Tidy up stage 3 entry
diff --git a/stage23/entry.s3.c b/stage23/entry.s3.c
index eab5371f..c210e2e4 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(void);
+void stage3_common(struct volume *boot_volume);
#if defined (uefi)
EFI_STATUS EFIAPI efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) {
@@ -44,49 +44,7 @@ EFI_STATUS EFIAPI efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable
panic("Can't determine boot disk");
}
- if (boot_volume->backing_dev != NULL) {
- boot_volume = boot_volume->backing_dev;
-
- int part_cnt = 0;
- for (size_t i = 0; ; i++) {
- if (part_cnt > boot_volume->max_partition)
- break;
-
- struct volume *volume = volume_get_by_coord(boot_volume->drive, i);
- if (volume == NULL)
- continue;
-
- part_cnt++;
-
- if (!init_config_disk(volume)) {
- print("Config file found and loaded.\n");
- boot_partition = i;
- boot_drive = boot_volume->drive;
- goto config_loaded;
- }
- }
-
- panic("Config file not found.");
- } else {
- struct volume *volume = volume_get_by_coord(boot_volume->drive, -1);
- if (volume == NULL)
- panic("Config file not found.");
-
- if (!init_config_disk(volume)) {
- print("Config file found and loaded.\n");
- boot_partition = -1;
- boot_drive = boot_volume->drive;
- goto config_loaded;
- }
-
- panic("Config file not found.");
- }
-
-config_loaded:
- print("Boot drive: %x\n", boot_drive);
- print("Boot partition: %d\n", boot_partition);
-
- stage3_common();
+ stage3_common(boot_volume);
}
#endif
@@ -99,25 +57,33 @@ __attribute__((section(".stage3_entry")))
void stage3_entry(int boot_from) {
(void)boot_from;
- mtrr_save();
-
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) {
+ 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;
+ got_config = true;
break;
}
);
- stage3_common();
-}
-#endif
+ if (!got_config)
+ panic("Config file not found.");
+
+ print("Boot drive: %x\n", boot_drive);
+ print("Boot partition: %d\n", boot_partition);
+
+ mtrr_save();
-__attribute__((noreturn))
-void stage3_common(void) {
char *cmdline;
char *config = menu(&cmdline);
