diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-04-11 14:58:33 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-04-11 14:58:33 -0400 |
commit | 8eab6cd031c11071cf88138b2fed19beaa216435 (patch) | |
tree | e9ff30c4786fd8de87ee297306b139315a9cfdde /arch/x86/boot | |
parent | ede1d63fccb7a397832ddbdee5951ec65194d93e (diff) | |
parent | b3b42ac2cbae1f3cecbb6229964a4d48af31d382 (diff) |
Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 fixes from Peter Anvin:
"This is a collection of minor fixes for x86, plus the IRET information
leak fix (forbid the use of 16-bit segments in 64-bit mode)"
NOTE! We may have to relax the "forbid the use of 16-bit segments in
64-bit mode" part, since there may be people who still run and depend on
16-bit Windows binaries under Wine.
But I'm taking this in the current unconditional form for now to see who
(if anybody) screams bloody murder. Maybe nobody cares. And maybe
we'll have to update it with some kind of runtime enablement (like our
vm.mmap_min_addr tunable that people who run dosemu/qemu/wine already
need to tweak).
* 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
x86-64, modify_ldt: Ban 16-bit segments on 64-bit kernels
efi: Pass correct file handle to efi_file_{read,close}
x86/efi: Correct EFI boot stub use of code32_start
x86/efi: Fix boot failure with EFI stub
x86/platform/hyperv: Handle VMBUS driver being a module
x86/apic: Reinstate error IRQ Pentium erratum 3AP workaround
x86, CMCI: Add proper detection of end of CMCI storms
Diffstat (limited to 'arch/x86/boot')
-rw-r--r-- | arch/x86/boot/compressed/eboot.c | 19 | ||||
-rw-r--r-- | arch/x86/boot/compressed/head_32.S | 8 | ||||
-rw-r--r-- | arch/x86/boot/compressed/head_64.S | 9 |
3 files changed, 15 insertions, 21 deletions
diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c index 1e6146137f8e..4703a6c4b8e3 100644 --- a/arch/x86/boot/compressed/eboot.c +++ b/arch/x86/boot/compressed/eboot.c | |||
@@ -112,7 +112,7 @@ __file_size64(void *__fh, efi_char16_t *filename_16, | |||
112 | efi_file_info_t *info; | 112 | efi_file_info_t *info; |
113 | efi_status_t status; | 113 | efi_status_t status; |
114 | efi_guid_t info_guid = EFI_FILE_INFO_ID; | 114 | efi_guid_t info_guid = EFI_FILE_INFO_ID; |
115 | u32 info_sz; | 115 | u64 info_sz; |
116 | 116 | ||
117 | status = efi_early->call((unsigned long)fh->open, fh, &h, filename_16, | 117 | status = efi_early->call((unsigned long)fh->open, fh, &h, filename_16, |
118 | EFI_FILE_MODE_READ, (u64)0); | 118 | EFI_FILE_MODE_READ, (u64)0); |
@@ -167,31 +167,31 @@ efi_file_size(efi_system_table_t *sys_table, void *__fh, | |||
167 | } | 167 | } |
168 | 168 | ||
169 | static inline efi_status_t | 169 | static inline efi_status_t |
170 | efi_file_read(void *__fh, void *handle, unsigned long *size, void *addr) | 170 | efi_file_read(void *handle, unsigned long *size, void *addr) |
171 | { | 171 | { |
172 | unsigned long func; | 172 | unsigned long func; |
173 | 173 | ||
174 | if (efi_early->is64) { | 174 | if (efi_early->is64) { |
175 | efi_file_handle_64_t *fh = __fh; | 175 | efi_file_handle_64_t *fh = handle; |
176 | 176 | ||
177 | func = (unsigned long)fh->read; | 177 | func = (unsigned long)fh->read; |
178 | return efi_early->call(func, handle, size, addr); | 178 | return efi_early->call(func, handle, size, addr); |
179 | } else { | 179 | } else { |
180 | efi_file_handle_32_t *fh = __fh; | 180 | efi_file_handle_32_t *fh = handle; |
181 | 181 | ||
182 | func = (unsigned long)fh->read; | 182 | func = (unsigned long)fh->read; |
183 | return efi_early->call(func, handle, size, addr); | 183 | return efi_early->call(func, handle, size, addr); |
184 | } | 184 | } |
185 | } | 185 | } |
186 | 186 | ||
187 | static inline efi_status_t efi_file_close(void *__fh, void *handle) | 187 | static inline efi_status_t efi_file_close(void *handle) |
188 | { | 188 | { |
189 | if (efi_early->is64) { | 189 | if (efi_early->is64) { |
190 | efi_file_handle_64_t *fh = __fh; | 190 | efi_file_handle_64_t *fh = handle; |
191 | 191 | ||
192 | return efi_early->call((unsigned long)fh->close, handle); | 192 | return efi_early->call((unsigned long)fh->close, handle); |
193 | } else { | 193 | } else { |
194 | efi_file_handle_32_t *fh = __fh; | 194 | efi_file_handle_32_t *fh = handle; |
195 | 195 | ||
196 | return efi_early->call((unsigned long)fh->close, handle); | 196 | return efi_early->call((unsigned long)fh->close, handle); |
197 | } | 197 | } |
@@ -1016,6 +1016,9 @@ void setup_graphics(struct boot_params *boot_params) | |||
1016 | * Because the x86 boot code expects to be passed a boot_params we | 1016 | * Because the x86 boot code expects to be passed a boot_params we |
1017 | * need to create one ourselves (usually the bootloader would create | 1017 | * need to create one ourselves (usually the bootloader would create |
1018 | * one for us). | 1018 | * one for us). |
1019 | * | ||
1020 | * The caller is responsible for filling out ->code32_start in the | ||
1021 | * returned boot_params. | ||
1019 | */ | 1022 | */ |
1020 | struct boot_params *make_boot_params(struct efi_config *c) | 1023 | struct boot_params *make_boot_params(struct efi_config *c) |
1021 | { | 1024 | { |
@@ -1081,8 +1084,6 @@ struct boot_params *make_boot_params(struct efi_config *c) | |||
1081 | hdr->vid_mode = 0xffff; | 1084 | hdr->vid_mode = 0xffff; |
1082 | hdr->boot_flag = 0xAA55; | 1085 | hdr->boot_flag = 0xAA55; |
1083 | 1086 | ||
1084 | hdr->code32_start = (__u64)(unsigned long)image->image_base; | ||
1085 | |||
1086 | hdr->type_of_loader = 0x21; | 1087 | hdr->type_of_loader = 0x21; |
1087 | 1088 | ||
1088 | /* Convert unicode cmdline to ascii */ | 1089 | /* Convert unicode cmdline to ascii */ |
diff --git a/arch/x86/boot/compressed/head_32.S b/arch/x86/boot/compressed/head_32.S index de9d4200d305..cbed1407a5cd 100644 --- a/arch/x86/boot/compressed/head_32.S +++ b/arch/x86/boot/compressed/head_32.S | |||
@@ -59,6 +59,7 @@ ENTRY(efi_pe_entry) | |||
59 | call make_boot_params | 59 | call make_boot_params |
60 | cmpl $0, %eax | 60 | cmpl $0, %eax |
61 | je fail | 61 | je fail |
62 | movl %esi, BP_code32_start(%eax) | ||
62 | popl %ecx | 63 | popl %ecx |
63 | pushl %eax | 64 | pushl %eax |
64 | pushl %ecx | 65 | pushl %ecx |
@@ -90,12 +91,7 @@ fail: | |||
90 | hlt | 91 | hlt |
91 | jmp fail | 92 | jmp fail |
92 | 2: | 93 | 2: |
93 | call 3f | 94 | movl BP_code32_start(%esi), %eax |
94 | 3: | ||
95 | popl %eax | ||
96 | subl $3b, %eax | ||
97 | subl BP_pref_address(%esi), %eax | ||
98 | add BP_code32_start(%esi), %eax | ||
99 | leal preferred_addr(%eax), %eax | 95 | leal preferred_addr(%eax), %eax |
100 | jmp *%eax | 96 | jmp *%eax |
101 | 97 | ||
diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S index 57e58a5fa210..0d558ee899ae 100644 --- a/arch/x86/boot/compressed/head_64.S +++ b/arch/x86/boot/compressed/head_64.S | |||
@@ -261,6 +261,8 @@ ENTRY(efi_pe_entry) | |||
261 | cmpq $0,%rax | 261 | cmpq $0,%rax |
262 | je fail | 262 | je fail |
263 | mov %rax, %rsi | 263 | mov %rax, %rsi |
264 | leaq startup_32(%rip), %rax | ||
265 | movl %eax, BP_code32_start(%rsi) | ||
264 | jmp 2f /* Skip the relocation */ | 266 | jmp 2f /* Skip the relocation */ |
265 | 267 | ||
266 | handover_entry: | 268 | handover_entry: |
@@ -284,12 +286,7 @@ fail: | |||
284 | hlt | 286 | hlt |
285 | jmp fail | 287 | jmp fail |
286 | 2: | 288 | 2: |
287 | call 3f | 289 | movl BP_code32_start(%esi), %eax |
288 | 3: | ||
289 | popq %rax | ||
290 | subq $3b, %rax | ||
291 | subq BP_pref_address(%rsi), %rax | ||
292 | add BP_code32_start(%esi), %eax | ||
293 | leaq preferred_addr(%rax), %rax | 290 | leaq preferred_addr(%rax), %rax |
294 | jmp *%rax | 291 | jmp *%rax |
295 | 292 | ||