diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-01-31 01:08:43 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-01-31 01:08:43 -0500 |
| commit | bdb0ae6a767ef2622eb282e06fc225e855341653 (patch) | |
| tree | 34441e77a137fa349c48472bce2e12efceb18b21 | |
| parent | 0fe94b9e56da7ebffad4422415bdc2854934a389 (diff) | |
| parent | e0094244e41c4d0c7ad69920681972fc45d8ce34 (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 miscellaneous fixes, the most important one is
the fix for the Samsung laptop bricking issue (auto-blacklisting the
samsung-laptop driver); the efi_enabled() changes you see below are
prerequisites for that fix.
The other issues fixed are booting on OLPC XO-1.5, an UV fix, NMI
debugging, and requiring CAP_SYS_RAWIO for MSR references, just as
with I/O port references."
* 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
samsung-laptop: Disable on EFI hardware
efi: Make 'efi_enabled' a function to query EFI facilities
smp: Fix SMP function call empty cpu mask race
x86/msr: Add capabilities check
x86/dma-debug: Bump PREALLOC_DMA_DEBUG_ENTRIES
x86/olpc: Fix olpc-xo1-sci.c build errors
arch/x86/platform/uv: Fix incorrect tlb flush all issue
x86-64: Fix unwind annotations in recent NMI changes
x86-32: Start out cr0 clean, disable paging before modifying cr3/4
| -rw-r--r-- | arch/x86/Kconfig | 1 | ||||
| -rw-r--r-- | arch/x86/include/asm/efi.h | 1 | ||||
| -rw-r--r-- | arch/x86/include/asm/uv/uv.h | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/entry_64.S | 7 | ||||
| -rw-r--r-- | arch/x86/kernel/head_32.S | 9 | ||||
| -rw-r--r-- | arch/x86/kernel/msr.c | 3 | ||||
| -rw-r--r-- | arch/x86/kernel/pci-dma.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/reboot.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/setup.c | 28 | ||||
| -rw-r--r-- | arch/x86/platform/efi/efi.c | 57 | ||||
| -rw-r--r-- | arch/x86/platform/uv/tlb_uv.c | 10 | ||||
| -rw-r--r-- | drivers/acpi/osl.c | 2 | ||||
| -rw-r--r-- | drivers/firmware/dmi_scan.c | 2 | ||||
| -rw-r--r-- | drivers/firmware/efivars.c | 4 | ||||
| -rw-r--r-- | drivers/firmware/iscsi_ibft_find.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_device.c | 3 | ||||
| -rw-r--r-- | drivers/platform/x86/ibm_rtl.c | 2 | ||||
| -rw-r--r-- | drivers/platform/x86/samsung-laptop.c | 4 | ||||
| -rw-r--r-- | drivers/scsi/isci/init.c | 2 | ||||
| -rw-r--r-- | include/linux/efi.h | 24 | ||||
| -rw-r--r-- | init/main.c | 4 | ||||
| -rw-r--r-- | kernel/smp.c | 13 |
22 files changed, 118 insertions, 66 deletions
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 79795af59810..225543bf45a5 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
| @@ -2138,6 +2138,7 @@ config OLPC_XO1_RTC | |||
| 2138 | config OLPC_XO1_SCI | 2138 | config OLPC_XO1_SCI |
| 2139 | bool "OLPC XO-1 SCI extras" | 2139 | bool "OLPC XO-1 SCI extras" |
| 2140 | depends on OLPC && OLPC_XO1_PM | 2140 | depends on OLPC && OLPC_XO1_PM |
| 2141 | depends on INPUT=y | ||
| 2141 | select POWER_SUPPLY | 2142 | select POWER_SUPPLY |
| 2142 | select GPIO_CS5535 | 2143 | select GPIO_CS5535 |
| 2143 | select MFD_CORE | 2144 | select MFD_CORE |
diff --git a/arch/x86/include/asm/efi.h b/arch/x86/include/asm/efi.h index 6e8fdf5ad113..28677c55113f 100644 --- a/arch/x86/include/asm/efi.h +++ b/arch/x86/include/asm/efi.h | |||
| @@ -94,6 +94,7 @@ extern void __iomem *efi_ioremap(unsigned long addr, unsigned long size, | |||
| 94 | #endif /* CONFIG_X86_32 */ | 94 | #endif /* CONFIG_X86_32 */ |
| 95 | 95 | ||
| 96 | extern int add_efi_memmap; | 96 | extern int add_efi_memmap; |
| 97 | extern unsigned long x86_efi_facility; | ||
| 97 | extern void efi_set_executable(efi_memory_desc_t *md, bool executable); | 98 | extern void efi_set_executable(efi_memory_desc_t *md, bool executable); |
| 98 | extern int efi_memblock_x86_reserve_range(void); | 99 | extern int efi_memblock_x86_reserve_range(void); |
| 99 | extern void efi_call_phys_prelog(void); | 100 | extern void efi_call_phys_prelog(void); |
diff --git a/arch/x86/include/asm/uv/uv.h b/arch/x86/include/asm/uv/uv.h index b47c2a82ff15..062921ef34e9 100644 --- a/arch/x86/include/asm/uv/uv.h +++ b/arch/x86/include/asm/uv/uv.h | |||
| @@ -16,7 +16,7 @@ extern void uv_system_init(void); | |||
| 16 | extern const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask, | 16 | extern const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask, |
| 17 | struct mm_struct *mm, | 17 | struct mm_struct *mm, |
| 18 | unsigned long start, | 18 | unsigned long start, |
| 19 | unsigned end, | 19 | unsigned long end, |
| 20 | unsigned int cpu); | 20 | unsigned int cpu); |
| 21 | 21 | ||
| 22 | #else /* X86_UV */ | 22 | #else /* X86_UV */ |
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index 07a7a04529bc..cb3c591339aa 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S | |||
| @@ -1781,6 +1781,7 @@ first_nmi: | |||
| 1781 | * Leave room for the "copied" frame | 1781 | * Leave room for the "copied" frame |
| 1782 | */ | 1782 | */ |
| 1783 | subq $(5*8), %rsp | 1783 | subq $(5*8), %rsp |
| 1784 | CFI_ADJUST_CFA_OFFSET 5*8 | ||
| 1784 | 1785 | ||
| 1785 | /* Copy the stack frame to the Saved frame */ | 1786 | /* Copy the stack frame to the Saved frame */ |
| 1786 | .rept 5 | 1787 | .rept 5 |
| @@ -1863,10 +1864,8 @@ end_repeat_nmi: | |||
| 1863 | nmi_swapgs: | 1864 | nmi_swapgs: |
| 1864 | SWAPGS_UNSAFE_STACK | 1865 | SWAPGS_UNSAFE_STACK |
| 1865 | nmi_restore: | 1866 | nmi_restore: |
| 1866 | RESTORE_ALL 8 | 1867 | /* Pop the extra iret frame at once */ |
| 1867 | 1868 | RESTORE_ALL 6*8 | |
| 1868 | /* Pop the extra iret frame */ | ||
| 1869 | addq $(5*8), %rsp | ||
| 1870 | 1869 | ||
| 1871 | /* Clear the NMI executing stack variable */ | 1870 | /* Clear the NMI executing stack variable */ |
| 1872 | movq $0, 5*8(%rsp) | 1871 | movq $0, 5*8(%rsp) |
diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S index 8e7f6556028f..c8932c79e78b 100644 --- a/arch/x86/kernel/head_32.S +++ b/arch/x86/kernel/head_32.S | |||
| @@ -300,6 +300,12 @@ ENTRY(startup_32_smp) | |||
| 300 | leal -__PAGE_OFFSET(%ecx),%esp | 300 | leal -__PAGE_OFFSET(%ecx),%esp |
| 301 | 301 | ||
| 302 | default_entry: | 302 | default_entry: |
| 303 | #define CR0_STATE (X86_CR0_PE | X86_CR0_MP | X86_CR0_ET | \ | ||
| 304 | X86_CR0_NE | X86_CR0_WP | X86_CR0_AM | \ | ||
| 305 | X86_CR0_PG) | ||
| 306 | movl $(CR0_STATE & ~X86_CR0_PG),%eax | ||
| 307 | movl %eax,%cr0 | ||
| 308 | |||
| 303 | /* | 309 | /* |
| 304 | * New page tables may be in 4Mbyte page mode and may | 310 | * New page tables may be in 4Mbyte page mode and may |
| 305 | * be using the global pages. | 311 | * be using the global pages. |
| @@ -364,8 +370,7 @@ default_entry: | |||
| 364 | */ | 370 | */ |
| 365 | movl $pa(initial_page_table), %eax | 371 | movl $pa(initial_page_table), %eax |
| 366 | movl %eax,%cr3 /* set the page table pointer.. */ | 372 | movl %eax,%cr3 /* set the page table pointer.. */ |
| 367 | movl %cr0,%eax | 373 | movl $CR0_STATE,%eax |
| 368 | orl $X86_CR0_PG,%eax | ||
| 369 | movl %eax,%cr0 /* ..and set paging (PG) bit */ | 374 | movl %eax,%cr0 /* ..and set paging (PG) bit */ |
| 370 | ljmp $__BOOT_CS,$1f /* Clear prefetch and normalize %eip */ | 375 | ljmp $__BOOT_CS,$1f /* Clear prefetch and normalize %eip */ |
| 371 | 1: | 376 | 1: |
diff --git a/arch/x86/kernel/msr.c b/arch/x86/kernel/msr.c index a7c5661f8496..4929502c1372 100644 --- a/arch/x86/kernel/msr.c +++ b/arch/x86/kernel/msr.c | |||
| @@ -174,6 +174,9 @@ static int msr_open(struct inode *inode, struct file *file) | |||
| 174 | unsigned int cpu; | 174 | unsigned int cpu; |
| 175 | struct cpuinfo_x86 *c; | 175 | struct cpuinfo_x86 *c; |
| 176 | 176 | ||
| 177 | if (!capable(CAP_SYS_RAWIO)) | ||
| 178 | return -EPERM; | ||
| 179 | |||
| 177 | cpu = iminor(file->f_path.dentry->d_inode); | 180 | cpu = iminor(file->f_path.dentry->d_inode); |
| 178 | if (cpu >= nr_cpu_ids || !cpu_online(cpu)) | 181 | if (cpu >= nr_cpu_ids || !cpu_online(cpu)) |
| 179 | return -ENXIO; /* No such CPU */ | 182 | return -ENXIO; /* No such CPU */ |
diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c index 0f5dec5c80e0..872079a67e4d 100644 --- a/arch/x86/kernel/pci-dma.c +++ b/arch/x86/kernel/pci-dma.c | |||
| @@ -56,7 +56,7 @@ struct device x86_dma_fallback_dev = { | |||
| 56 | EXPORT_SYMBOL(x86_dma_fallback_dev); | 56 | EXPORT_SYMBOL(x86_dma_fallback_dev); |
| 57 | 57 | ||
| 58 | /* Number of entries preallocated for DMA-API debugging */ | 58 | /* Number of entries preallocated for DMA-API debugging */ |
| 59 | #define PREALLOC_DMA_DEBUG_ENTRIES 32768 | 59 | #define PREALLOC_DMA_DEBUG_ENTRIES 65536 |
| 60 | 60 | ||
| 61 | int dma_set_mask(struct device *dev, u64 mask) | 61 | int dma_set_mask(struct device *dev, u64 mask) |
| 62 | { | 62 | { |
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index 4e8ba39eaf0f..76fa1e9a2b39 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c | |||
| @@ -584,7 +584,7 @@ static void native_machine_emergency_restart(void) | |||
| 584 | break; | 584 | break; |
| 585 | 585 | ||
| 586 | case BOOT_EFI: | 586 | case BOOT_EFI: |
| 587 | if (efi_enabled) | 587 | if (efi_enabled(EFI_RUNTIME_SERVICES)) |
| 588 | efi.reset_system(reboot_mode ? | 588 | efi.reset_system(reboot_mode ? |
| 589 | EFI_RESET_WARM : | 589 | EFI_RESET_WARM : |
| 590 | EFI_RESET_COLD, | 590 | EFI_RESET_COLD, |
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 00f6c1472b85..8b24289cc10c 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
| @@ -807,15 +807,15 @@ void __init setup_arch(char **cmdline_p) | |||
| 807 | #ifdef CONFIG_EFI | 807 | #ifdef CONFIG_EFI |
| 808 | if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature, | 808 | if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature, |
| 809 | "EL32", 4)) { | 809 | "EL32", 4)) { |
| 810 | efi_enabled = 1; | 810 | set_bit(EFI_BOOT, &x86_efi_facility); |
| 811 | efi_64bit = false; | ||
| 812 | } else if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature, | 811 | } else if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature, |
| 813 | "EL64", 4)) { | 812 | "EL64", 4)) { |
| 814 | efi_enabled = 1; | 813 | set_bit(EFI_BOOT, &x86_efi_facility); |
| 815 | efi_64bit = true; | 814 | set_bit(EFI_64BIT, &x86_efi_facility); |
| 816 | } | 815 | } |
| 817 | if (efi_enabled && efi_memblock_x86_reserve_range()) | ||
