@@ -76,17 +76,40 @@ fn main_inner(image: Handle, mut st: SystemTable<Boot>) -> Status {
76
76
unsafe {
77
77
* SYSTEM_TABLE . get ( ) = Some ( st. unsafe_clone ( ) ) ;
78
78
}
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) ;
79
102
80
- st. stdout ( ) . clear ( ) . unwrap ( ) ;
81
103
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
+ }
84
110
)
85
111
. unwrap ( ) ;
86
112
87
- let kernel = load_kernel ( image, & st) ;
88
- let ramdisk = load_ramdisk ( image, & st) ;
89
-
90
113
let framebuffer = init_logger ( & st, kernel. config ) ;
91
114
92
115
// we no longer need the system table for printing panics
@@ -152,16 +175,39 @@ fn main_inner(image: Handle, mut st: SystemTable<Boot>) -> Status {
152
175
) ;
153
176
}
154
177
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) )
158
199
}
159
200
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
+ }
165
211
}
166
212
167
213
fn open_device_path_protocol (
0 commit comments