[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[xen staging] x86/time: prefer CMOS over EFI_GET_TIME



commit 164ae033adb7df7cd2e7fd5b29329daceff664d2
Author:     Roger Pau Monne <roger.pau@xxxxxxxxxx>
AuthorDate: Mon Sep 2 16:00:19 2024 +0200
Commit:     Roger Pau Monne <roger.pau@xxxxxxxxxx>
CommitDate: Thu Jan 16 09:03:30 2025 +0100

    x86/time: prefer CMOS over EFI_GET_TIME
    
    The EFI_GET_TIME implementation is well known to be broken for many firmware
    implementations, for Xen the result on such implementations are:
    
    ----[ Xen-4.19-unstable  x86_64  debug=y  Tainted:   C    ]----
    CPU:    0
    RIP:    e008:[<0000000062ccfa70>] 0000000062ccfa70
    [...]
    Xen call trace:
       [<0000000062ccfa70>] R 0000000062ccfa70
       [<00000000732e9a3f>] S 00000000732e9a3f
       [<ffff82d04034f34f>] F arch/x86/time.c#get_cmos_time+0x1b3/0x26e
       [<ffff82d04045926f>] F init_xen_time+0x28/0xa4
       [<ffff82d040454bc4>] F __start_xen+0x1ee7/0x2578
       [<ffff82d040203334>] F __high_start+0x94/0xa0
    
    Pagetable walk from 0000000062ccfa70:
     L4[0x000] = 000000207ef1c063 ffffffffffffffff
     L3[0x001] = 000000005d6c0063 ffffffffffffffff
     L2[0x116] = 8000000062c001e3 ffffffffffffffff (PSE)
    
    ****************************************
    Panic on CPU 0:
    FATAL PAGE FAULT
    [error_code=0011]
    Faulting linear address: 0000000062ccfa70
    ****************************************
    
    Swap the preference to default to CMOS first, and EFI later, in an attempt 
to
    use EFI_GET_TIME as a last resort option only.  Note that Linux for example
    doesn't allow calling the get_time method, and instead provides a dummy 
handler
    that unconditionally returns EFI_UNSUPPORTED on x86-64.
    
    Such change in the preferences requires some re-arranging of the function
    logic, so that panic messages with workaround suggestions are suitably 
printed.
    
    Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
    Acked-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
    Acked-by: Marek Marczykowski-Górecki <marmarek@xxxxxxxxxxxxxxxxxxxxxx>
    Acked-By: Oleksii Kurochko<oleksii.kurochko@xxxxxxxxx>
    Release-Acked-by: Oleksii Kurochko<oleksii.kurochko@xxxxxxxxx>
---
 CHANGELOG.md        | 2 ++
 xen/arch/x86/time.c | 8 ++++----
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8507e6556a..1de1d1eca1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,6 +12,7 @@ The format is based on [Keep a 
Changelog](https://keepachangelog.com/en/1.0.0/)
    leaving this to the guest kernel to do in guest context.
  - On x86:
    - Prefer ACPI reboot over UEFI ResetSystem() run time service call.
+   - Prefer CMOS over EFI_GET_TIME as time source.
    - Switched the xAPIC flat driver to use physical destination mode for 
external
      interrupts instead of logical destination mode.
 
@@ -24,6 +25,7 @@ The format is based on [Keep a 
Changelog](https://keepachangelog.com/en/1.0.0/)
    - Support for LLC (Last Level Cache) coloring.
  - On x86:
    - xl suspend/resume subcommands.
+   - `wallclock` command line option to select time source.
 
 ### Removed
  - On x86:
diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c
index 00545c45fd..59129f419d 100644
--- a/xen/arch/x86/time.c
+++ b/xen/arch/x86/time.c
@@ -1592,14 +1592,14 @@ static void __init probe_wallclock(void)
         wallclock_source = WALLCLOCK_XEN;
         return;
     }
-    if ( efi_enabled(EFI_RS) && efi_get_time() )
+    if ( cmos_rtc_probe() )
     {
-        wallclock_source = WALLCLOCK_EFI;
+        wallclock_source = WALLCLOCK_CMOS;
         return;
     }
-    if ( cmos_rtc_probe() )
+    if ( efi_enabled(EFI_RS) && efi_get_time() )
     {
-        wallclock_source = WALLCLOCK_CMOS;
+        wallclock_source = WALLCLOCK_EFI;
         return;
     }
 
--
generated by git-patchbot for /home/xen/git/xen.git#staging



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.