:: commit 53332d70567470e650f0411ed15e13ab843d4dc6

mintsuki <mintsuki@protonmail.com> — 2021-03-10 23:23

parents: 0cd183faf4

misc: Clean up the boot device detection system

diff --git a/stage23/entry.s2.c b/stage23/entry.s2.c
index 12136efb..c6b08fe9 100644
--- a/stage23/entry.s2.c
+++ b/stage23/entry.s2.c
@@ -23,11 +23,7 @@
 
 extern uint64_t stage3_build_id;
 
-int boot_drive;
-int boot_partition = -1;
-
-bool booted_from_pxe = false;
-bool booted_from_cd = false;
+struct volume *boot_volume;
 
 #if defined (bios)
 
@@ -63,13 +59,14 @@ static bool stage3_init(struct volume *part) {
     return true;
 }
 
-__attribute__((noreturn))
-void entry(uint8_t _boot_drive, int boot_from) {
-    boot_drive = _boot_drive;
-
-    booted_from_pxe = (boot_from == BOOT_FROM_PXE);
-    booted_from_cd = (boot_from == BOOT_FROM_CD);
+enum {
+	BOOTED_FROM_HDD,
+	BOOTED_FROM_PXE,
+	BOOTED_FROM_CD
+};
 
+__attribute__((noreturn))
+void entry(uint8_t boot_drive, int boot_from) {
     term_textmode();
 
     print("Limine " LIMINE_VERSION "\n\n");
@@ -82,7 +79,9 @@ void entry(uint8_t _boot_drive, int boot_from) {
 
     disk_create_index();
 
-    struct volume *boot_volume = volume_get_by_coord(boot_drive, -1);
+    if (boot_from == BOOTED_FROM_HDD || boot_from == BOOTED_FROM_CD) {
+        boot_volume = volume_get_by_coord(boot_drive, -1);
+    }
 
     volume_iterate_parts(boot_volume,
         if (stage3_init(_PART)) {
diff --git a/stage23/entry.s3.c b/stage23/entry.s3.c
index 9836968b..70586bc0 100644
--- a/stage23/entry.s3.c
+++ b/stage23/entry.s3.c
@@ -21,7 +21,7 @@
 #include <pxe/tftp.h>
 #include <drivers/disk.h>
 
-void stage3_common(struct volume *boot_volume);
+void stage3_common(void);
 
 #if defined (uefi)
 EFI_STATUS EFIAPI efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) {
@@ -55,12 +55,12 @@ EFI_STATUS EFIAPI efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable
     uefi_call_wrapper(gBS->HandleProtocol, 3, ImageHandle, &loaded_img_prot_guid,
                       &loaded_image);
 
-    struct volume *boot_volume = disk_volume_from_efi_handle(loaded_image->DeviceHandle);
+    boot_volume = disk_volume_from_efi_handle(loaded_image->DeviceHandle);
     if (boot_volume == NULL) {
         panic("Can't determine boot disk");
     }
 
-    stage3_common(boot_volume);
+    stage3_common();
 }
 #endif
 
@@ -68,25 +68,15 @@ EFI_STATUS EFIAPI efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable
 __attribute__((section(".stage3_build_id")))
 uint64_t stage3_build_id = BUILD_ID;
 
-__attribute__((noreturn))
 __attribute__((section(".stage3_entry")))
-void stage3_entry(int boot_from) {
-    (void)boot_from;
-
-    struct volume *boot_volume = volume_get_by_coord(boot_drive, -1);
-
-    stage3_common(boot_volume);
-}
 #endif
-
 __attribute__((noreturn))
-void stage3_common(struct volume *boot_volume) {
+void stage3_common(void) {
     bool got_config = false;
     volume_iterate_parts(boot_volume,
         if (!init_config_disk(_PART)) {
             print("Config file found and loaded.\n");
-            boot_partition = _PARTNO;
-            boot_drive = _PART->drive;
+            boot_volume = _PART;
             got_config = true;
             break;
         }
@@ -95,8 +85,8 @@ void stage3_common(struct volume *boot_volume) {
     if (!got_config)
         panic("Config file not found.");
 
-    print("Boot drive: %x\n", boot_drive);
-    print("Boot partition: %d\n", boot_partition);
+    print("Boot drive: %x\n", boot_volume->drive);
+    print("Boot partition: %d\n", boot_volume->partition);
 
     mtrr_save();
 
@@ -113,7 +103,7 @@ void stage3_common(struct volume *boot_volume) {
     } else if (!strcmp(proto, "stivale")) {
         stivale_load(config, cmdline);
     } else if (!strcmp(proto, "stivale2")) {
-        stivale2_load(config, cmdline, booted_from_pxe);
+        stivale2_load(config, cmdline, false /*booted_from_pxe*/);
 #if defined (bios)
     } else if (!strcmp(proto, "linux")) {
         linux_load(config, cmdline);
diff --git a/stage23/lib/blib.h b/stage23/lib/blib.h
index bebffe66..e67c2766 100644
--- a/stage23/lib/blib.h
+++ b/stage23/lib/blib.h
@@ -20,12 +20,11 @@ extern bool efi_boot_services_exited;
 bool efi_exit_boot_services(void);
 #endif
 
-extern int boot_drive;
-extern int boot_partition;
+extern struct volume *boot_volume;
 
-extern bool booted_from_pxe;
-extern bool booted_from_cd;
+#if defined (bios)
 extern bool stage3_loaded;
+#endif
 
 bool parse_resolution(int *width, int *height, int *bpp, const char *buf);
 
@@ -60,12 +59,6 @@ uint64_t strtoui(const char *s, const char **end, int base);
 
 typedef char symbol[];
 
-enum {
-	BOOT_FROM_HDD,
-	BOOT_FROM_PXE,
-	BOOT_FROM_CD
-};
-
 #if defined (uefi)
 __attribute__((noreturn)) void do_32(void *fnptr, int args, ...);
 #endif
diff --git a/stage23/lib/uri.c b/stage23/lib/uri.c
index 78c0cf96..8f632f3c 100644
--- a/stage23/lib/uri.c
+++ b/stage23/lib/uri.c
@@ -67,7 +67,7 @@ static bool parse_bios_partition(char *loc, uint8_t *drive, uint8_t *partition)
         if (loc[i] == ':') {
             loc[i] = 0;
             if (*loc == 0) {
-                *drive = boot_drive;
+                *drive = boot_volume->drive;
             } else {
                 val = strtoui(loc, NULL, 10);
                 if (val < 1 || val > 16) {
@@ -157,7 +157,7 @@ static bool uri_tftp_dispatch(struct file_handle *fd, char *root, char *path) {
 
 static bool uri_boot_dispatch(struct file_handle *fd, char *s_part, char *path) {
 #if defined (bios)
-    if (booted_from_pxe)
+    if (false /*booted_from_pxe*/)
         return uri_tftp_dispatch(fd, s_part, path);
 #endif
 
@@ -169,13 +169,11 @@ static bool uri_boot_dispatch(struct file_handle *fd, char *s_part, char *path)
             panic("Partition number outside range 1-256");
         }
         partition = val - 1;
-    } else if (booted_from_cd || boot_partition != -1) {
-        partition = boot_partition;
     } else {
-        panic("Boot partition information is unavailable.");
+        partition = boot_volume->partition;
     }
 
-    struct volume *volume = volume_get_by_coord(boot_drive, partition);
+    struct volume *volume = volume_get_by_coord(boot_volume->drive, partition);
     if (volume == NULL)
         return false;
 
tab: 248 wrap: offon