mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
tools: readnote: Add bzImage kernel support
Add the check of bzImage kernel and make it work with RHEL 6 big zImage kernel Signed-off-by: Xuesen Guo <Xuesen.Guo@hitachiconsulting.com> Acked-by: Ian Campbell <ian.campbell@citrix.com> Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
This commit is contained in:
1 parent
c5156a6d18
commit
003668e259
1 file changed
+80
-3
@@ -18,6 +18,48 @@
|
||||
|
||||
static xc_interface *xch;
|
||||
|
||||
/* According to the implemation of xc_dom_probe_bzimage_kernel() function */
|
||||
/* We add support of bzImage kernel */
|
||||
/* Copied from tools/libxc/xc_doom_bzImageloader.c */
|
||||
struct setup_header {
|
||||
uint8_t _pad0[0x1f1]; /* skip uninteresting stuff */
|
||||
uint8_t setup_sects;
|
||||
uint16_t root_flags;
|
||||
uint32_t syssize;
|
||||
uint16_t ram_size;
|
||||
uint16_t vid_mode;
|
||||
uint16_t root_dev;
|
||||
uint16_t boot_flag;
|
||||
uint16_t jump;
|
||||
uint32_t header;
|
||||
#define HDR_MAGIC "HdrS"
|
||||
#define HDR_MAGIC_SZ 4
|
||||
uint16_t version;
|
||||
#define VERSION(h,l) (((h)<<8) | (l))
|
||||
uint32_t realmode_swtch;
|
||||
uint16_t start_sys;
|
||||
uint16_t kernel_version;
|
||||
uint8_t type_of_loader;
|
||||
uint8_t loadflags;
|
||||
uint16_t setup_move_size;
|
||||
uint32_t code32_start;
|
||||
uint32_t ramdisk_image;
|
||||
uint32_t ramdisk_size;
|
||||
uint32_t bootsect_kludge;
|
||||
uint16_t heap_end_ptr;
|
||||
uint16_t _pad1;
|
||||
uint32_t cmd_line_ptr;
|
||||
uint32_t initrd_addr_max;
|
||||
uint32_t kernel_alignment;
|
||||
uint8_t relocatable_kernel;
|
||||
uint8_t _pad2[3];
|
||||
uint32_t cmdline_size;
|
||||
uint32_t hardware_subarch;
|
||||
uint64_t hardware_subarch_data;
|
||||
uint32_t payload_offset;
|
||||
uint32_t payload_length;
|
||||
} __attribute__((packed));
|
||||
|
||||
static void print_string_note(const char *prefix, struct elf_binary *elf,
|
||||
const elf_note *note)
|
||||
{
|
||||
@@ -131,6 +173,9 @@ int main(int argc, char **argv)
|
||||
const elf_shdr *shdr;
|
||||
int notes_found = 0;
|
||||
|
||||
struct setup_header *hdr;
|
||||
uint64_t payload_offset, payload_length;
|
||||
|
||||
if (argc != 2)
|
||||
{
|
||||
fprintf(stderr, "Usage: readnotes <elfimage>\n");
|
||||
@@ -159,13 +204,45 @@ int main(int argc, char **argv)
|
||||
fprintf(stderr, "Unable to map %s: %s\n", f, strerror(errno));
|
||||
return 1;
|
||||
}
|
||||
size = st.st_size;
|
||||
|
||||
/* Check the magic of bzImage kernel */
|
||||
hdr = (struct setup_header *)image;
|
||||
if ( memcmp(&hdr->header, HDR_MAGIC, HDR_MAGIC_SZ) == 0 )
|
||||
{
|
||||
if ( hdr->version < VERSION(2,8) )
|
||||
{
|
||||
printf("%s: boot protocol too old (%04x)", __FUNCTION__, hdr->version);
|
||||
return 1;
|
||||
}
|
||||
|
||||
usize = xc_dom_check_gzip(xch, image, st.st_size);
|
||||
/* upcast to 64 bits to avoid overflow */
|
||||
/* setup_sects is u8 and so cannot overflow */
|
||||
payload_offset = (hdr->setup_sects + 1) * 512;
|
||||
payload_offset += hdr->payload_offset;
|
||||
payload_length = hdr->payload_length;
|
||||
|
||||
if ( payload_offset >= st.st_size )
|
||||
{
|
||||
printf("%s: payload offset overflow", __FUNCTION__);
|
||||
return 1;
|
||||
}
|
||||
if ( (payload_offset + payload_length) > st.st_size )
|
||||
{
|
||||
printf("%s: payload length overflow", __FUNCTION__);
|
||||
return 1;
|
||||
}
|
||||
|
||||
image = image + payload_offset;
|
||||
size = payload_length;
|
||||
} else {
|
||||
size = st.st_size;
|
||||
}
|
||||
|
||||
usize = xc_dom_check_gzip(xch, image, size);
|
||||
if (usize)
|
||||
{
|
||||
tmp = malloc(usize);
|
||||
xc_dom_do_gunzip(xch, image, st.st_size, tmp, usize);
|
||||
xc_dom_do_gunzip(xch, image, size, tmp, usize);
|
||||
image = tmp;
|
||||
size = usize;
|
||||
}
|
||||
|
||||