History

Merge tag 'x86-boot-2023-02-20' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull x86 boot updates from Ingo Molnar: - Robustify/fix calling startup_{32,64}() from the decompressor code, and removing x86 quirk from scripts/head-object-list.txt as a result. - Do not register processors that cannot be onlined for x2APIC * tag 'x86-boot-2023-02-20' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86/acpi/boot: Do not register processors that cannot be onlined for x2APIC scripts/head-object-list: Remove x86 from the list x86/boot: Robustify calling startup_{32,64}() from the decompressor code

Linus Torvalds committed 3 years ago

Commit 35011c62 parents 6be3daf e2869bd5 files · +29 −18Browse files

Unified · Split

5 files
  1. arch/x86/boot/compressed/head_32.S +1 −1
  2. arch/x86/boot/compressed/head_64.S +1 −1
  3. arch/x86/boot/compressed/misc.c +11 −7
  4. arch/x86/kernel/acpi/boot.c +16 −3
  5. scripts/head-object-list.txt +0 −6
arch/x86/boot/compressed/head_32.S+1−1
@@ -187,7 +187,7 @@ SYM_FUNC_START_LOCAL_NOALIGN(.Lrelocated) · 186 unmodified lines
187 leal boot_heap@GOTOFF(%ebx), %eax187 leal boot_heap@GOTOFF(%ebx), %eax
188 pushl %eax /* heap area */188 pushl %eax /* heap area */
189 pushl %esi /* real mode pointer */189 pushl %esi /* real mode pointer */
190 call extract_kernel /* returns kernel location in %eax */190 call extract_kernel /* returns kernel entry point in %eax */
191 addl $24, %esp191 addl $24, %esp
192 192
193/*193/*
arch/x86/boot/compressed/head_64.S+1−1
@@ -569,7 +569,7 @@ SYM_FUNC_START_LOCAL_NOALIGN(.Lrelocated) · 568 unmodified lines
569 movl input_len(%rip), %ecx /* input_len */569 movl input_len(%rip), %ecx /* input_len */
570 movq %rbp, %r8 /* output target address */570 movq %rbp, %r8 /* output target address */
571 movl output_len(%rip), %r9d /* decompressed length, end of relocs */571 movl output_len(%rip), %r9d /* decompressed length, end of relocs */
572 call extract_kernel /* returns kernel location in %rax */572 call extract_kernel /* returns kernel entry point in %rax */
573 popq %rsi573 popq %rsi
574 574
575/*575/*
arch/x86/boot/compressed/misc.c+11−7
@@ -277,7 +277,7 @@ static inline void handle_relocations(void *output, unsigned long output_len, · 276 unmodified lines
277{ }277{ }
278#endif278#endif
279 279
280static void parse_elf(void *output)280static size_t parse_elf(void *output)
281{281{
282#ifdef CONFIG_X86_64282#ifdef CONFIG_X86_64
283 Elf64_Ehdr ehdr;283 Elf64_Ehdr ehdr;
@@ -293,10 +293,8 @@ static void parse_elf(void *output) · 9 unmodified lines
293 if (ehdr.e_ident[EI_MAG0] != ELFMAG0 ||293 if (ehdr.e_ident[EI_MAG0] != ELFMAG0 ||
294 ehdr.e_ident[EI_MAG1] != ELFMAG1 ||294 ehdr.e_ident[EI_MAG1] != ELFMAG1 ||
295 ehdr.e_ident[EI_MAG2] != ELFMAG2 ||295 ehdr.e_ident[EI_MAG2] != ELFMAG2 ||
296 ehdr.e_ident[EI_MAG3] != ELFMAG3) {296 ehdr.e_ident[EI_MAG3] != ELFMAG3)
297 error("Kernel is not a valid ELF file");297 error("Kernel is not a valid ELF file");
298 return;
299 }
300 298
301 debug_putstr("Parsing ELF... ");299 debug_putstr("Parsing ELF... ");
302 300
@@ -328,6 +326,8 @@ static void parse_elf(void *output) · 25 unmodified lines
328 }326 }
329 327
330 free(phdrs);328 free(phdrs);
329
330 return ehdr.e_entry - LOAD_PHYSICAL_ADDR;
331}331}
332 332
333/*333/*
@@ -356,6 +356,7 @@ asmlinkage __visible void *extract_kernel(void *rmode, memptr heap, · 22 unmodified lines
356 const unsigned long kernel_total_size = VO__end - VO__text;356 const unsigned long kernel_total_size = VO__end - VO__text;
357 unsigned long virt_addr = LOAD_PHYSICAL_ADDR;357 unsigned long virt_addr = LOAD_PHYSICAL_ADDR;
358 unsigned long needed_size;358 unsigned long needed_size;
359 size_t entry_offset;
359 360
360 /* Retain x86 boot parameters pointer passed from startup_32/64. */361 /* Retain x86 boot parameters pointer passed from startup_32/64. */
361 boot_params = rmode;362 boot_params = rmode;
@@ -456,14 +457,17 @@ asmlinkage __visible void *extract_kernel(void *rmode, memptr heap, · 94 unmodified lines
456 debug_putstr("\nDecompressing Linux... ");457 debug_putstr("\nDecompressing Linux... ");
457 __decompress(input_data, input_len, NULL, NULL, output, output_len,458 __decompress(input_data, input_len, NULL, NULL, output, output_len,
458 NULL, error);459 NULL, error);
459 parse_elf(output);460 entry_offset = parse_elf(output);
460 handle_relocations(output, output_len, virt_addr);461 handle_relocations(output, output_len, virt_addr);
461 debug_putstr("done.\nBooting the kernel.\n");462
463 debug_putstr("done.\nBooting the kernel (entry_offset: 0x");
464 debug_puthex(entry_offset);
465 debug_putstr(").\n");
462 466
463 /* Disable exception handling before booting the kernel */467 /* Disable exception handling before booting the kernel */
464 cleanup_exception_handling();468 cleanup_exception_handling();
465 469
466 return output;470 return output + entry_offset;
467}471}
468 472
469void fortify_panic(const char *name)473void fortify_panic(const char *name)
arch/x86/kernel/acpi/boot.c+16−3
@@ -188,6 +188,17 @@ static int acpi_register_lapic(int id, u32 acpiid, u8 enabled) · 187 unmodified lines
188 return cpu;188 return cpu;
189}189}
190 190
191static bool __init acpi_is_processor_usable(u32 lapic_flags)
192{
193 if (lapic_flags & ACPI_MADT_ENABLED)
194 return true;
195
196 if (acpi_support_online_capable && (lapic_flags & ACPI_MADT_ONLINE_CAPABLE))
197 return true;
198
199 return false;
200}
201
191static int __init202static int __init
192acpi_parse_x2apic(union acpi_subtable_headers *header, const unsigned long end)203acpi_parse_x2apic(union acpi_subtable_headers *header, const unsigned long end)
193{204{
@@ -212,6 +223,10 @@ acpi_parse_x2apic(union acpi_subtable_headers *header, const unsigned long end) · 18 unmodified lines
212 if (apic_id == 0xffffffff)223 if (apic_id == 0xffffffff)
213 return 0;224 return 0;
214 225
226 /* don't register processors that cannot be onlined */
227 if (!acpi_is_processor_usable(processor->lapic_flags))
228 return 0;
229
215 /*230 /*
216 * We need to register disabled CPU as well to permit231 * We need to register disabled CPU as well to permit
217 * counting disabled CPUs. This allows us to size232 * counting disabled CPUs. This allows us to size
@@ -250,9 +265,7 @@ acpi_parse_lapic(union acpi_subtable_headers * header, const unsigned long end) · 32 unmodified lines
250 return 0;265 return 0;
251 266
252 /* don't register processors that can not be onlined */267 /* don't register processors that can not be onlined */
253 if (acpi_support_online_capable &&268 if (!acpi_is_processor_usable(processor->lapic_flags))
254 !(processor->lapic_flags & ACPI_MADT_ENABLED) &&
255 !(processor->lapic_flags & ACPI_MADT_ONLINE_CAPABLE))
256 return 0;269 return 0;
257 270
258 /*271 /*
scripts/head-object-list.txt+0−6
@@ -42,10 +42,4 @@ arch/s390/kernel/head64.o · 41 unmodified lines
42arch/sh/kernel/head_32.o42arch/sh/kernel/head_32.o
43arch/sparc/kernel/head_32.o43arch/sparc/kernel/head_32.o
44arch/sparc/kernel/head_64.o44arch/sparc/kernel/head_64.o
45arch/x86/kernel/head_32.o
46arch/x86/kernel/head_64.o
47arch/x86/kernel/head32.o
48arch/x86/kernel/head64.o
49arch/x86/kernel/ebda.o
50arch/x86/kernel/platform-quirks.o
51arch/xtensa/kernel/head.o45arch/xtensa/kernel/head.o