Appends a serialized QEMU loader command to the data buffer.
(data: &mut Vec<u8>, cmd: LoaderCmd)
| 373 | |
| 374 | /// Appends a serialized QEMU loader command to the data buffer. |
| 375 | fn qemu_loader_append(data: &mut Vec<u8>, cmd: LoaderCmd) { |
| 376 | match cmd { |
| 377 | LoaderCmd::Allocate { |
| 378 | file, |
| 379 | alignment, |
| 380 | zone, |
| 381 | } => { |
| 382 | data.extend_from_slice(&[0x01, 0x00, 0x00, 0x00]); |
| 383 | append_fixed_string(data, file); |
| 384 | data.extend_from_slice(&alignment.to_le_bytes()); |
| 385 | data.push(zone); |
| 386 | data.resize(data.len() + 63, 0); // Padding |
| 387 | } |
| 388 | LoaderCmd::AddPtr { |
| 389 | pointer_file, |
| 390 | pointee_file, |
| 391 | pointer_offset, |
| 392 | pointer_size, |
| 393 | } => { |
| 394 | data.extend_from_slice(&[0x02, 0x00, 0x00, 0x00]); |
| 395 | append_fixed_string(data, pointer_file); |
| 396 | append_fixed_string(data, pointee_file); |
| 397 | data.extend_from_slice(&pointer_offset.to_le_bytes()); |
| 398 | data.push(pointer_size); |
| 399 | data.resize(data.len() + 7, 0); // Padding |
| 400 | } |
| 401 | LoaderCmd::AddChecksum { |
| 402 | file, |
| 403 | result_offset, |
| 404 | start, |
| 405 | length, |
| 406 | } => { |
| 407 | data.extend_from_slice(&[0x03, 0x00, 0x00, 0x00]); |
| 408 | append_fixed_string(data, file); |
| 409 | data.extend_from_slice(&result_offset.to_le_bytes()); |
| 410 | data.extend_from_slice(&start.to_le_bytes()); |
| 411 | data.extend_from_slice(&length.to_le_bytes()); |
| 412 | data.resize(data.len() + 56, 0); // Padding |
| 413 | } |
| 414 | } |
| 415 | } |
| 416 | |
| 417 | /// ACPI table header (first 8 bytes of every ACPI table) |
| 418 | #[derive(Debug, Decode)] |
no test coverage detected