• Jan Beulich's avatar
    x86-64/efi: Use EFI to deal with platform wall clock (again) · bd52276f
    Jan Beulich authored
    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 bacef661 ("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 f026cfa8. 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: default avatarJan Beulich <jbeulich@suse.com>
    Tested-by: default avatarMatt Fleming <matt.fleming@intel.com>
    Acked-by: default avatarMatthew 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]
    bd52276f
efi.c 24.3 KB