summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Janssen <medhefgo@web.de>2022-08-04 10:21:15 +0200
committerJan Janssen <medhefgo@web.de>2022-08-04 10:21:15 +0200
commitbafc594528767192bc4b3c0081a992a9e2647d50 (patch)
tree12c1efc35118bb424a654c611f0784effaa021a5
parentadb9485acb2b7f429a72ce6db024724a809b6ec1 (diff)
downloadsystemd-bafc594528767192bc4b3c0081a992a9e2647d50.tar.gz
boot: Skip safety countdown when running in a VM
-rw-r--r--src/boot/efi/secure-boot.c5
-rw-r--r--src/boot/efi/ticks.c26
-rw-r--r--src/boot/efi/util.c17
-rw-r--r--src/boot/efi/util.h8
4 files changed, 34 insertions, 22 deletions
diff --git a/src/boot/efi/secure-boot.c b/src/boot/efi/secure-boot.c
index 854825abdb..cf7a464d0a 100644
--- a/src/boot/efi/secure-boot.c
+++ b/src/boot/efi/secure-boot.c
@@ -49,6 +49,11 @@ EFI_STATUS secure_boot_enroll_at(EFI_FILE *root_dir, const char16_t *path) {
unsigned timeout_sec = 15;
for(;;) {
+ /* Enrolling secure boot keys is safe to do in virtualized environments as there is nothing
+ * we can brick there. */
+ if (in_hypervisor())
+ break;
+
PrintAt(0, ST->ConOut->Mode->CursorRow, L"Enrolling in %2u s, press any key to abort.", timeout_sec);
uint64_t key;
diff --git a/src/boot/efi/ticks.c b/src/boot/efi/ticks.c
index 16e488c958..1b74ba15d0 100644
--- a/src/boot/efi/ticks.c
+++ b/src/boot/efi/ticks.c
@@ -2,35 +2,17 @@
#include <efi.h>
#include <efilib.h>
-#if defined(__i386__) || defined(__x86_64__)
-#include <cpuid.h>
-#endif
-#include <stdbool.h>
#include "ticks.h"
-
-#if defined(__i386__) || defined(__x86_64__)
-static bool in_hypervisor(void) {
- uint32_t eax, ebx, ecx, edx;
-
- /* The TSC might or might not be virtualized in VMs (and thus might not be accurate or start at zero
- * at boot), depending on hypervisor and CPU functionality. If it's not virtualized it's not useful
- * for keeping time, hence don't attempt to use it.
- *
- * This is a dumbed down version of src/basic/virt.c's detect_vm() that safely works in the UEFI
- * environment. */
-
- if (__get_cpuid(1, &eax, &ebx, &ecx, &edx) == 0)
- return false;
-
- return !!(ecx & 0x80000000U);
-}
-#endif
+#include "util.h"
#ifdef __x86_64__
static uint64_t ticks_read(void) {
uint64_t a, d;
+ /* The TSC might or might not be virtualized in VMs (and thus might not be accurate or start at zero
+ * at boot), depending on hypervisor and CPU functionality. If it's not virtualized it's not useful
+ * for keeping time, hence don't attempt to use it. */
if (in_hypervisor())
return 0;
diff --git a/src/boot/efi/util.c b/src/boot/efi/util.c
index 6fcf9b3121..a41dbaa43e 100644
--- a/src/boot/efi/util.c
+++ b/src/boot/efi/util.c
@@ -2,6 +2,9 @@
#include <efi.h>
#include <efilib.h>
+#if defined(__i386__) || defined(__x86_64__)
+# include <cpuid.h>
+#endif
#include "ticks.h"
#include "util.h"
@@ -768,3 +771,17 @@ EFI_STATUS make_file_device_path(EFI_HANDLE device, const char16_t *file, EFI_DE
SetDevicePathEndNode(dp);
return EFI_SUCCESS;
}
+
+#if defined(__i386__) || defined(__x86_64__)
+bool in_hypervisor(void) {
+ uint32_t eax, ebx, ecx, edx;
+
+ /* This is a dumbed down version of src/basic/virt.c's detect_vm() that safely works in the UEFI
+ * environment. */
+
+ if (__get_cpuid(1, &eax, &ebx, &ecx, &edx) == 0)
+ return false;
+
+ return !!(ecx & 0x80000000U);
+}
+#endif
diff --git a/src/boot/efi/util.h b/src/boot/efi/util.h
index bb4bb64e0e..afbc217d53 100644
--- a/src/boot/efi/util.h
+++ b/src/boot/efi/util.h
@@ -179,3 +179,11 @@ static inline void beep(UINTN beep_count) {}
EFI_STATUS open_volume(EFI_HANDLE device, EFI_FILE **ret_file);
EFI_STATUS make_file_device_path(EFI_HANDLE device, const char16_t *file, EFI_DEVICE_PATH **ret_dp);
+
+#if defined(__i386__) || defined(__x86_64__)
+bool in_hypervisor(void);
+#else
+static inline bool in_hypervisor(void) {
+ return false;
+}
+#endif