From 170a8a4fb242d908a3cb2c1ad58d36363dfa90ad Mon Sep 17 00:00:00 2001 From: Sergiu Moga Date: Mon, 24 Apr 2023 20:53:52 +0300 Subject: [PATCH] plat/kvm/shutdown.c: If on a `UEFI` system, rely on Runtime Services Preferably, a UEFI system is also an ACPI system and thus these functionalities should be implemented through ACPI methods. But for now, make use of UEFI's Runtime Services for resetting the system, since they are more reliable than what we have at the moment. Signed-off-by: Sergiu Moga Reviewed-by: Michalis Pappas Approved-by: Razvan Deaconescu Tested-by: Unikraft CI GitHub-Closes: #909 --- plat/kvm/shutdown.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/plat/kvm/shutdown.c b/plat/kvm/shutdown.c index 605d2ff7d..1f677674c 100644 --- a/plat/kvm/shutdown.c +++ b/plat/kvm/shutdown.c @@ -26,14 +26,51 @@ #include #include #include +#include +#include static void cpu_halt(void) __noreturn; -/* TODO: implement CPU reset */ +#ifdef CONFIG_KVM_BOOT_EFI_STUB +static void uk_efi_rs_reset_system(enum uk_efi_reset_type reset_type) +{ + const char reset_data[] = "UK EFI SYSTEM RESET"; + struct uk_efi_runtime_services *rs; + struct ukplat_bootinfo *bi; + + bi = ukplat_bootinfo_get(); + if (unlikely(!bi || !bi->efi_st)) + return; + + rs = ((struct uk_efi_sys_tbl *)bi->efi_st)->runtime_services; + if (unlikely(!rs)) + return; + + rs->reset_system(reset_type, UK_EFI_SUCCESS, + sizeof(reset_data), (void *)reset_data); +} +#else +static void uk_efi_rs_reset_system(enum uk_efi_reset_type reset_type __unused) +{ } +#endif + void ukplat_terminate(enum ukplat_gstate request) { uk_pr_info("Unikraft halted\n"); + switch (request) { + case UKPLAT_HALT: + cpu_halt(); + + break; + case UKPLAT_RESTART: + uk_efi_rs_reset_system(UK_EFI_RESET_COLD); + + break; + default: + uk_efi_rs_reset_system(UK_EFI_RESET_SHUTDOWN); + } + /* Try to make system off */ system_off(request); -- 2.39.5