+2012-05-31 Peter Jones <pjones@redhat.com>
+
+ * include/grub/i386/linux.h (linux_kernel_params): Add v206.
+ * grub-core/loader/i386/linux.c (grub_linux_boot): Use v206.
+ (grub_cmd_linux) [__x86_64__]: Validate grub_efi_system_table.
+
2012-05-31 Vladimir Serbinenko <phcoder@gmail.com>
* grub-core/loader/i386/linux.c (grub_linux_boot): Fix overflow and
efi_mmap_target = real_mode_target
+ ((grub_uint8_t *) efi_mmap_buf - (grub_uint8_t *) real_mode_mem);
/* Pass EFI parameters. */
- if (grub_le_to_cpu16 (params->version) >= 0x0206)
+ if (grub_le_to_cpu16 (params->version) >= 0x0208)
+ {
+ params->v0208.efi_mem_desc_size = efi_desc_size;
+ params->v0208.efi_mem_desc_version = efi_desc_version;
+ params->v0208.efi_mmap = efi_mmap_target;
+ params->v0208.efi_mmap_size = efi_mmap_size;
+
+#ifdef __x86_64__
+ params->v0206.efi_mmap_hi = (efi_mmap_target >> 32);
+#endif
+ }
+ else if (grub_le_to_cpu16 (params->version) >= 0x0206)
{
params->v0206.efi_mem_desc_size = efi_desc_size;
params->v0206.efi_mem_desc_version = efi_desc_version;
params->v0206.efi_mmap = efi_mmap_target;
params->v0206.efi_mmap_size = efi_mmap_size;
-#ifdef __x86_64__
- params->v0206.efi_mmap_hi = (efi_mmap_target >> 32);
-#endif
}
else if (grub_le_to_cpu16 (params->version) >= 0x0204)
{
params->font_size = 16; /* XXX */
#ifdef GRUB_MACHINE_EFI
- if (grub_le_to_cpu16 (params->version) >= 0x0206)
+#ifdef __x86_64__
+ if (grub_le_to_cpu16 (params->version < 0x0208) &&
+ ((grub_addr_t) grub_efi_system_table >> 32) != 0)
+ return grub_error(GRUB_ERR_BAD_OS,
+ "kernel does not support 64-bit addressing");
+#endif
+
+ if (grub_le_to_cpu16 (params->version) >= 0x0208)
{
params->v0206.efi_signature = GRUB_LINUX_EFI_SIGNATURE;
params->v0206.efi_system_table = (grub_uint32_t) (unsigned long) grub_efi_system_table;
params->v0206.efi_system_table_hi = (grub_uint32_t) ((grub_uint64_t) grub_efi_system_table >> 32);
#endif
}
+ else if (grub_le_to_cpu16 (params->version) >= 0x0206)
+ {
+ params->v0206.efi_signature = GRUB_LINUX_EFI_SIGNATURE;
+ params->v0206.efi_system_table = (grub_uint32_t) (unsigned long) grub_efi_system_table;
+ }
else if (grub_le_to_cpu16 (params->version) >= 0x0204)
{
params->v0204.efi_signature = GRUB_LINUX_EFI_SIGNATURE_0204;
grub_uint32_t efi_mmap_size; /* 1cc */
grub_uint32_t efi_mmap; /* 1d0 */
} v0204;
+ struct
+ {
+ grub_uint32_t padding7_1; /* 1b8 */
+ grub_uint32_t padding7_2; /* 1bc */
+ grub_uint32_t efi_signature; /* 1c0 */
+ grub_uint32_t efi_system_table; /* 1c4 */
+ grub_uint32_t efi_mem_desc_size; /* 1c8 */
+ grub_uint32_t efi_mem_desc_version; /* 1cc */
+ grub_uint32_t efi_mmap; /* 1d0 */
+ grub_uint32_t efi_mmap_size; /* 1d4 */
+ } v0206;
struct
{
grub_uint32_t padding7_1; /* 1b8 */
grub_uint32_t efi_mmap_size; /* 1d4 */
grub_uint32_t efi_system_table_hi; /* 1d8 */
grub_uint32_t efi_mmap_hi; /* 1dc */
- } v0206;
+ } v0208;
};
grub_uint32_t alt_mem; /* 1e0 */