@@ -130,6 +130,7 @@ fn load_kernel(image: Handle, st: &SystemTable<Boot>) -> Kernel<'static> {
130130 Kernel :: parse ( kernel_slice)
131131}
132132
133+ /// Try to load a kernel file from the boot device.
133134fn load_kernel_file ( image : Handle , st : & SystemTable < Boot > ) -> Option < & ' static mut [ u8 ] > {
134135 load_kernel_file_from_disk ( image, st)
135136 . or_else ( || load_kernel_file_from_tftp_boot_server ( image, st) )
@@ -189,59 +190,62 @@ fn load_kernel_file_from_disk(image: Handle, st: &SystemTable<Boot>) -> Option<&
189190 Some ( kernel_slice)
190191}
191192
193+ /// Try to load a kernel from a TFTP boot server.
192194fn load_kernel_file_from_tftp_boot_server (
193195 image : Handle ,
194196 st : & SystemTable < Boot > ,
195197) -> Option < & ' static mut [ u8 ] > {
196- let ref this = st. boot_services ( ) ;
198+ let this = st. boot_services ( ) ;
197199
198- let file_system_raw = {
199- let ref this = st. boot_services ( ) ;
200- let loaded_image = this
201- . handle_protocol :: < LoadedImage > ( image)
202- . expect ( "Failed to retrieve `LoadedImage` protocol from handle" ) ;
203- let loaded_image = unsafe { & * loaded_image. get ( ) } ;
200+ // Try to locate a `BaseCode` protocol on the boot device.
204201
205- let device_handle = loaded_image. device ( ) ;
202+ let loaded_image = this
203+ . handle_protocol :: < LoadedImage > ( image)
204+ . expect ( "Failed to retrieve `LoadedImage` protocol from handle" ) ;
205+ let loaded_image = unsafe { & * loaded_image. get ( ) } ;
206206
207- let device_path = this
208- . handle_protocol :: < DevicePath > ( device_handle)
209- . expect ( "Failed to retrieve `DevicePath` protocol from image's device handle" ) ;
210- let mut device_path = unsafe { & * device_path. get ( ) } ;
207+ let device_handle = loaded_image. device ( ) ;
211208
212- let device_handle = this
213- . locate_device_path :: < BaseCode > ( & mut device_path)
214- . expect ( "Failed to locate `BaseCode` protocol on device path" ) ;
209+ let device_path = this
210+ . handle_protocol :: < DevicePath > ( device_handle)
211+ . expect ( "Failed to retrieve `DevicePath` protocol from image's device handle" ) ;
212+ let mut device_path = unsafe { & * device_path. get ( ) } ;
215213
216- this. handle_protocol :: < BaseCode > ( device_handle )
217- }
218- . unwrap ( ) ;
219- let base_code = unsafe { & mut * file_system_raw . get ( ) } ;
214+ let device_handle = this. locate_device_path :: < BaseCode > ( & mut device_path ) . ok ( ) ? ;
215+
216+ let base_code_raw = this . handle_protocol :: < BaseCode > ( device_handle ) . unwrap ( ) ;
217+ let base_code = unsafe { & mut * base_code_raw . get ( ) } ;
220218
219+ // Find the TFTP boot server.
221220 let mode = base_code. mode ( ) ;
222221 assert ! ( mode. dhcp_ack_received) ;
223222 let dhcpv4: & DhcpV4Packet = mode. dhcp_ack . as_ref ( ) ;
224223 let server_ip = IpAddress :: new_v4 ( dhcpv4. bootp_si_addr ) ;
225224
226225 let filename = CStr8 :: from_bytes_with_nul ( b"kernel-x86_64\0 " ) . unwrap ( ) ;
227- let file_size = base_code. tftp_get_file_size ( & server_ip, filename) . unwrap ( ) ;
228226
229- let kernel_size = usize:: try_from ( file_size) . unwrap ( ) ;
227+ // Determine the kernel file size.
228+ let file_size = base_code
229+ . tftp_get_file_size ( & server_ip, filename)
230+ . expect ( "Failed to query the kernel file size" ) ;
231+ let kernel_size =
232+ usize:: try_from ( file_size) . expect ( "The kernel file size should fit into usize" ) ;
230233
234+ // Allocate some memory for the kernel file.
231235 let kernel_ptr = st
232236 . boot_services ( )
233237 . allocate_pages (
234238 AllocateType :: AnyPages ,
235239 MemoryType :: LOADER_DATA ,
236240 ( ( kernel_size - 1 ) / 4096 ) + 1 ,
237241 )
238- . unwrap ( ) as * mut u8 ;
239- unsafe { ptr:: write_bytes ( kernel_ptr, 0 , kernel_size) } ;
242+ . expect ( "Failed to allocate memory for the kernel file" ) as * mut u8 ;
240243 let kernel_slice = unsafe { slice:: from_raw_parts_mut ( kernel_ptr, kernel_size) } ;
241244
245+ // Load the kernel file.
242246 base_code
243247 . tftp_read_file ( & server_ip, filename, Some ( kernel_slice) )
244- . unwrap ( ) ;
248+ . expect ( "Failed to read kernel file from the TFTP boot server" ) ;
245249
246250 Some ( kernel_slice)
247251}
0 commit comments