diff options
Diffstat (limited to 'arch/x86')
| -rw-r--r-- | arch/x86/Kconfig | 2 | ||||
| -rw-r--r-- | arch/x86/include/asm/apb_timer.h | 2 | ||||
| -rw-r--r-- | arch/x86/include/asm/memblock.h | 2 | ||||
| -rw-r--r-- | arch/x86/include/asm/mmzone_32.h | 13 | ||||
| -rw-r--r-- | arch/x86/include/asm/mmzone_64.h | 3 | ||||
| -rw-r--r-- | arch/x86/include/asm/pvclock.h | 9 | ||||
| -rw-r--r-- | arch/x86/kernel/acpi/realmode/wakeup.S | 14 | ||||
| -rw-r--r-- | arch/x86/kernel/acpi/realmode/wakeup.h | 6 | ||||
| -rw-r--r-- | arch/x86/kernel/acpi/sleep.c | 6 | ||||
| -rw-r--r-- | arch/x86/kernel/reboot.c | 16 | ||||
| -rw-r--r-- | arch/x86/kvm/emulate.c | 12 | ||||
| -rw-r--r-- | arch/x86/kvm/mmu.c | 2 | ||||
| -rw-r--r-- | arch/x86/kvm/paging_tmpl.h | 2 | ||||
| -rw-r--r-- | arch/x86/kvm/vmx.c | 3 | ||||
| -rw-r--r-- | arch/x86/mm/init_64.c | 3 | ||||
| -rw-r--r-- | arch/x86/mm/memblock.c | 4 | ||||
| -rw-r--r-- | arch/x86/oprofile/nmi_int.c | 14 | ||||
| -rw-r--r-- | arch/x86/pci/acpi.c | 2 | ||||
| -rw-r--r-- | arch/x86/pci/xen.c | 40 | ||||
| -rw-r--r-- | arch/x86/platform/efi/efi.c | 32 | ||||
| -rw-r--r-- | arch/x86/xen/enlighten.c | 9 | ||||
| -rw-r--r-- | arch/x86/xen/mmu.c | 14 | ||||
| -rw-r--r-- | arch/x86/xen/setup.c | 10 | ||||
| -rw-r--r-- | arch/x86/xen/smp.c | 7 |
24 files changed, 169 insertions, 58 deletions
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index da349723d411..37357a599dca 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
| @@ -1170,7 +1170,7 @@ comment "NUMA (Summit) requires SMP, 64GB highmem support, ACPI" | |||
| 1170 | config AMD_NUMA | 1170 | config AMD_NUMA |
| 1171 | def_bool y | 1171 | def_bool y |
| 1172 | prompt "Old style AMD Opteron NUMA detection" | 1172 | prompt "Old style AMD Opteron NUMA detection" |
| 1173 | depends on NUMA && PCI | 1173 | depends on X86_64 && NUMA && PCI |
| 1174 | ---help--- | 1174 | ---help--- |
| 1175 | Enable AMD NUMA node topology detection. You should say Y here if | 1175 | Enable AMD NUMA node topology detection. You should say Y here if |
| 1176 | you have a multi processor AMD system. This uses an old method to | 1176 | you have a multi processor AMD system. This uses an old method to |
diff --git a/arch/x86/include/asm/apb_timer.h b/arch/x86/include/asm/apb_timer.h index 2fefa501d3ba..af60d8a2e288 100644 --- a/arch/x86/include/asm/apb_timer.h +++ b/arch/x86/include/asm/apb_timer.h | |||
| @@ -62,7 +62,7 @@ extern int sfi_mtimer_num; | |||
| 62 | #else /* CONFIG_APB_TIMER */ | 62 | #else /* CONFIG_APB_TIMER */ |
| 63 | 63 | ||
| 64 | static inline unsigned long apbt_quick_calibrate(void) {return 0; } | 64 | static inline unsigned long apbt_quick_calibrate(void) {return 0; } |
| 65 | static inline void apbt_time_init(void) {return 0; } | 65 | static inline void apbt_time_init(void) { } |
| 66 | 66 | ||
| 67 | #endif | 67 | #endif |
| 68 | #endif /* ASM_X86_APBT_H */ | 68 | #endif /* ASM_X86_APBT_H */ |
diff --git a/arch/x86/include/asm/memblock.h b/arch/x86/include/asm/memblock.h index 19ae14ba6978..0cd3800f33b9 100644 --- a/arch/x86/include/asm/memblock.h +++ b/arch/x86/include/asm/memblock.h | |||
| @@ -4,7 +4,6 @@ | |||
| 4 | #define ARCH_DISCARD_MEMBLOCK | 4 | #define ARCH_DISCARD_MEMBLOCK |
| 5 | 5 | ||
| 6 | u64 memblock_x86_find_in_range_size(u64 start, u64 *sizep, u64 align); | 6 | u64 memblock_x86_find_in_range_size(u64 start, u64 *sizep, u64 align); |
| 7 | void memblock_x86_to_bootmem(u64 start, u64 end); | ||
| 8 | 7 | ||
| 9 | void memblock_x86_reserve_range(u64 start, u64 end, char *name); | 8 | void memblock_x86_reserve_range(u64 start, u64 end, char *name); |
| 10 | void memblock_x86_free_range(u64 start, u64 end); | 9 | void memblock_x86_free_range(u64 start, u64 end); |
| @@ -19,5 +18,6 @@ u64 memblock_x86_hole_size(u64 start, u64 end); | |||
| 19 | u64 memblock_x86_find_in_range_node(int nid, u64 start, u64 end, u64 size, u64 align); | 18 | u64 memblock_x86_find_in_range_node(int nid, u64 start, u64 end, u64 size, u64 align); |
| 20 | u64 memblock_x86_free_memory_in_range(u64 addr, u64 limit); | 19 | u64 memblock_x86_free_memory_in_range(u64 addr, u64 limit); |
| 21 | u64 memblock_x86_memory_in_range(u64 addr, u64 limit); | 20 | u64 memblock_x86_memory_in_range(u64 addr, u64 limit); |
| 21 | bool memblock_x86_check_reserved_size(u64 *addrp, u64 *sizep, u64 align); | ||
| 22 | 22 | ||
| 23 | #endif | 23 | #endif |
diff --git a/arch/x86/include/asm/mmzone_32.h b/arch/x86/include/asm/mmzone_32.h index 5e83a416eca8..ffa037f28d39 100644 --- a/arch/x86/include/asm/mmzone_32.h +++ b/arch/x86/include/asm/mmzone_32.h | |||
| @@ -48,17 +48,6 @@ static inline int pfn_to_nid(unsigned long pfn) | |||
| 48 | #endif | 48 | #endif |
| 49 | } | 49 | } |
| 50 | 50 | ||
| 51 | /* | ||
| 52 | * Following are macros that each numa implmentation must define. | ||
| 53 | */ | ||
| 54 | |||
| 55 | #define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn) | ||
| 56 | #define node_end_pfn(nid) \ | ||
| 57 | ({ \ | ||
| 58 | pg_data_t *__pgdat = NODE_DATA(nid); \ | ||
| 59 | __pgdat->node_start_pfn + __pgdat->node_spanned_pages; \ | ||
| 60 | }) | ||
| 61 | |||
| 62 | static inline int pfn_valid(int pfn) | 51 | static inline int pfn_valid(int pfn) |
| 63 | { | 52 | { |
| 64 | int nid = pfn_to_nid(pfn); | 53 | int nid = pfn_to_nid(pfn); |
| @@ -68,6 +57,8 @@ static inline int pfn_valid(int pfn) | |||
| 68 | return 0; | 57 | return 0; |
| 69 | } | 58 | } |
| 70 | 59 | ||
| 60 | #define early_pfn_valid(pfn) pfn_valid((pfn)) | ||
| 61 | |||
| 71 | #endif /* CONFIG_DISCONTIGMEM */ | 62 | #endif /* CONFIG_DISCONTIGMEM */ |
| 72 | 63 | ||
| 73 | #ifdef CONFIG_NEED_MULTIPLE_NODES | 64 | #ifdef CONFIG_NEED_MULTIPLE_NODES |
diff --git a/arch/x86/include/asm/mmzone_64.h b/arch/x86/include/asm/mmzone_64.h index b3f88d7867c7..129d9aa3ceb3 100644 --- a/arch/x86/include/asm/mmzone_64.h +++ b/arch/x86/include/asm/mmzone_64.h | |||
| @@ -13,8 +13,5 @@ extern struct pglist_data *node_data[]; | |||
| 13 | 13 | ||
| 14 | #define NODE_DATA(nid) (node_data[nid]) | 14 | #define NODE_DATA(nid) (node_data[nid]) |
| 15 | 15 | ||
| 16 | #define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn) | ||
| 17 | #define node_end_pfn(nid) (NODE_DATA(nid)->node_start_pfn + \ | ||
| 18 | NODE_DATA(nid)->node_spanned_pages) | ||
| 19 | #endif | 16 | #endif |
| 20 | #endif /* _ASM_X86_MMZONE_64_H */ | 17 | #endif /* _ASM_X86_MMZONE_64_H */ |
diff --git a/arch/x86/include/asm/pvclock.h b/arch/x86/include/asm/pvclock.h index 31d84acc1512..a518c0a45044 100644 --- a/arch/x86/include/asm/pvclock.h +++ b/arch/x86/include/asm/pvclock.h | |||
| @@ -22,6 +22,8 @@ static inline u64 pvclock_scale_delta(u64 delta, u32 mul_frac, int shift) | |||
| 22 | u64 product; | 22 | u64 product; |
| 23 | #ifdef __i386__ | 23 | #ifdef __i386__ |
| 24 | u32 tmp1, tmp2; | 24 | u32 tmp1, tmp2; |
| 25 | #else | ||
| 26 | ulong tmp; | ||
| 25 | #endif | 27 | #endif |
| 26 | 28 | ||
| 27 | if (shift < 0) | 29 | if (shift < 0) |
| @@ -42,8 +44,11 @@ static inline u64 pvclock_scale_delta(u64 delta, u32 mul_frac, int shift) | |||
| 42 | : "a" ((u32)delta), "1" ((u32)(delta >> 32)), "2" (mul_frac) ); | 44 | : "a" ((u32)delta), "1" ((u32)(delta >> 32)), "2" (mul_frac) ); |
| 43 | #elif defined(__x86_64__) | 45 | #elif defined(__x86_64__) |
| 44 | __asm__ ( | 46 | __asm__ ( |
| 45 | "mul %%rdx ; shrd $32,%%rdx,%%rax" | 47 | "mul %[mul_frac] ; shrd $32, %[hi], %[lo]" |
| 46 | : "=a" (product) : "0" (delta), "d" ((u64)mul_frac) ); | 48 | : [lo]"=a"(product), |
| 49 | [hi]"=d"(tmp) | ||
| 50 | : "0"(delta), | ||
| 51 | [mul_frac]"rm"((u64)mul_frac)); | ||
| 47 | #else | 52 | #else |
| 48 | #error implement me! | 53 | #error implement me! |
| 49 | #endif | 54 | #endif |
diff --git a/arch/x86/kernel/acpi/realmode/wakeup.S b/arch/x86/kernel/acpi/realmode/wakeup.S index ead21b663117..b4fd836e4053 100644 --- a/arch/x86/kernel/acpi/realmode/wakeup.S +++ b/arch/x86/kernel/acpi/realmode/wakeup.S | |||
| @@ -28,6 +28,8 @@ pmode_cr3: .long 0 /* Saved %cr3 */ | |||
| 28 | pmode_cr4: .long 0 /* Saved %cr4 */ | 28 | pmode_cr4: .long 0 /* Saved %cr4 */ |
| 29 | pmode_efer: .quad 0 /* Saved EFER */ | 29 | pmode_efer: .quad 0 /* Saved EFER */ |
| 30 | pmode_gdt: .quad 0 | 30 | pmode_gdt: .quad 0 |
| 31 | pmode_misc_en: .quad 0 /* Saved MISC_ENABLE MSR */ | ||
| 32 | pmode_behavior: .long 0 /* Wakeup behavior flags */ | ||
| 31 | realmode_flags: .long 0 | 33 | realmode_flags: .long 0 |
| 32 | real_magic: .long 0 | 34 | real_magic: .long 0 |
| 33 | trampoline_segment: .word 0 | 35 | trampoline_segment: .word 0 |
| @@ -91,6 +93,18 @@ wakeup_code: | |||
| 91 | /* Call the C code */ | 93 | /* Call the C code */ |
| 92 | calll main | 94 | calll main |
| 93 | 95 | ||
| 96 | /* Restore MISC_ENABLE before entering protected mode, in case | ||
| 97 | BIOS decided to clear XD_DISABLE during S3. */ | ||
| 98 | movl pmode_behavior, %eax | ||
| 99 | btl $WAKEUP_BEHAVIOR_RESTORE_MISC_ENABLE, %eax | ||
| 100 | jnc 1f | ||
| 101 | |||
| 102 | movl pmode_misc_en, %eax | ||
| 103 | movl pmode_misc_en + 4, %edx | ||
| 104 | movl $MSR_IA32_MISC_ENABLE, %ecx | ||
| 105 | wrmsr | ||
| 106 | 1: | ||
| 107 | |||
| 94 | /* Do any other stuff... */ | 108 | /* Do any other stuff... */ |
| 95 | 109 | ||
| 96 | #ifndef CONFIG_64BIT | 110 | #ifndef CONFIG_64BIT |
diff --git a/arch/x86/kernel/acpi/realmode/wakeup.h b/arch/x86/kernel/acpi/realmode/wakeup.h index e1828c07e79c..97a29e1430e3 100644 --- a/arch/x86/kernel/acpi/realmode/wakeup.h +++ b/arch/x86/kernel/acpi/realmode/wakeup.h | |||
| @@ -21,6 +21,9 @@ struct wakeup_header { | |||
| 21 | u32 pmode_efer_low; /* Protected mode EFER */ | 21 | u32 pmode_efer_low; /* Protected mode EFER */ |
| 22 | u32 pmode_efer_high; | 22 | u32 pmode_efer_high; |
| 23 | u64 pmode_gdt; | 23 | u64 pmode_gdt; |
| 24 | u32 pmode_misc_en_low; /* Protected mode MISC_ENABLE */ | ||
| 25 | u32 pmode_misc_en_high; | ||
| 26 | u32 pmode_behavior; /* Wakeup routine behavior flags */ | ||
| 24 | u32 realmode_flags; | 27 | u32 realmode_flags; |
| 25 | u32 real_magic; | 28 | u32 real_magic; |
| 26 | u16 trampoline_segment; /* segment with trampoline code, 64-bit only */ | 29 | u16 trampoline_segment; /* segment with trampoline code, 64-bit only */ |
| @@ -39,4 +42,7 @@ extern struct wakeup_header wakeup_header; | |||
| 39 | #define WAKEUP_HEADER_SIGNATURE 0x51ee1111 | 42 | #define WAKEUP_HEADER_SIGNATURE 0x51ee1111 |
| 40 | #define WAKEUP_END_SIGNATURE 0x65a22c82 | 43 | #define WAKEUP_END_SIGNATURE 0x65a22c82 |
| 41 | 44 | ||
| 45 | /* Wakeup behavior bits */ | ||
| 46 | #define WAKEUP_BEHAVIOR_RESTORE_MISC_ENABLE 0 | ||
| 47 | |||
| 42 | #endif /* ARCH_X86_KERNEL_ACPI_RM_WAKEUP_H */ | 48 | #endif /* ARCH_X86_KERNEL_ACPI_RM_WAKEUP_H */ |
diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c index 18a857ba7a25..103b6ab368d3 100644 --- a/arch/x86/kernel/acpi/sleep.c +++ b/arch/x86/kernel/acpi/sleep.c | |||
| @@ -77,6 +77,12 @@ int acpi_suspend_lowlevel(void) | |||
| 77 | 77 | ||
| 78 | header->pmode_cr0 = read_cr0(); | 78 | header->pmode_cr0 = read_cr0(); |
| 79 | header->pmode_cr4 = read_cr4_safe(); | 79 | header->pmode_cr4 = read_cr4_safe(); |
| 80 | header->pmode_behavior = 0; | ||
| 81 | if (!rdmsr_safe(MSR_IA32_MISC_ENABLE, | ||
| 82 | &header->pmode_misc_en_low, | ||
| 83 | &header->pmode_misc_en_high)) | ||
| 84 | header->pmode_behavior |= | ||
| 85 | (1 << WAKEUP_BEHAVIOR_RESTORE_MISC_ENABLE); | ||
| 80 | header->realmode_flags = acpi_realmode_flags; | 86 | header->realmode_flags = acpi_realmode_flags; |
| 81 | header->real_magic = 0x12345678; | 87 | header->real_magic = 0x12345678; |
| 82 | 88 | ||
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index 0c016f727695..14eed214b584 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c | |||
| @@ -294,6 +294,14 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = { | |||
| 294 | DMI_MATCH(DMI_BOARD_NAME, "VersaLogic Menlow board"), | 294 | DMI_MATCH(DMI_BOARD_NAME, "VersaLogic Menlow board"), |
| 295 | }, | 295 | }, |
| 296 | }, | 296 | }, |
| 297 | { /* Handle reboot issue on Acer Aspire one */ | ||
| 298 | .callback = set_bios_reboot, | ||
| 299 | .ident = "Acer Aspire One A110", | ||
| 300 | .matches = { | ||
| 301 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
| 302 | DMI_MATCH(DMI_PRODUCT_NAME, "AOA110"), | ||
| 303 | }, | ||
| 304 | }, | ||
| 297 | { } | 305 | { } |
| 298 | }; | 306 | }; |
| 299 | 307 | ||
| @@ -411,6 +419,14 @@ static struct dmi_system_id __initdata pci_reboot_dmi_table[] = { | |||
| 411 | DMI_MATCH(DMI_PRODUCT_NAME, "iMac9,1"), | 419 | DMI_MATCH(DMI_PRODUCT_NAME, "iMac9,1"), |
| 412 | }, | 420 | }, |
| 413 | }, | 421 | }, |
| 422 | { /* Handle problems with rebooting on the Latitude E6320. */ | ||
| 423 | .callback = set_pci_reboot, | ||
| 424 | .ident = "Dell Latitude E6320", | ||
| 425 | .matches = { | ||
| 426 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 427 | DMI_MATCH(DMI_PRODUCT_NAME, "Latitude E6320"), | ||
| 428 | }, | ||
| 429 | }, | ||
| 414 | { } | 430 | { } |
| 415 | }; | 431 | }; |
| 416 | 432 | ||
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 6df88c7885c0..adc98675cda0 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
| @@ -3372,7 +3372,7 @@ x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len) | |||
| 3372 | int def_op_bytes, def_ad_bytes, goffset, simd_prefix; | 3372 | int def_op_bytes, def_ad_bytes, goffset, simd_prefix; |
| 3373 | bool op_prefix = false; | 3373 | bool op_prefix = false; |
| 3374 | struct opcode opcode; | 3374 | struct opcode opcode; |
| 3375 | struct operand memop = { .type = OP_NONE }; | 3375 | struct operand memop = { .type = OP_NONE }, *memopp = NULL; |
| 3376 | 3376 | ||
| 3377 | c->eip = ctxt->eip; | 3377 | c->eip = ctxt->eip; |
| 3378 | c->fetch.start = c->eip; | 3378 | c->fetch.start = c->eip; |
| @@ -3547,9 +3547,6 @@ done_prefixes: | |||
| 3547 | if (memop.type == OP_MEM && c->ad_bytes != 8) | 3547 | if (memop.type == OP_MEM && c->ad_bytes != 8) |
| 3548 | memop.addr.mem.ea = (u32)memop.addr.mem.ea; | 3548 | memop.addr.mem.ea = (u32)memop.addr.mem.ea; |
| 3549 | 3549 | ||
| 3550 | if (memop.type == OP_MEM && c->rip_relative) | ||
| 3551 | memop.addr.mem.ea += c->eip; | ||
| 3552 | |||
| 3553 | /* | 3550 | /* |
| 3554 | * Decode and fetch the source operand: register, memory | 3551 | * Decode and fetch the source operand: register, memory |
| 3555 | * or immediate. | 3552 | * or immediate. |
| @@ -3571,6 +3568,7 @@ done_prefixes: | |||
| 3571 | c->op_bytes; | 3568 | c->op_bytes; |
| 3572 | srcmem_common: | 3569 | srcmem_common: |
| 3573 | c->src = memop; | 3570 | c->src = memop; |
| 3571 | memopp = &c->src; | ||
| 3574 | break; | 3572 | break; |
| 3575 | case SrcImmU16: | 3573 | case SrcImmU16: |
| 3576 | rc = decode_imm(ctxt, &c->src, 2, false); | 3574 | rc = decode_imm(ctxt, &c->src, 2, false); |
| @@ -3667,6 +3665,7 @@ done_prefixes: | |||
| 3667 | case DstMem: | 3665 | case DstMem: |
| 3668 | case DstMem64: | 3666 | case DstMem64: |
| 3669 | c->dst = memop; | 3667 | c->dst = memop; |
| 3668 | memopp = &c->dst; | ||
| 3670 | if ((c->d & DstMask) == DstMem64) | 3669 | if ((c->d & DstMask) == DstMem64) |
| 3671 | c->dst.bytes = 8; | 3670 | c->dst.bytes = 8; |
| 3672 | else | 3671 | else |
| @@ -3700,10 +3699,13 @@ done_prefixes: | |||
| 3700 | /* Special instructions do their own operand decoding. */ | 3699 | /* Special instructions do their own operand decoding. */ |
| 3701 | default: | 3700 | default: |
| 3702 | c->dst.type = OP_NONE; /* Disable writeback. */ | 3701 | c->dst.type = OP_NONE; /* Disable writeback. */ |
| 3703 | return 0; | 3702 | break; |
| 3704 | } | 3703 | } |
| 3705 | 3704 | ||
| 3706 | done: | 3705 | done: |
| 3706 | if (memopp && memopp->type == OP_MEM && c->rip_relative) | ||
| 3707 | memopp->addr.mem.ea += c->eip; | ||
| 3708 | |||
| 3707 | return (rc == X86EMUL_UNHANDLEABLE) ? EMULATION_FAILED : EMULATION_OK; | 3709 | return (rc == X86EMUL_UNHANDLEABLE) ? EMULATION_FAILED : EMULATION_OK; |
| 3708 | } | 3710 | } |
| 3709 | 3711 | ||
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index bd14bb4c8594..aee38623b768 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c | |||
| @@ -565,7 +565,7 @@ gfn_to_memslot_dirty_bitmap(struct kvm_vcpu *vcpu, gfn_t gfn, | |||
| 565 | 565 | ||
| 566 | static bool mapping_level_dirty_bitmap(struct kvm_vcpu *vcpu, gfn_t large_gfn) | 566 | static bool mapping_level_dirty_bitmap(struct kvm_vcpu *vcpu, gfn_t large_gfn) |
| 567 | { | 567 | { |
| 568 | return gfn_to_memslot_dirty_bitmap(vcpu, large_gfn, true); | 568 | return !gfn_to_memslot_dirty_bitmap(vcpu, large_gfn, true); |
| 569 | } | 569 | } |
| 570 | 570 | ||
| 571 | static int mapping_level(struct kvm_vcpu *vcpu, gfn_t large_gfn) | 571 | static int mapping_level(struct kvm_vcpu *vcpu, gfn_t large_gfn) |
diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h index 6c4dc010c4cb..9d03ad4dd5ec 100644 --- a/arch/x86/kvm/paging_tmpl.h +++ b/arch/x86/kvm/paging_tmpl.h | |||
| @@ -121,7 +121,7 @@ static int FNAME(walk_addr_generic)(struct guest_walker *walker, | |||
| 121 | gva_t addr, u32 access) | 121 | gva_t addr, u32 access) |
| 122 | { | 122 | { |
| 123 | pt_element_t pte; | 123 | pt_element_t pte; |
| 124 | pt_element_t __user *ptep_user; | 124 | pt_element_t __user *uninitialized_var(ptep_user); |
| 125 | gfn_t table_gfn; | 125 | gfn_t table_gfn; |
| 126 | unsigned index, pt_access, uninitialized_var(pte_access); | 126 | unsigned index, pt_access, uninitialized_var(pte_access); |
| 127 | gpa_t pte_gpa; | 127 | gpa_t pte_gpa; |
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 4c3fa0f67469..d48ec60ea421 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
| @@ -2047,7 +2047,8 @@ static void ept_update_paging_mode_cr0(unsigned long *hw_cr0, | |||
| 2047 | unsigned long cr0, | 2047 | unsigned long cr0, |
| 2048 | struct kvm_vcpu *vcpu) | 2048 | struct kvm_vcpu *vcpu) |
| 2049 | { | 2049 | { |
| 2050 | vmx_decache_cr3(vcpu); | 2050 | if (!test_bit(VCPU_EXREG_CR3, (ulong *)&vcpu->arch.regs_avail)) |
| 2051 | vmx_decache_cr3(vcpu); | ||
| 2051 | if (!(cr0 & X86_CR0_PG)) { | 2052 | if (!(cr0 & X86_CR0_PG)) { |
| 2052 | /* From paging/starting to nonpaging */ | 2053 | /* From paging/starting to nonpaging */ |
| 2053 | vmcs_write32(CPU_BASED_VM_EXEC_CONTROL, | 2054 | vmcs_write32(CPU_BASED_VM_EXEC_CONTROL, |
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index d865c4aeec55..bbaaa005bf0e 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #include <linux/poison.h> | 28 | #include <linux/poison.h> |
| 29 | #include <linux/dma-mapping.h> | 29 | #include <linux/dma-mapping.h> |
| 30 | #include <linux/module.h> | 30 | #include <linux/module.h> |
| 31 | #include <linux/memory.h> | ||
| 31 | #include <linux/memory_hotplug.h> | 32 | #include <linux/memory_hotplug.h> |
| 32 | #include <linux/nmi.h> | 33 | #include <linux/nmi.h> |
| 33 | #include <linux/gfp.h> | 34 | #include <linux/gfp.h> |
| @@ -895,8 +896,6 @@ const char *arch_vma_name(struct vm_area_struct *vma) | |||
| 895 | } | 896 | } |
| 896 | 897 | ||
| 897 | #ifdef CONFIG_X86_UV | 898 | #ifdef CONFIG_X86_UV |
| 898 | #define MIN_MEMORY_BLOCK_SIZE (1 << SECTION_SIZE_BITS) | ||
| 899 | |||
| 900 | unsigned long memory_block_size_bytes(void) | 899 | unsigned long memory_block_size_bytes(void) |
| 901 | { | 900 | { |
| 902 | if (is_uv_system()) { | 901 | if (is_uv_system()) { |
diff --git a/arch/x86/mm/memblock.c b/arch/x86/mm/memblock.c index aa1169392b83..992da5ec5a64 100644 --- a/arch/x86/mm/memblock.c +++ b/arch/x86/mm/memblock.c | |||
| @@ -8,7 +8,7 @@ | |||
| 8 | #include <linux/range.h> | 8 | #include <linux/range.h> |
| 9 | 9 | ||
| 10 | /* Check for already reserved areas */ | 10 | /* Check for already reserved areas */ |
| 11 | static bool __init check_with_memblock_reserved_size(u64 *addrp, u64 *sizep, u64 align) | 11 | bool __init memblock_x86_check_reserved_size(u64 *addrp, u64 *sizep, u64 align) |
| 12 | { | 12 | { |
| 13 | struct memblock_region *r; | 13 | struct memblock_region *r; |
| 14 | u64 addr = *addrp, last; | 14 | u64 addr = *addrp, last; |
| @@ -59,7 +59,7 @@ u64 __init memblock_x86_find_in_range_size(u64 start, u64 *sizep, u64 align) | |||
| 59 | if (addr >= ei_last) | 59 | if (addr >= ei_last) |
| 60 | continue; | 60 | continue; |
| 61 | *sizep = ei_last - addr; | 61 | *sizep = ei_last - addr; |
| 62 | while (check_with_memblock_reserved_size(&addr, sizep, align)) | 62 | while (memblock_x86_check_reserved_size(&addr, sizep, align)) |
| 63 | ; | 63 | ; |
| 64 | 64 | ||
| 65 | if (*sizep) | 65 | if (*sizep) |
diff --git a/arch/x86/oprofile/nmi_int.c b/arch/x86/oprofile/nmi_int.c index cf9750004a08..68894fdc034b 100644 --- a/arch/x86/oprofile/nmi_int.c +++ b/arch/x86/oprofile/nmi_int.c | |||
| @@ -112,8 +112,10 @@ static void nmi_cpu_start(void *dummy) | |||
| 112 | static int nmi_start(void) | 112 | static int nmi_start(void) |
| 113 | { | 113 | { |
| 114 | get_online_cpus(); | 114 | get_online_cpus(); |
| 115 | on_each_cpu(nmi_cpu_start, NULL, 1); | ||
| 116 | ctr_running = 1; | 115 | ctr_running = 1; |
| 116 | /* make ctr_running visible to the nmi handler: */ | ||
| 117 | smp_mb(); | ||
| 118 | on_each_cpu(nmi_cpu_start, NULL, 1); | ||
| 117 | put_online_cpus(); | 119 | put_online_cpus(); |
| 118 | return 0; | 120 | return 0; |
| 119 | } | 121 | } |
| @@ -504,15 +506,18 @@ static int nmi_setup(void) | |||
| 504 | 506 | ||
| 505 | nmi_enabled = 0; | 507 | nmi_enabled = 0; |
| 506 | ctr_running = 0; | 508 | ctr_running = 0; |
| 507 | barrier(); | 509 | /* make variables visible to the nmi handler: */ |
| 510 | smp_mb(); | ||
| 508 | err = register_die_notifier(&profile_exceptions_nb); | 511 | err = register_die_notifier(&profile_exceptions_nb); |
| 509 | if (err) | 512 | if (err) |
| 510 | goto fail; | 513 | goto fail; |
| 511 | 514 | ||
| 512 | get_online_cpus(); | 515 | get_online_cpus(); |
| 513 | register_cpu_notifier(&oprofile_cpu_nb); | 516 | register_cpu_notifier(&oprofile_cpu_nb); |
| 514 | on_each_cpu(nmi_cpu_setup, NULL, 1); | ||
| 515 | nmi_enabled = 1; | 517 | nmi_enabled = 1; |
| 518 | /* make nmi_enabled visible to the nmi handler: */ | ||
| 519 | smp_mb(); | ||
| 520 | on_each_cpu(nmi_cpu_setup, NULL, 1); | ||
| 516 | put_online_cpus(); | 521 | put_online_cpus(); |
| 517 | 522 | ||
| 518 | return 0; | 523 | return 0; |
| @@ -531,7 +536,8 @@ static void nmi_shutdown(void) | |||
| 531 | nmi_enabled = 0; | 536 | nmi_enabled = 0; |
| 532 | ctr_running = 0; | 537 | ctr_running = 0; |
| 533 | put_online_cpus(); | 538 | put_online_cpus(); |
| 534 | barrier(); | 539 | /* make variables visible to the nmi handler: */ |
| 540 | smp_mb(); | ||
| 535 | unregister_die_notifier(&profile_exceptions_nb); | 541 | unregister_die_notifier(&profile_exceptions_nb); |
| 536 | msrs = &get_cpu_var(cpu_msrs); | 542 | msrs = &get_cpu_var(cpu_msrs); |
| 537 | model->shutdown(msrs); | 543 | model->shutdown(msrs); |
diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c index 0972315c3860..68c3c1395202 100644 --- a/arch/x86/pci/acpi.c +++ b/arch/x86/pci/acpi.c | |||
| @@ -188,7 +188,7 @@ static bool resource_contains(struct resource *res, resource_size_t point) | |||
| 188 | return false; | 188 | return false; |
| 189 | } | 189 | } |
| 190 | 190 | ||
| 191 | static void coalesce_windows(struct pci_root_info *info, int type) | 191 | static void coalesce_windows(struct pci_root_info *info, unsigned long type) |
| 192 | { | 192 | { |
| 193 | int i, j; | 193 | int i, j; |
| 194 | struct resource *res1, *res2; | 194 | struct resource *res1, *res2; |
diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c index 8214724ce54d..f567965c0620 100644 --- a/arch/x86/pci/xen.c +++ b/arch/x86/pci/xen.c | |||
| @@ -327,7 +327,7 @@ int __init pci_xen_hvm_init(void) | |||
| 327 | } | 327 | } |
| 328 | 328 | ||
| 329 | #ifdef CONFIG_XEN_DOM0 | 329 | #ifdef CONFIG_XEN_DOM0 |
| 330 | static int xen_register_pirq(u32 gsi, int triggering) | 330 | static int xen_register_pirq(u32 gsi, int gsi_override, int triggering) |
| 331 | { | 331 | { |
| 332 | int rc, pirq, irq = -1; | 332 | int rc, pirq, irq = -1; |
| 333 | struct physdev_map_pirq map_irq; | 333 | struct physdev_map_pirq map_irq; |
| @@ -344,16 +344,18 @@ static int xen_register_pirq(u32 gsi, int triggering) | |||
| 344 | shareable = 1; | 344 | shareable = 1; |
| 345 | name = "ioapic-level"; | 345 | name = "ioapic-level"; |
| 346 | } | 346 | } |
| 347 | |||
| 348 | pirq = xen_allocate_pirq_gsi(gsi); | 347 | pirq = xen_allocate_pirq_gsi(gsi); |
| 349 | if (pirq < 0) | 348 | if (pirq < 0) |
| 350 | goto out; | 349 | goto out; |
| 351 | 350 | ||
| 352 | irq = xen_bind_pirq_gsi_to_irq(gsi, pirq, shareable, name); | 351 | if (gsi_override >= 0) |
| 352 | irq = xen_bind_pirq_gsi_to_irq(gsi_override, pirq, shareable, name); | ||
| 353 | else | ||
| 354 | irq = xen_bind_pirq_gsi_to_irq(gsi, pirq, shareable, name); | ||
| 353 | if (irq < 0) | 355 | if (irq < 0) |
| 354 | goto out; | 356 | goto out; |
| 355 | 357 | ||
| 356 | printk(KERN_DEBUG "xen: --> pirq=%d -> irq=%d\n", pirq, irq); | 358 | printk(KERN_DEBUG "xen: --> pirq=%d -> irq=%d (gsi=%d)\n", pirq, irq, gsi); |
| 357 | 359 | ||
| 358 | map_irq.domid = DOMID_SELF; | 360 | map_irq.domid = DOMID_SELF; |
| 359 | map_irq.type = MAP_PIRQ_TYPE_GSI; | 361 | map_irq.type = MAP_PIRQ_TYPE_GSI; |
| @@ -370,7 +372,7 @@ out: | |||
| 370 | return irq; | 372 | return irq; |
| 371 | } | 373 | } |
| 372 | 374 | ||
| 373 | static int xen_register_gsi(u32 gsi, int triggering, int polarity) | 375 | static int xen_register_gsi(u32 gsi, int gsi_override, int triggering, int polarity) |
| 374 | { | 376 | { |
| 375 | int rc, irq; | 377 | int rc, irq; |
| 376 | struct physdev_setup_gsi setup_gsi; | 378 | struct physdev_setup_gsi setup_gsi; |
| @@ -381,7 +383,7 @@ static int xen_register_gsi(u32 gsi, int triggering, int polarity) | |||
| 381 | printk(KERN_DEBUG "xen: registering gsi %u triggering %d polarity %d\n", | 383 | printk(KERN_DEBUG "xen: registering gsi %u triggering %d polarity %d\n", |
| 382 | gsi, triggering, polarity); | 384 | gsi, triggering, polarity); |
| 383 | 385 | ||
| 384 | irq = xen_register_pirq(gsi, triggering); | 386 | irq = xen_register_pirq(gsi, gsi_override, triggering); |
| 385 | 387 | ||
| 386 | setup_gsi.gsi = gsi; | 388 | setup_gsi.gsi = gsi; |
| 387 | setup_gsi.triggering = (triggering == ACPI_EDGE_SENSITIVE ? 0 : 1); | 389 | setup_gsi.triggering = (triggering == ACPI_EDGE_SENSITIVE ? 0 : 1); |
| @@ -403,6 +405,8 @@ static __init void xen_setup_acpi_sci(void) | |||
| 403 | int rc; | 405 | int rc; |
| 404 | int trigger, polarity; | 406 | int trigger, polarity; |
| 405 | int gsi = acpi_sci_override_gsi; | 407 | int gsi = acpi_sci_override_gsi; |
| 408 | int irq = -1; | ||
| 409 | int gsi_override = -1; | ||
| 406 | 410 | ||
| 407 | if (!gsi) | 411 | if (!gsi) |
| 408 | return; | 412 | return; |
| @@ -419,7 +423,25 @@ static __init void xen_setup_acpi_sci(void) | |||
| 419 | printk(KERN_INFO "xen: sci override: global_irq=%d trigger=%d " | 423 | printk(KERN_INFO "xen: sci override: global_irq=%d trigger=%d " |
| 420 | "polarity=%d\n", gsi, trigger, polarity); | 424 | "polarity=%d\n", gsi, trigger, polarity); |
| 421 | 425 | ||
| 422 | gsi = xen_register_gsi(gsi, trigger, polarity); | 426 | /* Before we bind the GSI to a Linux IRQ, check whether |
| 427 | * we need to override it with bus_irq (IRQ) value. Usually for | ||
| 428 | * IRQs below IRQ_LEGACY_IRQ this holds IRQ == GSI, as so: | ||
| 429 | * ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 low level) | ||
| 430 | * but there are oddballs where the IRQ != GSI: | ||
| 431 | * ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 20 low level) | ||
| 432 | * which ends up being: gsi_to_irq[9] == 20 | ||
| 433 | * (which is what acpi_gsi_to_irq ends up calling when starting the | ||
| 434 | * the ACPI interpreter and keels over since IRQ 9 has not been | ||
| 435 | * setup as we had setup IRQ 20 for it). | ||
| 436 | */ | ||
| 437 | /* Check whether the GSI != IRQ */ | ||
| 438 | if (acpi_gsi_to_irq(gsi, &irq) == 0) { | ||
| 439 | if (irq >= 0 && irq != gsi) | ||
| 440 | /* Bugger, we MUST have that IRQ. */ | ||
| 441 | gsi_override = irq; | ||
| 442 | } | ||
| 443 | |||
| 444 | gsi = xen_register_gsi(gsi, gsi_override, trigger, polarity); | ||
| 423 | printk(KERN_INFO "xen: acpi sci %d\n", gsi); | 445 | printk(KERN_INFO "xen: acpi sci %d\n", gsi); |
| 424 | 446 | ||
| 425 | return; | 447 | return; |
| @@ -428,7 +450,7 @@ static __init void xen_setup_acpi_sci(void) | |||
| 428 | static int acpi_register_gsi_xen(struct device *dev, u32 gsi, | 450 | static int acpi_register_gsi_xen(struct device *dev, u32 gsi, |
| 429 | int trigger, int polarity) | 451 | int trigger, int polarity) |
| 430 | { | 452 | { |
| 431 | return xen_register_gsi(gsi, trigger, polarity); | 453 | return xen_register_gsi(gsi, -1 /* no GSI override */, trigger, polarity); |
| 432 | } | 454 | } |
| 433 | 455 | ||
| 434 | static int __init pci_xen_initial_domain(void) | 456 | static int __init pci_xen_initial_domain(void) |
| @@ -467,7 +489,7 @@ void __init xen_setup_pirqs(void) | |||
| 467 | if (acpi_get_override_irq(irq, &trigger, &polarity) == -1) | 489 | if (acpi_get_override_irq(irq, &trigger, &polarity) == -1) |
| 468 | continue; | 490 | continue; |
| 469 | 491 | ||
| 470 | xen_register_pirq(irq, | 492 | xen_register_pirq(irq, -1 /* no GSI override */, |
| 471 | trigger ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE); | 493 | trigger ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE); |
| 472 | } | 494 | } |
| 473 | } | 495 | } |
diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c index 0d3a4fa34560..899e393d8e73 100644 --- a/arch/x86/platform/efi/efi.c +++ b/arch/x86/platform/efi/efi.c | |||
| @@ -310,14 +310,31 @@ void __init efi_reserve_boot_services(void) | |||
| 310 | 310 | ||
| 311 | for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { | 311 | for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { |
| 312 | efi_memory_desc_t *md = p; | 312 | efi_memory_desc_t *md = p; |
| 313 | unsigned long long start = md->phys_addr; | 313 | u64 start = md->phys_addr; |
| 314 | unsigned long long size = md->num_pages << EFI_PAGE_SHIFT; | 314 | u64 size = md->num_pages << EFI_PAGE_SHIFT; |
| 315 | 315 | ||
| 316 | if (md->type != EFI_BOOT_SERVICES_CODE && | 316 | if (md->type != EFI_BOOT_SERVICES_CODE && |
| 317 | md->type != EFI_BOOT_SERVICES_DATA) | 317 | md->type != EFI_BOOT_SERVICES_DATA) |
| 318 | continue; | 318 | continue; |
| 319 | 319 | /* Only reserve where possible: | |
| 320 | memblock_x86_reserve_range(start, start + size, "EFI Boot"); | 320 | * - Not within any already allocated areas |
| 321 | * - Not over any memory area (really needed, if above?) | ||
| 322 | * - Not within any part of the kernel | ||
| 323 | * - Not the bios reserved area | ||
| 324 | */ | ||
| 325 | if ((start+size >= virt_to_phys(_text) | ||
| 326 | && start <= virt_to_phys(_end)) || | ||
| 327 | !e820_all_mapped(start, start+size, E820_RAM) || | ||
| 328 | memblock_x86_check_reserved_size(&start, &size, | ||
| 329 | 1<<EFI_PAGE_SHIFT)) { | ||
| 330 | /* Could not reserve, skip it */ | ||
| 331 | md->num_pages = 0; | ||
| 332 | memblock_dbg(PFX "Could not reserve boot range " | ||
| 333 | "[0x%010llx-0x%010llx]\n", | ||
| 334 | start, start+size-1); | ||
| 335 | } else | ||
| 336 | memblock_x86_reserve_range(start, start+size, | ||
| 337 | "EFI Boot"); | ||
| 321 | } | 338 | } |
| 322 | } | 339 | } |
| 323 | 340 | ||
| @@ -334,6 +351,10 @@ static void __init efi_free_boot_services(void) | |||
| 334 | md->type != EFI_BOOT_SERVICES_DATA) | 351 | md->type != EFI_BOOT_SERVICES_DATA) |
| 335 | continue; | 352 | continue; |
| 336 | 353 | ||
| 354 | /* Could not reserve boot area */ | ||
| 355 | if (!size) | ||
| 356 | continue; | ||
| 357 | |||
| 337 | free_bootmem_late(start, size); | 358 | free_bootmem_late(start, size); |
| 338 | } | 359 | } |
| 339 | } | 360 | } |
| @@ -483,9 +504,6 @@ void __init efi_init(void) | |||
| 483 | x86_platform.set_wallclock = efi_set_rtc_mmss; | 504 | x86_platform.set_wallclock = efi_set_rtc_mmss; |
| 484 | #endif | 505 | #endif |
| 485 | 506 | ||
| 486 | /* Setup for EFI runtime service */ | ||
| 487 | reboot_type = BOOT_EFI; | ||
| 488 | |||
| 489 | #if EFI_DEBUG | 507 | #if EFI_DEBUG |
| 490 | print_efi_memmap(); | 508 | print_efi_memmap(); |
| 491 | #endif | 509 | #endif |
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index dd7b88f2ec7a..5525163a0398 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
| @@ -1033,6 +1033,13 @@ static void xen_machine_halt(void) | |||
| 1033 | xen_reboot(SHUTDOWN_poweroff); | 1033 | xen_reboot(SHUTDOWN_poweroff); |
| 1034 | } | 1034 | } |
| 1035 | 1035 | ||
| 1036 | static void xen_machine_power_off(void) | ||
| 1037 | { | ||
| 1038 | if (pm_power_off) | ||
| 1039 | pm_power_off(); | ||
| 1040 | xen_reboot(SHUTDOWN_poweroff); | ||
| 1041 | } | ||
| 1042 | |||
| 1036 | static void xen_crash_shutdown(struct pt_regs *regs) | 1043 | static void xen_crash_shutdown(struct pt_regs *regs) |
| 1037 | { | 1044 | { |
| 1038 | xen_reboot(SHUTDOWN_crash); | 1045 | xen_reboot(SHUTDOWN_crash); |
| @@ -1058,7 +1065,7 @@ int xen_panic_handler_init(void) | |||
| 1058 | static const struct machine_ops xen_machine_ops __initconst = { | 1065 | static const struct machine_ops xen_machine_ops __initconst = { |
| 1059 | .restart = xen_restart, | 1066 | .restart = xen_restart, |
| 1060 | .halt = xen_machine_halt, | 1067 | .halt = xen_machine_halt, |
| 1061 | .power_off = xen_machine_halt, | 1068 | .power_off = xen_machine_power_off, |
| 1062 | .shutdown = xen_machine_halt, | 1069 | .shutdown = xen_machine_halt, |
| 1063 | .crash_shutdown = xen_crash_shutdown, | 1070 | .crash_shutdown = xen_crash_shutdown, |
| 1064 | .emergency_restart = xen_emergency_restart, | 1071 | .emergency_restart = xen_emergency_restart, |
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index dc708dcc62f1..0ccccb67a993 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c | |||
| @@ -59,6 +59,7 @@ | |||
| 59 | #include <asm/page.h> | 59 | #include <asm/page.h> |
| 60 | #include <asm/init.h> | 60 | #include <asm/init.h> |
| 61 | #include <asm/pat.h> | 61 | #include <asm/pat.h> |
| 62 | #include <asm/smp.h> | ||
| 62 | 63 | ||
| 63 | #include <asm/xen/hypercall.h> | 64 | #include <asm/xen/hypercall.h> |
| 64 | #include <asm/xen/hypervisor.h> | 65 | #include <asm/xen/hypervisor.h> |
| @@ -1231,7 +1232,11 @@ static void xen_flush_tlb_others(const struct cpumask *cpus, | |||
| 1231 | { | 1232 | { |
| 1232 | struct { | 1233 | struct { |
| 1233 | struct mmuext_op op; | 1234 | struct mmuext_op op; |
| 1235 | #ifdef CONFIG_SMP | ||
| 1236 | DECLARE_BITMAP(mask, num_processors); | ||
| 1237 | #else | ||
| 1234 | DECLARE_BITMAP(mask, NR_CPUS); | 1238 | DECLARE_BITMAP(mask, NR_CPUS); |
| 1239 | #endif | ||
| 1235 | } *args; | 1240 | } *args; |
| 1236 | struct multicall_space mcs; | 1241 | struct multicall_space mcs; |
| 1237 | 1242 | ||
| @@ -1599,6 +1604,11 @@ static void __init xen_map_identity_early(pmd_t *pmd, unsigned long max_pfn) | |||
| 1599 | for (pteidx = 0; pteidx < PTRS_PER_PTE; pteidx++, pfn++) { | 1604 | for (pteidx = 0; pteidx < PTRS_PER_PTE; pteidx++, pfn++) { |
| 1600 | pte_t pte; | 1605 | pte_t pte; |
| 1601 | 1606 | ||
| 1607 | #ifdef CONFIG_X86_32 | ||
| 1608 | if (pfn > max_pfn_mapped) | ||
| 1609 | max_pfn_mapped = pfn; | ||
| 1610 | #endif | ||
| 1611 | |||
| 1602 | if (!pte_none(pte_page[pteidx])) | 1612 | if (!pte_none(pte_page[pteidx])) |
| 1603 | continue; | 1613 | continue; |
| 1604 | 1614 | ||
| @@ -1766,7 +1776,9 @@ pgd_t * __init xen_setup_kernel_pagetable(pgd_t *pgd, | |||
| 1766 | initial_kernel_pmd = | 1776 | initial_kernel_pmd = |
| 1767 | extend_brk(sizeof(pmd_t) * PTRS_PER_PMD, PAGE_SIZE); | 1777 | extend_brk(sizeof(pmd_t) * PTRS_PER_PMD, PAGE_SIZE); |
| 1768 | 1778 | ||
| 1769 | max_pfn_mapped = PFN_DOWN(__pa(xen_start_info->mfn_list)); | 1779 | max_pfn_mapped = PFN_DOWN(__pa(xen_start_info->pt_base) + |
| 1780 | xen_start_info->nr_pt_frames * PAGE_SIZE + | ||
| 1781 | 512*1024); | ||
| 1770 | 1782 | ||
| 1771 | kernel_pmd = m2v(pgd[KERNEL_PGD_BOUNDARY].pgd); | 1783 | kernel_pmd = m2v(pgd[KERNEL_PGD_BOUNDARY].pgd); |
| 1772 | memcpy(initial_kernel_pmd, kernel_pmd, sizeof(pmd_t) * PTRS_PER_PMD); | 1784 | memcpy(initial_kernel_pmd, kernel_pmd, sizeof(pmd_t) * PTRS_PER_PMD); |
diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c index be1a464f6d66..60aeeb56948f 100644 --- a/arch/x86/xen/setup.c +++ b/arch/x86/xen/setup.c | |||
| @@ -227,11 +227,7 @@ char * __init xen_memory_setup(void) | |||
| 227 | 227 | ||
| 228 | memcpy(map_raw, map, sizeof(map)); | 228 | memcpy(map_raw, map, sizeof(map)); |
| 229 | e820.nr_map = 0; | 229 | e820.nr_map = 0; |
| 230 | #ifdef CONFIG_X86_32 | ||
| 231 | xen_extra_mem_start = mem_end; | 230 | xen_extra_mem_start = mem_end; |
| 232 | #else | ||
| 233 | xen_extra_mem_start = max((1ULL << 32), mem_end); | ||
| 234 | #endif | ||
| 235 | for (i = 0; i < memmap.nr_entries; i++) { | 231 | for (i = 0; i < memmap.nr_entries; i++) { |
| 236 | unsigned long long end; | 232 | unsigned long long end; |
| 237 | 233 | ||
| @@ -266,6 +262,12 @@ char * __init xen_memory_setup(void) | |||
| 266 | if (map[i].size > 0) | 262 | if (map[i].size > 0) |
| 267 | e820_add_region(map[i].addr, map[i].size, map[i].type); | 263 | e820_add_region(map[i].addr, map[i].size, map[i].type); |
| 268 | } | 264 | } |
| 265 | /* Align the balloon area so that max_low_pfn does not get set | ||
| 266 | * to be at the _end_ of the PCI gap at the far end (fee01000). | ||
| 267 | * Note that xen_extra_mem_start gets set in the loop above to be | ||
| 268 | * past the last E820 region. */ | ||
| 269 | if (xen_initial_domain() && (xen_extra_mem_start < (1ULL<<32))) | ||
| 270 | xen_extra_mem_start = (1ULL<<32); | ||
| 269 | 271 | ||
| 270 | /* | 272 | /* |
| 271 | * In domU, the ISA region is normal, usable memory, but we | 273 | * In domU, the ISA region is normal, usable memory, but we |
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index 41038c01de40..b4533a86d7e4 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c | |||
| @@ -205,11 +205,18 @@ static void __init xen_smp_prepare_boot_cpu(void) | |||
| 205 | static void __init xen_smp_prepare_cpus(unsigned int max_cpus) | 205 | static void __init xen_smp_prepare_cpus(unsigned int max_cpus) |
| 206 | { | 206 | { |
| 207 | unsigned cpu; | 207 | unsigned cpu; |
| 208 | unsigned int i; | ||
| 208 | 209 | ||
| 209 | xen_init_lock_cpu(0); | 210 | xen_init_lock_cpu(0); |
| 210 | 211 | ||
| 211 | smp_store_cpu_info(0); | 212 | smp_store_cpu_info(0); |
| 212 | cpu_data(0).x86_max_cores = 1; | 213 | cpu_data(0).x86_max_cores = 1; |
| 214 | |||
| 215 | for_each_possible_cpu(i) { | ||
| 216 | zalloc_cpumask_var(&per_cpu(cpu_sibling_map, i), GFP_KERNEL); | ||
| 217 | zalloc_cpumask_var(&per_cpu(cpu_core_map, i), GFP_KERNEL); | ||
| 218 | zalloc_cpumask_var(&per_cpu(cpu_llc_shared_map, i), GFP_KERNEL); | ||
| 219 | } | ||
| 213 | set_cpu_sibling_map(0); | 220 | set_cpu_sibling_map(0); |
| 214 | 221 | ||
| 215 | if (xen_smp_intr_init(0)) | 222 | if (xen_smp_intr_init(0)) |
