Skip to content

Commit 0a134f9

Browse files
committed
Make sure ramdisk loads from the same source as the kernel
1 parent bc52c59 commit 0a134f9

File tree

1 file changed

+60
-14
lines changed

1 file changed

+60
-14
lines changed

uefi/src/main.rs

Lines changed: 60 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -76,17 +76,40 @@ fn main_inner(image: Handle, mut st: SystemTable<Boot>) -> Status {
7676
unsafe {
7777
*SYSTEM_TABLE.get() = Some(st.unsafe_clone());
7878
}
79+
let stdout = unsafe { &mut *SYSTEM_TABLE.get() };
80+
let stdout = stdout.as_mut().unwrap();
81+
let stdout = stdout.stdout();
82+
stdout.clear().unwrap();
83+
writeln!(stdout, "UEFI bootloader started; trying to load kernel").unwrap();
84+
85+
let mut boot_mode = BootMode::Disk;
86+
let mut kernel = load_kernel(image, &mut st, boot_mode);
87+
if kernel.is_none() {
88+
writeln!(
89+
stdout,
90+
"Failed to load kernel via {:?}, trying TFTP",
91+
boot_mode
92+
)
93+
.unwrap();
94+
// Try TFTP boot
95+
boot_mode = BootMode::Tftp;
96+
kernel = load_kernel(image, &mut st, boot_mode);
97+
}
98+
let kernel = kernel.expect("Failed to load kernel");
99+
writeln!(stdout, "Trying to load ramdisk via {:?}", boot_mode).unwrap();
100+
// Ramdisk must load from same source, or not at all.
101+
let ramdisk = load_ramdisk(image, &mut st, boot_mode);
79102

80-
st.stdout().clear().unwrap();
81103
writeln!(
82-
st.stdout(),
83-
"UEFI bootloader started; trying to load kernel"
104+
stdout,
105+
"{}",
106+
match ramdisk {
107+
Some(_) => "Loaded ramdisk",
108+
None => "Ramdisk not found.",
109+
}
84110
)
85111
.unwrap();
86112

87-
let kernel = load_kernel(image, &st);
88-
let ramdisk = load_ramdisk(image, &st);
89-
90113
let framebuffer = init_logger(&st, kernel.config);
91114

92115
// we no longer need the system table for printing panics
@@ -152,16 +175,39 @@ fn main_inner(image: Handle, mut st: SystemTable<Boot>) -> Status {
152175
);
153176
}
154177

155-
fn load_ramdisk(image: Handle, st: &SystemTable<Boot>) -> Option<&'static mut [u8]> {
156-
load_file_from_disk(RAMDISK_FILENAME, image, st)
157-
.or_else(|| load_file_from_tftp_boot_server(RAMDISK_FILENAME, image, st))
178+
#[derive(Clone, Copy, Debug)]
179+
pub enum BootMode {
180+
Disk,
181+
Tftp,
182+
}
183+
184+
fn load_ramdisk(
185+
image: Handle,
186+
st: &mut SystemTable<Boot>,
187+
boot_mode: BootMode,
188+
) -> Option<&'static mut [u8]> {
189+
load_file_from_boot_method(image, st, RAMDISK_FILENAME, boot_mode)
190+
}
191+
192+
fn load_kernel(
193+
image: Handle,
194+
st: &mut SystemTable<Boot>,
195+
boot_mode: BootMode,
196+
) -> Option<Kernel<'static>> {
197+
let kernel_slice = load_file_from_boot_method(image, st, KERNEL_FILENAME, boot_mode)?;
198+
Some(Kernel::parse(kernel_slice))
158199
}
159200

160-
fn load_kernel(image: Handle, st: &SystemTable<Boot>) -> Kernel<'static> {
161-
let kernel_slice = load_file_from_disk(KERNEL_FILENAME, image, st)
162-
.or_else(|| load_file_from_tftp_boot_server(KERNEL_FILENAME, image, st))
163-
.expect("couldn't find kernel");
164-
Kernel::parse(kernel_slice)
201+
fn load_file_from_boot_method(
202+
image: Handle,
203+
st: &mut SystemTable<Boot>,
204+
filename: &str,
205+
boot_mode: BootMode,
206+
) -> Option<&'static mut [u8]> {
207+
match boot_mode {
208+
BootMode::Disk => load_file_from_disk(filename, image, st),
209+
BootMode::Tftp => load_file_from_tftp_boot_server(filename, image, st),
210+
}
165211
}
166212

167213
fn open_device_path_protocol(

0 commit comments

Comments
 (0)