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 9eabc99a63
This commit is contained in:
commit
7a5e87867e
8 changed files with 108 additions and 40 deletions
|
@ -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)
|
||||||
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)
|
||||||
|
|
||||||
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 @@
|
||||||
#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)
|
||||||
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)
|
||||||
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:
|
||||||
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:
|
||||||
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 @@
|
||||||
#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)
|
||||||
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:
|
||||||
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:
|
||||||
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:
|
||||||
.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; }
|
||||||
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 {
|
||||||
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[] = {
|
||||||
{ 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 @@
|
||||||
#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,
|
||||||
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,
|
||||||
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");
|
||||||
|
|
Loading…
Add table
Reference in a new issue