You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
3.1 KiB
72 lines
3.1 KiB
8 months ago
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||
|
From: Peter Jones <pjones@redhat.com>
|
||
|
Date: Thu, 16 Aug 2018 11:08:11 -0400
|
||
|
Subject: [PATCH] Make linux_arm_kernel_header.hdr_offset be at the right place
|
||
|
|
||
|
The kernel in front of me (slightly edited to make objdump work) looks like:
|
||
|
|
||
|
00000000 4d 5a 10 13 4d 5a 10 13 4d 5a 10 13 4d 5a 10 13 |MZ..MZ..MZ..MZ..|
|
||
|
00000010 4d 5a 10 13 4d 5a 10 13 4d 5a 10 13 00 00 a0 e1 |MZ..MZ..MZ......|
|
||
|
00000020 f6 03 00 ea 18 28 6f 01 00 00 00 00 00 32 74 00 |.....(o......2t.|
|
||
|
00000030 01 02 03 04 45 45 45 45 74 a2 00 00 40 00 00 00 |....EEEEt...@...|
|
||
|
00000040 50 45 00 00 4c 01 04 00 00 00 00 00 00 00 00 00 |PE..L...........|
|
||
|
00000050 00 00 00 00 90 00 06 03 0b 01 02 14 00 20 74 00 |............. t.|
|
||
|
00000060 00 14 00 00 00 00 00 00 b4 19 00 00 00 10 00 00 |................|
|
||
|
00000070 00 30 74 00 00 00 00 00 00 10 00 00 00 02 00 00 |.0t.............|
|
||
|
00000080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
|
||
|
00000090 00 44 74 00 00 10 00 00 00 00 00 00 0a 00 00 00 |.Dt.............|
|
||
|
000000a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
|
||
|
000000b0 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 |................|
|
||
|
000000c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
|
||
|
*
|
||
|
|
||
|
(I don't know why the MZ header is there 7 times, but the offsets work out, so
|
||
|
it's merely a surprising distraction.)
|
||
|
|
||
|
If linux_arm_kernel_header.reserved2 is 16 bytes, that means hdr_offset is
|
||
|
here:
|
||
|
|
||
|
00000030 01 02 03 04 45 45 45 45 74 a2 00 00 40 00 00 00 |....EEEEt...@...|
|
||
|
00000040 50 45 00 00 4c 01 04 00 00 00 00 00 00 00 00 00 |PE..L...........|
|
||
|
^^^^^^^^^^^
|
||
|
|
||
|
But it's supposed to be 4 bytes before that.
|
||
|
|
||
|
This patch makes the reserved field be 3*32 instead of 4*32, and that means we
|
||
|
can find the PE header correcrtly at 0x40 by reading the value at 0x3c.
|
||
|
|
||
|
Signed-off-by: Peter Jones <pjones@redhat.com>
|
||
|
---
|
||
|
grub-core/loader/efi/linux.c | 3 +++
|
||
|
include/grub/arm/linux.h | 2 +-
|
||
|
2 files changed, 4 insertions(+), 1 deletion(-)
|
||
|
|
||
|
diff --git a/grub-core/loader/efi/linux.c b/grub-core/loader/efi/linux.c
|
||
|
index 0622dfa48..b56ea0bc0 100644
|
||
|
--- a/grub-core/loader/efi/linux.c
|
||
|
+++ b/grub-core/loader/efi/linux.c
|
||
|
@@ -79,7 +79,10 @@ grub_efi_linux_boot (void *kernel_addr, grub_off_t handover_offset,
|
||
|
offset = 512;
|
||
|
#endif
|
||
|
|
||
|
+ grub_dprintf ("linux", "kernel_addr: %p handover_offset: %p params: %p\n",
|
||
|
+ kernel_addr, (void *)(grub_efi_uintn_t)handover_offset, kernel_params);
|
||
|
hf = (handover_func)((char *)kernel_addr + handover_offset + offset);
|
||
|
+ grub_dprintf ("linux", "handover_func() = %p\n", hf);
|
||
|
hf (grub_efi_image_handle, grub_efi_system_table, kernel_params);
|
||
|
|
||
|
return GRUB_ERR_BUG;
|
||
|
diff --git a/include/grub/arm/linux.h b/include/grub/arm/linux.h
|
||
|
index 5900fc8a4..bed308f22 100644
|
||
|
--- a/include/grub/arm/linux.h
|
||
|
+++ b/include/grub/arm/linux.h
|
||
|
@@ -31,7 +31,7 @@ struct linux_arm_kernel_header {
|
||
|
grub_uint32_t magic;
|
||
|
grub_uint32_t start; /* _start */
|
||
|
grub_uint32_t end; /* _edata */
|
||
|
- grub_uint32_t reserved2[4];
|
||
|
+ grub_uint32_t reserved2[3];
|
||
|
grub_uint32_t hdr_offset;
|
||
|
};
|
||
|
|