@@ -130,6 +130,7 @@ fn load_kernel(image: Handle, st: &SystemTable<Boot>) -> Kernel<'static> {
130
130
Kernel :: parse ( kernel_slice)
131
131
}
132
132
133
+ /// Try to load a kernel file from the boot device.
133
134
fn load_kernel_file ( image : Handle , st : & SystemTable < Boot > ) -> Option < & ' static mut [ u8 ] > {
134
135
load_kernel_file_from_disk ( image, st)
135
136
. 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<&
189
190
Some ( kernel_slice)
190
191
}
191
192
193
+ /// Try to load a kernel from a TFTP boot server.
192
194
fn load_kernel_file_from_tftp_boot_server (
193
195
image : Handle ,
194
196
st : & SystemTable < Boot > ,
195
197
) -> Option < & ' static mut [ u8 ] > {
196
- let ref this = st. boot_services ( ) ;
198
+ let this = st. boot_services ( ) ;
197
199
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.
204
201
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 ( ) } ;
206
206
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 ( ) ;
211
208
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 ( ) } ;
215
213
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 ( ) } ;
220
218
219
+ // Find the TFTP boot server.
221
220
let mode = base_code. mode ( ) ;
222
221
assert ! ( mode. dhcp_ack_received) ;
223
222
let dhcpv4: & DhcpV4Packet = mode. dhcp_ack . as_ref ( ) ;
224
223
let server_ip = IpAddress :: new_v4 ( dhcpv4. bootp_si_addr ) ;
225
224
226
225
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 ( ) ;
228
226
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" ) ;
230
233
234
+ // Allocate some memory for the kernel file.
231
235
let kernel_ptr = st
232
236
. boot_services ( )
233
237
. allocate_pages (
234
238
AllocateType :: AnyPages ,
235
239
MemoryType :: LOADER_DATA ,
236
240
( ( kernel_size - 1 ) / 4096 ) + 1 ,
237
241
)
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 ;
240
243
let kernel_slice = unsafe { slice:: from_raw_parts_mut ( kernel_ptr, kernel_size) } ;
241
244
245
+ // Load the kernel file.
242
246
base_code
243
247
. tftp_read_file ( & server_ip, filename, Some ( kernel_slice) )
244
- . unwrap ( ) ;
248
+ . expect ( "Failed to read kernel file from the TFTP boot server" ) ;
245
249
246
250
Some ( kernel_slice)
247
251
}
0 commit comments