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@citrix.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
Acked-By: Oleksii Kurochko<oleksii.kurochko@gmail.com>
Release-Acked-by: Oleksii Kurochko<oleksii.kurochko@gmail.com>
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.
- Support for LLC (Last Level Cache) coloring.
- On x86:
- xl suspend/resume subcommands.
+ - `wallclock` command line option to select time source.
### Removed
- On x86:
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;
}