diff options
Diffstat (limited to 'arch/x86')
37 files changed, 229 insertions, 77 deletions
diff --git a/arch/x86/.gitignore b/arch/x86/.gitignore new file mode 100644 index 000000000000..028079065af6 --- /dev/null +++ b/arch/x86/.gitignore | |||
| @@ -0,0 +1,3 @@ | |||
| 1 | boot/compressed/vmlinux | ||
| 2 | tools/test_get_len | ||
| 3 | |||
diff --git a/arch/x86/boot/compressed/mkpiggy.c b/arch/x86/boot/compressed/mkpiggy.c index bcbd36c41432..5c228129d175 100644 --- a/arch/x86/boot/compressed/mkpiggy.c +++ b/arch/x86/boot/compressed/mkpiggy.c | |||
| @@ -77,7 +77,7 @@ int main(int argc, char *argv[]) | |||
| 77 | offs += 32*1024 + 18; /* Add 32K + 18 bytes slack */ | 77 | offs += 32*1024 + 18; /* Add 32K + 18 bytes slack */ |
| 78 | offs = (offs+4095) & ~4095; /* Round to a 4K boundary */ | 78 | offs = (offs+4095) & ~4095; /* Round to a 4K boundary */ |
| 79 | 79 | ||
| 80 | printf(".section \".rodata.compressed\",\"a\",@progbits\n"); | 80 | printf(".section \".rodata..compressed\",\"a\",@progbits\n"); |
| 81 | printf(".globl z_input_len\n"); | 81 | printf(".globl z_input_len\n"); |
| 82 | printf("z_input_len = %lu\n", ilen); | 82 | printf("z_input_len = %lu\n", ilen); |
| 83 | printf(".globl z_output_len\n"); | 83 | printf(".globl z_output_len\n"); |
diff --git a/arch/x86/boot/compressed/vmlinux.lds.S b/arch/x86/boot/compressed/vmlinux.lds.S index a6f1a59a5b0c..5ddabceee124 100644 --- a/arch/x86/boot/compressed/vmlinux.lds.S +++ b/arch/x86/boot/compressed/vmlinux.lds.S | |||
| @@ -26,8 +26,8 @@ SECTIONS | |||
| 26 | HEAD_TEXT | 26 | HEAD_TEXT |
| 27 | _ehead = . ; | 27 | _ehead = . ; |
| 28 | } | 28 | } |
| 29 | .rodata.compressed : { | 29 | .rodata..compressed : { |
| 30 | *(.rodata.compressed) | 30 | *(.rodata..compressed) |
| 31 | } | 31 | } |
| 32 | .text : { | 32 | .text : { |
| 33 | _text = .; /* Text */ | 33 | _text = .; /* Text */ |
diff --git a/arch/x86/boot/video-vga.c b/arch/x86/boot/video-vga.c index ed7aeff786b2..45bc9402aa49 100644 --- a/arch/x86/boot/video-vga.c +++ b/arch/x86/boot/video-vga.c | |||
| @@ -41,13 +41,12 @@ static __videocard video_vga; | |||
| 41 | static u8 vga_set_basic_mode(void) | 41 | static u8 vga_set_basic_mode(void) |
| 42 | { | 42 | { |
| 43 | struct biosregs ireg, oreg; | 43 | struct biosregs ireg, oreg; |
| 44 | u16 ax; | ||
| 45 | u8 mode; | 44 | u8 mode; |
| 46 | 45 | ||
| 47 | initregs(&ireg); | 46 | initregs(&ireg); |
| 48 | 47 | ||
| 49 | /* Query current mode */ | 48 | /* Query current mode */ |
| 50 | ax = 0x0f00; | 49 | ireg.ax = 0x0f00; |
| 51 | intcall(0x10, &ireg, &oreg); | 50 | intcall(0x10, &ireg, &oreg); |
| 52 | mode = oreg.al; | 51 | mode = oreg.al; |
| 53 | 52 | ||
diff --git a/arch/x86/include/asm/cache.h b/arch/x86/include/asm/cache.h index 2f9047cfaaca..48f99f15452e 100644 --- a/arch/x86/include/asm/cache.h +++ b/arch/x86/include/asm/cache.h | |||
| @@ -7,7 +7,7 @@ | |||
| 7 | #define L1_CACHE_SHIFT (CONFIG_X86_L1_CACHE_SHIFT) | 7 | #define L1_CACHE_SHIFT (CONFIG_X86_L1_CACHE_SHIFT) |
| 8 | #define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) | 8 | #define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) |
| 9 | 9 | ||
| 10 | #define __read_mostly __attribute__((__section__(".data.read_mostly"))) | 10 | #define __read_mostly __attribute__((__section__(".data..read_mostly"))) |
| 11 | 11 | ||
| 12 | #define INTERNODE_CACHE_SHIFT CONFIG_X86_INTERNODE_CACHE_SHIFT | 12 | #define INTERNODE_CACHE_SHIFT CONFIG_X86_INTERNODE_CACHE_SHIFT |
| 13 | #define INTERNODE_CACHE_BYTES (1 << INTERNODE_CACHE_SHIFT) | 13 | #define INTERNODE_CACHE_BYTES (1 << INTERNODE_CACHE_SHIFT) |
diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h index 63cb4096c3dc..9cb2edb87c2f 100644 --- a/arch/x86/include/asm/io_apic.h +++ b/arch/x86/include/asm/io_apic.h | |||
| @@ -183,7 +183,7 @@ struct mp_ioapic_gsi{ | |||
| 183 | u32 gsi_end; | 183 | u32 gsi_end; |
| 184 | }; | 184 | }; |
| 185 | extern struct mp_ioapic_gsi mp_gsi_routing[]; | 185 | extern struct mp_ioapic_gsi mp_gsi_routing[]; |
| 186 | extern u32 gsi_end; | 186 | extern u32 gsi_top; |
| 187 | int mp_find_ioapic(u32 gsi); | 187 | int mp_find_ioapic(u32 gsi); |
| 188 | int mp_find_ioapic_pin(int ioapic, u32 gsi); | 188 | int mp_find_ioapic_pin(int ioapic, u32 gsi); |
| 189 | void __init mp_register_ioapic(int id, u32 address, u32 gsi_base); | 189 | void __init mp_register_ioapic(int id, u32 address, u32 gsi_base); |
| @@ -197,7 +197,7 @@ static const int timer_through_8259 = 0; | |||
| 197 | static inline void ioapic_init_mappings(void) { } | 197 | static inline void ioapic_init_mappings(void) { } |
| 198 | static inline void ioapic_insert_resources(void) { } | 198 | static inline void ioapic_insert_resources(void) { } |
| 199 | static inline void probe_nr_irqs_gsi(void) { } | 199 | static inline void probe_nr_irqs_gsi(void) { } |
| 200 | #define gsi_end (NR_IRQS_LEGACY - 1) | 200 | #define gsi_top (NR_IRQS_LEGACY) |
| 201 | static inline int mp_find_ioapic(u32 gsi) { return 0; } | 201 | static inline int mp_find_ioapic(u32 gsi) { return 0; } |
| 202 | 202 | ||
| 203 | struct io_apic_irq_attr; | 203 | struct io_apic_irq_attr; |
diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h index b49d8ca228f6..8c7ae4318629 100644 --- a/arch/x86/include/asm/msr-index.h +++ b/arch/x86/include/asm/msr-index.h | |||
| @@ -110,6 +110,7 @@ | |||
| 110 | #define MSR_AMD64_PATCH_LOADER 0xc0010020 | 110 | #define MSR_AMD64_PATCH_LOADER 0xc0010020 |
| 111 | #define MSR_AMD64_OSVW_ID_LENGTH 0xc0010140 | 111 | #define MSR_AMD64_OSVW_ID_LENGTH 0xc0010140 |
| 112 | #define MSR_AMD64_OSVW_STATUS 0xc0010141 | 112 | #define MSR_AMD64_OSVW_STATUS 0xc0010141 |
| 113 | #define MSR_AMD64_DC_CFG 0xc0011022 | ||
| 113 | #define MSR_AMD64_IBSFETCHCTL 0xc0011030 | 114 | #define MSR_AMD64_IBSFETCHCTL 0xc0011030 |
| 114 | #define MSR_AMD64_IBSFETCHLINAD 0xc0011031 | 115 | #define MSR_AMD64_IBSFETCHLINAD 0xc0011031 |
| 115 | #define MSR_AMD64_IBSFETCHPHYSAD 0xc0011032 | 116 | #define MSR_AMD64_IBSFETCHPHYSAD 0xc0011032 |
diff --git a/arch/x86/include/asm/pci_x86.h b/arch/x86/include/asm/pci_x86.h index 8d8797eae5d7..cd2a31dc5fb8 100644 --- a/arch/x86/include/asm/pci_x86.h +++ b/arch/x86/include/asm/pci_x86.h | |||
| @@ -53,6 +53,8 @@ extern int pcibios_last_bus; | |||
| 53 | extern struct pci_bus *pci_root_bus; | 53 | extern struct pci_bus *pci_root_bus; |
| 54 | extern struct pci_ops pci_root_ops; | 54 | extern struct pci_ops pci_root_ops; |
| 55 | 55 | ||
| 56 | void pcibios_scan_specific_bus(int busn); | ||
| 57 | |||
| 56 | /* pci-irq.c */ | 58 | /* pci-irq.c */ |
| 57 | 59 | ||
| 58 | struct irq_info { | 60 | struct irq_info { |
diff --git a/arch/x86/include/asm/percpu.h b/arch/x86/include/asm/percpu.h index 0797e748d280..cd28f9ad910d 100644 --- a/arch/x86/include/asm/percpu.h +++ b/arch/x86/include/asm/percpu.h | |||
| @@ -77,6 +77,7 @@ do { \ | |||
| 77 | if (0) { \ | 77 | if (0) { \ |
| 78 | pto_T__ pto_tmp__; \ | 78 | pto_T__ pto_tmp__; \ |
| 79 | pto_tmp__ = (val); \ | 79 | pto_tmp__ = (val); \ |
| 80 | (void)pto_tmp__; \ | ||
| 80 | } \ | 81 | } \ |
| 81 | switch (sizeof(var)) { \ | 82 | switch (sizeof(var)) { \ |
| 82 | case 1: \ | 83 | case 1: \ |
| @@ -115,6 +116,7 @@ do { \ | |||
| 115 | if (0) { \ | 116 | if (0) { \ |
| 116 | pao_T__ pao_tmp__; \ | 117 | pao_T__ pao_tmp__; \ |
| 117 | pao_tmp__ = (val); \ | 118 | pao_tmp__ = (val); \ |
| 119 | (void)pao_tmp__; \ | ||
| 118 | } \ | 120 | } \ |
| 119 | switch (sizeof(var)) { \ | 121 | switch (sizeof(var)) { \ |
| 120 | case 1: \ | 122 | case 1: \ |
diff --git a/arch/x86/include/asm/pgtable_32_types.h b/arch/x86/include/asm/pgtable_32_types.h index 5e67c1532314..ed5903be26fe 100644 --- a/arch/x86/include/asm/pgtable_32_types.h +++ b/arch/x86/include/asm/pgtable_32_types.h | |||
| @@ -26,7 +26,7 @@ | |||
| 26 | */ | 26 | */ |
| 27 | #define VMALLOC_OFFSET (8 * 1024 * 1024) | 27 | #define VMALLOC_OFFSET (8 * 1024 * 1024) |
| 28 | 28 | ||
| 29 | #ifndef __ASSEMBLER__ | 29 | #ifndef __ASSEMBLY__ |
| 30 | extern bool __vmalloc_start_set; /* set once high_memory is set */ | 30 | extern bool __vmalloc_start_set; /* set once high_memory is set */ |
| 31 | #endif | 31 | #endif |
| 32 | 32 | ||
diff --git a/arch/x86/include/asm/suspend_32.h b/arch/x86/include/asm/suspend_32.h index 48dcfa62ea07..fd921c3a6841 100644 --- a/arch/x86/include/asm/suspend_32.h +++ b/arch/x86/include/asm/suspend_32.h | |||
| @@ -15,6 +15,8 @@ static inline int arch_prepare_suspend(void) { return 0; } | |||
| 15 | struct saved_context { | 15 | struct saved_context { |
| 16 | u16 es, fs, gs, ss; | 16 | u16 es, fs, gs, ss; |
| 17 | unsigned long cr0, cr2, cr3, cr4; | 17 | unsigned long cr0, cr2, cr3, cr4; |
| 18 | u64 misc_enable; | ||
| 19 | bool misc_enable_saved; | ||
| 18 | struct desc_ptr gdt; | 20 | struct desc_ptr gdt; |
| 19 | struct desc_ptr idt; | 21 | struct desc_ptr idt; |
| 20 | u16 ldt; | 22 | u16 ldt; |
diff --git a/arch/x86/include/asm/suspend_64.h b/arch/x86/include/asm/suspend_64.h index 06284f42b759..8d942afae681 100644 --- a/arch/x86/include/asm/suspend_64.h +++ b/arch/x86/include/asm/suspend_64.h | |||
| @@ -27,6 +27,8 @@ struct saved_context { | |||
| 27 | u16 ds, es, fs, gs, ss; | 27 | u16 ds, es, fs, gs, ss; |
| 28 | unsigned long gs_base, gs_kernel_base, fs_base; | 28 | unsigned long gs_base, gs_kernel_base, fs_base; |
| 29 | unsigned long cr0, cr2, cr3, cr4, cr8; | 29 | unsigned long cr0, cr2, cr3, cr4, cr8; |
| 30 | u64 misc_enable; | ||
| 31 | bool misc_enable_saved; | ||
| 30 | unsigned long efer; | 32 | unsigned long efer; |
| 31 | u16 gdt_pad; | 33 | u16 gdt_pad; |
| 32 | u16 gdt_limit; | 34 | u16 gdt_limit; |
diff --git a/arch/x86/include/asm/system.h b/arch/x86/include/asm/system.h index b8fe48ee2ed9..e7f4d33c55ed 100644 --- a/arch/x86/include/asm/system.h +++ b/arch/x86/include/asm/system.h | |||
| @@ -451,7 +451,7 @@ void stop_this_cpu(void *dummy); | |||
| 451 | * | 451 | * |
| 452 | * (Could use an alternative three way for this if there was one.) | 452 | * (Could use an alternative three way for this if there was one.) |
| 453 | */ | 453 | */ |
| 454 | static inline void rdtsc_barrier(void) | 454 | static __always_inline void rdtsc_barrier(void) |
| 455 | { | 455 | { |
| 456 | alternative(ASM_NOP3, "mfence", X86_FEATURE_MFENCE_RDTSC); | 456 | alternative(ASM_NOP3, "mfence", X86_FEATURE_MFENCE_RDTSC); |
| 457 | alternative(ASM_NOP3, "lfence", X86_FEATURE_LFENCE_RDTSC); | 457 | alternative(ASM_NOP3, "lfence", X86_FEATURE_LFENCE_RDTSC); |
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index 60cc4058ed5f..c05872aa3ce0 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
| @@ -118,7 +118,7 @@ static unsigned int gsi_to_irq(unsigned int gsi) | |||
| 118 | if (gsi >= NR_IRQS_LEGACY) | 118 | if (gsi >= NR_IRQS_LEGACY) |
| 119 | irq = gsi; | 119 | irq = gsi; |
| 120 | else | 120 | else |
| 121 | irq = gsi_end + 1 + gsi; | 121 | irq = gsi_top + gsi; |
| 122 | 122 | ||
| 123 | return irq; | 123 | return irq; |
| 124 | } | 124 | } |
| @@ -129,10 +129,10 @@ static u32 irq_to_gsi(int irq) | |||
| 129 | 129 | ||
| 130 | if (irq < NR_IRQS_LEGACY) | 130 | if (irq < NR_IRQS_LEGACY) |
| 131 | gsi = isa_irq_to_gsi[irq]; | 131 | gsi = isa_irq_to_gsi[irq]; |
| 132 | else if (irq <= gsi_end) | 132 | else if (irq < gsi_top) |
| 133 | gsi = irq; | 133 | gsi = irq; |
| 134 | else if (irq <= (gsi_end + NR_IRQS_LEGACY)) | 134 | else if (irq < (gsi_top + NR_IRQS_LEGACY)) |
| 135 | gsi = irq - gsi_end; | 135 | gsi = irq - gsi_top; |
| 136 | else | 136 | else |
| 137 | gsi = 0xffffffff; | 137 | gsi = 0xffffffff; |
| 138 | 138 | ||
diff --git a/arch/x86/kernel/acpi/wakeup_32.S b/arch/x86/kernel/acpi/wakeup_32.S index 8ded418b0593..13ab720573e3 100644 --- a/arch/x86/kernel/acpi/wakeup_32.S +++ b/arch/x86/kernel/acpi/wakeup_32.S | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | .section .text.page_aligned | 1 | .section .text..page_aligned |
| 2 | #include <linux/linkage.h> | 2 | #include <linux/linkage.h> |
| 3 | #include <asm/segment.h> | 3 | #include <asm/segment.h> |
| 4 | #include <asm/page_types.h> | 4 | #include <asm/page_types.h> |
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c index fa5a1474cd18..0d20286d78c6 100644 --- a/arch/x86/kernel/amd_iommu.c +++ b/arch/x86/kernel/amd_iommu.c | |||
| @@ -1487,6 +1487,7 @@ static int __attach_device(struct device *dev, | |||
| 1487 | struct protection_domain *domain) | 1487 | struct protection_domain *domain) |
| 1488 | { | 1488 | { |
| 1489 | struct iommu_dev_data *dev_data, *alias_data; | 1489 | struct iommu_dev_data *dev_data, *alias_data; |
| 1490 | int ret; | ||
| 1490 | 1491 | ||
| 1491 | dev_data = get_dev_data(dev); | 1492 | dev_data = get_dev_data(dev); |
| 1492 | alias_data = get_dev_data(dev_data->alias); | 1493 | alias_data = get_dev_data(dev_data->alias); |
| @@ -1498,13 +1499,14 @@ static int __attach_device(struct device *dev, | |||
| 1498 | spin_lock(&domain->lock); | 1499 | spin_lock(&domain->lock); |
| 1499 | 1500 | ||
| 1500 | /* Some sanity checks */ | 1501 | /* Some sanity checks */ |
| 1502 | ret = -EBUSY; | ||
| 1501 | if (alias_data->domain != NULL && | 1503 | if (alias_data->domain != NULL && |
| 1502 | alias_data->domain != domain) | 1504 | alias_data->domain != domain) |
| 1503 | return -EBUSY; | 1505 | goto out_unlock; |
| 1504 | 1506 | ||
| 1505 | if (dev_data->domain != NULL && | 1507 | if (dev_data->domain != NULL && |
| 1506 | dev_data->domain != domain) | 1508 | dev_data->domain != domain) |
| 1507 | return -EBUSY; | 1509 | goto out_unlock; |
| 1508 | 1510 | ||
| 1509 | /* Do real assignment */ | 1511 | /* Do real assignment */ |
| 1510 | if (dev_data->alias != dev) { | 1512 | if (dev_data->alias != dev) { |
| @@ -1520,10 +1522,14 @@ static int __attach_device(struct device *dev, | |||
| 1520 | 1522 | ||
| 1521 | atomic_inc(&dev_data->bind); | 1523 | atomic_inc(&dev_data->bind); |
| 1522 | 1524 | ||
| 1525 | ret = 0; | ||
| 1526 | |||
| 1527 | out_unlock: | ||
| 1528 | |||
| 1523 | /* ready */ | 1529 | /* ready */ |
| 1524 | spin_unlock(&domain->lock); | 1530 | spin_unlock(&domain->lock); |
| 1525 | 1531 | ||
| 1526 | return 0; | 1532 | return ret; |
| 1527 | } | 1533 | } |
| 1528 | 1534 | ||
| 1529 | /* | 1535 | /* |
| @@ -2324,10 +2330,6 @@ int __init amd_iommu_init_dma_ops(void) | |||
| 2324 | 2330 | ||
| 2325 | iommu_detected = 1; | 2331 | iommu_detected = 1; |
| 2326 | swiotlb = 0; | 2332 | swiotlb = 0; |
| 2327 | #ifdef CONFIG_GART_IOMMU | ||
| 2328 | gart_iommu_aperture_disabled = 1; | ||
| 2329 | gart_iommu_aperture = 0; | ||
| 2330 | #endif | ||
| 2331 | 2333 | ||
| 2332 | /* Make the driver finally visible to the drivers */ | 2334 | /* Make the driver finally visible to the drivers */ |
| 2333 | dma_ops = &amd_iommu_dma_ops; | 2335 | dma_ops = &amd_iommu_dma_ops; |
diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c index 3bacb4d0844c..3cc63e2b8dd4 100644 --- a/arch/x86/kernel/amd_iommu_init.c +++ b/arch/x86/kernel/amd_iommu_init.c | |||
| @@ -287,8 +287,12 @@ static u8 * __init iommu_map_mmio_space(u64 address) | |||
| 287 | { | 287 | { |
| 288 | u8 *ret; | 288 | u8 *ret; |
| 289 | 289 | ||
| 290 | if (!request_mem_region(address, MMIO_REGION_LENGTH, "amd_iommu")) | 290 | if (!request_mem_region(address, MMIO_REGION_LENGTH, "amd_iommu")) { |
| 291 | pr_err("AMD-Vi: Can not reserve memory region %llx for mmio\n", | ||
| 292 | address); | ||
| 293 | pr_err("AMD-Vi: This is a BIOS bug. Please contact your hardware vendor\n"); | ||
| 291 | return NULL; | 294 | return NULL; |
| 295 | } | ||
| 292 | 296 | ||
| 293 | ret = ioremap_nocache(address, MMIO_REGION_LENGTH); | 297 | ret = ioremap_nocache(address, MMIO_REGION_LENGTH); |
| 294 | if (ret != NULL) | 298 | if (ret != NULL) |
| @@ -1314,7 +1318,7 @@ static int __init amd_iommu_init(void) | |||
| 1314 | ret = amd_iommu_init_dma_ops(); | 1318 | ret = amd_iommu_init_dma_ops(); |
| 1315 | 1319 | ||
| 1316 | if (ret) | 1320 | if (ret) |
| 1317 | goto free; | 1321 | goto free_disable; |
| 1318 | 1322 | ||
| 1319 | amd_iommu_init_api(); | 1323 | amd_iommu_init_api(); |
| 1320 | 1324 | ||
| @@ -1332,9 +1336,10 @@ static int __init amd_iommu_init(void) | |||
| 1332 | out: | 1336 | out: |
| 1333 | return ret; | 1337 | return ret; |
| 1334 | 1338 | ||
| 1335 | free: | 1339 | free_disable: |
| 1336 | disable_iommus(); | 1340 | disable_iommus(); |
| 1337 | 1341 | ||
| 1342 | free: | ||
| 1338 | amd_iommu_uninit_devices(); | 1343 | amd_iommu_uninit_devices(); |
| 1339 | 1344 | ||
| 1340 | free_pages((unsigned long)amd_iommu_pd_alloc_bitmap, | 1345 | free_pages((unsigned long)amd_iommu_pd_alloc_bitmap, |
| @@ -1353,6 +1358,15 @@ free: | |||
| 1353 | 1358 | ||
| 1354 | free_unity_maps(); | 1359 | free_unity_maps(); |
| 1355 | 1360 | ||
| 1361 | #ifdef CONFIG_GART_IOMMU | ||
| 1362 | /* | ||
| 1363 | * We failed to initialize the AMD IOMMU - try fallback to GART | ||
| 1364 | * if possible. | ||
| 1365 | */ | ||
| 1366 | gart_iommu_init(); | ||
| 1367 | |||
| 1368 | #endif | ||
| 1369 | |||
| 1356 | goto out; | 1370 | goto out; |
| 1357 | } | 1371 | } |
| 1358 | 1372 | ||
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 33f3563a2a52..e41ed24ab26d 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c | |||
| @@ -89,8 +89,8 @@ int nr_ioapics; | |||
| 89 | /* IO APIC gsi routing info */ | 89 | /* IO APIC gsi routing info */ |
| 90 | struct mp_ioapic_gsi mp_gsi_routing[MAX_IO_APICS]; | 90 | struct mp_ioapic_gsi mp_gsi_routing[MAX_IO_APICS]; |
| 91 | 91 | ||
| 92 | /* The last gsi number used */ | 92 | /* The one past the highest gsi number used */ |
| 93 | u32 gsi_end; | 93 | u32 gsi_top; |
| 94 | 94 | ||
| 95 | /* MP IRQ source entries */ | 95 | /* MP IRQ source entries */ |
| 96 | struct mpc_intsrc mp_irqs[MAX_IRQ_SOURCES]; | 96 | struct mpc_intsrc mp_irqs[MAX_IRQ_SOURCES]; |
| @@ -1035,7 +1035,7 @@ static int pin_2_irq(int idx, int apic, int pin) | |||
| 1035 | if (gsi >= NR_IRQS_LEGACY) | 1035 | if (gsi >= NR_IRQS_LEGACY) |
| 1036 | irq = gsi; | 1036 | irq = gsi; |
| 1037 | else | 1037 | else |
| 1038 | irq = gsi_end + 1 + gsi; | 1038 | irq = gsi_top + gsi; |
| 1039 | } | 1039 | } |
| 1040 | 1040 | ||
| 1041 | #ifdef CONFIG_X86_32 | 1041 | #ifdef CONFIG_X86_32 |
| @@ -3853,7 +3853,7 @@ void __init probe_nr_irqs_gsi(void) | |||
| 3853 | { | 3853 | { |
| 3854 | int nr; | 3854 | int nr; |
| 3855 | 3855 | ||
| 3856 | nr = gsi_end + 1 + NR_IRQS_LEGACY; | 3856 | nr = gsi_top + NR_IRQS_LEGACY; |
| 3857 | if (nr > nr_irqs_gsi) | 3857 | if (nr > nr_irqs_gsi) |
| 3858 | nr_irqs_gsi = nr; | 3858 | nr_irqs_gsi = nr; |
| 3859 | 3859 | ||
| @@ -4294,8 +4294,8 @@ void __init mp_register_ioapic(int id, u32 address, u32 gsi_base) | |||
| 4294 | */ | 4294 | */ |
| 4295 | nr_ioapic_registers[idx] = entries; | 4295 | nr_ioapic_registers[idx] = entries; |
| 4296 | 4296 | ||
| 4297 | if (mp_gsi_routing[idx].gsi_end > gsi_end) | 4297 | if (mp_gsi_routing[idx].gsi_end >= gsi_top) |
| 4298 | gsi_end = mp_gsi_routing[idx].gsi_end; | 4298 | gsi_top = mp_gsi_routing[idx].gsi_end + 1; |
| 4299 | 4299 | ||
| 4300 | printk(KERN_INFO "IOAPIC[%d]: apic_id %d, version %d, address 0x%x, " | 4300 | printk(KERN_INFO "IOAPIC[%d]: apic_id %d, version %d, address 0x%x, " |
| 4301 | "GSI %d-%d\n", idx, mp_ioapics[idx].apicid, | 4301 | "GSI %d-%d\n", idx, mp_ioapics[idx].apicid, |
diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c index 707165dbc203..18cc42562250 100644 --- a/arch/x86/kernel/cpu/mcheck/mce.c +++ b/arch/x86/kernel/cpu/mcheck/mce.c | |||
| @@ -36,6 +36,7 @@ | |||
| 36 | #include <linux/fs.h> | 36 | #include <linux/fs.h> |
| 37 | #include <linux/mm.h> | 37 | #include <linux/mm.h> |
| 38 | #include <linux/debugfs.h> | 38 | #include <linux/debugfs.h> |
| 39 | #include <linux/edac_mce.h> | ||
| 39 | 40 | ||
| 40 | #include <asm/processor.h> | 41 | #include <asm/processor.h> |
| 41 | #include <asm/hw_irq.h> | 42 | #include <asm/hw_irq.h> |
| @@ -169,6 +170,15 @@ void mce_log(struct mce *mce) | |||
| 169 | entry = rcu_dereference_check_mce(mcelog.next); | 170 | entry = rcu_dereference_check_mce(mcelog.next); |
| 170 | for (;;) { | 171 | for (;;) { |
| 171 | /* | 172 | /* |
| 173 | * If edac_mce is enabled, it will check the error type | ||
| 174 | * and will process it, if it is a known error. | ||
| 175 | * Otherwise, the error will be sent through mcelog | ||
| 176 | * interface | ||
| 177 | */ | ||
| 178 | if (edac_mce_parse(mce)) | ||
| 179 | return; | ||
| 180 | |||
| 181 | /* | ||
| 172 | * When the buffer fills up discard new entries. | 182 | * When the buffer fills up discard new entries. |
| 173 | * Assume that the earlier errors are the more | 183 | * Assume that the earlier errors are the more |
| 174 | * interesting ones: | 184 | * interesting ones: |
diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c index 7bca3c6a02fb..0d6fc71bedb1 100644 --- a/arch/x86/kernel/e820.c +++ b/arch/x86/kernel/e820.c | |||
| @@ -729,7 +729,7 @@ static int __init e820_mark_nvs_memory(void) | |||
| 729 | struct e820entry *ei = &e820.map[i]; | 729 | struct e820entry *ei = &e820.map[i]; |
| 730 | 730 | ||
| 731 | if (ei->type == E820_NVS) | 731 | if (ei->type == E820_NVS) |
| 732 | hibernate_nvs_register(ei->addr, ei->size); | 732 | suspend_nvs_register(ei->addr, ei->size); |
| 733 | } | 733 | } |
| 734 | 734 | ||
| 735 | return 0; | 735 | return 0; |
diff --git a/arch/x86/kernel/init_task.c b/arch/x86/kernel/init_task.c index 3a54dcb9cd0e..43e9ccf44947 100644 --- a/arch/x86/kernel/init_task.c +++ b/arch/x86/kernel/init_task.c | |||
| @@ -34,7 +34,7 @@ EXPORT_SYMBOL(init_task); | |||
| 34 | /* | 34 | /* |
| 35 | * per-CPU TSS segments. Threads are completely 'soft' on Linux, | 35 | * per-CPU TSS segments. Threads are completely 'soft' on Linux, |
| 36 | * no more per-task TSS's. The TSS size is kept cacheline-aligned | 36 | * no more per-task TSS's. The TSS size is kept cacheline-aligned |
| 37 | * so they are allowed to end up in the .data.cacheline_aligned | 37 | * so they are allowed to end up in the .data..cacheline_aligned |
| 38 | * section. Since TSS's are completely CPU-local, we want them | 38 | * section. Since TSS's are completely CPU-local, we want them |
| 39 | * on exact cacheline boundaries, to eliminate cacheline ping-pong. | 39 | * on exact cacheline boundaries, to eliminate cacheline ping-pong. |
| 40 | */ | 40 | */ |
diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c index 5ae5d2426edf..d86dbf7e54be 100644 --- a/arch/x86/kernel/mpparse.c +++ b/arch/x86/kernel/mpparse.c | |||
| @@ -123,7 +123,7 @@ static void __init MP_ioapic_info(struct mpc_ioapic *m) | |||
| 123 | printk(KERN_INFO "I/O APIC #%d Version %d at 0x%X.\n", | 123 | printk(KERN_INFO "I/O APIC #%d Version %d at 0x%X.\n", |
| 124 | m->apicid, m->apicver, m->apicaddr); | 124 | m->apicid, m->apicver, m->apicaddr); |
| 125 | 125 | ||
| 126 | mp_register_ioapic(m->apicid, m->apicaddr, gsi_end + 1); | 126 | mp_register_ioapic(m->apicid, m->apicaddr, gsi_top); |
| 127 | } | 127 | } |
| 128 | 128 | ||
| 129 | static void print_MP_intsrc_info(struct mpc_intsrc *m) | 129 | static void print_MP_intsrc_info(struct mpc_intsrc *m) |
diff --git a/arch/x86/kernel/pci-calgary_64.c b/arch/x86/kernel/pci-calgary_64.c index fb99f7edb341..0b96b5589f08 100644 --- a/arch/x86/kernel/pci-calgary_64.c +++ b/arch/x86/kernel/pci-calgary_64.c | |||
| @@ -103,11 +103,16 @@ int use_calgary __read_mostly = 0; | |||
| 103 | #define PMR_SOFTSTOPFAULT 0x40000000 | 103 | #define PMR_SOFTSTOPFAULT 0x40000000 |
| 104 | #define PMR_HARDSTOP 0x20000000 | 104 | #define PMR_HARDSTOP 0x20000000 |
| 105 | 105 | ||
| 106 | #define MAX_NUM_OF_PHBS 8 /* how many PHBs in total? */ | 106 | /* |
| 107 | #define MAX_NUM_CHASSIS 8 /* max number of chassis */ | 107 | * The maximum PHB bus number. |
| 108 | /* MAX_PHB_BUS_NUM is the maximal possible dev->bus->number */ | 108 | * x3950M2 (rare): 8 chassis, 48 PHBs per chassis = 384 |
| 109 | #define MAX_PHB_BUS_NUM (MAX_NUM_OF_PHBS * MAX_NUM_CHASSIS * 2) | 109 | * x3950M2: 4 chassis, 48 PHBs per chassis = 192 |
| 110 | #define PHBS_PER_CALGARY 4 | 110 | * x3950 (PCIE): 8 chassis, 32 PHBs per chassis = 256 |
| 111 | * x3950 (PCIX): 8 chassis, 16 PHBs per chassis = 128 | ||
| 112 | */ | ||
| 113 | #define MAX_PHB_BUS_NUM 384 | ||
| 114 | |||
| 115 | #define PHBS_PER_CALGARY 4 | ||
| 111 | 116 | ||
| 112 | /* register offsets in Calgary's internal register space */ | 117 | /* register offsets in Calgary's internal register space */ |
| 113 | static const unsigned long tar_offsets[] = { | 118 | static const unsigned long tar_offsets[] = { |
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index 8e1aac86b50c..e3af342fe83a 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c | |||
| @@ -228,6 +228,14 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = { | |||
| 228 | DMI_MATCH(DMI_PRODUCT_NAME, "Precision WorkStation T5400"), | 228 | DMI_MATCH(DMI_PRODUCT_NAME, "Precision WorkStation T5400"), |
| 229 | }, | 229 | }, |
| 230 | }, | 230 | }, |
| 231 | { /* Handle problems with rebooting on Dell T7400's */ | ||
| 232 | .callback = set_bios_reboot, | ||
| 233 | .ident = "Dell Precision T7400", | ||
| 234 | .matches = { | ||
| 235 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 236 | DMI_MATCH(DMI_PRODUCT_NAME, "Precision WorkStation T7400"), | ||
| 237 | }, | ||
| 238 | }, | ||
| 231 | { /* Handle problems with rebooting on HP laptops */ | 239 | { /* Handle problems with rebooting on HP laptops */ |
| 232 | .callback = set_bios_reboot, | 240 | .callback = set_bios_reboot, |
| 233 | .ident = "HP Compaq Laptop", | 241 | .ident = "HP Compaq Laptop", |
diff --git a/arch/x86/kernel/setup_percpu.c b/arch/x86/kernel/setup_percpu.c index a867940a6dfc..de3b63ae3da2 100644 --- a/arch/x86/kernel/setup_percpu.c +++ b/arch/x86/kernel/setup_percpu.c | |||
| @@ -21,12 +21,6 @@ | |||
| 21 | #include <asm/cpu.h> | 21 | #include <asm/cpu.h> |
| 22 | #include <asm/stackprotector.h> | 22 | #include <asm/stackprotector.h> |
| 23 | 23 | ||
| 24 | #ifdef CONFIG_DEBUG_PER_CPU_MAPS | ||
| 25 | # define DBG(fmt, ...) pr_dbg(fmt, ##__VA_ARGS__) | ||
| 26 | #else | ||
| 27 | # define DBG(fmt, ...) do { if (0) pr_dbg(fmt, ##__VA_ARGS__); } while (0) | ||
| 28 | #endif | ||
| 29 | |||
| 30 | DEFINE_PER_CPU(int, cpu_number); | 24 | DEFINE_PER_CPU(int, cpu_number); |
| 31 | EXPORT_PER_CPU_SYMBOL(cpu_number); | 25 | EXPORT_PER_CPU_SYMBOL(cpu_number); |
| 32 | 26 | ||
| @@ -247,7 +241,7 @@ void __init setup_per_cpu_areas(void) | |||
| 247 | #endif | 241 | #endif |
| 248 | #endif | 242 | #endif |
| 249 | /* | 243 | /* |
| 250 | * Up to this point, the boot CPU has been using .data.init | 244 | * Up to this point, the boot CPU has been using .init.data |
| 251 | * area. Reload any changed state for the boot CPU. | 245 | * area. Reload any changed state for the boot CPU. |
| 252 | */ | 246 | */ |
| 253 | if (cpu == boot_cpu_id) | 247 | if (cpu == boot_cpu_id) |
diff --git a/arch/x86/kernel/sfi.c b/arch/x86/kernel/sfi.c index 7ded57896c0a..cb22acf3ed09 100644 --- a/arch/x86/kernel/sfi.c +++ b/arch/x86/kernel/sfi.c | |||
| @@ -93,7 +93,7 @@ static int __init sfi_parse_ioapic(struct sfi_table_header *table) | |||
| 93 | pentry = (struct sfi_apic_table_entry *)sb->pentry; | 93 | pentry = (struct sfi_apic_table_entry *)sb->pentry; |
| 94 | 94 | ||
| 95 | for (i = 0; i < num; i++) { | 95 | for (i = 0; i < num; i++) { |
| 96 | mp_register_ioapic(i, pentry->phys_addr, gsi_end + 1); | 96 | mp_register_ioapic(i, pentry->phys_addr, gsi_top); |
| 97 | pentry++; | 97 | pentry++; |
| 98 | } | 98 | } |
| 99 | 99 | ||
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index 37462f1ddba5..c4f33b2e77d6 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
| @@ -686,7 +686,7 @@ static void __cpuinit do_fork_idle(struct work_struct *work) | |||
| 686 | static void __cpuinit announce_cpu(int cpu, int apicid) | 686 | static void __cpuinit announce_cpu(int cpu, int apicid) |
| 687 | { | 687 | { |
| 688 | static int current_node = -1; | 688 | static int current_node = -1; |
| 689 | int node = cpu_to_node(cpu); | 689 | int node = early_cpu_to_node(cpu); |
| 690 | 690 | ||
| 691 | if (system_state == SYSTEM_BOOTING) { | 691 | if (system_state == SYSTEM_BOOTING) { |
| 692 | if (node != current_node) { | 692 | if (node != current_node) { |
diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S index 2cc249718c46..d0bb52296fa3 100644 --- a/arch/x86/kernel/vmlinux.lds.S +++ b/arch/x86/kernel/vmlinux.lds.S | |||
| @@ -97,7 +97,7 @@ SECTIONS | |||
| 97 | HEAD_TEXT | 97 | HEAD_TEXT |
| 98 | #ifdef CONFIG_X86_32 | 98 | #ifdef CONFIG_X86_32 |
| 99 | . = ALIGN(PAGE_SIZE); | 99 | . = ALIGN(PAGE_SIZE); |
| 100 | *(.text.page_aligned) | 100 | *(.text..page_aligned) |
| 101 | #endif | 101 | #endif |
| 102 | . = ALIGN(8); | 102 | . = ALIGN(8); |
| 103 | _stext = .; | 103 | _stext = .; |
| @@ -305,7 +305,7 @@ SECTIONS | |||
| 305 | . = ALIGN(PAGE_SIZE); | 305 | . = ALIGN(PAGE_SIZE); |
| 306 | .bss : AT(ADDR(.bss) - LOAD_OFFSET) { | 306 | .bss : AT(ADDR(.bss) - LOAD_OFFSET) { |
| 307 | __bss_start = .; | 307 | __bss_start = .; |
| 308 | *(.bss.page_aligned) | 308 | *(.bss..page_aligned) |
| 309 | *(.bss) | 309 | *(.bss) |
| 310 | . = ALIGN(4); | 310 | . = ALIGN(4); |
| 311 | __bss_stop = .; | 311 | __bss_stop = .; |
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 81563e76e28f..a6f695d76928 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c | |||
| @@ -1815,6 +1815,9 @@ static int set_spte(struct kvm_vcpu *vcpu, u64 *sptep, | |||
| 1815 | 1815 | ||
| 1816 | spte |= PT_WRITABLE_MASK; | 1816 | spte |= PT_WRITABLE_MASK; |
| 1817 | 1817 | ||
| 1818 | if (!tdp_enabled && !(pte_access & ACC_WRITE_MASK)) | ||
| 1819 | spte &= ~PT_USER_MASK; | ||
| 1820 | |||
| 1818 | /* | 1821 | /* |
| 1819 | * Optimization: for pte sync, if spte was writable the hash | 1822 | * Optimization: for pte sync, if spte was writable the hash |
| 1820 | * lookup is unnecessary (and expensive). Write protection | 1823 | * lookup is unnecessary (and expensive). Write protection |
| @@ -1870,6 +1873,8 @@ static void mmu_set_spte(struct kvm_vcpu *vcpu, u64 *sptep, | |||
| 1870 | 1873 | ||
| 1871 | child = page_header(pte & PT64_BASE_ADDR_MASK); | 1874 | child = page_header(pte & PT64_BASE_ADDR_MASK); |
| 1872 | mmu_page_remove_parent_pte(child, sptep); | 1875 | mmu_page_remove_parent_pte(child, sptep); |
| 1876 | __set_spte(sptep, shadow_trap_nonpresent_pte); | ||
| 1877 | kvm_flush_remote_tlbs(vcpu->kvm); | ||
| 1873 | } else if (pfn != spte_to_pfn(*sptep)) { | 1878 | } else if (pfn != spte_to_pfn(*sptep)) { |
| 1874 | pgprintk("hfn old %lx new %lx\n", | 1879 | pgprintk("hfn old %lx new %lx\n", |
| 1875 | spte_to_pfn(*sptep), pfn); | 1880 | spte_to_pfn(*sptep), pfn); |
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 96dc232bfc56..ce438e0fdd26 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #include <linux/ftrace_event.h> | 28 | #include <linux/ftrace_event.h> |
| 29 | #include <linux/slab.h> | 29 | #include <linux/slab.h> |
| 30 | 30 | ||
| 31 | #include <asm/tlbflush.h> | ||
| 31 | #include <asm/desc.h> | 32 | #include <asm/desc.h> |
| 32 | 33 | ||
| 33 | #include <asm/virtext.h> | 34 | #include <asm/virtext.h> |
| @@ -56,6 +57,8 @@ MODULE_LICENSE("GPL"); | |||
| 56 | 57 | ||
| 57 | #define DEBUGCTL_RESERVED_BITS (~(0x3fULL)) | 58 | #define DEBUGCTL_RESERVED_BITS (~(0x3fULL)) |
| 58 | 59 | ||
| 60 | static bool erratum_383_found __read_mostly; | ||
| 61 | |||
| 59 | static const u32 host_save_user_msrs[] = { | 62 | static const u32 host_save_user_msrs[] = { |
| 60 | #ifdef CONFIG_X86_64 | 63 | #ifdef CONFIG_X86_64 |
| 61 | MSR_STAR, MSR_LSTAR, MSR_CSTAR, MSR_SYSCALL_MASK, MSR_KERNEL_GS_BASE, | 64 | MSR_STAR, MSR_LSTAR, MSR_CSTAR, MSR_SYSCALL_MASK, MSR_KERNEL_GS_BASE, |
| @@ -374,6 +377,31 @@ static void svm_queue_exception(struct kvm_vcpu *vcpu, unsigned nr, | |||
| 374 | svm->vmcb->control.event_inj_err = error_code; | 377 | svm->vmcb->control.event_inj_err = error_code; |
| 375 | } | 378 | } |
| 376 | 379 | ||
| 380 | static void svm_init_erratum_383(void) | ||
| 381 | { | ||
| 382 | u32 low, high; | ||
| 383 | int err; | ||
| 384 | u64 val; | ||
| 385 | |||
| 386 | /* Only Fam10h is affected */ | ||
| 387 | if (boot_cpu_data.x86 != 0x10) | ||
| 388 | return; | ||
| 389 | |||
| 390 | /* Use _safe variants to not break nested virtualization */ | ||
| 391 | val = native_read_msr_safe(MSR_AMD64_DC_CFG, &err); | ||
| 392 | if (err) | ||
| 393 | return; | ||
| 394 | |||
| 395 | val |= (1ULL << 47); | ||
| 396 | |||
| 397 | low = lower_32_bits(val); | ||
| 398 | high = upper_32_bits(val); | ||
| 399 | |||
| 400 | native_write_msr_safe(MSR_AMD64_DC_CFG, low, high); | ||
| 401 | |||
| 402 | erratum_383_found = true; | ||
| 403 | } | ||
| 404 | |||
| 377 | static int has_svm(void) | 405 | static int has_svm(void) |
| 378 | { | 406 | { |
| 379 | const char *msg; | 407 | const char *msg; |
| @@ -429,6 +457,8 @@ static int svm_hardware_enable(void *garbage) | |||
| 429 | 457 | ||
| 430 | wrmsrl(MSR_VM_HSAVE_PA, page_to_pfn(sd->save_area) << PAGE_SHIFT); | 458 | wrmsrl(MSR_VM_HSAVE_PA, page_to_pfn(sd->save_area) << PAGE_SHIFT); |
| 431 | 459 | ||
| 460 | svm_init_erratum_383(); | ||
| 461 | |||
| 432 | return 0; | 462 | return 0; |
| 433 | } | 463 | } |
| 434 | 464 | ||
| @@ -1410,8 +1440,59 @@ static int nm_interception(struct vcpu_svm *svm) | |||
| 1410 | return 1; | 1440 | return 1; |
| 1411 | } | 1441 | } |
| 1412 | 1442 | ||
| 1413 | static int mc_interception(struct vcpu_svm *svm) | 1443 | static bool is_erratum_383(void) |
| 1414 | { | 1444 | { |
| 1445 | int err, i; | ||
| 1446 | u64 value; | ||
| 1447 | |||
| 1448 | if (!erratum_383_found) | ||
| 1449 | return false; | ||
| 1450 | |||
| 1451 | value = native_read_msr_safe(MSR_IA32_MC0_STATUS, &err); | ||
| 1452 | if (err) | ||
| 1453 | return false; | ||
| 1454 | |||
| 1455 | /* Bit 62 may or may not be set for this mce */ | ||
| 1456 | value &= ~(1ULL << 62); | ||
| 1457 | |||
| 1458 | if (value != 0xb600000000010015ULL) | ||
| 1459 | return false; | ||
| 1460 | |||
| 1461 | /* Clear MCi_STATUS registers */ | ||
| 1462 | for (i = 0; i < 6; ++i) | ||
| 1463 | native_write_msr_safe(MSR_IA32_MCx_STATUS(i), 0, 0); | ||
| 1464 | |||
| 1465 | value = native_read_msr_safe(MSR_IA32_MCG_STATUS, &err); | ||
| 1466 | if (!err) { | ||
| 1467 | u32 low, high; | ||
| 1468 | |||
| 1469 | value &= ~(1ULL << 2); | ||
| 1470 | low = lower_32_bits(value); | ||
| 1471 | high = upper_32_bits(value); | ||
| 1472 | |||
| 1473 | native_write_msr_safe(MSR_IA32_MCG_STATUS, low, high); | ||
| 1474 | } | ||
| 1475 | |||
| 1476 | /* Flush tlb to evict multi-match entries */ | ||
| 1477 | __flush_tlb_all(); | ||
| 1478 | |||
| 1479 | return true; | ||
| 1480 | } | ||
| 1481 | |||
| 1482 | static void svm_handle_mce(struct vcpu_svm *svm) | ||
| 1483 | { | ||
| 1484 | if (is_erratum_383()) { | ||
| 1485 | /* | ||
| 1486 | * Erratum 383 triggered. Guest state is corrupt so kill the | ||
| 1487 | * guest. | ||
| 1488 | */ | ||
| 1489 | pr_err("KVM: Guest triggered AMD Erratum 383\n"); | ||
| 1490 | |||
| 1491 | set_bit(KVM_REQ_TRIPLE_FAULT, &svm->vcpu.requests); | ||
| 1492 | |||
| 1493 | return; | ||
| 1494 | } | ||
| 1495 | |||
| 1415 | /* | 1496 | /* |
| 1416 | * On an #MC intercept the MCE handler is not called automatically in | 1497 | * On an #MC intercept the MCE handler is not called automatically in |
| 1417 | * the host. So do it by hand here. | 1498 | * the host. So do it by hand here. |
| @@ -1420,6 +1501,11 @@ static int mc_interception(struct vcpu_svm *svm) | |||
| 1420 | "int $0x12\n"); | 1501 | "int $0x12\n"); |
| 1421 | /* not sure if we ever come back to this point */ | 1502 | /* not sure if we ever come back to this point */ |
| 1422 | 1503 | ||
| 1504 | return; | ||
| 1505 | } | ||
| 1506 | |||
| 1507 | static int mc_interception(struct vcpu_svm *svm) | ||
| 1508 | { | ||
| 1423 | return 1; | 1509 | return 1; |
| 1424 | } | 1510 | } |
| 1425 | 1511 | ||
| @@ -3088,6 +3174,14 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu) | |||
| 3088 | vcpu->arch.regs_avail &= ~(1 << VCPU_EXREG_PDPTR); | 3174 | vcpu->arch.regs_avail &= ~(1 << VCPU_EXREG_PDPTR); |
| 3089 | vcpu->arch.regs_dirty &= ~(1 << VCPU_EXREG_PDPTR); | 3175 | vcpu->arch.regs_dirty &= ~(1 << VCPU_EXREG_PDPTR); |
| 3090 | } | 3176 | } |
| 3177 | |||
| 3178 | /* | ||
| 3179 | * We need to handle MC intercepts here before the vcpu has a chance to | ||
| 3180 | * change the physical cpu | ||
| 3181 | */ | ||
| 3182 | if (unlikely(svm->vmcb->control.exit_code == | ||
| 3183 | SVM_EXIT_EXCP_BASE + MC_VECTOR)) | ||
| 3184 | svm_handle_mce(svm); | ||
| 3091 | } | 3185 | } |
| 3092 | 3186 | ||
| 3093 | #undef R | 3187 | #undef R |
diff --git a/arch/x86/mm/numa.c b/arch/x86/mm/numa.c index 550df481accd..787c52ca49c3 100644 --- a/arch/x86/mm/numa.c +++ b/arch/x86/mm/numa.c | |||
| @@ -3,12 +3,6 @@ | |||
| 3 | #include <linux/module.h> | 3 | #include <linux/module.h> |
| 4 | #include <linux/bootmem.h> | 4 | #include <linux/bootmem.h> |
| 5 | 5 | ||
| 6 | #ifdef CONFIG_DEBUG_PER_CPU_MAPS | ||
| 7 | # define DBG(x...) printk(KERN_DEBUG x) | ||
| 8 | #else | ||
| 9 | # define DBG(x...) | ||
| 10 | #endif | ||
| 11 | |||
| 12 | /* | 6 | /* |
| 13 | * Which logical CPUs are on which nodes | 7 | * Which logical CPUs are on which nodes |
| 14 | */ | 8 | */ |
diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c index acc15b23b743..64121a18b8cb 100644 --- a/arch/x86/mm/pat.c +++ b/arch/x86/mm/pat.c | |||
| @@ -302,7 +302,7 @@ int reserve_memtype(u64 start, u64 end, unsigned long req_type, | |||
| 302 | return -EINVAL; | 302 | return -EINVAL; |
| 303 | } | 303 | } |
| 304 | 304 | ||
| 305 | new = kmalloc(sizeof(struct memtype), GFP_KERNEL); | 305 | new = kzalloc(sizeof(struct memtype), GFP_KERNEL); |
| 306 | if (!new) | 306 | if (!new) |
| 307 | return -ENOMEM; | 307 | return -ENOMEM; |
| 308 | 308 | ||
diff --git a/arch/x86/mm/pat_rbtree.c b/arch/x86/mm/pat_rbtree.c index f537087bb740..f20eeec85a86 100644 --- a/arch/x86/mm/pat_rbtree.c +++ b/arch/x86/mm/pat_rbtree.c | |||
| @@ -226,6 +226,7 @@ int rbt_memtype_check_insert(struct memtype *new, unsigned long *ret_type) | |||
| 226 | if (ret_type) | 226 | if (ret_type) |
| 227 | new->type = *ret_type; | 227 | new->type = *ret_type; |
| 228 | 228 | ||
| 229 | new->subtree_max_end = new->end; | ||
| 229 | memtype_rb_insert(&memtype_rbroot, new); | 230 | memtype_rb_insert(&memtype_rbroot, new); |
| 230 | } | 231 | } |
| 231 | return err; | 232 | return err; |
diff --git a/arch/x86/pci/i386.c b/arch/x86/pci/i386.c index 97da2ba9344b..6fdb3ec30c31 100644 --- a/arch/x86/pci/i386.c +++ b/arch/x86/pci/i386.c | |||
| @@ -96,6 +96,7 @@ EXPORT_SYMBOL(pcibios_align_resource); | |||
| 96 | * the fact the PCI specs explicitly allow address decoders to be | 96 | * the fact the PCI specs explicitly allow address decoders to be |
| 97 | * shared between expansion ROMs and other resource regions, it's | 97 | * shared between expansion ROMs and other resource regions, it's |
| 98 | * at least dangerous) | 98 | * at least dangerous) |
| 99 | * - bad resource sizes or overlaps with other regions | ||
| 99 | * | 100 | * |
| 100 | * Our solution: | 101 | * Our solution: |
| 101 | * (1) Allocate resources for all buses behind PCI-to-PCI bridges. | 102 | * (1) Allocate resources for all buses behind PCI-to-PCI bridges. |
| @@ -136,6 +137,7 @@ static void __init pcibios_allocate_bus_resources(struct list_head *bus_list) | |||
| 136 | * child resource allocations in this | 137 | * child resource allocations in this |
| 137 | * range. | 138 | * range. |
| 138 | */ | 139 | */ |
| 140 | r->start = r->end = 0; | ||
| 139 | r->flags = 0; | 141 | r->flags = 0; |
| 140 | } | 142 | } |
| 141 | } | 143 | } |
diff --git a/arch/x86/pci/legacy.c b/arch/x86/pci/legacy.c index 0db5eaf54560..8d460eaf524f 100644 --- a/arch/x86/pci/legacy.c +++ b/arch/x86/pci/legacy.c | |||
| @@ -11,28 +11,14 @@ | |||
| 11 | */ | 11 | */ |
| 12 | static void __devinit pcibios_fixup_peer_bridges(void) | 12 | static void __devinit pcibios_fixup_peer_bridges(void) |
| 13 | { | 13 | { |
| 14 | int n, devfn; | 14 | int n; |
| 15 | long node; | ||
| 16 | 15 | ||
| 17 | if (pcibios_last_bus <= 0 || pcibios_last_bus > 0xff) | 16 | if (pcibios_last_bus <= 0 || pcibios_last_bus > 0xff) |
| 18 | return; | 17 | return; |
| 19 | DBG("PCI: Peer bridge fixup\n"); | 18 | DBG("PCI: Peer bridge fixup\n"); |
| 20 | 19 | ||
| 21 | for (n=0; n <= pcibios_last_bus; n++) { | 20 | for (n=0; n <= pcibios_last_bus; n++) |
| 22 | u32 l; | 21 | pcibios_scan_specific_bus(n); |
| 23 | if (pci_find_bus(0, n)) | ||
| 24 | continue; | ||
| 25 | node = get_mp_bus_to_node(n); | ||
| 26 | for (devfn = 0; devfn < 256; devfn += 8) { | ||
| 27 | if (!raw_pci_read(0, n, devfn, PCI_VENDOR_ID, 2, &l) && | ||
| 28 | l != 0x0000 && l != 0xffff) { | ||
| 29 | DBG("Found device at %02x:%02x [%04x]\n", n, devfn, l); | ||
| 30 | printk(KERN_INFO "PCI: Discovered peer bus %02x\n", n); | ||
| 31 | pci_scan_bus_on_node(n, &pci_root_ops, node); | ||
| 32 | break; | ||
| 33 | } | ||
| 34 | } | ||
| 35 | } | ||
| 36 | } | 22 | } |
| 37 | 23 | ||
| 38 | int __init pci_legacy_init(void) | 24 | int __init pci_legacy_init(void) |
| @@ -50,6 +36,28 @@ int __init pci_legacy_init(void) | |||
| 50 | return 0; | 36 | return 0; |
| 51 | } | 37 | } |
| 52 | 38 | ||
| 39 | void pcibios_scan_specific_bus(int busn) | ||
| 40 | { | ||
| 41 | int devfn; | ||
| 42 | long node; | ||
| 43 | u32 l; | ||
| 44 | |||
| 45 | if (pci_find_bus(0, busn)) | ||
| 46 | return; | ||
| 47 | |||
| 48 | node = get_mp_bus_to_node(busn); | ||
| 49 | for (devfn = 0; devfn < 256; devfn += 8) { | ||
| 50 | if (!raw_pci_read(0, busn, devfn, PCI_VENDOR_ID, 2, &l) && | ||
| 51 | l != 0x0000 && l != 0xffff) { | ||
| 52 | DBG("Found device at %02x:%02x [%04x]\n", busn, devfn, l); | ||
| 53 | printk(KERN_INFO "PCI: Discovered peer bus %02x\n", busn); | ||
| 54 | pci_scan_bus_on_node(busn, &pci_root_ops, node); | ||
| 55 | return; | ||
| 56 | } | ||
| 57 | } | ||
| 58 | } | ||
| 59 | EXPORT_SYMBOL_GPL(pcibios_scan_specific_bus); | ||
| 60 | |||
| 53 | int __init pci_subsys_init(void) | 61 | int __init pci_subsys_init(void) |
| 54 | { | 62 | { |
| 55 | /* | 63 | /* |
diff --git a/arch/x86/power/cpu.c b/arch/x86/power/cpu.c index 0a979f3e5b8a..1290ba54b350 100644 --- a/arch/x86/power/cpu.c +++ b/arch/x86/power/cpu.c | |||
| @@ -105,6 +105,8 @@ static void __save_processor_state(struct saved_context *ctxt) | |||
| 105 | ctxt->cr4 = read_cr4(); | 105 | ctxt->cr4 = read_cr4(); |
| 106 | ctxt->cr8 = read_cr8(); | 106 | ctxt->cr8 = read_cr8(); |
| 107 | #endif | 107 | #endif |
| 108 | ctxt->misc_enable_saved = !rdmsrl_safe(MSR_IA32_MISC_ENABLE, | ||
| 109 | &ctxt->misc_enable); | ||
| 108 | } | 110 | } |
| 109 | 111 | ||
| 110 | /* Needed by apm.c */ | 112 | /* Needed by apm.c */ |
| @@ -152,6 +154,8 @@ static void fix_processor_context(void) | |||
| 152 | */ | 154 | */ |
| 153 | static void __restore_processor_state(struct saved_context *ctxt) | 155 | static void __restore_processor_state(struct saved_context *ctxt) |
| 154 | { | 156 | { |
| 157 | if (ctxt->misc_enable_saved) | ||
| 158 | wrmsrl(MSR_IA32_MISC_ENABLE, ctxt->misc_enable); | ||
| 155 | /* | 159 | /* |
| 156 | * control registers | 160 | * control registers |
| 157 | */ | 161 | */ |
diff --git a/arch/x86/xen/suspend.c b/arch/x86/xen/suspend.c index 987267f79bf5..a9c661108034 100644 --- a/arch/x86/xen/suspend.c +++ b/arch/x86/xen/suspend.c | |||
| @@ -60,6 +60,6 @@ static void xen_vcpu_notify_restore(void *data) | |||
| 60 | 60 | ||
| 61 | void xen_arch_resume(void) | 61 | void xen_arch_resume(void) |
| 62 | { | 62 | { |
| 63 | smp_call_function(xen_vcpu_notify_restore, | 63 | on_each_cpu(xen_vcpu_notify_restore, |
| 64 | (void *)CLOCK_EVT_NOTIFY_RESUME, 1); | 64 | (void *)CLOCK_EVT_NOTIFY_RESUME, 1); |
| 65 | } | 65 | } |
