diff options
author | Jackie Huang <jackie.huang@windriver.com> | 2013-11-15 03:36:20 -0500 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2013-12-14 09:11:11 +0000 |
commit | e0d4865bbd3f619fd1aeca261e4c4d664eddcc6e (patch) | |
tree | d9d34b013d0f4ef9d5d628a00b32e69fcd6f6037 /meta/recipes-bsp/grub | |
parent | 40b73e46605a3b4914983301195605162927dcb7 (diff) | |
download | poky-e0d4865bbd3f619fd1aeca261e4c4d664eddcc6e.tar.gz |
grub-efi: allow compilation without large model support
-mcmodel=large is not supported by gcc with version lower
than 4.4, but we don't need to use memory over 4GiB, so add
a patch to allow compilation without large model support.
(From OE-Core rev: 1d005240bcbcca97126bddb1f6d4882ba4d81fa9)
Signed-off-by: Jackie Huang <jackie.huang@windriver.com>
Signed-off-by: Saul Wold <sgw@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/recipes-bsp/grub')
-rw-r--r-- | meta/recipes-bsp/grub/files/grub-efi-allow-a-compilation-without-mcmodel-large.patch | 131 | ||||
-rw-r--r-- | meta/recipes-bsp/grub/grub-efi_2.00.bb | 1 |
2 files changed, 132 insertions, 0 deletions
diff --git a/meta/recipes-bsp/grub/files/grub-efi-allow-a-compilation-without-mcmodel-large.patch b/meta/recipes-bsp/grub/files/grub-efi-allow-a-compilation-without-mcmodel-large.patch new file mode 100644 index 0000000000..4588fca4ba --- /dev/null +++ b/meta/recipes-bsp/grub/files/grub-efi-allow-a-compilation-without-mcmodel-large.patch | |||
@@ -0,0 +1,131 @@ | |||
1 | Allow a compilation without -mcmodel=large | ||
2 | |||
3 | It's provided by Vladimir Serbinenko, and he will commit | ||
4 | it upstream so it should be backport patch. | ||
5 | |||
6 | Upstream-Status: Backport | ||
7 | |||
8 | Signed-off-by: Jackie Huang <jackie.huang@windriver.com> | ||
9 | |||
10 | -- | ||
11 | diff --git a/configure.ac b/configure.ac | ||
12 | index 9f8fb8a..2c5e6ed 100644 | ||
13 | --- a/configure.ac | ||
14 | +++ b/configure.ac | ||
15 | @@ -723,9 +723,7 @@ if test "$target_cpu" = x86_64; then | ||
16 | [grub_cv_cc_mcmodel=yes], | ||
17 | [grub_cv_cc_mcmodel=no]) | ||
18 | ]) | ||
19 | - if test "x$grub_cv_cc_mcmodel" = xno; then | ||
20 | - AC_MSG_ERROR([-mcmodel=large not supported. Upgrade your gcc.]) | ||
21 | - else | ||
22 | + if test "x$grub_cv_cc_mcmodel" = xyes; then | ||
23 | TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=large" | ||
24 | fi | ||
25 | fi | ||
26 | diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c | ||
27 | index 1409b5d..6e9dace 100644 | ||
28 | --- a/grub-core/kern/efi/mm.c | ||
29 | +++ b/grub-core/kern/efi/mm.c | ||
30 | @@ -32,6 +32,12 @@ | ||
31 | #define BYTES_TO_PAGES(bytes) (((bytes) + 0xfff) >> 12) | ||
32 | #define PAGES_TO_BYTES(pages) ((pages) << 12) | ||
33 | |||
34 | +#if defined (__code_model_large__) || !defined (__x86_64__) | ||
35 | +#define MAX_USABLE_ADDRESS 0xffffffff | ||
36 | +#else | ||
37 | +#define MAX_USABLE_ADDRESS 0x7fffffff | ||
38 | +#endif | ||
39 | + | ||
40 | /* The size of a memory map obtained from the firmware. This must be | ||
41 | a multiplier of 4KB. */ | ||
42 | #define MEMORY_MAP_SIZE 0x3000 | ||
43 | @@ -58,7 +64,7 @@ grub_efi_allocate_pages (grub_efi_physical_address_t address, | ||
44 | |||
45 | #if 1 | ||
46 | /* Limit the memory access to less than 4GB for 32-bit platforms. */ | ||
47 | - if (address > 0xffffffff) | ||
48 | + if (address > MAX_USABLE_ADDRESS) | ||
49 | return 0; | ||
50 | #endif | ||
51 | |||
52 | @@ -66,7 +72,7 @@ grub_efi_allocate_pages (grub_efi_physical_address_t address, | ||
53 | if (address == 0) | ||
54 | { | ||
55 | type = GRUB_EFI_ALLOCATE_MAX_ADDRESS; | ||
56 | - address = 0xffffffff; | ||
57 | + address = MAX_USABLE_ADDRESS; | ||
58 | } | ||
59 | else | ||
60 | type = GRUB_EFI_ALLOCATE_ADDRESS; | ||
61 | @@ -86,7 +92,7 @@ grub_efi_allocate_pages (grub_efi_physical_address_t address, | ||
62 | { | ||
63 | /* Uggh, the address 0 was allocated... This is too annoying, | ||
64 | so reallocate another one. */ | ||
65 | - address = 0xffffffff; | ||
66 | + address = MAX_USABLE_ADDRESS; | ||
67 | status = efi_call_4 (b->allocate_pages, type, GRUB_EFI_LOADER_DATA, pages, &address); | ||
68 | grub_efi_free_pages (0, pages); | ||
69 | if (status != GRUB_EFI_SUCCESS) | ||
70 | @@ -319,7 +325,7 @@ filter_memory_map (grub_efi_memory_descriptor_t *memory_map, | ||
71 | { | ||
72 | if (desc->type == GRUB_EFI_CONVENTIONAL_MEMORY | ||
73 | #if 1 | ||
74 | - && desc->physical_start <= 0xffffffff | ||
75 | + && desc->physical_start <= MAX_USABLE_ADDRESS | ||
76 | #endif | ||
77 | && desc->physical_start + PAGES_TO_BYTES (desc->num_pages) > 0x100000 | ||
78 | && desc->num_pages != 0) | ||
79 | @@ -337,9 +343,9 @@ filter_memory_map (grub_efi_memory_descriptor_t *memory_map, | ||
80 | #if 1 | ||
81 | if (BYTES_TO_PAGES (filtered_desc->physical_start) | ||
82 | + filtered_desc->num_pages | ||
83 | - > BYTES_TO_PAGES (0x100000000LL)) | ||
84 | + > BYTES_TO_PAGES (MAX_USABLE_ADDRESS+1LL)) | ||
85 | filtered_desc->num_pages | ||
86 | - = (BYTES_TO_PAGES (0x100000000LL) | ||
87 | + = (BYTES_TO_PAGES (MAX_USABLE_ADDRESS+1LL) | ||
88 | - BYTES_TO_PAGES (filtered_desc->physical_start)); | ||
89 | #endif | ||
90 | |||
91 | diff --git a/grub-core/kern/x86_64/dl.c b/grub-core/kern/x86_64/dl.c | ||
92 | index 65f09ef..17c1215 100644 | ||
93 | --- a/grub-core/kern/x86_64/dl.c | ||
94 | +++ b/grub-core/kern/x86_64/dl.c | ||
95 | @@ -100,14 +100,32 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr) | ||
96 | break; | ||
97 | |||
98 | case R_X86_64_PC32: | ||
99 | - *addr32 += rel->r_addend + sym->st_value - | ||
100 | - (Elf64_Xword) seg->addr - rel->r_offset; | ||
101 | + { | ||
102 | + grub_int64_t value; | ||
103 | + value = ((grub_int32_t) *addr32) + rel->r_addend + sym->st_value - | ||
104 | + (Elf64_Xword) seg->addr - rel->r_offset; | ||
105 | + if (value != (grub_int32_t) value) | ||
106 | + return grub_error (GRUB_ERR_BAD_MODULE, "relocation out of range"); | ||
107 | + *addr32 = value; | ||
108 | + } | ||
109 | break; | ||
110 | |||
111 | case R_X86_64_32: | ||
112 | + { | ||
113 | + grub_uint64_t value = *addr32 + rel->r_addend + sym->st_value; | ||
114 | + if (value != (grub_uint32_t) value) | ||
115 | + return grub_error (GRUB_ERR_BAD_MODULE, "relocation out of range"); | ||
116 | + *addr32 = value; | ||
117 | + } | ||
118 | + break; | ||
119 | case R_X86_64_32S: | ||
120 | - *addr32 += rel->r_addend + sym->st_value; | ||
121 | - break; | ||
122 | + { | ||
123 | + grub_int64_t value = ((grub_int32_t) *addr32) + rel->r_addend + sym->st_value; | ||
124 | + if (value != (grub_int32_t) value) | ||
125 | + return grub_error (GRUB_ERR_BAD_MODULE, "relocation out of range"); | ||
126 | + *addr32 = value; | ||
127 | + } | ||
128 | + break; | ||
129 | |||
130 | default: | ||
131 | return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, | ||
diff --git a/meta/recipes-bsp/grub/grub-efi_2.00.bb b/meta/recipes-bsp/grub/grub-efi_2.00.bb index 2fe688cb35..deb95149b3 100644 --- a/meta/recipes-bsp/grub/grub-efi_2.00.bb +++ b/meta/recipes-bsp/grub/grub-efi_2.00.bb | |||
@@ -27,6 +27,7 @@ SRC_URI = "ftp://ftp.gnu.org/gnu/grub/grub-${PV}.tar.gz \ | |||
27 | file://grub-no-unused-result.patch \ | 27 | file://grub-no-unused-result.patch \ |
28 | file://grub-2.00-ignore-gnulib-gets-stupidity.patch \ | 28 | file://grub-2.00-ignore-gnulib-gets-stupidity.patch \ |
29 | file://fix-issue-with-flex-2.5.37.patch \ | 29 | file://fix-issue-with-flex-2.5.37.patch \ |
30 | file://grub-efi-allow-a-compilation-without-mcmodel-large.patch \ | ||
30 | " | 31 | " |
31 | SRC_URI[md5sum] = "e927540b6eda8b024fb0391eeaa4091c" | 32 | SRC_URI[md5sum] = "e927540b6eda8b024fb0391eeaa4091c" |
32 | SRC_URI[sha256sum] = "65b39a0558f8c802209c574f4d02ca263a804e8a564bc6caf1cd0fd3b3cc11e3" | 33 | SRC_URI[sha256sum] = "65b39a0558f8c802209c574f4d02ca263a804e8a564bc6caf1cd0fd3b3cc11e3" |