diff -up kexec-tools-2.0.0/include/x86/x86-linux.h.orig kexec-tools-2.0.0/include/x86/x86-linux.h --- kexec-tools-2.0.0/include/x86/x86-linux.h.orig 2008-07-14 07:28:19.000000000 -0400 +++ kexec-tools-2.0.0/include/x86/x86-linux.h 2010-08-04 12:14:51.000000000 -0400 @@ -27,7 +27,7 @@ struct drive_info_struct { }; struct sys_desc_table { uint16_t length; - uint8_t table[318]; + uint8_t table[14]; }; struct apm_bios_info { @@ -67,6 +67,17 @@ struct edd_info { uint8_t edd_device_params[EDD_DEVICE_PARAM_SIZE]; } __attribute__ ((packed)); +struct efi_info { + uint32_t efi_loader_signature; + uint32_t efi_systab; + uint32_t efi_memdesc_size; + uint32_t efi_memdesc_version; + uint32_t efi_memmap; + uint32_t efi_memmap_size; + uint32_t efi_systab_hi; + uint32_t efi_memmap_hi; +}; + struct x86_linux_param_header { uint8_t orig_x; /* 0x00 */ uint8_t orig_y; /* 0x01 */ @@ -107,6 +118,9 @@ struct x86_linux_param_header { struct apm_bios_info apm_bios_info; /* 0x40 */ struct drive_info_struct drive_info; /* 0x80 */ struct sys_desc_table sys_desc_table; /* 0xa0 */ + uint8_t _pad4[144]; /* 0x0b0 */ + uint8_t _pad5[128]; /* 0x140 - edid_data*/ + struct efi_info efi_info; /* 0x1c0 */ uint32_t alt_mem_k; /* 0x1e0 */ uint8_t reserved5[4]; /* 0x1e4 */ uint8_t e820_map_nr; /* 0x1e8 */ diff -up kexec-tools-2.0.0/kexec/arch/i386/x86-linux-setup.c.orig kexec-tools-2.0.0/kexec/arch/i386/x86-linux-setup.c --- kexec-tools-2.0.0/kexec/arch/i386/x86-linux-setup.c.orig 2008-07-14 07:28:19.000000000 -0400 +++ kexec-tools-2.0.0/kexec/arch/i386/x86-linux-setup.c 2010-08-04 12:15:34.000000000 -0400 @@ -403,7 +403,8 @@ void setup_linux_system_parameters(struc /* Fill in information the BIOS would usually provide */ struct memory_range *range; int i, ranges; - + int boot_param_fd; + /* Default screen size */ real_mode->orig_x = 0; real_mode->orig_y = 0; @@ -428,6 +429,20 @@ void setup_linux_system_parameters(struc /* Default sysdesc table */ real_mode->sys_desc_table.length = 0; + memset(&real_mode->efi_info, 0, sizeof(struct efi_info)); + /* check to see if we're running an EFI firmware here */ + boot_param_fd = open("/sys/kernel/debug/boot_params/data", O_RDONLY); + if (boot_param_fd > 0) { + int rc; + lseek(boot_param_fd, 0x1c0, SEEK_SET); + rc = read(boot_param_fd, &real_mode->efi_info, + sizeof(struct efi_info)); + if (rc != sizeof(struct efi_info)) + printf("ERROR READING EFI INFO\n"); + close(boot_param_fd); + } else + printf("UNABLE TO GATHER EFI DATA\n"); + /* default yes: this can be overridden on the command line */ real_mode->mount_root_rdonly = 0xFFFF;