diff options
author | Jan Beulich <JBeulich@suse.com> | 2012-05-25 11:20:31 -0400 |
---|---|---|
committer | Matt Fleming <matt.fleming@intel.com> | 2012-10-30 06:39:20 -0400 |
commit | bd52276fa1d420c3a504b76ffaaa1642cc79d4c4 (patch) | |
tree | 8efb267177d802dda32695c1ef4f6f2013cf61e5 /init/main.c | |
parent | da5a108d05b4f350be33e62d2db125673823e7ff (diff) |
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 as bacef661acdb ("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 in f026cfa82f62. 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]
Diffstat (limited to 'init/main.c')
-rw-r--r-- | init/main.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/init/main.c b/init/main.c index 9cf77ab138a6..ae70b647b4d9 100644 --- a/init/main.c +++ b/init/main.c | |||
@@ -461,6 +461,10 @@ static void __init mm_init(void) | |||
461 | percpu_init_late(); | 461 | percpu_init_late(); |
462 | pgtable_cache_init(); | 462 | pgtable_cache_init(); |
463 | vmalloc_init(); | 463 | vmalloc_init(); |
464 | #ifdef CONFIG_X86 | ||
465 | if (efi_enabled) | ||
466 | efi_enter_virtual_mode(); | ||
467 | #endif | ||
464 | } | 468 | } |
465 | 469 | ||
466 | asmlinkage void __init start_kernel(void) | 470 | asmlinkage void __init start_kernel(void) |
@@ -601,10 +605,6 @@ asmlinkage void __init start_kernel(void) | |||
601 | calibrate_delay(); | 605 | calibrate_delay(); |
602 | pidmap_init(); | 606 | pidmap_init(); |
603 | anon_vma_init(); | 607 | anon_vma_init(); |
604 | #ifdef CONFIG_X86 | ||
605 | if (efi_enabled) | ||
606 | efi_enter_virtual_mode(); | ||
607 | #endif | ||
608 | thread_info_cache_init(); | 608 | thread_info_cache_init(); |
609 | cred_init(); | 609 | cred_init(); |
610 | fork_init(totalram_pages); | 610 | fork_init(totalram_pages); |