@@ -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
167213fn open_device_path_protocol (
0 commit comments