x86-64/efi: Use EFI to deal with platform wall clock (again)
Other than ix86, x86-64 on EFI so far didn't set the {g,s}et_wallclock accessors to the EFI routines, thus incorrectly using raw RTC accesses instead. Simply removing the #ifdef around the respective code isn't enough, however: While so far early get-time calls were done in physical mode, this doesn't work properly for x86-64, as virtual addresses would still need to be set up for all runtime regions (which wasn't the case on the system I have access to), so instead the patch moves the call to efi_enter_virtual_mode() ahead (which in turn allows to drop all code related to calling efi-get-time in physical mode). Additionally the earlier calling of efi_set_executable() requires the CPA code to cope, i.e. during early boot it must be avoided to call cpa_flush_array(), as the first thing this function does is a BUG_ON(irqs_disabled()). Also make the two EFI functions in question here static - they're not being referenced elsewhere. History: This commit was originally merged asbacef661ac
("x86-64/efi: Use EFI to deal with platform wall clock") but it resulted in some ASUS machines no longer booting due to a firmware bug, and so was reverted inf026cfa82f
. A pre-emptive fix for the buggy ASUS firmware was merged in 03a1c254975e ("x86, efi: 1:1 pagetable mapping for virtual EFI calls") so now this patch can be reapplied. Signed-off-by: Jan Beulich <jbeulich@suse.com> Tested-by: Matt Fleming <matt.fleming@intel.com> Acked-by: Matthew Garrett <mjg@redhat.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: H. Peter Anvin <hpa@zytor.com> Signed-off-by: Matt Fleming <matt.fleming@intel.com> [added commit history]
Этот коммит содержится в:

коммит произвёл
Matt Fleming

родитель
da5a108d05
Коммит
bd52276fa1
@@ -919,11 +919,13 @@ static int change_page_attr_set_clr(unsigned long *addr, int numpages,
|
||||
|
||||
/*
|
||||
* On success we use clflush, when the CPU supports it to
|
||||
* avoid the wbindv. If the CPU does not support it and in the
|
||||
* error case we fall back to cpa_flush_all (which uses
|
||||
* wbindv):
|
||||
* avoid the wbindv. If the CPU does not support it, in the
|
||||
* error case, and during early boot (for EFI) we fall back
|
||||
* to cpa_flush_all (which uses wbinvd):
|
||||
*/
|
||||
if (!ret && cpu_has_clflush) {
|
||||
if (early_boot_irqs_disabled)
|
||||
__cpa_flush_all((void *)(long)cache);
|
||||
else if (!ret && cpu_has_clflush) {
|
||||
if (cpa.flags & (CPA_PAGES_ARRAY | CPA_ARRAY)) {
|
||||
cpa_flush_array(addr, numpages, cache,
|
||||
cpa.flags, pages);
|
||||
|
Ссылка в новой задаче
Block a user