diff options
Diffstat (limited to 'arch/x86')
34 files changed, 182 insertions, 70 deletions
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 07e01149e3bf..72ace9515a07 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
| @@ -1443,12 +1443,8 @@ config SECCOMP | |||
| 1443 | 1443 | ||
| 1444 | If unsure, say Y. Only embedded should say N here. | 1444 | If unsure, say Y. Only embedded should say N here. |
| 1445 | 1445 | ||
| 1446 | config CC_STACKPROTECTOR_ALL | ||
| 1447 | bool | ||
| 1448 | |||
| 1449 | config CC_STACKPROTECTOR | 1446 | config CC_STACKPROTECTOR |
| 1450 | bool "Enable -fstack-protector buffer overflow detection (EXPERIMENTAL)" | 1447 | bool "Enable -fstack-protector buffer overflow detection (EXPERIMENTAL)" |
| 1451 | select CC_STACKPROTECTOR_ALL | ||
| 1452 | ---help--- | 1448 | ---help--- |
| 1453 | This option turns on the -fstack-protector GCC feature. This | 1449 | This option turns on the -fstack-protector GCC feature. This |
| 1454 | feature puts, at the beginning of functions, a canary value on | 1450 | feature puts, at the beginning of functions, a canary value on |
diff --git a/arch/x86/Kconfig.cpu b/arch/x86/Kconfig.cpu index f2824fb8c79c..2649840d888f 100644 --- a/arch/x86/Kconfig.cpu +++ b/arch/x86/Kconfig.cpu | |||
| @@ -400,7 +400,7 @@ config X86_TSC | |||
| 400 | 400 | ||
| 401 | config X86_CMPXCHG64 | 401 | config X86_CMPXCHG64 |
| 402 | def_bool y | 402 | def_bool y |
| 403 | depends on X86_PAE || X86_64 || MCORE2 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MATOM | 403 | depends on !M386 && !M486 |
| 404 | 404 | ||
| 405 | # this should be set for all -march=.. options where the compiler | 405 | # this should be set for all -march=.. options where the compiler |
| 406 | # generates cmov. | 406 | # generates cmov. |
diff --git a/arch/x86/Makefile b/arch/x86/Makefile index a012ee8ef803..d2d24c9ee64d 100644 --- a/arch/x86/Makefile +++ b/arch/x86/Makefile | |||
| @@ -76,7 +76,6 @@ ifdef CONFIG_CC_STACKPROTECTOR | |||
| 76 | cc_has_sp := $(srctree)/scripts/gcc-x86_$(BITS)-has-stack-protector.sh | 76 | cc_has_sp := $(srctree)/scripts/gcc-x86_$(BITS)-has-stack-protector.sh |
| 77 | ifeq ($(shell $(CONFIG_SHELL) $(cc_has_sp) $(CC) $(biarch)),y) | 77 | ifeq ($(shell $(CONFIG_SHELL) $(cc_has_sp) $(CC) $(biarch)),y) |
| 78 | stackp-y := -fstack-protector | 78 | stackp-y := -fstack-protector |
| 79 | stackp-$(CONFIG_CC_STACKPROTECTOR_ALL) += -fstack-protector-all | ||
| 80 | KBUILD_CFLAGS += $(stackp-y) | 79 | KBUILD_CFLAGS += $(stackp-y) |
| 81 | else | 80 | else |
| 82 | $(warning stack protector enabled but no compiler support) | 81 | $(warning stack protector enabled but no compiler support) |
diff --git a/arch/x86/boot/setup.ld b/arch/x86/boot/setup.ld index 0f6ec455a2b1..03c0683636b6 100644 --- a/arch/x86/boot/setup.ld +++ b/arch/x86/boot/setup.ld | |||
| @@ -53,6 +53,9 @@ SECTIONS | |||
| 53 | 53 | ||
| 54 | /DISCARD/ : { *(.note*) } | 54 | /DISCARD/ : { *(.note*) } |
| 55 | 55 | ||
| 56 | /* | ||
| 57 | * The ASSERT() sink to . is intentional, for binutils 2.14 compatibility: | ||
| 58 | */ | ||
| 56 | . = ASSERT(_end <= 0x8000, "Setup too big!"); | 59 | . = ASSERT(_end <= 0x8000, "Setup too big!"); |
| 57 | . = ASSERT(hdr == 0x1f1, "The setup header has the wrong offset!"); | 60 | . = ASSERT(hdr == 0x1f1, "The setup header has the wrong offset!"); |
| 58 | /* Necessary for the very-old-loader check to work... */ | 61 | /* Necessary for the very-old-loader check to work... */ |
diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S index 1733f9f65e82..581b0568fe19 100644 --- a/arch/x86/ia32/ia32entry.S +++ b/arch/x86/ia32/ia32entry.S | |||
| @@ -204,7 +204,7 @@ sysexit_from_sys_call: | |||
| 204 | movl RDI-ARGOFFSET(%rsp),%r8d /* reload 5th syscall arg */ | 204 | movl RDI-ARGOFFSET(%rsp),%r8d /* reload 5th syscall arg */ |
| 205 | .endm | 205 | .endm |
| 206 | 206 | ||
| 207 | .macro auditsys_exit exit,ebpsave=RBP | 207 | .macro auditsys_exit exit |
| 208 | testl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),TI_flags(%r10) | 208 | testl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),TI_flags(%r10) |
| 209 | jnz ia32_ret_from_sys_call | 209 | jnz ia32_ret_from_sys_call |
| 210 | TRACE_IRQS_ON | 210 | TRACE_IRQS_ON |
| @@ -217,7 +217,6 @@ sysexit_from_sys_call: | |||
| 217 | call audit_syscall_exit | 217 | call audit_syscall_exit |
| 218 | GET_THREAD_INFO(%r10) | 218 | GET_THREAD_INFO(%r10) |
| 219 | movl RAX-ARGOFFSET(%rsp),%eax /* reload syscall return value */ | 219 | movl RAX-ARGOFFSET(%rsp),%eax /* reload syscall return value */ |
| 220 | movl \ebpsave-ARGOFFSET(%rsp),%ebp /* reload user register value */ | ||
| 221 | movl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),%edi | 220 | movl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),%edi |
| 222 | cli | 221 | cli |
| 223 | TRACE_IRQS_OFF | 222 | TRACE_IRQS_OFF |
| @@ -351,7 +350,7 @@ cstar_auditsys: | |||
| 351 | jmp cstar_dispatch | 350 | jmp cstar_dispatch |
| 352 | 351 | ||
| 353 | sysretl_audit: | 352 | sysretl_audit: |
| 354 | auditsys_exit sysretl_from_sys_call, RCX /* user %ebp in RCX slot */ | 353 | auditsys_exit sysretl_from_sys_call |
| 355 | #endif | 354 | #endif |
| 356 | 355 | ||
| 357 | cstar_tracesys: | 356 | cstar_tracesys: |
diff --git a/arch/x86/include/asm/amd_iommu.h b/arch/x86/include/asm/amd_iommu.h index ac95995b7bad..4b180897e6b5 100644 --- a/arch/x86/include/asm/amd_iommu.h +++ b/arch/x86/include/asm/amd_iommu.h | |||
| @@ -31,6 +31,7 @@ extern irqreturn_t amd_iommu_int_handler(int irq, void *data); | |||
| 31 | extern void amd_iommu_flush_all_domains(void); | 31 | extern void amd_iommu_flush_all_domains(void); |
| 32 | extern void amd_iommu_flush_all_devices(void); | 32 | extern void amd_iommu_flush_all_devices(void); |
| 33 | extern void amd_iommu_shutdown(void); | 33 | extern void amd_iommu_shutdown(void); |
| 34 | extern void amd_iommu_apply_erratum_63(u16 devid); | ||
| 34 | #else | 35 | #else |
| 35 | static inline int amd_iommu_init(void) { return -ENODEV; } | 36 | static inline int amd_iommu_init(void) { return -ENODEV; } |
| 36 | static inline void amd_iommu_detect(void) { } | 37 | static inline void amd_iommu_detect(void) { } |
diff --git a/arch/x86/include/asm/desc.h b/arch/x86/include/asm/desc.h index e8de2f6f5ca5..617bd56b3070 100644 --- a/arch/x86/include/asm/desc.h +++ b/arch/x86/include/asm/desc.h | |||
| @@ -288,7 +288,7 @@ static inline void load_LDT(mm_context_t *pc) | |||
| 288 | 288 | ||
| 289 | static inline unsigned long get_desc_base(const struct desc_struct *desc) | 289 | static inline unsigned long get_desc_base(const struct desc_struct *desc) |
| 290 | { | 290 | { |
| 291 | return desc->base0 | ((desc->base1) << 16) | ((desc->base2) << 24); | 291 | return (unsigned)(desc->base0 | ((desc->base1) << 16) | ((desc->base2) << 24)); |
| 292 | } | 292 | } |
| 293 | 293 | ||
| 294 | static inline void set_desc_base(struct desc_struct *desc, unsigned long base) | 294 | static inline void set_desc_base(struct desc_struct *desc, unsigned long base) |
diff --git a/arch/x86/include/asm/dma-mapping.h b/arch/x86/include/asm/dma-mapping.h index 0ee770d23d0e..6a25d5d42836 100644 --- a/arch/x86/include/asm/dma-mapping.h +++ b/arch/x86/include/asm/dma-mapping.h | |||
| @@ -14,6 +14,12 @@ | |||
| 14 | #include <asm/swiotlb.h> | 14 | #include <asm/swiotlb.h> |
| 15 | #include <asm-generic/dma-coherent.h> | 15 | #include <asm-generic/dma-coherent.h> |
| 16 | 16 | ||
| 17 | #ifdef CONFIG_ISA | ||
| 18 | # define ISA_DMA_BIT_MASK DMA_BIT_MASK(24) | ||
| 19 | #else | ||
| 20 | # define ISA_DMA_BIT_MASK DMA_BIT_MASK(32) | ||
| 21 | #endif | ||
| 22 | |||
| 17 | extern dma_addr_t bad_dma_address; | 23 | extern dma_addr_t bad_dma_address; |
| 18 | extern int iommu_merge; | 24 | extern int iommu_merge; |
| 19 | extern struct device x86_dma_fallback_dev; | 25 | extern struct device x86_dma_fallback_dev; |
| @@ -124,10 +130,8 @@ dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, | |||
| 124 | if (dma_alloc_from_coherent(dev, size, dma_handle, &memory)) | 130 | if (dma_alloc_from_coherent(dev, size, dma_handle, &memory)) |
| 125 | return memory; | 131 | return memory; |
| 126 | 132 | ||
| 127 | if (!dev) { | 133 | if (!dev) |
| 128 | dev = &x86_dma_fallback_dev; | 134 | dev = &x86_dma_fallback_dev; |
| 129 | gfp |= GFP_DMA; | ||
| 130 | } | ||
| 131 | 135 | ||
| 132 | if (!is_device_dma_capable(dev)) | 136 | if (!is_device_dma_capable(dev)) |
| 133 | return NULL; | 137 | return NULL; |
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index c3429e8b2424..c9786480f0fe 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h | |||
| @@ -1000,7 +1000,7 @@ extern unsigned long thread_saved_pc(struct task_struct *tsk); | |||
| 1000 | #define thread_saved_pc(t) (*(unsigned long *)((t)->thread.sp - 8)) | 1000 | #define thread_saved_pc(t) (*(unsigned long *)((t)->thread.sp - 8)) |
| 1001 | 1001 | ||
| 1002 | #define task_pt_regs(tsk) ((struct pt_regs *)(tsk)->thread.sp0 - 1) | 1002 | #define task_pt_regs(tsk) ((struct pt_regs *)(tsk)->thread.sp0 - 1) |
| 1003 | #define KSTK_ESP(tsk) -1 /* sorry. doesn't work for syscall. */ | 1003 | extern unsigned long KSTK_ESP(struct task_struct *task); |
| 1004 | #endif /* CONFIG_X86_64 */ | 1004 | #endif /* CONFIG_X86_64 */ |
| 1005 | 1005 | ||
| 1006 | extern void start_thread(struct pt_regs *regs, unsigned long new_ip, | 1006 | extern void start_thread(struct pt_regs *regs, unsigned long new_ip, |
diff --git a/arch/x86/include/asm/topology.h b/arch/x86/include/asm/topology.h index 25a92842dd99..40e37b10c6c0 100644 --- a/arch/x86/include/asm/topology.h +++ b/arch/x86/include/asm/topology.h | |||
| @@ -143,6 +143,7 @@ extern unsigned long node_remap_size[]; | |||
| 143 | | 1*SD_BALANCE_FORK \ | 143 | | 1*SD_BALANCE_FORK \ |
| 144 | | 0*SD_BALANCE_WAKE \ | 144 | | 0*SD_BALANCE_WAKE \ |
| 145 | | 1*SD_WAKE_AFFINE \ | 145 | | 1*SD_WAKE_AFFINE \ |
| 146 | | 0*SD_PREFER_LOCAL \ | ||
| 146 | | 0*SD_SHARE_CPUPOWER \ | 147 | | 0*SD_SHARE_CPUPOWER \ |
| 147 | | 0*SD_POWERSAVINGS_BALANCE \ | 148 | | 0*SD_POWERSAVINGS_BALANCE \ |
| 148 | | 0*SD_SHARE_PKG_RESOURCES \ | 149 | | 0*SD_SHARE_PKG_RESOURCES \ |
diff --git a/arch/x86/include/asm/uv/uv_hub.h b/arch/x86/include/asm/uv/uv_hub.h index 04eb6c958b9d..d1414af98559 100644 --- a/arch/x86/include/asm/uv/uv_hub.h +++ b/arch/x86/include/asm/uv/uv_hub.h | |||
| @@ -19,6 +19,8 @@ | |||
| 19 | #include <asm/types.h> | 19 | #include <asm/types.h> |
| 20 | #include <asm/percpu.h> | 20 | #include <asm/percpu.h> |
| 21 | #include <asm/uv/uv_mmrs.h> | 21 | #include <asm/uv/uv_mmrs.h> |
| 22 | #include <asm/irq_vectors.h> | ||
| 23 | #include <asm/io_apic.h> | ||
| 22 | 24 | ||
| 23 | 25 | ||
| 24 | /* | 26 | /* |
| @@ -114,7 +116,7 @@ | |||
| 114 | /* | 116 | /* |
| 115 | * The largest possible NASID of a C or M brick (+ 2) | 117 | * The largest possible NASID of a C or M brick (+ 2) |
| 116 | */ | 118 | */ |
| 117 | #define UV_MAX_NASID_VALUE (UV_MAX_NUMALINK_NODES * 2) | 119 | #define UV_MAX_NASID_VALUE (UV_MAX_NUMALINK_BLADES * 2) |
| 118 | 120 | ||
| 119 | struct uv_scir_s { | 121 | struct uv_scir_s { |
| 120 | struct timer_list timer; | 122 | struct timer_list timer; |
| @@ -230,6 +232,20 @@ static inline unsigned long uv_gpa(void *v) | |||
| 230 | return uv_soc_phys_ram_to_gpa(__pa(v)); | 232 | return uv_soc_phys_ram_to_gpa(__pa(v)); |
| 231 | } | 233 | } |
| 232 | 234 | ||
| 235 | /* gnode -> pnode */ | ||
| 236 | static inline unsigned long uv_gpa_to_gnode(unsigned long gpa) | ||
| 237 | { | ||
| 238 | return gpa >> uv_hub_info->m_val; | ||
| 239 | } | ||
| 240 | |||
| 241 | /* gpa -> pnode */ | ||
| 242 | static inline int uv_gpa_to_pnode(unsigned long gpa) | ||
| 243 | { | ||
| 244 | unsigned long n_mask = (1UL << uv_hub_info->n_val) - 1; | ||
| 245 | |||
| 246 | return uv_gpa_to_gnode(gpa) & n_mask; | ||
| 247 | } | ||
| 248 | |||
| 233 | /* pnode, offset --> socket virtual */ | 249 | /* pnode, offset --> socket virtual */ |
| 234 | static inline void *uv_pnode_offset_to_vaddr(int pnode, unsigned long offset) | 250 | static inline void *uv_pnode_offset_to_vaddr(int pnode, unsigned long offset) |
| 235 | { | 251 | { |
| @@ -421,9 +437,14 @@ static inline void uv_set_cpu_scir_bits(int cpu, unsigned char value) | |||
| 421 | static inline void uv_hub_send_ipi(int pnode, int apicid, int vector) | 437 | static inline void uv_hub_send_ipi(int pnode, int apicid, int vector) |
| 422 | { | 438 | { |
| 423 | unsigned long val; | 439 | unsigned long val; |
| 440 | unsigned long dmode = dest_Fixed; | ||
| 441 | |||
| 442 | if (vector == NMI_VECTOR) | ||
| 443 | dmode = dest_NMI; | ||
| 424 | 444 | ||
| 425 | val = (1UL << UVH_IPI_INT_SEND_SHFT) | | 445 | val = (1UL << UVH_IPI_INT_SEND_SHFT) | |
| 426 | ((apicid) << UVH_IPI_INT_APIC_ID_SHFT) | | 446 | ((apicid) << UVH_IPI_INT_APIC_ID_SHFT) | |
| 447 | (dmode << UVH_IPI_INT_DELIVERY_MODE_SHFT) | | ||
| 427 | (vector << UVH_IPI_INT_VECTOR_SHFT); | 448 | (vector << UVH_IPI_INT_VECTOR_SHFT); |
| 428 | uv_write_global_mmr64(pnode, UVH_IPI_INT, val); | 449 | uv_write_global_mmr64(pnode, UVH_IPI_INT, val); |
| 429 | } | 450 | } |
diff --git a/arch/x86/kernel/acpi/processor.c b/arch/x86/kernel/acpi/processor.c index d296f4a195c9..d85d1b2432ba 100644 --- a/arch/x86/kernel/acpi/processor.c +++ b/arch/x86/kernel/acpi/processor.c | |||
| @@ -79,7 +79,8 @@ void arch_acpi_processor_init_pdc(struct acpi_processor *pr) | |||
| 79 | struct cpuinfo_x86 *c = &cpu_data(pr->id); | 79 | struct cpuinfo_x86 *c = &cpu_data(pr->id); |
| 80 | 80 | ||
| 81 | pr->pdc = NULL; | 81 | pr->pdc = NULL; |
| 82 | if (c->x86_vendor == X86_VENDOR_INTEL) | 82 | if (c->x86_vendor == X86_VENDOR_INTEL || |
| 83 | c->x86_vendor == X86_VENDOR_CENTAUR) | ||
| 83 | init_intel_pdc(pr, c); | 84 | init_intel_pdc(pr, c); |
| 84 | 85 | ||
| 85 | return; | 86 | return; |
diff --git a/arch/x86/kernel/acpi/realmode/wakeup.lds.S b/arch/x86/kernel/acpi/realmode/wakeup.lds.S index 7da00b799cda..060fff8f5c5b 100644 --- a/arch/x86/kernel/acpi/realmode/wakeup.lds.S +++ b/arch/x86/kernel/acpi/realmode/wakeup.lds.S | |||
| @@ -57,5 +57,8 @@ SECTIONS | |||
| 57 | *(.note*) | 57 | *(.note*) |
| 58 | } | 58 | } |
| 59 | 59 | ||
| 60 | /* | ||
| 61 | * The ASSERT() sink to . is intentional, for binutils 2.14 compatibility: | ||
| 62 | */ | ||
| 60 | . = ASSERT(_end <= WAKEUP_SIZE, "Wakeup too big!"); | 63 | . = ASSERT(_end <= WAKEUP_SIZE, "Wakeup too big!"); |
| 61 | } | 64 | } |
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c index 98f230f6a28d..0285521e0a99 100644 --- a/arch/x86/kernel/amd_iommu.c +++ b/arch/x86/kernel/amd_iommu.c | |||
| @@ -1220,6 +1220,8 @@ static void __detach_device(struct protection_domain *domain, u16 devid) | |||
| 1220 | amd_iommu_dev_table[devid].data[1] = 0; | 1220 | amd_iommu_dev_table[devid].data[1] = 0; |
| 1221 | amd_iommu_dev_table[devid].data[2] = 0; | 1221 | amd_iommu_dev_table[devid].data[2] = 0; |
| 1222 | 1222 | ||
| 1223 | amd_iommu_apply_erratum_63(devid); | ||
| 1224 | |||
| 1223 | /* decrease reference counter */ | 1225 | /* decrease reference counter */ |
| 1224 | domain->dev_cnt -= 1; | 1226 | domain->dev_cnt -= 1; |
| 1225 | 1227 | ||
diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c index b4b61d462dcc..c20001e4f556 100644 --- a/arch/x86/kernel/amd_iommu_init.c +++ b/arch/x86/kernel/amd_iommu_init.c | |||
| @@ -240,7 +240,7 @@ static void iommu_feature_enable(struct amd_iommu *iommu, u8 bit) | |||
| 240 | writel(ctrl, iommu->mmio_base + MMIO_CONTROL_OFFSET); | 240 | writel(ctrl, iommu->mmio_base + MMIO_CONTROL_OFFSET); |
| 241 | } | 241 | } |
| 242 | 242 | ||
| 243 | static void __init iommu_feature_disable(struct amd_iommu *iommu, u8 bit) | 243 | static void iommu_feature_disable(struct amd_iommu *iommu, u8 bit) |
| 244 | { | 244 | { |
| 245 | u32 ctrl; | 245 | u32 ctrl; |
| 246 | 246 | ||
| @@ -519,6 +519,26 @@ static void set_dev_entry_bit(u16 devid, u8 bit) | |||
| 519 | amd_iommu_dev_table[devid].data[i] |= (1 << _bit); | 519 | amd_iommu_dev_table[devid].data[i] |= (1 << _bit); |
| 520 | } | 520 | } |
| 521 | 521 | ||
| 522 | static int get_dev_entry_bit(u16 devid, u8 bit) | ||
| 523 | { | ||
| 524 | int i = (bit >> 5) & 0x07; | ||
| 525 | int _bit = bit & 0x1f; | ||
| 526 | |||
| 527 | return (amd_iommu_dev_table[devid].data[i] & (1 << _bit)) >> _bit; | ||
| 528 | } | ||
| 529 | |||
| 530 | |||
| 531 | void amd_iommu_apply_erratum_63(u16 devid) | ||
| 532 | { | ||
| 533 | int sysmgt; | ||
| 534 | |||
| 535 | sysmgt = get_dev_entry_bit(devid, DEV_ENTRY_SYSMGT1) | | ||
| 536 | (get_dev_entry_bit(devid, DEV_ENTRY_SYSMGT2) << 1); | ||
| 537 | |||
| 538 | if (sysmgt == 0x01) | ||
| 539 | set_dev_entry_bit(devid, DEV_ENTRY_IW); | ||
| 540 | } | ||
| 541 | |||
| 522 | /* Writes the specific IOMMU for a device into the rlookup table */ | 542 | /* Writes the specific IOMMU for a device into the rlookup table */ |
| 523 | static void __init set_iommu_for_device(struct amd_iommu *iommu, u16 devid) | 543 | static void __init set_iommu_for_device(struct amd_iommu *iommu, u16 devid) |
| 524 | { | 544 | { |
| @@ -547,6 +567,8 @@ static void __init set_dev_entry_from_acpi(struct amd_iommu *iommu, | |||
| 547 | if (flags & ACPI_DEVFLAG_LINT1) | 567 | if (flags & ACPI_DEVFLAG_LINT1) |
| 548 | set_dev_entry_bit(devid, DEV_ENTRY_LINT1_PASS); | 568 | set_dev_entry_bit(devid, DEV_ENTRY_LINT1_PASS); |
| 549 | 569 | ||
| 570 | amd_iommu_apply_erratum_63(devid); | ||
| 571 | |||
| 550 | set_iommu_for_device(iommu, devid); | 572 | set_iommu_for_device(iommu, devid); |
| 551 | } | 573 | } |
| 552 | 574 | ||
diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c index f5f5886a6b53..326c25477d3d 100644 --- a/arch/x86/kernel/apic/x2apic_uv_x.c +++ b/arch/x86/kernel/apic/x2apic_uv_x.c | |||
| @@ -352,14 +352,14 @@ static __init void get_lowmem_redirect(unsigned long *base, unsigned long *size) | |||
| 352 | 352 | ||
| 353 | for (i = 0; i < ARRAY_SIZE(redir_addrs); i++) { | 353 | for (i = 0; i < ARRAY_SIZE(redir_addrs); i++) { |
| 354 | alias.v = uv_read_local_mmr(redir_addrs[i].alias); | 354 | alias.v = uv_read_local_mmr(redir_addrs[i].alias); |
| 355 | if (alias.s.base == 0) { | 355 | if (alias.s.enable && alias.s.base == 0) { |
| 356 | *size = (1UL << alias.s.m_alias); | 356 | *size = (1UL << alias.s.m_alias); |
| 357 | redirect.v = uv_read_local_mmr(redir_addrs[i].redirect); | 357 | redirect.v = uv_read_local_mmr(redir_addrs[i].redirect); |
| 358 | *base = (unsigned long)redirect.s.dest_base << DEST_SHIFT; | 358 | *base = (unsigned long)redirect.s.dest_base << DEST_SHIFT; |
| 359 | return; | 359 | return; |
| 360 | } | 360 | } |
| 361 | } | 361 | } |
| 362 | BUG(); | 362 | *base = *size = 0; |
| 363 | } | 363 | } |
| 364 | 364 | ||
| 365 | enum map_type {map_wb, map_uc}; | 365 | enum map_type {map_wb, map_uc}; |
| @@ -619,12 +619,12 @@ void __init uv_system_init(void) | |||
| 619 | uv_cpu_hub_info(cpu)->lowmem_remap_base = lowmem_redir_base; | 619 | uv_cpu_hub_info(cpu)->lowmem_remap_base = lowmem_redir_base; |
| 620 | uv_cpu_hub_info(cpu)->lowmem_remap_top = lowmem_redir_size; | 620 | uv_cpu_hub_info(cpu)->lowmem_remap_top = lowmem_redir_size; |
| 621 | uv_cpu_hub_info(cpu)->m_val = m_val; | 621 | uv_cpu_hub_info(cpu)->m_val = m_val; |
| 622 | uv_cpu_hub_info(cpu)->n_val = m_val; | 622 | uv_cpu_hub_info(cpu)->n_val = n_val; |
| 623 | uv_cpu_hub_info(cpu)->numa_blade_id = blade; | 623 | uv_cpu_hub_info(cpu)->numa_blade_id = blade; |
| 624 | uv_cpu_hub_info(cpu)->blade_processor_id = lcpu; | 624 | uv_cpu_hub_info(cpu)->blade_processor_id = lcpu; |
| 625 | uv_cpu_hub_info(cpu)->pnode = pnode; | 625 | uv_cpu_hub_info(cpu)->pnode = pnode; |
| 626 | uv_cpu_hub_info(cpu)->pnode_mask = pnode_mask; | 626 | uv_cpu_hub_info(cpu)->pnode_mask = pnode_mask; |
| 627 | uv_cpu_hub_info(cpu)->gpa_mask = (1 << (m_val + n_val)) - 1; | 627 | uv_cpu_hub_info(cpu)->gpa_mask = (1UL << (m_val + n_val)) - 1; |
| 628 | uv_cpu_hub_info(cpu)->gnode_upper = gnode_upper; | 628 | uv_cpu_hub_info(cpu)->gnode_upper = gnode_upper; |
| 629 | uv_cpu_hub_info(cpu)->gnode_extra = gnode_extra; | 629 | uv_cpu_hub_info(cpu)->gnode_extra = gnode_extra; |
| 630 | uv_cpu_hub_info(cpu)->global_mmr_base = mmr_base; | 630 | uv_cpu_hub_info(cpu)->global_mmr_base = mmr_base; |
diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c index 7d5c3b0ea8da..8b581d3905cb 100644 --- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c +++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c | |||
| @@ -526,15 +526,21 @@ static const struct dmi_system_id sw_any_bug_dmi_table[] = { | |||
| 526 | 526 | ||
| 527 | static int acpi_cpufreq_blacklist(struct cpuinfo_x86 *c) | 527 | static int acpi_cpufreq_blacklist(struct cpuinfo_x86 *c) |
| 528 | { | 528 | { |
| 529 | /* http://www.intel.com/Assets/PDF/specupdate/314554.pdf | 529 | /* Intel Xeon Processor 7100 Series Specification Update |
| 530 | * http://www.intel.com/Assets/PDF/specupdate/314554.pdf | ||
| 530 | * AL30: A Machine Check Exception (MCE) Occurring during an | 531 | * AL30: A Machine Check Exception (MCE) Occurring during an |
| 531 | * Enhanced Intel SpeedStep Technology Ratio Change May Cause | 532 | * Enhanced Intel SpeedStep Technology Ratio Change May Cause |
| 532 | * Both Processor Cores to Lock Up when HT is enabled*/ | 533 | * Both Processor Cores to Lock Up. */ |
| 533 | if (c->x86_vendor == X86_VENDOR_INTEL) { | 534 | if (c->x86_vendor == X86_VENDOR_INTEL) { |
| 534 | if ((c->x86 == 15) && | 535 | if ((c->x86 == 15) && |
| 535 | (c->x86_model == 6) && | 536 | (c->x86_model == 6) && |
| 536 | (c->x86_mask == 8) && smt_capable()) | 537 | (c->x86_mask == 8)) { |
| 538 | printk(KERN_INFO "acpi-cpufreq: Intel(R) " | ||
| 539 | "Xeon(R) 7100 Errata AL30, processors may " | ||
| 540 | "lock up on frequency changes: disabling " | ||
| 541 | "acpi-cpufreq.\n"); | ||
| 537 | return -ENODEV; | 542 | return -ENODEV; |
| 543 | } | ||
| 538 | } | 544 | } |
| 539 | return 0; | 545 | return 0; |
| 540 | } | 546 | } |
| @@ -549,13 +555,18 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy) | |||
| 549 | unsigned int result = 0; | 555 | unsigned int result = 0; |
| 550 | struct cpuinfo_x86 *c = &cpu_data(policy->cpu); | 556 | struct cpuinfo_x86 *c = &cpu_data(policy->cpu); |
| 551 | struct acpi_processor_performance *perf; | 557 | struct acpi_processor_performance *perf; |
| 558 | #ifdef CONFIG_SMP | ||
| 559 | static int blacklisted; | ||
| 560 | #endif | ||
| 552 | 561 | ||
| 553 | dprintk("acpi_cpufreq_cpu_init\n"); | 562 | dprintk("acpi_cpufreq_cpu_init\n"); |
| 554 | 563 | ||
| 555 | #ifdef CONFIG_SMP | 564 | #ifdef CONFIG_SMP |
| 556 | result = acpi_cpufreq_blacklist(c); | 565 | if (blacklisted) |
| 557 | if (result) | 566 | return blacklisted; |
| 558 | return result; | 567 | blacklisted = acpi_cpufreq_blacklist(c); |
| 568 | if (blacklisted) | ||
| 569 | return blacklisted; | ||
| 559 | #endif | 570 | #endif |
| 560 | 571 | ||
| 561 | data = kzalloc(sizeof(struct acpi_cpufreq_data), GFP_KERNEL); | 572 | data = kzalloc(sizeof(struct acpi_cpufreq_data), GFP_KERNEL); |
diff --git a/arch/x86/kernel/cpu/cpufreq/longhaul.c b/arch/x86/kernel/cpu/cpufreq/longhaul.c index ce2ed3e4aad9..cabd2fa3fc93 100644 --- a/arch/x86/kernel/cpu/cpufreq/longhaul.c +++ b/arch/x86/kernel/cpu/cpufreq/longhaul.c | |||
| @@ -813,7 +813,7 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy) | |||
| 813 | memcpy(eblcr, samuel2_eblcr, sizeof(samuel2_eblcr)); | 813 | memcpy(eblcr, samuel2_eblcr, sizeof(samuel2_eblcr)); |
| 814 | break; | 814 | break; |
| 815 | case 1 ... 15: | 815 | case 1 ... 15: |
| 816 | longhaul_version = TYPE_LONGHAUL_V1; | 816 | longhaul_version = TYPE_LONGHAUL_V2; |
| 817 | if (c->x86_mask < 8) { | 817 | if (c->x86_mask < 8) { |
| 818 | cpu_model = CPU_SAMUEL2; | 818 | cpu_model = CPU_SAMUEL2; |
| 819 | cpuname = "C3 'Samuel 2' [C5B]"; | 819 | cpuname = "C3 'Samuel 2' [C5B]"; |
diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c index 6394aa5c7985..3f12dabeab52 100644 --- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c +++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c | |||
| @@ -1022,7 +1022,7 @@ static int get_transition_latency(struct powernow_k8_data *data) | |||
| 1022 | * set it to 1 to avoid problems in the future. | 1022 | * set it to 1 to avoid problems in the future. |
| 1023 | * For all others it's a BIOS bug. | 1023 | * For all others it's a BIOS bug. |
| 1024 | */ | 1024 | */ |
| 1025 | if (!boot_cpu_data.x86 == 0x11) | 1025 | if (boot_cpu_data.x86 != 0x11) |
| 1026 | printk(KERN_ERR FW_WARN PFX "Invalid zero transition " | 1026 | printk(KERN_ERR FW_WARN PFX "Invalid zero transition " |
| 1027 | "latency\n"); | 1027 | "latency\n"); |
| 1028 | max_latency = 1; | 1028 | max_latency = 1; |
diff --git a/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c b/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c index 6911e91fb4f6..3ae5a7a3a500 100644 --- a/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c +++ b/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c | |||
| @@ -232,28 +232,23 @@ static unsigned int speedstep_detect_chipset(void) | |||
| 232 | return 0; | 232 | return 0; |
| 233 | } | 233 | } |
| 234 | 234 | ||
| 235 | struct get_freq_data { | 235 | static void get_freq_data(void *_speed) |
| 236 | unsigned int speed; | ||
| 237 | unsigned int processor; | ||
| 238 | }; | ||
| 239 | |||
| 240 | static void get_freq_data(void *_data) | ||
| 241 | { | 236 | { |
| 242 | struct get_freq_data *data = _data; | 237 | unsigned int *speed = _speed; |
| 243 | 238 | ||
| 244 | data->speed = speedstep_get_frequency(data->processor); | 239 | *speed = speedstep_get_frequency(speedstep_processor); |
| 245 | } | 240 | } |
| 246 | 241 | ||
| 247 | static unsigned int speedstep_get(unsigned int cpu) | 242 | static unsigned int speedstep_get(unsigned int cpu) |
| 248 | { | 243 | { |
| 249 | struct get_freq_data data = { .processor = cpu }; | 244 | unsigned int speed; |
| 250 | 245 | ||
| 251 | /* You're supposed to ensure CPU is online. */ | 246 | /* You're supposed to ensure CPU is online. */ |
| 252 | if (smp_call_function_single(cpu, get_freq_data, &data, 1) != 0) | 247 | if (smp_call_function_single(cpu, get_freq_data, &speed, 1) != 0) |
| 253 | BUG(); | 248 | BUG(); |
| 254 | 249 | ||
| 255 | dprintk("detected %u kHz as current frequency\n", data.speed); | 250 | dprintk("detected %u kHz as current frequency\n", speed); |
| 256 | return data.speed; | 251 | return speed; |
| 257 | } | 252 | } |
| 258 | 253 | ||
| 259 | /** | 254 | /** |
diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c index b1598a9436d0..721a77ca8115 100644 --- a/arch/x86/kernel/cpu/mcheck/mce.c +++ b/arch/x86/kernel/cpu/mcheck/mce.c | |||
| @@ -1214,7 +1214,8 @@ static int __cpuinit mce_cap_init(void) | |||
| 1214 | rdmsrl(MSR_IA32_MCG_CAP, cap); | 1214 | rdmsrl(MSR_IA32_MCG_CAP, cap); |
| 1215 | 1215 | ||
| 1216 | b = cap & MCG_BANKCNT_MASK; | 1216 | b = cap & MCG_BANKCNT_MASK; |
| 1217 | printk(KERN_INFO "mce: CPU supports %d MCE banks\n", b); | 1217 | if (!banks) |
| 1218 | printk(KERN_INFO "mce: CPU supports %d MCE banks\n", b); | ||
| 1218 | 1219 | ||
| 1219 | if (b > MAX_NR_BANKS) { | 1220 | if (b > MAX_NR_BANKS) { |
| 1220 | printk(KERN_WARNING | 1221 | printk(KERN_WARNING |
diff --git a/arch/x86/kernel/cpu/mtrr/cleanup.c b/arch/x86/kernel/cpu/mtrr/cleanup.c index 315738c74aad..73c86db5acbe 100644 --- a/arch/x86/kernel/cpu/mtrr/cleanup.c +++ b/arch/x86/kernel/cpu/mtrr/cleanup.c | |||
| @@ -846,7 +846,7 @@ int __init mtrr_cleanup(unsigned address_bits) | |||
| 846 | sort(range, nr_range, sizeof(struct res_range), cmp_range, NULL); | 846 | sort(range, nr_range, sizeof(struct res_range), cmp_range, NULL); |
| 847 | 847 | ||
| 848 | range_sums = sum_ranges(range, nr_range); | 848 | range_sums = sum_ranges(range, nr_range); |
| 849 | printk(KERN_INFO "total RAM coverred: %ldM\n", | 849 | printk(KERN_INFO "total RAM covered: %ldM\n", |
| 850 | range_sums >> (20 - PAGE_SHIFT)); | 850 | range_sums >> (20 - PAGE_SHIFT)); |
| 851 | 851 | ||
| 852 | if (mtrr_chunk_size && mtrr_gran_size) { | 852 | if (mtrr_chunk_size && mtrr_gran_size) { |
diff --git a/arch/x86/kernel/crash_dump_32.c b/arch/x86/kernel/crash_dump_32.c index f7cdb3b457aa..cd97ce18c29d 100644 --- a/arch/x86/kernel/crash_dump_32.c +++ b/arch/x86/kernel/crash_dump_32.c | |||
| @@ -16,6 +16,22 @@ static void *kdump_buf_page; | |||
| 16 | /* Stores the physical address of elf header of crash image. */ | 16 | /* Stores the physical address of elf header of crash image. */ |
| 17 | unsigned long long elfcorehdr_addr = ELFCORE_ADDR_MAX; | 17 | unsigned long long elfcorehdr_addr = ELFCORE_ADDR_MAX; |
| 18 | 18 | ||
| 19 | static inline bool is_crashed_pfn_valid(unsigned long pfn) | ||
| 20 | { | ||
| 21 | #ifndef CONFIG_X86_PAE | ||
| 22 | /* | ||
| 23 | * non-PAE kdump kernel executed from a PAE one will crop high pte | ||
| 24 | * bits and poke unwanted space counting again from address 0, we | ||
| 25 | * don't want that. pte must fit into unsigned long. In fact the | ||
| 26 | * test checks high 12 bits for being zero (pfn will be shifted left | ||
| 27 | * by PAGE_SHIFT). | ||
| 28 | */ | ||
| 29 | return pte_pfn(pfn_pte(pfn, __pgprot(0))) == pfn; | ||
| 30 | #else | ||
| 31 | return true; | ||
| 32 | #endif | ||
| 33 | } | ||
| 34 | |||
| 19 | /** | 35 | /** |
| 20 | * copy_oldmem_page - copy one page from "oldmem" | 36 | * copy_oldmem_page - copy one page from "oldmem" |
| 21 | * @pfn: page frame number to be copied | 37 | * @pfn: page frame number to be copied |
| @@ -41,6 +57,9 @@ ssize_t copy_oldmem_page(unsigned long pfn, char *buf, | |||
| 41 | if (!csize) | 57 | if (!csize) |
| 42 | return 0; | 58 | return 0; |
| 43 | 59 | ||
| 60 | if (!is_crashed_pfn_valid(pfn)) | ||
| 61 | return -EFAULT; | ||
| 62 | |||
| 44 | vaddr = kmap_atomic_pfn(pfn, KM_PTE0); | 63 | vaddr = kmap_atomic_pfn(pfn, KM_PTE0); |
| 45 | 64 | ||
| 46 | if (!userbuf) { | 65 | if (!userbuf) { |
diff --git a/arch/x86/kernel/efi.c b/arch/x86/kernel/efi.c index ad5bd988fb79..cdcfb122f256 100644 --- a/arch/x86/kernel/efi.c +++ b/arch/x86/kernel/efi.c | |||
| @@ -454,8 +454,10 @@ void __init efi_init(void) | |||
| 454 | if (add_efi_memmap) | 454 | if (add_efi_memmap) |
| 455 | do_add_efi_memmap(); | 455 | do_add_efi_memmap(); |
| 456 | 456 | ||
| 457 | #ifdef CONFIG_X86_32 | ||
| 457 | x86_platform.get_wallclock = efi_get_time; | 458 | x86_platform.get_wallclock = efi_get_time; |
| 458 | x86_platform.set_wallclock = efi_set_rtc_mmss; | 459 | x86_platform.set_wallclock = efi_set_rtc_mmss; |
| 460 | #endif | ||
| 459 | 461 | ||
| 460 | /* Setup for EFI runtime service */ | 462 | /* Setup for EFI runtime service */ |
| 461 | reboot_type = BOOT_EFI; | 463 | reboot_type = BOOT_EFI; |
diff --git a/arch/x86/kernel/microcode_amd.c b/arch/x86/kernel/microcode_amd.c index 366baa179913..f4c538b681ca 100644 --- a/arch/x86/kernel/microcode_amd.c +++ b/arch/x86/kernel/microcode_amd.c | |||
| @@ -317,6 +317,12 @@ static enum ucode_state request_microcode_fw(int cpu, struct device *device) | |||
| 317 | return UCODE_NFOUND; | 317 | return UCODE_NFOUND; |
| 318 | } | 318 | } |
| 319 | 319 | ||
| 320 | if (*(u32 *)firmware->data != UCODE_MAGIC) { | ||
| 321 | printk(KERN_ERR "microcode: invalid UCODE_MAGIC (0x%08x)\n", | ||
| 322 | *(u32 *)firmware->data); | ||
| 323 | return UCODE_ERROR; | ||
| 324 | } | ||
| 325 | |||
| 320 | ret = generic_load_microcode(cpu, firmware->data, firmware->size); | 326 | ret = generic_load_microcode(cpu, firmware->data, firmware->size); |
| 321 | 327 | ||
| 322 | release_firmware(firmware); | 328 | release_firmware(firmware); |
diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c index b2a71dca5642..a6e804d16c35 100644 --- a/arch/x86/kernel/pci-dma.c +++ b/arch/x86/kernel/pci-dma.c | |||
| @@ -45,12 +45,10 @@ int iommu_pass_through __read_mostly; | |||
| 45 | dma_addr_t bad_dma_address __read_mostly = 0; | 45 | dma_addr_t bad_dma_address __read_mostly = 0; |
| 46 | EXPORT_SYMBOL(bad_dma_address); | 46 | EXPORT_SYMBOL(bad_dma_address); |
| 47 | 47 | ||
| 48 | /* Dummy device used for NULL arguments (normally ISA). Better would | 48 | /* Dummy device used for NULL arguments (normally ISA). */ |
| 49 | be probably a smaller DMA mask, but this is bug-to-bug compatible | ||
| 50 | to older i386. */ | ||
| 51 | struct device x86_dma_fallback_dev = { | 49 | struct device x86_dma_fallback_dev = { |
| 52 | .init_name = "fallback device", | 50 | .init_name = "fallback device", |
| 53 | .coherent_dma_mask = DMA_BIT_MASK(32), | 51 | .coherent_dma_mask = ISA_DMA_BIT_MASK, |
| 54 | .dma_mask = &x86_dma_fallback_dev.coherent_dma_mask, | 52 | .dma_mask = &x86_dma_fallback_dev.coherent_dma_mask, |
| 55 | }; | 53 | }; |
| 56 | EXPORT_SYMBOL(x86_dma_fallback_dev); | 54 | EXPORT_SYMBOL(x86_dma_fallback_dev); |
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index ad535b683170..eb62cbcaa490 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c | |||
| @@ -664,3 +664,8 @@ long sys_arch_prctl(int code, unsigned long addr) | |||
| 664 | return do_arch_prctl(current, code, addr); | 664 | return do_arch_prctl(current, code, addr); |
| 665 | } | 665 | } |
| 666 | 666 | ||
| 667 | unsigned long KSTK_ESP(struct task_struct *task) | ||
| 668 | { | ||
| 669 | return (test_tsk_thread_flag(task, TIF_IA32)) ? | ||
| 670 | (task_pt_regs(task)->sp) : ((task)->thread.usersp); | ||
| 671 | } | ||
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index a1a3cdda06e1..f93078746e00 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c | |||
| @@ -436,6 +436,14 @@ static struct dmi_system_id __initdata pci_reboot_dmi_table[] = { | |||
| 436 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5"), | 436 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5"), |
| 437 | }, | 437 | }, |
| 438 | }, | 438 | }, |
| 439 | { /* Handle problems with rebooting on Apple Macmini3,1 */ | ||
| 440 | .callback = set_pci_reboot, | ||
| 441 | .ident = "Apple Macmini3,1", | ||
| 442 | .matches = { | ||
| 443 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | ||
| 444 | DMI_MATCH(DMI_PRODUCT_NAME, "Macmini3,1"), | ||
| 445 | }, | ||
| 446 | }, | ||
| 439 | { } | 447 | { } |
| 440 | }; | 448 | }; |
| 441 | 449 | ||
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index e09f0e2c14b5..2a34f9c5be21 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
| @@ -660,6 +660,13 @@ static struct dmi_system_id __initdata bad_bios_dmi_table[] = { | |||
| 660 | }, | 660 | }, |
| 661 | }, | 661 | }, |
| 662 | { | 662 | { |
| 663 | .callback = dmi_low_memory_corruption, | ||
| 664 | .ident = "Phoenix/MSC BIOS", | ||
| 665 | .matches = { | ||
| 666 | DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix/MSC"), | ||
| 667 | }, | ||
| 668 | }, | ||
| 669 | { | ||
| 663 | /* | 670 | /* |
| 664 | * AMI BIOS with low memory corruption was found on Intel DG45ID board. | 671 | * AMI BIOS with low memory corruption was found on Intel DG45ID board. |
| 665 | * It hase different DMI_BIOS_VENDOR = "Intel Corp.", for now we will | 672 | * It hase different DMI_BIOS_VENDOR = "Intel Corp.", for now we will |
diff --git a/arch/x86/kernel/tlb_uv.c b/arch/x86/kernel/tlb_uv.c index 503c1f2e8835..1740c85e24bb 100644 --- a/arch/x86/kernel/tlb_uv.c +++ b/arch/x86/kernel/tlb_uv.c | |||
| @@ -23,8 +23,6 @@ | |||
| 23 | static struct bau_control **uv_bau_table_bases __read_mostly; | 23 | static struct bau_control **uv_bau_table_bases __read_mostly; |
| 24 | static int uv_bau_retry_limit __read_mostly; | 24 | static int uv_bau_retry_limit __read_mostly; |
| 25 | 25 | ||
| 26 | /* position of pnode (which is nasid>>1): */ | ||
| 27 | static int uv_nshift __read_mostly; | ||
| 28 | /* base pnode in this partition */ | 26 | /* base pnode in this partition */ |
| 29 | static int uv_partition_base_pnode __read_mostly; | 27 | static int uv_partition_base_pnode __read_mostly; |
| 30 | 28 | ||
| @@ -723,7 +721,7 @@ uv_activation_descriptor_init(int node, int pnode) | |||
| 723 | BUG_ON(!adp); | 721 | BUG_ON(!adp); |
| 724 | 722 | ||
| 725 | pa = uv_gpa(adp); /* need the real nasid*/ | 723 | pa = uv_gpa(adp); /* need the real nasid*/ |
| 726 | n = pa >> uv_nshift; | 724 | n = uv_gpa_to_pnode(pa); |
| 727 | m = pa & uv_mmask; | 725 | m = pa & uv_mmask; |
| 728 | 726 | ||
| 729 | uv_write_global_mmr64(pnode, UVH_LB_BAU_SB_DESCRIPTOR_BASE, | 727 | uv_write_global_mmr64(pnode, UVH_LB_BAU_SB_DESCRIPTOR_BASE, |
| @@ -778,7 +776,7 @@ uv_payload_queue_init(int node, int pnode, struct bau_control *bau_tablesp) | |||
| 778 | * need the pnode of where the memory was really allocated | 776 | * need the pnode of where the memory was really allocated |
| 779 | */ | 777 | */ |
| 780 | pa = uv_gpa(pqp); | 778 | pa = uv_gpa(pqp); |
| 781 | pn = pa >> uv_nshift; | 779 | pn = uv_gpa_to_pnode(pa); |
| 782 | uv_write_global_mmr64(pnode, | 780 | uv_write_global_mmr64(pnode, |
| 783 | UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST, | 781 | UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST, |
| 784 | ((unsigned long)pn << UV_PAYLOADQ_PNODE_SHIFT) | | 782 | ((unsigned long)pn << UV_PAYLOADQ_PNODE_SHIFT) | |
| @@ -843,8 +841,7 @@ static int __init uv_bau_init(void) | |||
| 843 | GFP_KERNEL, cpu_to_node(cur_cpu)); | 841 | GFP_KERNEL, cpu_to_node(cur_cpu)); |
| 844 | 842 | ||
| 845 | uv_bau_retry_limit = 1; | 843 | uv_bau_retry_limit = 1; |
| 846 | uv_nshift = uv_hub_info->n_val; | 844 | uv_mmask = (1UL << uv_hub_info->m_val) - 1; |
| 847 | uv_mmask = (1UL << uv_hub_info->n_val) - 1; | ||
| 848 | nblades = uv_num_possible_blades(); | 845 | nblades = uv_num_possible_blades(); |
| 849 | 846 | ||
| 850 | uv_bau_table_bases = (struct bau_control **) | 847 | uv_bau_table_bases = (struct bau_control **) |
diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S index 92929fb3f9fa..3c68fe2d46cf 100644 --- a/arch/x86/kernel/vmlinux.lds.S +++ b/arch/x86/kernel/vmlinux.lds.S | |||
| @@ -305,6 +305,9 @@ SECTIONS | |||
| 305 | 305 | ||
| 306 | 306 | ||
| 307 | #ifdef CONFIG_X86_32 | 307 | #ifdef CONFIG_X86_32 |
| 308 | /* | ||
| 309 | * The ASSERT() sink to . is intentional, for binutils 2.14 compatibility: | ||
| 310 | */ | ||
| 308 | . = ASSERT((_end - LOAD_OFFSET <= KERNEL_IMAGE_SIZE), | 311 | . = ASSERT((_end - LOAD_OFFSET <= KERNEL_IMAGE_SIZE), |
| 309 | "kernel image bigger than KERNEL_IMAGE_SIZE"); | 312 | "kernel image bigger than KERNEL_IMAGE_SIZE"); |
| 310 | #else | 313 | #else |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 9b9695322f56..ae07d261527c 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
| @@ -1692,7 +1692,7 @@ static int kvm_vcpu_ioctl_x86_setup_mce(struct kvm_vcpu *vcpu, | |||
| 1692 | unsigned bank_num = mcg_cap & 0xff, bank; | 1692 | unsigned bank_num = mcg_cap & 0xff, bank; |
| 1693 | 1693 | ||
| 1694 | r = -EINVAL; | 1694 | r = -EINVAL; |
| 1695 | if (!bank_num) | 1695 | if (!bank_num || bank_num >= KVM_MAX_MCE_BANKS) |
| 1696 | goto out; | 1696 | goto out; |
| 1697 | if (mcg_cap & ~(KVM_MCE_CAP_SUPPORTED | 0xff | 0xff0000)) | 1697 | if (mcg_cap & ~(KVM_MCE_CAP_SUPPORTED | 0xff | 0xff0000)) |
| 1698 | goto out; | 1698 | goto out; |
| @@ -4051,7 +4051,7 @@ static int save_guest_segment_descriptor(struct kvm_vcpu *vcpu, u16 selector, | |||
| 4051 | return kvm_write_guest_virt(dtable.base + index*8, seg_desc, sizeof(*seg_desc), vcpu); | 4051 | return kvm_write_guest_virt(dtable.base + index*8, seg_desc, sizeof(*seg_desc), vcpu); |
| 4052 | } | 4052 | } |
| 4053 | 4053 | ||
| 4054 | static u32 get_tss_base_addr(struct kvm_vcpu *vcpu, | 4054 | static gpa_t get_tss_base_addr(struct kvm_vcpu *vcpu, |
| 4055 | struct desc_struct *seg_desc) | 4055 | struct desc_struct *seg_desc) |
| 4056 | { | 4056 | { |
| 4057 | u32 base_addr = get_desc_base(seg_desc); | 4057 | u32 base_addr = get_desc_base(seg_desc); |
diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c index 334e63ca7b2b..2feb9bdedaaf 100644 --- a/arch/x86/mm/ioremap.c +++ b/arch/x86/mm/ioremap.c | |||
| @@ -170,8 +170,7 @@ static void __iomem *__ioremap_caller(resource_size_t phys_addr, | |||
| 170 | (unsigned long long)phys_addr, | 170 | (unsigned long long)phys_addr, |
| 171 | (unsigned long long)(phys_addr + size), | 171 | (unsigned long long)(phys_addr + size), |
| 172 | prot_val, new_prot_val); | 172 | prot_val, new_prot_val); |
| 173 | free_memtype(phys_addr, phys_addr + size); | 173 | goto err_free_memtype; |
| 174 | return NULL; | ||
| 175 | } | 174 | } |
| 176 | prot_val = new_prot_val; | 175 | prot_val = new_prot_val; |
| 177 | } | 176 | } |
| @@ -197,26 +196,25 @@ static void __iomem *__ioremap_caller(resource_size_t phys_addr, | |||
| 197 | */ | 196 | */ |
| 198 | area = get_vm_area_caller(size, VM_IOREMAP, caller); | 197 | area = get_vm_area_caller(size, VM_IOREMAP, caller); |
| 199 | if (!area) | 198 | if (!area) |
| 200 | return NULL; | 199 | goto err_free_memtype; |
| 201 | area->phys_addr = phys_addr; | 200 | area->phys_addr = phys_addr; |
| 202 | vaddr = (unsigned long) area->addr; | 201 | vaddr = (unsigned long) area->addr; |
| 203 | 202 | ||
| 204 | if (kernel_map_sync_memtype(phys_addr, size, prot_val)) { | 203 | if (kernel_map_sync_memtype(phys_addr, size, prot_val)) |
| 205 | free_memtype(phys_addr, phys_addr + size); | 204 | goto err_free_area; |
| 206 | free_vm_area(area); | ||
| 207 | return NULL; | ||
| 208 | } | ||
| 209 | 205 | ||
| 210 | if (ioremap_page_range(vaddr, vaddr + size, phys_addr, prot)) { | 206 | if (ioremap_page_range(vaddr, vaddr + size, phys_addr, prot)) |
| 211 | free_memtype(phys_addr, phys_addr + size); | 207 | goto err_free_area; |
| 212 | free_vm_area(area); | ||
| 213 | return NULL; | ||
| 214 | } | ||
| 215 | 208 | ||
| 216 | ret_addr = (void __iomem *) (vaddr + offset); | 209 | ret_addr = (void __iomem *) (vaddr + offset); |
| 217 | mmiotrace_ioremap(unaligned_phys_addr, unaligned_size, ret_addr); | 210 | mmiotrace_ioremap(unaligned_phys_addr, unaligned_size, ret_addr); |
| 218 | 211 | ||
| 219 | return ret_addr; | 212 | return ret_addr; |
| 213 | err_free_area: | ||
| 214 | free_vm_area(area); | ||
| 215 | err_free_memtype: | ||
| 216 | free_memtype(phys_addr, phys_addr + size); | ||
| 217 | return NULL; | ||
| 220 | } | 218 | } |
| 221 | 219 | ||
| 222 | /** | 220 | /** |
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index 3439616d69f1..dfbf70e65860 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
| @@ -178,6 +178,7 @@ static __read_mostly unsigned int cpuid_leaf1_ecx_mask = ~0; | |||
| 178 | static void xen_cpuid(unsigned int *ax, unsigned int *bx, | 178 | static void xen_cpuid(unsigned int *ax, unsigned int *bx, |
| 179 | unsigned int *cx, unsigned int *dx) | 179 | unsigned int *cx, unsigned int *dx) |
| 180 | { | 180 | { |
| 181 | unsigned maskebx = ~0; | ||
| 181 | unsigned maskecx = ~0; | 182 | unsigned maskecx = ~0; |
| 182 | unsigned maskedx = ~0; | 183 | unsigned maskedx = ~0; |
| 183 | 184 | ||
| @@ -185,9 +186,16 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx, | |||
| 185 | * Mask out inconvenient features, to try and disable as many | 186 | * Mask out inconvenient features, to try and disable as many |
| 186 | * unsupported kernel subsystems as possible. | 187 | * unsupported kernel subsystems as possible. |
| 187 | */ | 188 | */ |
| 188 | if (*ax == 1) { | 189 | switch (*ax) { |
| 190 | case 1: | ||
| 189 | maskecx = cpuid_leaf1_ecx_mask; | 191 | maskecx = cpuid_leaf1_ecx_mask; |
| 190 | maskedx = cpuid_leaf1_edx_mask; | 192 | maskedx = cpuid_leaf1_edx_mask; |
| 193 | break; | ||
| 194 | |||
| 195 | case 0xb: | ||
| 196 | /* Suppress extended topology stuff */ | ||
| 197 | maskebx = 0; | ||
| 198 | break; | ||
| 191 | } | 199 | } |
| 192 | 200 | ||
| 193 | asm(XEN_EMULATE_PREFIX "cpuid" | 201 | asm(XEN_EMULATE_PREFIX "cpuid" |
| @@ -197,6 +205,7 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx, | |||
| 197 | "=d" (*dx) | 205 | "=d" (*dx) |
| 198 | : "0" (*ax), "2" (*cx)); | 206 | : "0" (*ax), "2" (*cx)); |
| 199 | 207 | ||
| 208 | *bx &= maskebx; | ||
| 200 | *cx &= maskecx; | 209 | *cx &= maskecx; |
| 201 | *dx &= maskedx; | 210 | *dx &= maskedx; |
| 202 | } | 211 | } |
| @@ -1075,6 +1084,8 @@ asmlinkage void __init xen_start_kernel(void) | |||
| 1075 | * Set up some pagetable state before starting to set any ptes. | 1084 | * Set up some pagetable state before starting to set any ptes. |
| 1076 | */ | 1085 | */ |
| 1077 | 1086 | ||
| 1087 | xen_init_mmu_ops(); | ||
| 1088 | |||
| 1078 | /* Prevent unwanted bits from being set in PTEs. */ | 1089 | /* Prevent unwanted bits from being set in PTEs. */ |
| 1079 | __supported_pte_mask &= ~_PAGE_GLOBAL; | 1090 | __supported_pte_mask &= ~_PAGE_GLOBAL; |
| 1080 | if (!xen_initial_domain()) | 1091 | if (!xen_initial_domain()) |
| @@ -1099,7 +1110,6 @@ asmlinkage void __init xen_start_kernel(void) | |||
| 1099 | */ | 1110 | */ |
| 1100 | xen_setup_stackprotector(); | 1111 | xen_setup_stackprotector(); |
| 1101 | 1112 | ||
| 1102 | xen_init_mmu_ops(); | ||
| 1103 | xen_init_irq_ops(); | 1113 | xen_init_irq_ops(); |
| 1104 | xen_init_cpuid_mask(); | 1114 | xen_init_cpuid_mask(); |
| 1105 | 1115 | ||
