diff --git a/utility/include/kernel_blob.h b/utility/include/kernel_blob.h index d5256aa826..e8f813eb0c 100644 --- a/utility/include/kernel_blob.h +++ b/utility/include/kernel_blob.h @@ -28,22 +28,35 @@ struct linux_kernel_header uint8_t pad1[0x0230 - 0x1f2]; } __attribute__ ((packed)); +// Simplified version of x86 kernel e820 memory map entries +#define E820_ENTRY_MAX 128 +#define E820_TYPE_RAM 1 +#define E820_TYPE_RESERVED 2 + +struct linux_kernel_e820entry { + uint64_t start_addr; + uint64_t segment_size; + uint32_t segment_type; +} __attribute__((packed)); // Simplified version of the x86 kernel zeropage table struct linux_kernel_params { - uint8_t pad0[0x01f1 - 0x0]; + uint8_t pad0[0x1e8 - 0x0]; + uint8_t n_e820_entry; // 1e8 + uint8_t pad1[0x1f1 - 0x1e9]; uint8_t setup_sects; // 1f1 - uint8_t pad1[0x1fe - 0x1f2]; + uint8_t pad2[0x1fe - 0x1f2]; uint16_t boot_flag; // 1fe - uint8_t pad2[0x210 - 0x200]; + uint8_t pad3[0x210 - 0x200]; uint8_t type_of_loader; // 210 - uint8_t pad3[0x218 - 0x211]; + uint8_t pad4[0x218 - 0x211]; uint32_t ramdisk_image; // 218 - uint32_t ramdisk_size; // 21c - uint8_t pad4[0x228 - 0x220]; + uint32_t ramdisk_size; // 21c + uint8_t pad5[0x228 - 0x220]; uint32_t cmd_line_ptr; // 228 - uint8_t pad5[0x0cd0 - 0x22c]; + uint8_t pad6[0x2d0 - 0x22c]; + struct linux_kernel_e820entry e820_entries[E820_ENTRY_MAX]; // 2d0 - cd0 } __attribute__ ((packed)); diff --git a/utility/vbutil_kernel.c b/utility/vbutil_kernel.c index 763480e35f..80197194b8 100644 --- a/utility/vbutil_kernel.c +++ b/utility/vbutil_kernel.c @@ -335,6 +335,14 @@ static blob_t *NewBlob(uint64_t version, params->ramdisk_size = 0; params->type_of_loader = 0xff; params->cmd_line_ptr = cmdline_addr; + /* A fake e820 memory map with 2 entries */ + params->n_e820_entry = 2; + params->e820_entries[0].start_addr = 0x00000000; + params->e820_entries[0].segment_size = 0x00001000; + params->e820_entries[0].segment_type = E820_TYPE_RAM; + params->e820_entries[1].start_addr = 0xfffff000; + params->e820_entries[1].segment_size = 0x00001000; + params->e820_entries[1].segment_type = E820_TYPE_RESERVED; now += CROS_PARAMS_SIZE; /* Finally, append the bootloader. Remember where it will load in