Commit 7a5e8786 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull x86 fixes from Ingo Molnar:
 "Misc fixes:

  EFI fixes, a build fix, a page table dumping (debug) fix and a clang
  build fix"

* 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  efi/arm64: Fix fdt-related memory reservation
  x86/mm: Apply the section attribute to the variable, not its type
  x86/efi: Fixup GOT in all boot code paths
  x86/efi: Only load initrd above 4g on second try
  x86-64, ptdump: Mark espfix area only if existent
  x86, irq: Fix build error caused by 9eabc99a
parents 9f471129 5ac385d8
...@@ -149,8 +149,7 @@ void __init arm64_memblock_init(void) ...@@ -149,8 +149,7 @@ void __init arm64_memblock_init(void)
memblock_reserve(__virt_to_phys(initrd_start), initrd_end - initrd_start); memblock_reserve(__virt_to_phys(initrd_start), initrd_end - initrd_start);
#endif #endif
if (!efi_enabled(EFI_MEMMAP)) early_init_fdt_scan_reserved_mem();
early_init_fdt_scan_reserved_mem();
/* 4GB maximum for 32-bit only capable devices */ /* 4GB maximum for 32-bit only capable devices */
if (IS_ENABLED(CONFIG_ZONE_DMA)) if (IS_ENABLED(CONFIG_ZONE_DMA))
......
...@@ -1032,7 +1032,6 @@ struct boot_params *make_boot_params(struct efi_config *c) ...@@ -1032,7 +1032,6 @@ struct boot_params *make_boot_params(struct efi_config *c)
int i; int i;
unsigned long ramdisk_addr; unsigned long ramdisk_addr;
unsigned long ramdisk_size; unsigned long ramdisk_size;
unsigned long initrd_addr_max;
efi_early = c; efi_early = c;
sys_table = (efi_system_table_t *)(unsigned long)efi_early->table; sys_table = (efi_system_table_t *)(unsigned long)efi_early->table;
...@@ -1095,15 +1094,20 @@ struct boot_params *make_boot_params(struct efi_config *c) ...@@ -1095,15 +1094,20 @@ struct boot_params *make_boot_params(struct efi_config *c)
memset(sdt, 0, sizeof(*sdt)); memset(sdt, 0, sizeof(*sdt));
if (hdr->xloadflags & XLF_CAN_BE_LOADED_ABOVE_4G)
initrd_addr_max = -1UL;
else
initrd_addr_max = hdr->initrd_addr_max;
status = handle_cmdline_files(sys_table, image, status = handle_cmdline_files(sys_table, image,
(char *)(unsigned long)hdr->cmd_line_ptr, (char *)(unsigned long)hdr->cmd_line_ptr,
"initrd=", initrd_addr_max, "initrd=", hdr->initrd_addr_max,
&ramdisk_addr, &ramdisk_size); &ramdisk_addr, &ramdisk_size);
if (status != EFI_SUCCESS &&
hdr->xloadflags & XLF_CAN_BE_LOADED_ABOVE_4G) {
efi_printk(sys_table, "Trying to load files to higher address\n");
status = handle_cmdline_files(sys_table, image,
(char *)(unsigned long)hdr->cmd_line_ptr,
"initrd=", -1UL,
&ramdisk_addr, &ramdisk_size);
}
if (status != EFI_SUCCESS) if (status != EFI_SUCCESS)
goto fail2; goto fail2;
hdr->ramdisk_image = ramdisk_addr & 0xffffffff; hdr->ramdisk_image = ramdisk_addr & 0xffffffff;
......
...@@ -30,6 +30,33 @@ ...@@ -30,6 +30,33 @@
#include <asm/boot.h> #include <asm/boot.h>
#include <asm/asm-offsets.h> #include <asm/asm-offsets.h>
/*
* Adjust our own GOT
*
* The relocation base must be in %ebx
*
* It is safe to call this macro more than once, because in some of the
* code paths multiple invocations are inevitable, e.g. via the efi*
* entry points.
*
* Relocation is only performed the first time.
*/
.macro FIXUP_GOT
cmpb $1, got_fixed(%ebx)
je 2f
leal _got(%ebx), %edx
leal _egot(%ebx), %ecx
1:
cmpl %ecx, %edx
jae 2f
addl %ebx, (%edx)
addl $4, %edx
jmp 1b
2:
movb $1, got_fixed(%ebx)
.endm
__HEAD __HEAD
ENTRY(startup_32) ENTRY(startup_32)
#ifdef CONFIG_EFI_STUB #ifdef CONFIG_EFI_STUB
...@@ -56,6 +83,9 @@ ENTRY(efi_pe_entry) ...@@ -56,6 +83,9 @@ ENTRY(efi_pe_entry)
add %esi, 88(%eax) add %esi, 88(%eax)
pushl %eax pushl %eax
movl %esi, %ebx
FIXUP_GOT
call make_boot_params call make_boot_params
cmpl $0, %eax cmpl $0, %eax
je fail je fail
...@@ -81,6 +111,10 @@ ENTRY(efi32_stub_entry) ...@@ -81,6 +111,10 @@ ENTRY(efi32_stub_entry)
leal efi32_config(%esi), %eax leal efi32_config(%esi), %eax
add %esi, 88(%eax) add %esi, 88(%eax)
pushl %eax pushl %eax
movl %esi, %ebx
FIXUP_GOT
2: 2:
call efi_main call efi_main
cmpl $0, %eax cmpl $0, %eax
...@@ -190,19 +224,7 @@ relocated: ...@@ -190,19 +224,7 @@ relocated:
shrl $2, %ecx shrl $2, %ecx
rep stosl rep stosl
/* FIXUP_GOT
* Adjust our own GOT
*/
leal _got(%ebx), %edx
leal _egot(%ebx), %ecx
1:
cmpl %ecx, %edx
jae 2f
addl %ebx, (%edx)
addl $4, %edx
jmp 1b
2:
/* /*
* Do the decompression, and jump to the new kernel.. * Do the decompression, and jump to the new kernel..
*/ */
...@@ -225,8 +247,12 @@ relocated: ...@@ -225,8 +247,12 @@ relocated:
xorl %ebx, %ebx xorl %ebx, %ebx
jmp *%eax jmp *%eax
#ifdef CONFIG_EFI_STUB
.data .data
/* Have we relocated the GOT? */
got_fixed:
.byte 0
#ifdef CONFIG_EFI_STUB
efi32_config: efi32_config:
.fill 11,8,0 .fill 11,8,0
.long efi_call_phys .long efi_call_phys
......
...@@ -32,6 +32,33 @@ ...@@ -32,6 +32,33 @@
#include <asm/processor-flags.h> #include <asm/processor-flags.h>
#include <asm/asm-offsets.h> #include <asm/asm-offsets.h>
/*
* Adjust our own GOT
*
* The relocation base must be in %rbx
*
* It is safe to call this macro more than once, because in some of the
* code paths multiple invocations are inevitable, e.g. via the efi*
* entry points.
*
* Relocation is only performed the first time.
*/
.macro FIXUP_GOT
cmpb $1, got_fixed(%rip)
je 2f
leaq _got(%rip), %rdx
leaq _egot(%rip), %rcx
1:
cmpq %rcx, %rdx
jae 2f
addq %rbx, (%rdx)
addq $8, %rdx
jmp 1b
2:
movb $1, got_fixed(%rip)
.endm
__HEAD __HEAD
.code32 .code32
ENTRY(startup_32) ENTRY(startup_32)
...@@ -252,10 +279,13 @@ ENTRY(efi_pe_entry) ...@@ -252,10 +279,13 @@ ENTRY(efi_pe_entry)
subq $1b, %rbp subq $1b, %rbp
/* /*
* Relocate efi_config->call(). * Relocate efi_config->call() and the GOT entries.
*/ */
addq %rbp, efi64_config+88(%rip) addq %rbp, efi64_config+88(%rip)
movq %rbp, %rbx
FIXUP_GOT
movq %rax, %rdi movq %rax, %rdi
call make_boot_params call make_boot_params
cmpq $0,%rax cmpq $0,%rax
...@@ -271,10 +301,13 @@ handover_entry: ...@@ -271,10 +301,13 @@ handover_entry:
subq $1b, %rbp subq $1b, %rbp
/* /*
* Relocate efi_config->call(). * Relocate efi_config->call() and the GOT entries.
*/ */
movq efi_config(%rip), %rax movq efi_config(%rip), %rax
addq %rbp, 88(%rax) addq %rbp, 88(%rax)
movq %rbp, %rbx
FIXUP_GOT
2: 2:
movq efi_config(%rip), %rdi movq efi_config(%rip), %rdi
call efi_main call efi_main
...@@ -385,19 +418,8 @@ relocated: ...@@ -385,19 +418,8 @@ relocated:
shrq $3, %rcx shrq $3, %rcx
rep stosq rep stosq
/* FIXUP_GOT
* Adjust our own GOT
*/
leaq _got(%rip), %rdx
leaq _egot(%rip), %rcx
1:
cmpq %rcx, %rdx
jae 2f
addq %rbx, (%rdx)
addq $8, %rdx
jmp 1b
2:
/* /*
* Do the decompression, and jump to the new kernel.. * Do the decompression, and jump to the new kernel..
*/ */
...@@ -437,6 +459,10 @@ gdt: ...@@ -437,6 +459,10 @@ gdt:
.quad 0x0000000000000000 /* TS continued */ .quad 0x0000000000000000 /* TS continued */
gdt_end: gdt_end:
/* Have we relocated the GOT? */
got_fixed:
.byte 0
#ifdef CONFIG_EFI_STUB #ifdef CONFIG_EFI_STUB
efi_config: efi_config:
.quad 0 .quad 0
......
...@@ -239,6 +239,7 @@ static inline int mp_find_ioapic(u32 gsi) { return 0; } ...@@ -239,6 +239,7 @@ static inline int mp_find_ioapic(u32 gsi) { return 0; }
static inline u32 mp_pin_to_gsi(int ioapic, int pin) { return UINT_MAX; } static inline u32 mp_pin_to_gsi(int ioapic, int pin) { return UINT_MAX; }
static inline int mp_map_gsi_to_irq(u32 gsi, unsigned int flags) { return gsi; } static inline int mp_map_gsi_to_irq(u32 gsi, unsigned int flags) { return gsi; }
static inline void mp_unmap_irq(int irq) { } static inline void mp_unmap_irq(int irq) { }
static inline bool mp_should_keep_irq(struct device *dev) { return 1; }
static inline int save_ioapic_entries(void) static inline int save_ioapic_entries(void)
{ {
......
...@@ -48,7 +48,9 @@ enum address_markers_idx { ...@@ -48,7 +48,9 @@ enum address_markers_idx {
LOW_KERNEL_NR, LOW_KERNEL_NR,
VMALLOC_START_NR, VMALLOC_START_NR,
VMEMMAP_START_NR, VMEMMAP_START_NR,
# ifdef CONFIG_X86_ESPFIX64
ESPFIX_START_NR, ESPFIX_START_NR,
# endif
HIGH_KERNEL_NR, HIGH_KERNEL_NR,
MODULES_VADDR_NR, MODULES_VADDR_NR,
MODULES_END_NR, MODULES_END_NR,
...@@ -71,7 +73,9 @@ static struct addr_marker address_markers[] = { ...@@ -71,7 +73,9 @@ static struct addr_marker address_markers[] = {
{ PAGE_OFFSET, "Low Kernel Mapping" }, { PAGE_OFFSET, "Low Kernel Mapping" },
{ VMALLOC_START, "vmalloc() Area" }, { VMALLOC_START, "vmalloc() Area" },
{ VMEMMAP_START, "Vmemmap" }, { VMEMMAP_START, "Vmemmap" },
# ifdef CONFIG_X86_ESPFIX64
{ ESPFIX_BASE_ADDR, "ESPfix Area", 16 }, { ESPFIX_BASE_ADDR, "ESPfix Area", 16 },
# endif
{ __START_KERNEL_map, "High Kernel Mapping" }, { __START_KERNEL_map, "High Kernel Mapping" },
{ MODULES_VADDR, "Modules" }, { MODULES_VADDR, "Modules" },
{ MODULES_END, "End Modules" }, { MODULES_END, "End Modules" },
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
#include <linux/sched.h> #include <linux/sched.h>
#include <asm/elf.h> #include <asm/elf.h>
struct __read_mostly va_alignment va_align = { struct va_alignment __read_mostly va_align = {
.flags = -1, .flags = -1,
}; };
......
...@@ -22,7 +22,7 @@ efi_status_t update_fdt(efi_system_table_t *sys_table, void *orig_fdt, ...@@ -22,7 +22,7 @@ efi_status_t update_fdt(efi_system_table_t *sys_table, void *orig_fdt,
unsigned long map_size, unsigned long desc_size, unsigned long map_size, unsigned long desc_size,
u32 desc_ver) u32 desc_ver)
{ {
int node, prev; int node, prev, num_rsv;
int status; int status;
u32 fdt_val32; u32 fdt_val32;
u64 fdt_val64; u64 fdt_val64;
...@@ -73,6 +73,14 @@ efi_status_t update_fdt(efi_system_table_t *sys_table, void *orig_fdt, ...@@ -73,6 +73,14 @@ efi_status_t update_fdt(efi_system_table_t *sys_table, void *orig_fdt,
prev = node; prev = node;
} }
/*
* Delete all memory reserve map entries. When booting via UEFI,
* kernel will use the UEFI memory map to find reserved regions.
*/
num_rsv = fdt_num_mem_rsv(fdt);
while (num_rsv-- > 0)
fdt_del_mem_rsv(fdt, num_rsv);
node = fdt_subnode_offset(fdt, 0, "chosen"); node = fdt_subnode_offset(fdt, 0, "chosen");
if (node < 0) { if (node < 0) {
node = fdt_add_subnode(fdt, 0, "chosen"); node = fdt_add_subnode(fdt, 0, "chosen");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment