x86/efi: Quirk out SGI UV
Alex reported hitting the following BUG after the EFI 1:1 virtual mapping work was merged, kernel BUG at arch/x86/mm/init_64.c:351! invalid opcode: 0000 [#1] SMP Call Trace: [<ffffffff818aa71d>] init_extra_mapping_uc+0x13/0x15 [<ffffffff818a5e20>] uv_system_init+0x22b/0x124b [<ffffffff8108b886>] ? clockevents_register_device+0x138/0x13d [<ffffffff81028dbb>] ? setup_APIC_timer+0xc5/0xc7 [<ffffffff8108b620>] ? clockevent_delta2ns+0xb/0xd [<ffffffff818a3a92>] ? setup_boot_APIC_clock+0x4a8/0x4b7 [<ffffffff8153d955>] ? printk+0x72/0x74 [<ffffffff818a1757>] native_smp_prepare_cpus+0x389/0x3d6 [<ffffffff818957bc>] kernel_init_freeable+0xb7/0x1fb [<ffffffff81535530>] ? rest_init+0x74/0x74 [<ffffffff81535539>] kernel_init+0x9/0xff [<ffffffff81541dfc>] ret_from_fork+0x7c/0xb0 [<ffffffff81535530>] ? rest_init+0x74/0x74 Getting this thing to work with the new mapping scheme would need more work, so automatically switch to the old memmap layout for SGI UV. Acked-by: Russ Anderson <rja@sgi.com> Cc: Alex Thorlton <athorlton@sgi.com Signed-off-by: Borislav Petkov <bp@suse.de> Signed-off-by: Matt Fleming <matt.fleming@intel.com>
This commit is contained in:
parent
09503379dc
commit
a5d90c923b
@ -134,6 +134,7 @@ extern void efi_setup_page_tables(void);
|
|||||||
extern void __init old_map_region(efi_memory_desc_t *md);
|
extern void __init old_map_region(efi_memory_desc_t *md);
|
||||||
extern void __init runtime_code_page_mkexec(void);
|
extern void __init runtime_code_page_mkexec(void);
|
||||||
extern void __init efi_runtime_mkexec(void);
|
extern void __init efi_runtime_mkexec(void);
|
||||||
|
extern void __init efi_apply_memmap_quirks(void);
|
||||||
|
|
||||||
struct efi_setup_data {
|
struct efi_setup_data {
|
||||||
u64 fw_vendor;
|
u64 fw_vendor;
|
||||||
|
@ -1239,14 +1239,8 @@ void __init setup_arch(char **cmdline_p)
|
|||||||
register_refined_jiffies(CLOCK_TICK_RATE);
|
register_refined_jiffies(CLOCK_TICK_RATE);
|
||||||
|
|
||||||
#ifdef CONFIG_EFI
|
#ifdef CONFIG_EFI
|
||||||
/* Once setup is done above, unmap the EFI memory map on
|
if (efi_enabled(EFI_BOOT))
|
||||||
* mismatched firmware/kernel archtectures since there is no
|
efi_apply_memmap_quirks();
|
||||||
* support for runtime services.
|
|
||||||
*/
|
|
||||||
if (efi_enabled(EFI_BOOT) && !efi_is_native()) {
|
|
||||||
pr_info("efi: Setup done, disabling due to 32/64-bit mismatch\n");
|
|
||||||
efi_unmap_memmap();
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,6 +52,7 @@
|
|||||||
#include <asm/tlbflush.h>
|
#include <asm/tlbflush.h>
|
||||||
#include <asm/x86_init.h>
|
#include <asm/x86_init.h>
|
||||||
#include <asm/rtc.h>
|
#include <asm/rtc.h>
|
||||||
|
#include <asm/uv/uv.h>
|
||||||
|
|
||||||
#define EFI_DEBUG
|
#define EFI_DEBUG
|
||||||
|
|
||||||
@ -1210,3 +1211,22 @@ static int __init parse_efi_cmdline(char *str)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
early_param("efi", parse_efi_cmdline);
|
early_param("efi", parse_efi_cmdline);
|
||||||
|
|
||||||
|
void __init efi_apply_memmap_quirks(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Once setup is done earlier, unmap the EFI memory map on mismatched
|
||||||
|
* firmware/kernel architectures since there is no support for runtime
|
||||||
|
* services.
|
||||||
|
*/
|
||||||
|
if (!efi_is_native()) {
|
||||||
|
pr_info("efi: Setup done, disabling due to 32/64-bit mismatch\n");
|
||||||
|
efi_unmap_memmap();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* UV doesn't support the new EFI pagetable mapping yet.
|
||||||
|
*/
|
||||||
|
if (is_uv_system())
|
||||||
|
set_bit(EFI_OLD_MEMMAP, &x86_efi_facility);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user