diff options
author | Ingo Molnar <mingo@elte.hu> | 2009-04-21 04:46:39 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-04-21 04:46:54 -0400 |
commit | 8ecee4620e76aae418bfa0e8cc830e92cb559bbb (patch) | |
tree | 49a36784c0a26c8494a37087e37502101013b35d /arch/x86/include | |
parent | 6424fb38667fffbbb1b90be0ffd9a0c540db6a4b (diff) | |
parent | a939b96cccdb65df80a52447ec8e4a6d79c56dbb (diff) |
Merge branch 'linus' into x86/mm
Merge reason: refresh the topic: there's been 290 non-merges commits upstream
to arch/x86 alone.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/include')
46 files changed, 514 insertions, 409 deletions
diff --git a/arch/x86/include/asm/aes.h b/arch/x86/include/asm/aes.h new file mode 100644 index 000000000000..80545a1cbe39 --- /dev/null +++ b/arch/x86/include/asm/aes.h | |||
@@ -0,0 +1,11 @@ | |||
1 | #ifndef ASM_X86_AES_H | ||
2 | #define ASM_X86_AES_H | ||
3 | |||
4 | #include <linux/crypto.h> | ||
5 | #include <crypto/aes.h> | ||
6 | |||
7 | void crypto_aes_encrypt_x86(struct crypto_aes_ctx *ctx, u8 *dst, | ||
8 | const u8 *src); | ||
9 | void crypto_aes_decrypt_x86(struct crypto_aes_ctx *ctx, u8 *dst, | ||
10 | const u8 *src); | ||
11 | #endif | ||
diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h index 00f5962d82d0..42f2f8377422 100644 --- a/arch/x86/include/asm/apic.h +++ b/arch/x86/include/asm/apic.h | |||
@@ -75,7 +75,7 @@ static inline void default_inquire_remote_apic(int apicid) | |||
75 | #define setup_secondary_clock setup_secondary_APIC_clock | 75 | #define setup_secondary_clock setup_secondary_APIC_clock |
76 | #endif | 76 | #endif |
77 | 77 | ||
78 | #ifdef CONFIG_X86_VSMP | 78 | #ifdef CONFIG_X86_64 |
79 | extern int is_vsmp_box(void); | 79 | extern int is_vsmp_box(void); |
80 | #else | 80 | #else |
81 | static inline int is_vsmp_box(void) | 81 | static inline int is_vsmp_box(void) |
@@ -107,6 +107,9 @@ extern u32 native_safe_apic_wait_icr_idle(void); | |||
107 | extern void native_apic_icr_write(u32 low, u32 id); | 107 | extern void native_apic_icr_write(u32 low, u32 id); |
108 | extern u64 native_apic_icr_read(void); | 108 | extern u64 native_apic_icr_read(void); |
109 | 109 | ||
110 | #define EIM_8BIT_APIC_ID 0 | ||
111 | #define EIM_32BIT_APIC_ID 1 | ||
112 | |||
110 | #ifdef CONFIG_X86_X2APIC | 113 | #ifdef CONFIG_X86_X2APIC |
111 | /* | 114 | /* |
112 | * Make previous memory operations globally visible before | 115 | * Make previous memory operations globally visible before |
@@ -489,10 +492,19 @@ static inline int default_apic_id_registered(void) | |||
489 | return physid_isset(read_apic_id(), phys_cpu_present_map); | 492 | return physid_isset(read_apic_id(), phys_cpu_present_map); |
490 | } | 493 | } |
491 | 494 | ||
495 | static inline int default_phys_pkg_id(int cpuid_apic, int index_msb) | ||
496 | { | ||
497 | return cpuid_apic >> index_msb; | ||
498 | } | ||
499 | |||
500 | extern int default_apicid_to_node(int logical_apicid); | ||
501 | |||
502 | #endif | ||
503 | |||
492 | static inline unsigned int | 504 | static inline unsigned int |
493 | default_cpu_mask_to_apicid(const struct cpumask *cpumask) | 505 | default_cpu_mask_to_apicid(const struct cpumask *cpumask) |
494 | { | 506 | { |
495 | return cpumask_bits(cpumask)[0]; | 507 | return cpumask_bits(cpumask)[0] & APIC_ALL_CPUS; |
496 | } | 508 | } |
497 | 509 | ||
498 | static inline unsigned int | 510 | static inline unsigned int |
@@ -506,15 +518,6 @@ default_cpu_mask_to_apicid_and(const struct cpumask *cpumask, | |||
506 | return (unsigned int)(mask1 & mask2 & mask3); | 518 | return (unsigned int)(mask1 & mask2 & mask3); |
507 | } | 519 | } |
508 | 520 | ||
509 | static inline int default_phys_pkg_id(int cpuid_apic, int index_msb) | ||
510 | { | ||
511 | return cpuid_apic >> index_msb; | ||
512 | } | ||
513 | |||
514 | extern int default_apicid_to_node(int logical_apicid); | ||
515 | |||
516 | #endif | ||
517 | |||
518 | static inline unsigned long default_check_apicid_used(physid_mask_t bitmap, int apicid) | 521 | static inline unsigned long default_check_apicid_used(physid_mask_t bitmap, int apicid) |
519 | { | 522 | { |
520 | return physid_isset(apicid, bitmap); | 523 | return physid_isset(apicid, bitmap); |
diff --git a/arch/x86/include/asm/cacheflush.h b/arch/x86/include/asm/cacheflush.h index b3894bf52fcd..e55dfc1ad453 100644 --- a/arch/x86/include/asm/cacheflush.h +++ b/arch/x86/include/asm/cacheflush.h | |||
@@ -126,6 +126,11 @@ void clflush_cache_range(void *addr, unsigned int size); | |||
126 | #ifdef CONFIG_DEBUG_RODATA | 126 | #ifdef CONFIG_DEBUG_RODATA |
127 | void mark_rodata_ro(void); | 127 | void mark_rodata_ro(void); |
128 | extern const int rodata_test_data; | 128 | extern const int rodata_test_data; |
129 | void set_kernel_text_rw(void); | ||
130 | void set_kernel_text_ro(void); | ||
131 | #else | ||
132 | static inline void set_kernel_text_rw(void) { } | ||
133 | static inline void set_kernel_text_ro(void) { } | ||
129 | #endif | 134 | #endif |
130 | 135 | ||
131 | #ifdef CONFIG_DEBUG_RODATA_TEST | 136 | #ifdef CONFIG_DEBUG_RODATA_TEST |
diff --git a/arch/x86/include/asm/cpu_debug.h b/arch/x86/include/asm/cpu_debug.h index 222802029fa6..222802029fa6 100755..100644 --- a/arch/x86/include/asm/cpu_debug.h +++ b/arch/x86/include/asm/cpu_debug.h | |||
diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h index 7301e60dc4a8..bb83b1c397aa 100644 --- a/arch/x86/include/asm/cpufeature.h +++ b/arch/x86/include/asm/cpufeature.h | |||
@@ -154,6 +154,7 @@ | |||
154 | * CPUID levels like 0x6, 0xA etc | 154 | * CPUID levels like 0x6, 0xA etc |
155 | */ | 155 | */ |
156 | #define X86_FEATURE_IDA (7*32+ 0) /* Intel Dynamic Acceleration */ | 156 | #define X86_FEATURE_IDA (7*32+ 0) /* Intel Dynamic Acceleration */ |
157 | #define X86_FEATURE_ARAT (7*32+ 1) /* Always Running APIC Timer */ | ||
157 | 158 | ||
158 | /* Virtualization flags: Linux defined */ | 159 | /* Virtualization flags: Linux defined */ |
159 | #define X86_FEATURE_TPR_SHADOW (8*32+ 0) /* Intel TPR Shadow */ | 160 | #define X86_FEATURE_TPR_SHADOW (8*32+ 0) /* Intel TPR Shadow */ |
@@ -213,6 +214,7 @@ extern const char * const x86_power_flags[32]; | |||
213 | #define cpu_has_xmm boot_cpu_has(X86_FEATURE_XMM) | 214 | #define cpu_has_xmm boot_cpu_has(X86_FEATURE_XMM) |
214 | #define cpu_has_xmm2 boot_cpu_has(X86_FEATURE_XMM2) | 215 | #define cpu_has_xmm2 boot_cpu_has(X86_FEATURE_XMM2) |
215 | #define cpu_has_xmm3 boot_cpu_has(X86_FEATURE_XMM3) | 216 | #define cpu_has_xmm3 boot_cpu_has(X86_FEATURE_XMM3) |
217 | #define cpu_has_aes boot_cpu_has(X86_FEATURE_AES) | ||
216 | #define cpu_has_ht boot_cpu_has(X86_FEATURE_HT) | 218 | #define cpu_has_ht boot_cpu_has(X86_FEATURE_HT) |
217 | #define cpu_has_mp boot_cpu_has(X86_FEATURE_MP) | 219 | #define cpu_has_mp boot_cpu_has(X86_FEATURE_MP) |
218 | #define cpu_has_nx boot_cpu_has(X86_FEATURE_NX) | 220 | #define cpu_has_nx boot_cpu_has(X86_FEATURE_NX) |
diff --git a/arch/x86/include/asm/cpumask.h b/arch/x86/include/asm/cpumask.h index a7f3c75f8ad7..61c852fa346b 100644 --- a/arch/x86/include/asm/cpumask.h +++ b/arch/x86/include/asm/cpumask.h | |||
@@ -3,8 +3,6 @@ | |||
3 | #ifndef __ASSEMBLY__ | 3 | #ifndef __ASSEMBLY__ |
4 | #include <linux/cpumask.h> | 4 | #include <linux/cpumask.h> |
5 | 5 | ||
6 | #ifdef CONFIG_X86_64 | ||
7 | |||
8 | extern cpumask_var_t cpu_callin_mask; | 6 | extern cpumask_var_t cpu_callin_mask; |
9 | extern cpumask_var_t cpu_callout_mask; | 7 | extern cpumask_var_t cpu_callout_mask; |
10 | extern cpumask_var_t cpu_initialized_mask; | 8 | extern cpumask_var_t cpu_initialized_mask; |
@@ -12,21 +10,5 @@ extern cpumask_var_t cpu_sibling_setup_mask; | |||
12 | 10 | ||
13 | extern void setup_cpu_local_masks(void); | 11 | extern void setup_cpu_local_masks(void); |
14 | 12 | ||
15 | #else /* CONFIG_X86_32 */ | ||
16 | |||
17 | extern cpumask_t cpu_callin_map; | ||
18 | extern cpumask_t cpu_callout_map; | ||
19 | extern cpumask_t cpu_initialized; | ||
20 | extern cpumask_t cpu_sibling_setup_map; | ||
21 | |||
22 | #define cpu_callin_mask ((struct cpumask *)&cpu_callin_map) | ||
23 | #define cpu_callout_mask ((struct cpumask *)&cpu_callout_map) | ||
24 | #define cpu_initialized_mask ((struct cpumask *)&cpu_initialized) | ||
25 | #define cpu_sibling_setup_mask ((struct cpumask *)&cpu_sibling_setup_map) | ||
26 | |||
27 | static inline void setup_cpu_local_masks(void) { } | ||
28 | |||
29 | #endif /* CONFIG_X86_32 */ | ||
30 | |||
31 | #endif /* __ASSEMBLY__ */ | 13 | #endif /* __ASSEMBLY__ */ |
32 | #endif /* _ASM_X86_CPUMASK_H */ | 14 | #endif /* _ASM_X86_CPUMASK_H */ |
diff --git a/arch/x86/include/asm/device.h b/arch/x86/include/asm/device.h index 3c034f48fdb0..4994a20acbcb 100644 --- a/arch/x86/include/asm/device.h +++ b/arch/x86/include/asm/device.h | |||
@@ -6,7 +6,7 @@ struct dev_archdata { | |||
6 | void *acpi_handle; | 6 | void *acpi_handle; |
7 | #endif | 7 | #endif |
8 | #ifdef CONFIG_X86_64 | 8 | #ifdef CONFIG_X86_64 |
9 | struct dma_mapping_ops *dma_ops; | 9 | struct dma_map_ops *dma_ops; |
10 | #endif | 10 | #endif |
11 | #ifdef CONFIG_DMAR | 11 | #ifdef CONFIG_DMAR |
12 | void *iommu; /* hook for IOMMU specific extension */ | 12 | void *iommu; /* hook for IOMMU specific extension */ |
diff --git a/arch/x86/include/asm/dma-mapping.h b/arch/x86/include/asm/dma-mapping.h index 132a134d12f2..f82fdc412c64 100644 --- a/arch/x86/include/asm/dma-mapping.h +++ b/arch/x86/include/asm/dma-mapping.h | |||
@@ -7,6 +7,8 @@ | |||
7 | */ | 7 | */ |
8 | 8 | ||
9 | #include <linux/scatterlist.h> | 9 | #include <linux/scatterlist.h> |
10 | #include <linux/dma-debug.h> | ||
11 | #include <linux/dma-attrs.h> | ||
10 | #include <asm/io.h> | 12 | #include <asm/io.h> |
11 | #include <asm/swiotlb.h> | 13 | #include <asm/swiotlb.h> |
12 | #include <asm-generic/dma-coherent.h> | 14 | #include <asm-generic/dma-coherent.h> |
@@ -16,47 +18,9 @@ extern int iommu_merge; | |||
16 | extern struct device x86_dma_fallback_dev; | 18 | extern struct device x86_dma_fallback_dev; |
17 | extern int panic_on_overflow; | 19 | extern int panic_on_overflow; |
18 | 20 | ||
19 | struct dma_mapping_ops { | 21 | extern struct dma_map_ops *dma_ops; |
20 | int (*mapping_error)(struct device *dev, | 22 | |
21 | dma_addr_t dma_addr); | 23 | static inline struct dma_map_ops *get_dma_ops(struct device *dev) |
22 | void* (*alloc_coherent)(struct device *dev, size_t size, | ||
23 | dma_addr_t *dma_handle, gfp_t gfp); | ||
24 | void (*free_coherent)(struct device *dev, size_t size, | ||
25 | void *vaddr, dma_addr_t dma_handle); | ||
26 | dma_addr_t (*map_single)(struct device *hwdev, phys_addr_t ptr, | ||
27 | size_t size, int direction); | ||
28 | void (*unmap_single)(struct device *dev, dma_addr_t addr, | ||
29 | size_t size, int direction); | ||
30 | void (*sync_single_for_cpu)(struct device *hwdev, | ||
31 | dma_addr_t dma_handle, size_t size, | ||
32 | int direction); | ||
33 | void (*sync_single_for_device)(struct device *hwdev, | ||
34 | dma_addr_t dma_handle, size_t size, | ||
35 | int direction); | ||
36 | void (*sync_single_range_for_cpu)(struct device *hwdev, | ||
37 | dma_addr_t dma_handle, unsigned long offset, | ||
38 | size_t size, int direction); | ||
39 | void (*sync_single_range_for_device)(struct device *hwdev, | ||
40 | dma_addr_t dma_handle, unsigned long offset, | ||
41 | size_t size, int direction); | ||
42 | void (*sync_sg_for_cpu)(struct device *hwdev, | ||
43 | struct scatterlist *sg, int nelems, | ||
44 | int direction); | ||
45 | void (*sync_sg_for_device)(struct device *hwdev, | ||
46 | struct scatterlist *sg, int nelems, | ||
47 | int direction); | ||
48 | int (*map_sg)(struct device *hwdev, struct scatterlist *sg, | ||
49 | int nents, int direction); | ||
50 | void (*unmap_sg)(struct device *hwdev, | ||
51 | struct scatterlist *sg, int nents, | ||
52 | int direction); | ||
53 | int (*dma_supported)(struct device *hwdev, u64 mask); | ||
54 | int is_phys; | ||
55 | }; | ||
56 | |||
57 | extern struct dma_mapping_ops *dma_ops; | ||
58 | |||
59 | static inline struct dma_mapping_ops *get_dma_ops(struct device *dev) | ||
60 | { | 24 | { |
61 | #ifdef CONFIG_X86_32 | 25 | #ifdef CONFIG_X86_32 |
62 | return dma_ops; | 26 | return dma_ops; |
@@ -71,7 +35,7 @@ static inline struct dma_mapping_ops *get_dma_ops(struct device *dev) | |||
71 | /* Make sure we keep the same behaviour */ | 35 | /* Make sure we keep the same behaviour */ |
72 | static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) | 36 | static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) |
73 | { | 37 | { |
74 | struct dma_mapping_ops *ops = get_dma_ops(dev); | 38 | struct dma_map_ops *ops = get_dma_ops(dev); |
75 | if (ops->mapping_error) | 39 | if (ops->mapping_error) |
76 | return ops->mapping_error(dev, dma_addr); | 40 | return ops->mapping_error(dev, dma_addr); |
77 | 41 | ||
@@ -90,137 +54,167 @@ extern void *dma_generic_alloc_coherent(struct device *dev, size_t size, | |||
90 | 54 | ||
91 | static inline dma_addr_t | 55 | static inline dma_addr_t |
92 | dma_map_single(struct device *hwdev, void *ptr, size_t size, | 56 | dma_map_single(struct device *hwdev, void *ptr, size_t size, |
93 | int direction) | 57 | enum dma_data_direction dir) |
94 | { | 58 | { |
95 | struct dma_mapping_ops *ops = get_dma_ops(hwdev); | 59 | struct dma_map_ops *ops = get_dma_ops(hwdev); |
96 | 60 | dma_addr_t addr; | |
97 | BUG_ON(!valid_dma_direction(direction)); | 61 | |
98 | return ops->map_single(hwdev, virt_to_phys(ptr), size, direction); | 62 | BUG_ON(!valid_dma_direction(dir)); |
63 | addr = ops->map_page(hwdev, virt_to_page(ptr), | ||
64 | (unsigned long)ptr & ~PAGE_MASK, size, | ||
65 | dir, NULL); | ||
66 | debug_dma_map_page(hwdev, virt_to_page(ptr), | ||
67 | (unsigned long)ptr & ~PAGE_MASK, size, | ||
68 | dir, addr, true); | ||
69 | return addr; | ||
99 | } | 70 | } |
100 | 71 | ||
101 | static inline void | 72 | static inline void |
102 | dma_unmap_single(struct device *dev, dma_addr_t addr, size_t size, | 73 | dma_unmap_single(struct device *dev, dma_addr_t addr, size_t size, |
103 | int direction) | 74 | enum dma_data_direction dir) |
104 | { | 75 | { |
105 | struct dma_mapping_ops *ops = get_dma_ops(dev); | 76 | struct dma_map_ops *ops = get_dma_ops(dev); |
106 | 77 | ||
107 | BUG_ON(!valid_dma_direction(direction)); | 78 | BUG_ON(!valid_dma_direction(dir)); |
108 | if (ops->unmap_single) | 79 | if (ops->unmap_page) |
109 | ops->unmap_single(dev, addr, size, direction); | 80 | ops->unmap_page(dev, addr, size, dir, NULL); |
81 | debug_dma_unmap_page(dev, addr, size, dir, true); | ||
110 | } | 82 | } |
111 | 83 | ||
112 | static inline int | 84 | static inline int |
113 | dma_map_sg(struct device *hwdev, struct scatterlist *sg, | 85 | dma_map_sg(struct device *hwdev, struct scatterlist *sg, |
114 | int nents, int direction) | 86 | int nents, enum dma_data_direction dir) |
115 | { | 87 | { |
116 | struct dma_mapping_ops *ops = get_dma_ops(hwdev); | 88 | struct dma_map_ops *ops = get_dma_ops(hwdev); |
89 | int ents; | ||
90 | |||
91 | BUG_ON(!valid_dma_direction(dir)); | ||
92 | ents = ops->map_sg(hwdev, sg, nents, dir, NULL); | ||
93 | debug_dma_map_sg(hwdev, sg, nents, ents, dir); | ||
117 | 94 | ||
118 | BUG_ON(!valid_dma_direction(direction)); | 95 | return ents; |
119 | return ops->map_sg(hwdev, sg, nents, direction); | ||
120 | } | 96 | } |
121 | 97 | ||
122 | static inline void | 98 | static inline void |
123 | dma_unmap_sg(struct device *hwdev, struct scatterlist *sg, int nents, | 99 | dma_unmap_sg(struct device *hwdev, struct scatterlist *sg, int nents, |
124 | int direction) | 100 | enum dma_data_direction dir) |
125 | { | 101 | { |
126 | struct dma_mapping_ops *ops = get_dma_ops(hwdev); | 102 | struct dma_map_ops *ops = get_dma_ops(hwdev); |
127 | 103 | ||
128 | BUG_ON(!valid_dma_direction(direction)); | 104 | BUG_ON(!valid_dma_direction(dir)); |
105 | debug_dma_unmap_sg(hwdev, sg, nents, dir); | ||
129 | if (ops->unmap_sg) | 106 | if (ops->unmap_sg) |
130 | ops->unmap_sg(hwdev, sg, nents, direction); | 107 | ops->unmap_sg(hwdev, sg, nents, dir, NULL); |
131 | } | 108 | } |
132 | 109 | ||
133 | static inline void | 110 | static inline void |
134 | dma_sync_single_for_cpu(struct device *hwdev, dma_addr_t dma_handle, | 111 | dma_sync_single_for_cpu(struct device *hwdev, dma_addr_t dma_handle, |
135 | size_t size, int direction) | 112 | size_t size, enum dma_data_direction dir) |
136 | { | 113 | { |
137 | struct dma_mapping_ops *ops = get_dma_ops(hwdev); | 114 | struct dma_map_ops *ops = get_dma_ops(hwdev); |
138 | 115 | ||
139 | BUG_ON(!valid_dma_direction(direction)); | 116 | BUG_ON(!valid_dma_direction(dir)); |
140 | if (ops->sync_single_for_cpu) | 117 | if (ops->sync_single_for_cpu) |
141 | ops->sync_single_for_cpu(hwdev, dma_handle, size, direction); | 118 | ops->sync_single_for_cpu(hwdev, dma_handle, size, dir); |
119 | debug_dma_sync_single_for_cpu(hwdev, dma_handle, size, dir); | ||
142 | flush_write_buffers(); | 120 | flush_write_buffers(); |
143 | } | 121 | } |
144 | 122 | ||
145 | static inline void | 123 | static inline void |
146 | dma_sync_single_for_device(struct device *hwdev, dma_addr_t dma_handle, | 124 | dma_sync_single_for_device(struct device *hwdev, dma_addr_t dma_handle, |
147 | size_t size, int direction) | 125 | size_t size, enum dma_data_direction dir) |
148 | { | 126 | { |
149 | struct dma_mapping_ops *ops = get_dma_ops(hwdev); | 127 | struct dma_map_ops *ops = get_dma_ops(hwdev); |
150 | 128 | ||
151 | BUG_ON(!valid_dma_direction(direction)); | 129 | BUG_ON(!valid_dma_direction(dir)); |
152 | if (ops->sync_single_for_device) | 130 | if (ops->sync_single_for_device) |
153 | ops->sync_single_for_device(hwdev, dma_handle, size, direction); | 131 | ops->sync_single_for_device(hwdev, dma_handle, size, dir); |
132 | debug_dma_sync_single_for_device(hwdev, dma_handle, size, dir); | ||
154 | flush_write_buffers(); | 133 | flush_write_buffers(); |
155 | } | 134 | } |
156 | 135 | ||
157 | static inline void | 136 | static inline void |
158 | dma_sync_single_range_for_cpu(struct device *hwdev, dma_addr_t dma_handle, | 137 | dma_sync_single_range_for_cpu(struct device *hwdev, dma_addr_t dma_handle, |
159 | unsigned long offset, size_t size, int direction) | 138 | unsigned long offset, size_t size, |
139 | enum dma_data_direction dir) | ||
160 | { | 140 | { |
161 | struct dma_mapping_ops *ops = get_dma_ops(hwdev); | 141 | struct dma_map_ops *ops = get_dma_ops(hwdev); |
162 | 142 | ||
163 | BUG_ON(!valid_dma_direction(direction)); | 143 | BUG_ON(!valid_dma_direction(dir)); |
164 | if (ops->sync_single_range_for_cpu) | 144 | if (ops->sync_single_range_for_cpu) |
165 | ops->sync_single_range_for_cpu(hwdev, dma_handle, offset, | 145 | ops->sync_single_range_for_cpu(hwdev, dma_handle, offset, |
166 | size, direction); | 146 | size, dir); |
147 | debug_dma_sync_single_range_for_cpu(hwdev, dma_handle, | ||
148 | offset, size, dir); | ||
167 | flush_write_buffers(); | 149 | flush_write_buffers(); |
168 | } | 150 | } |
169 | 151 | ||
170 | static inline void | 152 | static inline void |
171 | dma_sync_single_range_for_device(struct device *hwdev, dma_addr_t dma_handle, | 153 | dma_sync_single_range_for_device(struct device *hwdev, dma_addr_t dma_handle, |
172 | unsigned long offset, size_t size, | 154 | unsigned long offset, size_t size, |
173 | int direction) | 155 | enum dma_data_direction dir) |
174 | { | 156 | { |
175 | struct dma_mapping_ops *ops = get_dma_ops(hwdev); | 157 | struct dma_map_ops *ops = get_dma_ops(hwdev); |
176 | 158 | ||
177 | BUG_ON(!valid_dma_direction(direction)); | 159 | BUG_ON(!valid_dma_direction(dir)); |
178 | if (ops->sync_single_range_for_device) | 160 | if (ops->sync_single_range_for_device) |
179 | ops->sync_single_range_for_device(hwdev, dma_handle, | 161 | ops->sync_single_range_for_device(hwdev, dma_handle, |
180 | offset, size, direction); | 162 | offset, size, dir); |
163 | debug_dma_sync_single_range_for_device(hwdev, dma_handle, | ||
164 | offset, size, dir); | ||
181 | flush_write_buffers(); | 165 | flush_write_buffers(); |
182 | } | 166 | } |
183 | 167 | ||
184 | static inline void | 168 | static inline void |
185 | dma_sync_sg_for_cpu(struct device *hwdev, struct scatterlist *sg, | 169 | dma_sync_sg_for_cpu(struct device *hwdev, struct scatterlist *sg, |
186 | int nelems, int direction) | 170 | int nelems, enum dma_data_direction dir) |
187 | { | 171 | { |
188 | struct dma_mapping_ops *ops = get_dma_ops(hwdev); | 172 | struct dma_map_ops *ops = get_dma_ops(hwdev); |
189 | 173 | ||
190 | BUG_ON(!valid_dma_direction(direction)); | 174 | BUG_ON(!valid_dma_direction(dir)); |
191 | if (ops->sync_sg_for_cpu) | 175 | if (ops->sync_sg_for_cpu) |
192 | ops->sync_sg_for_cpu(hwdev, sg, nelems, direction); | 176 | ops->sync_sg_for_cpu(hwdev, sg, nelems, dir); |
177 | debug_dma_sync_sg_for_cpu(hwdev, sg, nelems, dir); | ||
193 | flush_write_buffers(); | 178 | flush_write_buffers(); |
194 | } | 179 | } |
195 | 180 | ||
196 | static inline void | 181 | static inline void |
197 | dma_sync_sg_for_device(struct device *hwdev, struct scatterlist *sg, | 182 | dma_sync_sg_for_device(struct device *hwdev, struct scatterlist *sg, |
198 | int nelems, int direction) | 183 | int nelems, enum dma_data_direction dir) |
199 | { | 184 | { |
200 | struct dma_mapping_ops *ops = get_dma_ops(hwdev); | 185 | struct dma_map_ops *ops = get_dma_ops(hwdev); |
201 | 186 | ||
202 | BUG_ON(!valid_dma_direction(direction)); | 187 | BUG_ON(!valid_dma_direction(dir)); |
203 | if (ops->sync_sg_for_device) | 188 | if (ops->sync_sg_for_device) |
204 | ops->sync_sg_for_device(hwdev, sg, nelems, direction); | 189 | ops->sync_sg_for_device(hwdev, sg, nelems, dir); |
190 | debug_dma_sync_sg_for_device(hwdev, sg, nelems, dir); | ||
205 | 191 | ||
206 | flush_write_buffers(); | 192 | flush_write_buffers(); |
207 | } | 193 | } |
208 | 194 | ||
209 | static inline dma_addr_t dma_map_page(struct device *dev, struct page *page, | 195 | static inline dma_addr_t dma_map_page(struct device *dev, struct page *page, |
210 | size_t offset, size_t size, | 196 | size_t offset, size_t size, |
211 | int direction) | 197 | enum dma_data_direction dir) |
212 | { | 198 | { |
213 | struct dma_mapping_ops *ops = get_dma_ops(dev); | 199 | struct dma_map_ops *ops = get_dma_ops(dev); |
200 | dma_addr_t addr; | ||
214 | 201 | ||
215 | BUG_ON(!valid_dma_direction(direction)); | 202 | BUG_ON(!valid_dma_direction(dir)); |
216 | return ops->map_single(dev, page_to_phys(page) + offset, | 203 | addr = ops->map_page(dev, page, offset, size, dir, NULL); |
217 | size, direction); | 204 | debug_dma_map_page(dev, page, offset, size, dir, addr, false); |
205 | |||
206 | return addr; | ||
218 | } | 207 | } |
219 | 208 | ||
220 | static inline void dma_unmap_page(struct device *dev, dma_addr_t addr, | 209 | static inline void dma_unmap_page(struct device *dev, dma_addr_t addr, |
221 | size_t size, int direction) | 210 | size_t size, enum dma_data_direction dir) |
222 | { | 211 | { |
223 | dma_unmap_single(dev, addr, size, direction); | 212 | struct dma_map_ops *ops = get_dma_ops(dev); |
213 | |||
214 | BUG_ON(!valid_dma_direction(dir)); | ||
215 | if (ops->unmap_page) | ||
216 | ops->unmap_page(dev, addr, size, dir, NULL); | ||
217 | debug_dma_unmap_page(dev, addr, size, dir, false); | ||
224 | } | 218 | } |
225 | 219 | ||
226 | static inline void | 220 | static inline void |
@@ -244,7 +238,7 @@ static inline unsigned long dma_alloc_coherent_mask(struct device *dev, | |||
244 | 238 | ||
245 | dma_mask = dev->coherent_dma_mask; | 239 | dma_mask = dev->coherent_dma_mask; |
246 | if (!dma_mask) | 240 | if (!dma_mask) |
247 | dma_mask = (gfp & GFP_DMA) ? DMA_24BIT_MASK : DMA_32BIT_MASK; | 241 | dma_mask = (gfp & GFP_DMA) ? DMA_BIT_MASK(24) : DMA_BIT_MASK(32); |
248 | 242 | ||
249 | return dma_mask; | 243 | return dma_mask; |
250 | } | 244 | } |
@@ -253,10 +247,10 @@ static inline gfp_t dma_alloc_coherent_gfp_flags(struct device *dev, gfp_t gfp) | |||
253 | { | 247 | { |
254 | unsigned long dma_mask = dma_alloc_coherent_mask(dev, gfp); | 248 | unsigned long dma_mask = dma_alloc_coherent_mask(dev, gfp); |
255 | 249 | ||
256 | if (dma_mask <= DMA_24BIT_MASK) | 250 | if (dma_mask <= DMA_BIT_MASK(24)) |
257 | gfp |= GFP_DMA; | 251 | gfp |= GFP_DMA; |
258 | #ifdef CONFIG_X86_64 | 252 | #ifdef CONFIG_X86_64 |
259 | if (dma_mask <= DMA_32BIT_MASK && !(gfp & GFP_DMA)) | 253 | if (dma_mask <= DMA_BIT_MASK(32) && !(gfp & GFP_DMA)) |
260 | gfp |= GFP_DMA32; | 254 | gfp |= GFP_DMA32; |
261 | #endif | 255 | #endif |
262 | return gfp; | 256 | return gfp; |
@@ -266,7 +260,7 @@ static inline void * | |||
266 | dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, | 260 | dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, |
267 | gfp_t gfp) | 261 | gfp_t gfp) |
268 | { | 262 | { |
269 | struct dma_mapping_ops *ops = get_dma_ops(dev); | 263 | struct dma_map_ops *ops = get_dma_ops(dev); |
270 | void *memory; | 264 | void *memory; |
271 | 265 | ||
272 | gfp &= ~(__GFP_DMA | __GFP_HIGHMEM | __GFP_DMA32); | 266 | gfp &= ~(__GFP_DMA | __GFP_HIGHMEM | __GFP_DMA32); |
@@ -285,20 +279,24 @@ dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, | |||
285 | if (!ops->alloc_coherent) | 279 | if (!ops->alloc_coherent) |
286 | return NULL; | 280 | return NULL; |
287 | 281 | ||
288 | return ops->alloc_coherent(dev, size, dma_handle, | 282 | memory = ops->alloc_coherent(dev, size, dma_handle, |
289 | dma_alloc_coherent_gfp_flags(dev, gfp)); | 283 | dma_alloc_coherent_gfp_flags(dev, gfp)); |
284 | debug_dma_alloc_coherent(dev, size, *dma_handle, memory); | ||
285 | |||
286 | return memory; | ||
290 | } | 287 | } |
291 | 288 | ||
292 | static inline void dma_free_coherent(struct device *dev, size_t size, | 289 | static inline void dma_free_coherent(struct device *dev, size_t size, |
293 | void *vaddr, dma_addr_t bus) | 290 | void *vaddr, dma_addr_t bus) |
294 | { | 291 | { |
295 | struct dma_mapping_ops *ops = get_dma_ops(dev); | 292 | struct dma_map_ops *ops = get_dma_ops(dev); |
296 | 293 | ||
297 | WARN_ON(irqs_disabled()); /* for portability */ | 294 | WARN_ON(irqs_disabled()); /* for portability */ |
298 | 295 | ||
299 | if (dma_release_from_coherent(dev, get_order(size), vaddr)) | 296 | if (dma_release_from_coherent(dev, get_order(size), vaddr)) |
300 | return; | 297 | return; |
301 | 298 | ||
299 | debug_dma_free_coherent(dev, size, vaddr, bus); | ||
302 | if (ops->free_coherent) | 300 | if (ops->free_coherent) |
303 | ops->free_coherent(dev, size, vaddr, bus); | 301 | ops->free_coherent(dev, size, vaddr, bus); |
304 | } | 302 | } |
diff --git a/arch/x86/include/asm/e820.h b/arch/x86/include/asm/e820.h index 00d41ce4c844..7ecba4d85089 100644 --- a/arch/x86/include/asm/e820.h +++ b/arch/x86/include/asm/e820.h | |||
@@ -72,7 +72,7 @@ extern int e820_all_mapped(u64 start, u64 end, unsigned type); | |||
72 | extern void e820_add_region(u64 start, u64 size, int type); | 72 | extern void e820_add_region(u64 start, u64 size, int type); |
73 | extern void e820_print_map(char *who); | 73 | extern void e820_print_map(char *who); |
74 | extern int | 74 | extern int |
75 | sanitize_e820_map(struct e820entry *biosmap, int max_nr_map, int *pnr_map); | 75 | sanitize_e820_map(struct e820entry *biosmap, int max_nr_map, u32 *pnr_map); |
76 | extern u64 e820_update_range(u64 start, u64 size, unsigned old_type, | 76 | extern u64 e820_update_range(u64 start, u64 size, unsigned old_type, |
77 | unsigned new_type); | 77 | unsigned new_type); |
78 | extern u64 e820_remove_range(u64 start, u64 size, unsigned old_type, | 78 | extern u64 e820_remove_range(u64 start, u64 size, unsigned old_type, |
diff --git a/arch/x86/include/asm/fixmap.h b/arch/x86/include/asm/fixmap.h index 63a79c77d220..2d81af3974a0 100644 --- a/arch/x86/include/asm/fixmap.h +++ b/arch/x86/include/asm/fixmap.h | |||
@@ -111,6 +111,8 @@ enum fixed_addresses { | |||
111 | #ifdef CONFIG_PARAVIRT | 111 | #ifdef CONFIG_PARAVIRT |
112 | FIX_PARAVIRT_BOOTMAP, | 112 | FIX_PARAVIRT_BOOTMAP, |
113 | #endif | 113 | #endif |
114 | FIX_TEXT_POKE0, /* reserve 2 pages for text_poke() */ | ||
115 | FIX_TEXT_POKE1, | ||
114 | __end_of_permanent_fixed_addresses, | 116 | __end_of_permanent_fixed_addresses, |
115 | #ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT | 117 | #ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT |
116 | FIX_OHCI1394_BASE, | 118 | FIX_OHCI1394_BASE, |
@@ -149,11 +151,11 @@ extern pte_t *pkmap_page_table; | |||
149 | 151 | ||
150 | void __native_set_fixmap(enum fixed_addresses idx, pte_t pte); | 152 | void __native_set_fixmap(enum fixed_addresses idx, pte_t pte); |
151 | void native_set_fixmap(enum fixed_addresses idx, | 153 | void native_set_fixmap(enum fixed_addresses idx, |
152 | unsigned long phys, pgprot_t flags); | 154 | phys_addr_t phys, pgprot_t flags); |
153 | 155 | ||
154 | #ifndef CONFIG_PARAVIRT | 156 | #ifndef CONFIG_PARAVIRT |
155 | static inline void __set_fixmap(enum fixed_addresses idx, | 157 | static inline void __set_fixmap(enum fixed_addresses idx, |
156 | unsigned long phys, pgprot_t flags) | 158 | phys_addr_t phys, pgprot_t flags) |
157 | { | 159 | { |
158 | native_set_fixmap(idx, phys, flags); | 160 | native_set_fixmap(idx, phys, flags); |
159 | } | 161 | } |
diff --git a/arch/x86/include/asm/ftrace.h b/arch/x86/include/asm/ftrace.h index b55b4a7fbefd..bd2c6511c887 100644 --- a/arch/x86/include/asm/ftrace.h +++ b/arch/x86/include/asm/ftrace.h | |||
@@ -28,6 +28,13 @@ | |||
28 | 28 | ||
29 | #endif | 29 | #endif |
30 | 30 | ||
31 | /* FIXME: I don't want to stay hardcoded */ | ||
32 | #ifdef CONFIG_X86_64 | ||
33 | # define FTRACE_SYSCALL_MAX 296 | ||
34 | #else | ||
35 | # define FTRACE_SYSCALL_MAX 333 | ||
36 | #endif | ||
37 | |||
31 | #ifdef CONFIG_FUNCTION_TRACER | 38 | #ifdef CONFIG_FUNCTION_TRACER |
32 | #define MCOUNT_ADDR ((long)(mcount)) | 39 | #define MCOUNT_ADDR ((long)(mcount)) |
33 | #define MCOUNT_INSN_SIZE 5 /* sizeof mcount call */ | 40 | #define MCOUNT_INSN_SIZE 5 /* sizeof mcount call */ |
@@ -55,29 +62,4 @@ struct dyn_arch_ftrace { | |||
55 | #endif /* __ASSEMBLY__ */ | 62 | #endif /* __ASSEMBLY__ */ |
56 | #endif /* CONFIG_FUNCTION_TRACER */ | 63 | #endif /* CONFIG_FUNCTION_TRACER */ |
57 | 64 | ||
58 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | ||
59 | |||
60 | #ifndef __ASSEMBLY__ | ||
61 | |||
62 | /* | ||
63 | * Stack of return addresses for functions | ||
64 | * of a thread. | ||
65 | * Used in struct thread_info | ||
66 | */ | ||
67 | struct ftrace_ret_stack { | ||
68 | unsigned long ret; | ||
69 | unsigned long func; | ||
70 | unsigned long long calltime; | ||
71 | }; | ||
72 | |||
73 | /* | ||
74 | * Primary handler of a function return. | ||
75 | * It relays on ftrace_return_to_handler. | ||
76 | * Defined in entry_32/64.S | ||
77 | */ | ||
78 | extern void return_to_handler(void); | ||
79 | |||
80 | #endif /* __ASSEMBLY__ */ | ||
81 | #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ | ||
82 | |||
83 | #endif /* _ASM_X86_FTRACE_H */ | 65 | #endif /* _ASM_X86_FTRACE_H */ |
diff --git a/arch/x86/include/asm/ia32.h b/arch/x86/include/asm/ia32.h index 50ca486fd88c..1f7e62517284 100644 --- a/arch/x86/include/asm/ia32.h +++ b/arch/x86/include/asm/ia32.h | |||
@@ -129,13 +129,6 @@ typedef struct compat_siginfo { | |||
129 | } _sifields; | 129 | } _sifields; |
130 | } compat_siginfo_t; | 130 | } compat_siginfo_t; |
131 | 131 | ||
132 | struct ustat32 { | ||
133 | __u32 f_tfree; | ||
134 | compat_ino_t f_tinode; | ||
135 | char f_fname[6]; | ||
136 | char f_fpack[6]; | ||
137 | }; | ||
138 | |||
139 | #define IA32_STACK_TOP IA32_PAGE_OFFSET | 132 | #define IA32_STACK_TOP IA32_PAGE_OFFSET |
140 | 133 | ||
141 | #ifdef __KERNEL__ | 134 | #ifdef __KERNEL__ |
diff --git a/arch/x86/include/asm/io.h b/arch/x86/include/asm/io.h index e5383e3d2f8c..73739322b6d0 100644 --- a/arch/x86/include/asm/io.h +++ b/arch/x86/include/asm/io.h | |||
@@ -193,8 +193,10 @@ extern void __iomem *ioremap_wc(resource_size_t offset, unsigned long size); | |||
193 | */ | 193 | */ |
194 | extern void early_ioremap_init(void); | 194 | extern void early_ioremap_init(void); |
195 | extern void early_ioremap_reset(void); | 195 | extern void early_ioremap_reset(void); |
196 | extern void __iomem *early_ioremap(unsigned long offset, unsigned long size); | 196 | extern void __iomem *early_ioremap(resource_size_t phys_addr, |
197 | extern void __iomem *early_memremap(unsigned long offset, unsigned long size); | 197 | unsigned long size); |
198 | extern void __iomem *early_memremap(resource_size_t phys_addr, | ||
199 | unsigned long size); | ||
198 | extern void early_iounmap(void __iomem *addr, unsigned long size); | 200 | extern void early_iounmap(void __iomem *addr, unsigned long size); |
199 | 201 | ||
200 | #define IO_SPACE_LIMIT 0xffff | 202 | #define IO_SPACE_LIMIT 0xffff |
diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h index 373cc2bbcad2..9d826e436010 100644 --- a/arch/x86/include/asm/io_apic.h +++ b/arch/x86/include/asm/io_apic.h | |||
@@ -162,10 +162,13 @@ extern int (*ioapic_renumber_irq)(int ioapic, int irq); | |||
162 | extern void ioapic_init_mappings(void); | 162 | extern void ioapic_init_mappings(void); |
163 | 163 | ||
164 | #ifdef CONFIG_X86_64 | 164 | #ifdef CONFIG_X86_64 |
165 | extern int save_IO_APIC_setup(void); | 165 | extern struct IO_APIC_route_entry **alloc_ioapic_entries(void); |
166 | extern void mask_IO_APIC_setup(void); | 166 | extern void free_ioapic_entries(struct IO_APIC_route_entry **ioapic_entries); |
167 | extern void restore_IO_APIC_setup(void); | 167 | extern int save_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries); |
168 | extern void reinit_intr_remapped_IO_APIC(int); | 168 | extern void mask_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries); |
169 | extern int restore_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries); | ||
170 | extern void reinit_intr_remapped_IO_APIC(int intr_remapping, | ||
171 | struct IO_APIC_route_entry **ioapic_entries); | ||
169 | #endif | 172 | #endif |
170 | 173 | ||
171 | extern void probe_nr_irqs_gsi(void); | 174 | extern void probe_nr_irqs_gsi(void); |
diff --git a/arch/x86/include/asm/iommu.h b/arch/x86/include/asm/iommu.h index a6ee9e6f530f..af326a2975b5 100644 --- a/arch/x86/include/asm/iommu.h +++ b/arch/x86/include/asm/iommu.h | |||
@@ -3,7 +3,7 @@ | |||
3 | 3 | ||
4 | extern void pci_iommu_shutdown(void); | 4 | extern void pci_iommu_shutdown(void); |
5 | extern void no_iommu_init(void); | 5 | extern void no_iommu_init(void); |
6 | extern struct dma_mapping_ops nommu_dma_ops; | 6 | extern struct dma_map_ops nommu_dma_ops; |
7 | extern int force_iommu, no_iommu; | 7 | extern int force_iommu, no_iommu; |
8 | extern int iommu_detected; | 8 | extern int iommu_detected; |
9 | 9 | ||
diff --git a/arch/x86/include/asm/kvm.h b/arch/x86/include/asm/kvm.h index 886c9402ec45..dc3f6cf11704 100644 --- a/arch/x86/include/asm/kvm.h +++ b/arch/x86/include/asm/kvm.h | |||
@@ -15,6 +15,7 @@ | |||
15 | #define __KVM_HAVE_DEVICE_ASSIGNMENT | 15 | #define __KVM_HAVE_DEVICE_ASSIGNMENT |
16 | #define __KVM_HAVE_MSI | 16 | #define __KVM_HAVE_MSI |
17 | #define __KVM_HAVE_USER_NMI | 17 | #define __KVM_HAVE_USER_NMI |
18 | #define __KVM_HAVE_GUEST_DEBUG | ||
18 | 19 | ||
19 | /* Architectural interrupt line count. */ | 20 | /* Architectural interrupt line count. */ |
20 | #define KVM_NR_INTERRUPTS 256 | 21 | #define KVM_NR_INTERRUPTS 256 |
@@ -212,7 +213,30 @@ struct kvm_pit_channel_state { | |||
212 | __s64 count_load_time; | 213 | __s64 count_load_time; |
213 | }; | 214 | }; |
214 | 215 | ||
216 | struct kvm_debug_exit_arch { | ||
217 | __u32 exception; | ||
218 | __u32 pad; | ||
219 | __u64 pc; | ||
220 | __u64 dr6; | ||
221 | __u64 dr7; | ||
222 | }; | ||
223 | |||
224 | #define KVM_GUESTDBG_USE_SW_BP 0x00010000 | ||
225 | #define KVM_GUESTDBG_USE_HW_BP 0x00020000 | ||
226 | #define KVM_GUESTDBG_INJECT_DB 0x00040000 | ||
227 | #define KVM_GUESTDBG_INJECT_BP 0x00080000 | ||
228 | |||
229 | /* for KVM_SET_GUEST_DEBUG */ | ||
230 | struct kvm_guest_debug_arch { | ||
231 | __u64 debugreg[8]; | ||
232 | }; | ||
233 | |||
215 | struct kvm_pit_state { | 234 | struct kvm_pit_state { |
216 | struct kvm_pit_channel_state channels[3]; | 235 | struct kvm_pit_channel_state channels[3]; |
217 | }; | 236 | }; |
237 | |||
238 | struct kvm_reinject_control { | ||
239 | __u8 pit_reinject; | ||
240 | __u8 reserved[31]; | ||
241 | }; | ||
218 | #endif /* _ASM_X86_KVM_H */ | 242 | #endif /* _ASM_X86_KVM_H */ |
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 730843d1d2fb..f0faf58044ff 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <asm/pvclock-abi.h> | 22 | #include <asm/pvclock-abi.h> |
23 | #include <asm/desc.h> | 23 | #include <asm/desc.h> |
24 | #include <asm/mtrr.h> | 24 | #include <asm/mtrr.h> |
25 | #include <asm/msr-index.h> | ||
25 | 26 | ||
26 | #define KVM_MAX_VCPUS 16 | 27 | #define KVM_MAX_VCPUS 16 |
27 | #define KVM_MEMORY_SLOTS 32 | 28 | #define KVM_MEMORY_SLOTS 32 |
@@ -134,11 +135,18 @@ enum { | |||
134 | 135 | ||
135 | #define KVM_NR_MEM_OBJS 40 | 136 | #define KVM_NR_MEM_OBJS 40 |
136 | 137 | ||
137 | struct kvm_guest_debug { | 138 | #define KVM_NR_DB_REGS 4 |
138 | int enabled; | 139 | |
139 | unsigned long bp[4]; | 140 | #define DR6_BD (1 << 13) |
140 | int singlestep; | 141 | #define DR6_BS (1 << 14) |
141 | }; | 142 | #define DR6_FIXED_1 0xffff0ff0 |
143 | #define DR6_VOLATILE 0x0000e00f | ||
144 | |||
145 | #define DR7_BP_EN_MASK 0x000000ff | ||
146 | #define DR7_GE (1 << 9) | ||
147 | #define DR7_GD (1 << 13) | ||
148 | #define DR7_FIXED_1 0x00000400 | ||
149 | #define DR7_VOLATILE 0xffff23ff | ||
142 | 150 | ||
143 | /* | 151 | /* |
144 | * We don't want allocation failures within the mmu code, so we preallocate | 152 | * We don't want allocation failures within the mmu code, so we preallocate |
@@ -162,7 +170,8 @@ struct kvm_pte_chain { | |||
162 | * bits 0:3 - total guest paging levels (2-4, or zero for real mode) | 170 | * bits 0:3 - total guest paging levels (2-4, or zero for real mode) |
163 | * bits 4:7 - page table level for this shadow (1-4) | 171 | * bits 4:7 - page table level for this shadow (1-4) |
164 | * bits 8:9 - page table quadrant for 2-level guests | 172 | * bits 8:9 - page table quadrant for 2-level guests |
165 | * bit 16 - "metaphysical" - gfn is not a real page (huge page/real mode) | 173 | * bit 16 - direct mapping of virtual to physical mapping at gfn |
174 | * used for real mode and two-dimensional paging | ||
166 | * bits 17:19 - common access permissions for all ptes in this shadow page | 175 | * bits 17:19 - common access permissions for all ptes in this shadow page |
167 | */ | 176 | */ |
168 | union kvm_mmu_page_role { | 177 | union kvm_mmu_page_role { |
@@ -172,9 +181,10 @@ union kvm_mmu_page_role { | |||
172 | unsigned level:4; | 181 | unsigned level:4; |
173 | unsigned quadrant:2; | 182 | unsigned quadrant:2; |
174 | unsigned pad_for_nice_hex_output:6; | 183 | unsigned pad_for_nice_hex_output:6; |
175 | unsigned metaphysical:1; | 184 | unsigned direct:1; |
176 | unsigned access:3; | 185 | unsigned access:3; |
177 | unsigned invalid:1; | 186 | unsigned invalid:1; |
187 | unsigned cr4_pge:1; | ||
178 | }; | 188 | }; |
179 | }; | 189 | }; |
180 | 190 | ||
@@ -218,6 +228,18 @@ struct kvm_pv_mmu_op_buffer { | |||
218 | char buf[512] __aligned(sizeof(long)); | 228 | char buf[512] __aligned(sizeof(long)); |
219 | }; | 229 | }; |
220 | 230 | ||
231 | struct kvm_pio_request { | ||
232 | unsigned long count; | ||
233 | int cur_count; | ||
234 | gva_t guest_gva; | ||
235 | int in; | ||
236 | int port; | ||
237 | int size; | ||
238 | int string; | ||
239 | int down; | ||
240 | int rep; | ||
241 | }; | ||
242 | |||
221 | /* | 243 | /* |
222 | * x86 supports 3 paging modes (4-level 64-bit, 3-level 64-bit, and 2-level | 244 | * x86 supports 3 paging modes (4-level 64-bit, 3-level 64-bit, and 2-level |
223 | * 32-bit). The kvm_mmu structure abstracts the details of the current mmu | 245 | * 32-bit). The kvm_mmu structure abstracts the details of the current mmu |
@@ -236,6 +258,7 @@ struct kvm_mmu { | |||
236 | hpa_t root_hpa; | 258 | hpa_t root_hpa; |
237 | int root_level; | 259 | int root_level; |
238 | int shadow_root_level; | 260 | int shadow_root_level; |
261 | union kvm_mmu_page_role base_role; | ||
239 | 262 | ||
240 | u64 *pae_root; | 263 | u64 *pae_root; |
241 | }; | 264 | }; |
@@ -258,6 +281,7 @@ struct kvm_vcpu_arch { | |||
258 | unsigned long cr3; | 281 | unsigned long cr3; |
259 | unsigned long cr4; | 282 | unsigned long cr4; |
260 | unsigned long cr8; | 283 | unsigned long cr8; |
284 | u32 hflags; | ||
261 | u64 pdptrs[4]; /* pae */ | 285 | u64 pdptrs[4]; /* pae */ |
262 | u64 shadow_efer; | 286 | u64 shadow_efer; |
263 | u64 apic_base; | 287 | u64 apic_base; |
@@ -338,6 +362,15 @@ struct kvm_vcpu_arch { | |||
338 | 362 | ||
339 | struct mtrr_state_type mtrr_state; | 363 | struct mtrr_state_type mtrr_state; |
340 | u32 pat; | 364 | u32 pat; |
365 | |||
366 | int switch_db_regs; | ||
367 | unsigned long host_db[KVM_NR_DB_REGS]; | ||
368 | unsigned long host_dr6; | ||
369 | unsigned long host_dr7; | ||
370 | unsigned long db[KVM_NR_DB_REGS]; | ||
371 | unsigned long dr6; | ||
372 | unsigned long dr7; | ||
373 | unsigned long eff_db[KVM_NR_DB_REGS]; | ||
341 | }; | 374 | }; |
342 | 375 | ||
343 | struct kvm_mem_alias { | 376 | struct kvm_mem_alias { |
@@ -378,6 +411,7 @@ struct kvm_arch{ | |||
378 | 411 | ||
379 | unsigned long irq_sources_bitmap; | 412 | unsigned long irq_sources_bitmap; |
380 | unsigned long irq_states[KVM_IOAPIC_NUM_PINS]; | 413 | unsigned long irq_states[KVM_IOAPIC_NUM_PINS]; |
414 | u64 vm_init_tsc; | ||
381 | }; | 415 | }; |
382 | 416 | ||
383 | struct kvm_vm_stat { | 417 | struct kvm_vm_stat { |
@@ -446,8 +480,7 @@ struct kvm_x86_ops { | |||
446 | void (*vcpu_put)(struct kvm_vcpu *vcpu); | 480 | void (*vcpu_put)(struct kvm_vcpu *vcpu); |
447 | 481 | ||
448 | int (*set_guest_debug)(struct kvm_vcpu *vcpu, | 482 | int (*set_guest_debug)(struct kvm_vcpu *vcpu, |
449 | struct kvm_debug_guest *dbg); | 483 | struct kvm_guest_debug *dbg); |
450 | void (*guest_debug_pre)(struct kvm_vcpu *vcpu); | ||
451 | int (*get_msr)(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata); | 484 | int (*get_msr)(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata); |
452 | int (*set_msr)(struct kvm_vcpu *vcpu, u32 msr_index, u64 data); | 485 | int (*set_msr)(struct kvm_vcpu *vcpu, u32 msr_index, u64 data); |
453 | u64 (*get_segment_base)(struct kvm_vcpu *vcpu, int seg); | 486 | u64 (*get_segment_base)(struct kvm_vcpu *vcpu, int seg); |
@@ -583,16 +616,12 @@ void kvm_queue_exception_e(struct kvm_vcpu *vcpu, unsigned nr, u32 error_code); | |||
583 | void kvm_inject_page_fault(struct kvm_vcpu *vcpu, unsigned long cr2, | 616 | void kvm_inject_page_fault(struct kvm_vcpu *vcpu, unsigned long cr2, |
584 | u32 error_code); | 617 | u32 error_code); |
585 | 618 | ||
586 | void kvm_pic_set_irq(void *opaque, int irq, int level); | 619 | int kvm_pic_set_irq(void *opaque, int irq, int level); |
587 | 620 | ||
588 | void kvm_inject_nmi(struct kvm_vcpu *vcpu); | 621 | void kvm_inject_nmi(struct kvm_vcpu *vcpu); |
589 | 622 | ||
590 | void fx_init(struct kvm_vcpu *vcpu); | 623 | void fx_init(struct kvm_vcpu *vcpu); |
591 | 624 | ||
592 | int emulator_read_std(unsigned long addr, | ||
593 | void *val, | ||
594 | unsigned int bytes, | ||
595 | struct kvm_vcpu *vcpu); | ||
596 | int emulator_write_emulated(unsigned long addr, | 625 | int emulator_write_emulated(unsigned long addr, |
597 | const void *val, | 626 | const void *val, |
598 | unsigned int bytes, | 627 | unsigned int bytes, |
@@ -737,6 +766,10 @@ enum { | |||
737 | TASK_SWITCH_GATE = 3, | 766 | TASK_SWITCH_GATE = 3, |
738 | }; | 767 | }; |
739 | 768 | ||
769 | #define HF_GIF_MASK (1 << 0) | ||
770 | #define HF_HIF_MASK (1 << 1) | ||
771 | #define HF_VINTR_MASK (1 << 2) | ||
772 | |||
740 | /* | 773 | /* |
741 | * Hardware virtualization extension instructions may fault if a | 774 | * Hardware virtualization extension instructions may fault if a |
742 | * reboot turns off virtualization while processes are running. | 775 | * reboot turns off virtualization while processes are running. |
diff --git a/arch/x86/include/asm/lguest_hcall.h b/arch/x86/include/asm/lguest_hcall.h index 43894428c3c2..faae1996487b 100644 --- a/arch/x86/include/asm/lguest_hcall.h +++ b/arch/x86/include/asm/lguest_hcall.h | |||
@@ -5,7 +5,6 @@ | |||
5 | #define LHCALL_FLUSH_ASYNC 0 | 5 | #define LHCALL_FLUSH_ASYNC 0 |
6 | #define LHCALL_LGUEST_INIT 1 | 6 | #define LHCALL_LGUEST_INIT 1 |
7 | #define LHCALL_SHUTDOWN 2 | 7 | #define LHCALL_SHUTDOWN 2 |
8 | #define LHCALL_LOAD_GDT 3 | ||
9 | #define LHCALL_NEW_PGTABLE 4 | 8 | #define LHCALL_NEW_PGTABLE 4 |
10 | #define LHCALL_FLUSH_TLB 5 | 9 | #define LHCALL_FLUSH_TLB 5 |
11 | #define LHCALL_LOAD_IDT_ENTRY 6 | 10 | #define LHCALL_LOAD_IDT_ENTRY 6 |
@@ -17,6 +16,7 @@ | |||
17 | #define LHCALL_SET_PMD 15 | 16 | #define LHCALL_SET_PMD 15 |
18 | #define LHCALL_LOAD_TLS 16 | 17 | #define LHCALL_LOAD_TLS 16 |
19 | #define LHCALL_NOTIFY 17 | 18 | #define LHCALL_NOTIFY 17 |
19 | #define LHCALL_LOAD_GDT_ENTRY 18 | ||
20 | 20 | ||
21 | #define LGUEST_TRAP_ENTRY 0x1F | 21 | #define LGUEST_TRAP_ENTRY 0x1F |
22 | 22 | ||
@@ -26,36 +26,20 @@ | |||
26 | 26 | ||
27 | #ifndef __ASSEMBLY__ | 27 | #ifndef __ASSEMBLY__ |
28 | #include <asm/hw_irq.h> | 28 | #include <asm/hw_irq.h> |
29 | #include <asm/kvm_para.h> | ||
29 | 30 | ||
30 | /*G:031 But first, how does our Guest contact the Host to ask for privileged | 31 | /*G:031 But first, how does our Guest contact the Host to ask for privileged |
31 | * operations? There are two ways: the direct way is to make a "hypercall", | 32 | * operations? There are two ways: the direct way is to make a "hypercall", |
32 | * to make requests of the Host Itself. | 33 | * to make requests of the Host Itself. |
33 | * | 34 | * |
34 | * Our hypercall mechanism uses the highest unused trap code (traps 32 and | 35 | * We use the KVM hypercall mechanism. Eighteen hypercalls are |
35 | * above are used by real hardware interrupts). Fifteen hypercalls are | ||
36 | * available: the hypercall number is put in the %eax register, and the | 36 | * available: the hypercall number is put in the %eax register, and the |
37 | * arguments (when required) are placed in %edx, %ebx and %ecx. If a return | 37 | * arguments (when required) are placed in %ebx, %ecx and %edx. If a return |
38 | * value makes sense, it's returned in %eax. | 38 | * value makes sense, it's returned in %eax. |
39 | * | 39 | * |
40 | * Grossly invalid calls result in Sudden Death at the hands of the vengeful | 40 | * Grossly invalid calls result in Sudden Death at the hands of the vengeful |
41 | * Host, rather than returning failure. This reflects Winston Churchill's | 41 | * Host, rather than returning failure. This reflects Winston Churchill's |
42 | * definition of a gentleman: "someone who is only rude intentionally". */ | 42 | * definition of a gentleman: "someone who is only rude intentionally". */ |
43 | static inline unsigned long | ||
44 | hcall(unsigned long call, | ||
45 | unsigned long arg1, unsigned long arg2, unsigned long arg3) | ||
46 | { | ||
47 | /* "int" is the Intel instruction to trigger a trap. */ | ||
48 | asm volatile("int $" __stringify(LGUEST_TRAP_ENTRY) | ||
49 | /* The call in %eax (aka "a") might be overwritten */ | ||
50 | : "=a"(call) | ||
51 | /* The arguments are in %eax, %edx, %ebx & %ecx */ | ||
52 | : "a"(call), "d"(arg1), "b"(arg2), "c"(arg3) | ||
53 | /* "memory" means this might write somewhere in memory. | ||
54 | * This isn't true for all calls, but it's safe to tell | ||
55 | * gcc that it might happen so it doesn't get clever. */ | ||
56 | : "memory"); | ||
57 | return call; | ||
58 | } | ||
59 | /*:*/ | 43 | /*:*/ |
60 | 44 | ||
61 | /* Can't use our min() macro here: needs to be a constant */ | 45 | /* Can't use our min() macro here: needs to be a constant */ |
@@ -64,7 +48,7 @@ hcall(unsigned long call, | |||
64 | #define LHCALL_RING_SIZE 64 | 48 | #define LHCALL_RING_SIZE 64 |
65 | struct hcall_args { | 49 | struct hcall_args { |
66 | /* These map directly onto eax, ebx, ecx, edx in struct lguest_regs */ | 50 | /* These map directly onto eax, ebx, ecx, edx in struct lguest_regs */ |
67 | unsigned long arg0, arg2, arg3, arg1; | 51 | unsigned long arg0, arg1, arg2, arg3; |
68 | }; | 52 | }; |
69 | 53 | ||
70 | #endif /* !__ASSEMBLY__ */ | 54 | #endif /* !__ASSEMBLY__ */ |
diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h index 2dbd2314139e..ec41fc16c167 100644 --- a/arch/x86/include/asm/msr-index.h +++ b/arch/x86/include/asm/msr-index.h | |||
@@ -18,11 +18,15 @@ | |||
18 | #define _EFER_LME 8 /* Long mode enable */ | 18 | #define _EFER_LME 8 /* Long mode enable */ |
19 | #define _EFER_LMA 10 /* Long mode active (read-only) */ | 19 | #define _EFER_LMA 10 /* Long mode active (read-only) */ |
20 | #define _EFER_NX 11 /* No execute enable */ | 20 | #define _EFER_NX 11 /* No execute enable */ |
21 | #define _EFER_SVME 12 /* Enable virtualization */ | ||
22 | #define _EFER_FFXSR 14 /* Enable Fast FXSAVE/FXRSTOR */ | ||
21 | 23 | ||
22 | #define EFER_SCE (1<<_EFER_SCE) | 24 | #define EFER_SCE (1<<_EFER_SCE) |
23 | #define EFER_LME (1<<_EFER_LME) | 25 | #define EFER_LME (1<<_EFER_LME) |
24 | #define EFER_LMA (1<<_EFER_LMA) | 26 | #define EFER_LMA (1<<_EFER_LMA) |
25 | #define EFER_NX (1<<_EFER_NX) | 27 | #define EFER_NX (1<<_EFER_NX) |
28 | #define EFER_SVME (1<<_EFER_SVME) | ||
29 | #define EFER_FFXSR (1<<_EFER_FFXSR) | ||
26 | 30 | ||
27 | /* Intel MSRs. Some also available on other CPUs */ | 31 | /* Intel MSRs. Some also available on other CPUs */ |
28 | #define MSR_IA32_PERFCTR0 0x000000c1 | 32 | #define MSR_IA32_PERFCTR0 0x000000c1 |
@@ -365,4 +369,9 @@ | |||
365 | #define MSR_IA32_VMX_PROCBASED_CTLS2 0x0000048b | 369 | #define MSR_IA32_VMX_PROCBASED_CTLS2 0x0000048b |
366 | #define MSR_IA32_VMX_EPT_VPID_CAP 0x0000048c | 370 | #define MSR_IA32_VMX_EPT_VPID_CAP 0x0000048c |
367 | 371 | ||
372 | /* AMD-V MSRs */ | ||
373 | |||
374 | #define MSR_VM_CR 0xc0010114 | ||
375 | #define MSR_VM_HSAVE_PA 0xc0010117 | ||
376 | |||
368 | #endif /* _ASM_X86_MSR_INDEX_H */ | 377 | #endif /* _ASM_X86_MSR_INDEX_H */ |
diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h index 7727aa8b7dda..378e3691c08c 100644 --- a/arch/x86/include/asm/paravirt.h +++ b/arch/x86/include/asm/paravirt.h | |||
@@ -347,7 +347,7 @@ struct pv_mmu_ops { | |||
347 | /* Sometimes the physical address is a pfn, and sometimes its | 347 | /* Sometimes the physical address is a pfn, and sometimes its |
348 | an mfn. We can tell which is which from the index. */ | 348 | an mfn. We can tell which is which from the index. */ |
349 | void (*set_fixmap)(unsigned /* enum fixed_addresses */ idx, | 349 | void (*set_fixmap)(unsigned /* enum fixed_addresses */ idx, |
350 | unsigned long phys, pgprot_t flags); | 350 | phys_addr_t phys, pgprot_t flags); |
351 | }; | 351 | }; |
352 | 352 | ||
353 | struct raw_spinlock; | 353 | struct raw_spinlock; |
@@ -1432,7 +1432,7 @@ static inline void arch_leave_lazy_mmu_mode(void) | |||
1432 | void arch_flush_lazy_mmu_mode(void); | 1432 | void arch_flush_lazy_mmu_mode(void); |
1433 | 1433 | ||
1434 | static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx, | 1434 | static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx, |
1435 | unsigned long phys, pgprot_t flags) | 1435 | phys_addr_t phys, pgprot_t flags) |
1436 | { | 1436 | { |
1437 | pv_mmu_ops.set_fixmap(idx, phys, flags); | 1437 | pv_mmu_ops.set_fixmap(idx, phys, flags); |
1438 | } | 1438 | } |
diff --git a/arch/x86/include/asm/pat.h b/arch/x86/include/asm/pat.h index 2cd07b9422f4..7af14e512f97 100644 --- a/arch/x86/include/asm/pat.h +++ b/arch/x86/include/asm/pat.h | |||
@@ -18,9 +18,5 @@ extern int free_memtype(u64 start, u64 end); | |||
18 | 18 | ||
19 | extern int kernel_map_sync_memtype(u64 base, unsigned long size, | 19 | extern int kernel_map_sync_memtype(u64 base, unsigned long size, |
20 | unsigned long flag); | 20 | unsigned long flag); |
21 | extern void map_devmem(unsigned long pfn, unsigned long size, | ||
22 | struct pgprot vma_prot); | ||
23 | extern void unmap_devmem(unsigned long pfn, unsigned long size, | ||
24 | struct pgprot vma_prot); | ||
25 | 21 | ||
26 | #endif /* _ASM_X86_PAT_H */ | 22 | #endif /* _ASM_X86_PAT_H */ |
diff --git a/arch/x86/include/asm/pci.h b/arch/x86/include/asm/pci.h index a977de23cb4d..b51a1e8b0baf 100644 --- a/arch/x86/include/asm/pci.h +++ b/arch/x86/include/asm/pci.h | |||
@@ -86,12 +86,43 @@ static inline void early_quirks(void) { } | |||
86 | 86 | ||
87 | extern void pci_iommu_alloc(void); | 87 | extern void pci_iommu_alloc(void); |
88 | 88 | ||
89 | #endif /* __KERNEL__ */ | 89 | /* MSI arch hook */ |
90 | #define arch_setup_msi_irqs arch_setup_msi_irqs | ||
91 | |||
92 | #define PCI_DMA_BUS_IS_PHYS (dma_ops->is_phys) | ||
93 | |||
94 | #if defined(CONFIG_X86_64) || defined(CONFIG_DMA_API_DEBUG) | ||
95 | |||
96 | #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) \ | ||
97 | dma_addr_t ADDR_NAME; | ||
98 | #define DECLARE_PCI_UNMAP_LEN(LEN_NAME) \ | ||
99 | __u32 LEN_NAME; | ||
100 | #define pci_unmap_addr(PTR, ADDR_NAME) \ | ||
101 | ((PTR)->ADDR_NAME) | ||
102 | #define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) \ | ||
103 | (((PTR)->ADDR_NAME) = (VAL)) | ||
104 | #define pci_unmap_len(PTR, LEN_NAME) \ | ||
105 | ((PTR)->LEN_NAME) | ||
106 | #define pci_unmap_len_set(PTR, LEN_NAME, VAL) \ | ||
107 | (((PTR)->LEN_NAME) = (VAL)) | ||
90 | 108 | ||
91 | #ifdef CONFIG_X86_32 | ||
92 | # include "pci_32.h" | ||
93 | #else | 109 | #else |
94 | # include "pci_64.h" | 110 | |
111 | #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) dma_addr_t ADDR_NAME[0]; | ||
112 | #define DECLARE_PCI_UNMAP_LEN(LEN_NAME) unsigned LEN_NAME[0]; | ||
113 | #define pci_unmap_addr(PTR, ADDR_NAME) sizeof((PTR)->ADDR_NAME) | ||
114 | #define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) \ | ||
115 | do { break; } while (pci_unmap_addr(PTR, ADDR_NAME)) | ||
116 | #define pci_unmap_len(PTR, LEN_NAME) sizeof((PTR)->LEN_NAME) | ||
117 | #define pci_unmap_len_set(PTR, LEN_NAME, VAL) \ | ||
118 | do { break; } while (pci_unmap_len(PTR, LEN_NAME)) | ||
119 | |||
120 | #endif | ||
121 | |||
122 | #endif /* __KERNEL__ */ | ||
123 | |||
124 | #ifdef CONFIG_X86_64 | ||
125 | #include "pci_64.h" | ||
95 | #endif | 126 | #endif |
96 | 127 | ||
97 | /* implement the pci_ DMA API in terms of the generic device dma_ one */ | 128 | /* implement the pci_ DMA API in terms of the generic device dma_ one */ |
@@ -109,11 +140,6 @@ static inline int __pcibus_to_node(const struct pci_bus *bus) | |||
109 | return sd->node; | 140 | return sd->node; |
110 | } | 141 | } |
111 | 142 | ||
112 | static inline cpumask_t __pcibus_to_cpumask(struct pci_bus *bus) | ||
113 | { | ||
114 | return node_to_cpumask(__pcibus_to_node(bus)); | ||
115 | } | ||
116 | |||
117 | static inline const struct cpumask * | 143 | static inline const struct cpumask * |
118 | cpumask_of_pcibus(const struct pci_bus *bus) | 144 | cpumask_of_pcibus(const struct pci_bus *bus) |
119 | { | 145 | { |
diff --git a/arch/x86/include/asm/pci_32.h b/arch/x86/include/asm/pci_32.h deleted file mode 100644 index 6f1213a6ef4f..000000000000 --- a/arch/x86/include/asm/pci_32.h +++ /dev/null | |||
@@ -1,34 +0,0 @@ | |||
1 | #ifndef _ASM_X86_PCI_32_H | ||
2 | #define _ASM_X86_PCI_32_H | ||
3 | |||
4 | |||
5 | #ifdef __KERNEL__ | ||
6 | |||
7 | |||
8 | /* Dynamic DMA mapping stuff. | ||
9 | * i386 has everything mapped statically. | ||
10 | */ | ||
11 | |||
12 | struct pci_dev; | ||
13 | |||
14 | /* The PCI address space does equal the physical memory | ||
15 | * address space. The networking and block device layers use | ||
16 | * this boolean for bounce buffer decisions. | ||
17 | */ | ||
18 | #define PCI_DMA_BUS_IS_PHYS (1) | ||
19 | |||
20 | /* pci_unmap_{page,single} is a nop so... */ | ||
21 | #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) dma_addr_t ADDR_NAME[0]; | ||
22 | #define DECLARE_PCI_UNMAP_LEN(LEN_NAME) unsigned LEN_NAME[0]; | ||
23 | #define pci_unmap_addr(PTR, ADDR_NAME) sizeof((PTR)->ADDR_NAME) | ||
24 | #define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) \ | ||
25 | do { break; } while (pci_unmap_addr(PTR, ADDR_NAME)) | ||
26 | #define pci_unmap_len(PTR, LEN_NAME) sizeof((PTR)->LEN_NAME) | ||
27 | #define pci_unmap_len_set(PTR, LEN_NAME, VAL) \ | ||
28 | do { break; } while (pci_unmap_len(PTR, LEN_NAME)) | ||
29 | |||
30 | |||
31 | #endif /* __KERNEL__ */ | ||
32 | |||
33 | |||
34 | #endif /* _ASM_X86_PCI_32_H */ | ||
diff --git a/arch/x86/include/asm/pci_64.h b/arch/x86/include/asm/pci_64.h index 4da207982777..ae5e40f67daf 100644 --- a/arch/x86/include/asm/pci_64.h +++ b/arch/x86/include/asm/pci_64.h | |||
@@ -24,28 +24,6 @@ extern int (*pci_config_write)(int seg, int bus, int dev, int fn, | |||
24 | 24 | ||
25 | extern void dma32_reserve_bootmem(void); | 25 | extern void dma32_reserve_bootmem(void); |
26 | 26 | ||
27 | /* The PCI address space does equal the physical memory | ||
28 | * address space. The networking and block device layers use | ||
29 | * this boolean for bounce buffer decisions | ||
30 | * | ||
31 | * On AMD64 it mostly equals, but we set it to zero if a hardware | ||
32 | * IOMMU (gart) of sotware IOMMU (swiotlb) is available. | ||
33 | */ | ||
34 | #define PCI_DMA_BUS_IS_PHYS (dma_ops->is_phys) | ||
35 | |||
36 | #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) \ | ||
37 | dma_addr_t ADDR_NAME; | ||
38 | #define DECLARE_PCI_UNMAP_LEN(LEN_NAME) \ | ||
39 | __u32 LEN_NAME; | ||
40 | #define pci_unmap_addr(PTR, ADDR_NAME) \ | ||
41 | ((PTR)->ADDR_NAME) | ||
42 | #define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) \ | ||
43 | (((PTR)->ADDR_NAME) = (VAL)) | ||
44 | #define pci_unmap_len(PTR, LEN_NAME) \ | ||
45 | ((PTR)->LEN_NAME) | ||
46 | #define pci_unmap_len_set(PTR, LEN_NAME, VAL) \ | ||
47 | (((PTR)->LEN_NAME) = (VAL)) | ||
48 | |||
49 | #endif /* __KERNEL__ */ | 27 | #endif /* __KERNEL__ */ |
50 | 28 | ||
51 | #endif /* _ASM_X86_PCI_64_H */ | 29 | #endif /* _ASM_X86_PCI_64_H */ |
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index ae85a8d66a30..fcf4d92e7e04 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h | |||
@@ -94,7 +94,7 @@ struct cpuinfo_x86 { | |||
94 | unsigned long loops_per_jiffy; | 94 | unsigned long loops_per_jiffy; |
95 | #ifdef CONFIG_SMP | 95 | #ifdef CONFIG_SMP |
96 | /* cpus sharing the last level cache: */ | 96 | /* cpus sharing the last level cache: */ |
97 | cpumask_t llc_shared_map; | 97 | cpumask_var_t llc_shared_map; |
98 | #endif | 98 | #endif |
99 | /* cpuid returned max cores value: */ | 99 | /* cpuid returned max cores value: */ |
100 | u16 x86_max_cores; | 100 | u16 x86_max_cores; |
@@ -352,6 +352,11 @@ struct i387_soft_struct { | |||
352 | u32 entry_eip; | 352 | u32 entry_eip; |
353 | }; | 353 | }; |
354 | 354 | ||
355 | struct ymmh_struct { | ||
356 | /* 16 * 16 bytes for each YMMH-reg = 256 bytes */ | ||
357 | u32 ymmh_space[64]; | ||
358 | }; | ||
359 | |||
355 | struct xsave_hdr_struct { | 360 | struct xsave_hdr_struct { |
356 | u64 xstate_bv; | 361 | u64 xstate_bv; |
357 | u64 reserved1[2]; | 362 | u64 reserved1[2]; |
@@ -361,6 +366,7 @@ struct xsave_hdr_struct { | |||
361 | struct xsave_struct { | 366 | struct xsave_struct { |
362 | struct i387_fxsave_struct i387; | 367 | struct i387_fxsave_struct i387; |
363 | struct xsave_hdr_struct xsave_hdr; | 368 | struct xsave_hdr_struct xsave_hdr; |
369 | struct ymmh_struct ymmh; | ||
364 | /* new processor state extensions will go here */ | 370 | /* new processor state extensions will go here */ |
365 | } __attribute__ ((packed, aligned (64))); | 371 | } __attribute__ ((packed, aligned (64))); |
366 | 372 | ||
@@ -736,6 +742,7 @@ static inline void __sti_mwait(unsigned long eax, unsigned long ecx) | |||
736 | extern void mwait_idle_with_hints(unsigned long eax, unsigned long ecx); | 742 | extern void mwait_idle_with_hints(unsigned long eax, unsigned long ecx); |
737 | 743 | ||
738 | extern void select_idle_routine(const struct cpuinfo_x86 *c); | 744 | extern void select_idle_routine(const struct cpuinfo_x86 *c); |
745 | extern void init_c1e_mask(void); | ||
739 | 746 | ||
740 | extern unsigned long boot_option_idle_override; | 747 | extern unsigned long boot_option_idle_override; |
741 | extern unsigned long idle_halt; | 748 | extern unsigned long idle_halt; |
diff --git a/arch/x86/include/asm/ptrace-abi.h b/arch/x86/include/asm/ptrace-abi.h index 8e0f8d199e05..86723035a515 100644 --- a/arch/x86/include/asm/ptrace-abi.h +++ b/arch/x86/include/asm/ptrace-abi.h | |||
@@ -80,8 +80,6 @@ | |||
80 | 80 | ||
81 | #define PTRACE_SINGLEBLOCK 33 /* resume execution until next branch */ | 81 | #define PTRACE_SINGLEBLOCK 33 /* resume execution until next branch */ |
82 | 82 | ||
83 | #ifdef CONFIG_X86_PTRACE_BTS | ||
84 | |||
85 | #ifndef __ASSEMBLY__ | 83 | #ifndef __ASSEMBLY__ |
86 | #include <linux/types.h> | 84 | #include <linux/types.h> |
87 | 85 | ||
@@ -140,6 +138,5 @@ struct ptrace_bts_config { | |||
140 | BTS records are read from oldest to newest. | 138 | BTS records are read from oldest to newest. |
141 | Returns number of BTS records drained. | 139 | Returns number of BTS records drained. |
142 | */ | 140 | */ |
143 | #endif /* CONFIG_X86_PTRACE_BTS */ | ||
144 | 141 | ||
145 | #endif /* _ASM_X86_PTRACE_ABI_H */ | 142 | #endif /* _ASM_X86_PTRACE_ABI_H */ |
diff --git a/arch/x86/include/asm/required-features.h b/arch/x86/include/asm/required-features.h index d5cd6c586881..a4737dddfd58 100644 --- a/arch/x86/include/asm/required-features.h +++ b/arch/x86/include/asm/required-features.h | |||
@@ -50,7 +50,7 @@ | |||
50 | #ifdef CONFIG_X86_64 | 50 | #ifdef CONFIG_X86_64 |
51 | #define NEED_PSE 0 | 51 | #define NEED_PSE 0 |
52 | #define NEED_MSR (1<<(X86_FEATURE_MSR & 31)) | 52 | #define NEED_MSR (1<<(X86_FEATURE_MSR & 31)) |
53 | #define NEED_PGE (1<<(X86_FEATURE_PGE & 31)) | 53 | #define NEED_PGE 0 |
54 | #define NEED_FXSR (1<<(X86_FEATURE_FXSR & 31)) | 54 | #define NEED_FXSR (1<<(X86_FEATURE_FXSR & 31)) |
55 | #define NEED_XMM (1<<(X86_FEATURE_XMM & 31)) | 55 | #define NEED_XMM (1<<(X86_FEATURE_XMM & 31)) |
56 | #define NEED_XMM2 (1<<(X86_FEATURE_XMM2 & 31)) | 56 | #define NEED_XMM2 (1<<(X86_FEATURE_XMM2 & 31)) |
diff --git a/arch/x86/include/asm/setup.h b/arch/x86/include/asm/setup.h index fbf0521eeed8..bdc2ada05ae0 100644 --- a/arch/x86/include/asm/setup.h +++ b/arch/x86/include/asm/setup.h | |||
@@ -64,7 +64,7 @@ extern void x86_quirk_time_init(void); | |||
64 | #include <asm/bootparam.h> | 64 | #include <asm/bootparam.h> |
65 | 65 | ||
66 | /* Interrupt control for vSMPowered x86_64 systems */ | 66 | /* Interrupt control for vSMPowered x86_64 systems */ |
67 | #ifdef CONFIG_X86_VSMP | 67 | #ifdef CONFIG_X86_64 |
68 | void vsmp_init(void); | 68 | void vsmp_init(void); |
69 | #else | 69 | #else |
70 | static inline void vsmp_init(void) { } | 70 | static inline void vsmp_init(void) { } |
diff --git a/arch/x86/include/asm/sigcontext.h b/arch/x86/include/asm/sigcontext.h index ec666491aaa4..72e5a4491661 100644 --- a/arch/x86/include/asm/sigcontext.h +++ b/arch/x86/include/asm/sigcontext.h | |||
@@ -269,6 +269,11 @@ struct _xsave_hdr { | |||
269 | __u64 reserved2[5]; | 269 | __u64 reserved2[5]; |
270 | }; | 270 | }; |
271 | 271 | ||
272 | struct _ymmh_state { | ||
273 | /* 16 * 16 bytes for each YMMH-reg */ | ||
274 | __u32 ymmh_space[64]; | ||
275 | }; | ||
276 | |||
272 | /* | 277 | /* |
273 | * Extended state pointed by the fpstate pointer in the sigcontext. | 278 | * Extended state pointed by the fpstate pointer in the sigcontext. |
274 | * In addition to the fpstate, information encoded in the xstate_hdr | 279 | * In addition to the fpstate, information encoded in the xstate_hdr |
@@ -278,6 +283,7 @@ struct _xsave_hdr { | |||
278 | struct _xstate { | 283 | struct _xstate { |
279 | struct _fpstate fpstate; | 284 | struct _fpstate fpstate; |
280 | struct _xsave_hdr xstate_hdr; | 285 | struct _xsave_hdr xstate_hdr; |
286 | struct _ymmh_state ymmh; | ||
281 | /* new processor state extensions go here */ | 287 | /* new processor state extensions go here */ |
282 | }; | 288 | }; |
283 | 289 | ||
diff --git a/arch/x86/include/asm/smp.h b/arch/x86/include/asm/smp.h index 47d0e21f2b9e..19e0d88b966d 100644 --- a/arch/x86/include/asm/smp.h +++ b/arch/x86/include/asm/smp.h | |||
@@ -21,19 +21,19 @@ | |||
21 | extern int smp_num_siblings; | 21 | extern int smp_num_siblings; |
22 | extern unsigned int num_processors; | 22 | extern unsigned int num_processors; |
23 | 23 | ||
24 | DECLARE_PER_CPU(cpumask_t, cpu_sibling_map); | 24 | DECLARE_PER_CPU(cpumask_var_t, cpu_sibling_map); |
25 | DECLARE_PER_CPU(cpumask_t, cpu_core_map); | 25 | DECLARE_PER_CPU(cpumask_var_t, cpu_core_map); |
26 | DECLARE_PER_CPU(u16, cpu_llc_id); | 26 | DECLARE_PER_CPU(u16, cpu_llc_id); |
27 | DECLARE_PER_CPU(int, cpu_number); | 27 | DECLARE_PER_CPU(int, cpu_number); |
28 | 28 | ||
29 | static inline struct cpumask *cpu_sibling_mask(int cpu) | 29 | static inline struct cpumask *cpu_sibling_mask(int cpu) |
30 | { | 30 | { |
31 | return &per_cpu(cpu_sibling_map, cpu); | 31 | return per_cpu(cpu_sibling_map, cpu); |
32 | } | 32 | } |
33 | 33 | ||
34 | static inline struct cpumask *cpu_core_mask(int cpu) | 34 | static inline struct cpumask *cpu_core_mask(int cpu) |
35 | { | 35 | { |
36 | return &per_cpu(cpu_core_map, cpu); | 36 | return per_cpu(cpu_core_map, cpu); |
37 | } | 37 | } |
38 | 38 | ||
39 | DECLARE_EARLY_PER_CPU(u16, x86_cpu_to_apicid); | 39 | DECLARE_EARLY_PER_CPU(u16, x86_cpu_to_apicid); |
@@ -121,9 +121,10 @@ static inline void arch_send_call_function_single_ipi(int cpu) | |||
121 | smp_ops.send_call_func_single_ipi(cpu); | 121 | smp_ops.send_call_func_single_ipi(cpu); |
122 | } | 122 | } |
123 | 123 | ||
124 | static inline void arch_send_call_function_ipi(cpumask_t mask) | 124 | #define arch_send_call_function_ipi_mask arch_send_call_function_ipi_mask |
125 | static inline void arch_send_call_function_ipi_mask(const struct cpumask *mask) | ||
125 | { | 126 | { |
126 | smp_ops.send_call_func_ipi(&mask); | 127 | smp_ops.send_call_func_ipi(mask); |
127 | } | 128 | } |
128 | 129 | ||
129 | void cpu_disable_common(void); | 130 | void cpu_disable_common(void); |
diff --git a/arch/x86/include/asm/socket.h b/arch/x86/include/asm/socket.h index 8ab9cc8b2ecc..ca8bf2cd0ba9 100644 --- a/arch/x86/include/asm/socket.h +++ b/arch/x86/include/asm/socket.h | |||
@@ -54,4 +54,7 @@ | |||
54 | 54 | ||
55 | #define SO_MARK 36 | 55 | #define SO_MARK 36 |
56 | 56 | ||
57 | #define SO_TIMESTAMPING 37 | ||
58 | #define SCM_TIMESTAMPING SO_TIMESTAMPING | ||
59 | |||
57 | #endif /* _ASM_X86_SOCKET_H */ | 60 | #endif /* _ASM_X86_SOCKET_H */ |
diff --git a/arch/x86/include/asm/spinlock.h b/arch/x86/include/asm/spinlock.h index 3a5696656680..e5e6caffec87 100644 --- a/arch/x86/include/asm/spinlock.h +++ b/arch/x86/include/asm/spinlock.h | |||
@@ -295,6 +295,9 @@ static inline void __raw_write_unlock(raw_rwlock_t *rw) | |||
295 | : "+m" (rw->lock) : "i" (RW_LOCK_BIAS) : "memory"); | 295 | : "+m" (rw->lock) : "i" (RW_LOCK_BIAS) : "memory"); |
296 | } | 296 | } |
297 | 297 | ||
298 | #define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock) | ||
299 | #define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock) | ||
300 | |||
298 | #define _raw_spin_relax(lock) cpu_relax() | 301 | #define _raw_spin_relax(lock) cpu_relax() |
299 | #define _raw_read_relax(lock) cpu_relax() | 302 | #define _raw_read_relax(lock) cpu_relax() |
300 | #define _raw_write_relax(lock) cpu_relax() | 303 | #define _raw_write_relax(lock) cpu_relax() |
diff --git a/arch/x86/include/asm/suspend_32.h b/arch/x86/include/asm/suspend_32.h index a5074bd0f8be..48dcfa62ea07 100644 --- a/arch/x86/include/asm/suspend_32.h +++ b/arch/x86/include/asm/suspend_32.h | |||
@@ -24,28 +24,4 @@ struct saved_context { | |||
24 | unsigned long return_address; | 24 | unsigned long return_address; |
25 | } __attribute__((packed)); | 25 | } __attribute__((packed)); |
26 | 26 | ||
27 | #ifdef CONFIG_ACPI | ||
28 | extern unsigned long saved_eip; | ||
29 | extern unsigned long saved_esp; | ||
30 | extern unsigned long saved_ebp; | ||
31 | extern unsigned long saved_ebx; | ||
32 | extern unsigned long saved_esi; | ||
33 | extern unsigned long saved_edi; | ||
34 | |||
35 | static inline void acpi_save_register_state(unsigned long return_point) | ||
36 | { | ||
37 | saved_eip = return_point; | ||
38 | asm volatile("movl %%esp,%0" : "=m" (saved_esp)); | ||
39 | asm volatile("movl %%ebp,%0" : "=m" (saved_ebp)); | ||
40 | asm volatile("movl %%ebx,%0" : "=m" (saved_ebx)); | ||
41 | asm volatile("movl %%edi,%0" : "=m" (saved_edi)); | ||
42 | asm volatile("movl %%esi,%0" : "=m" (saved_esi)); | ||
43 | } | ||
44 | |||
45 | #define acpi_restore_register_state() do {} while (0) | ||
46 | |||
47 | /* routines for saving/restoring kernel state */ | ||
48 | extern int acpi_save_state_mem(void); | ||
49 | #endif | ||
50 | |||
51 | #endif /* _ASM_X86_SUSPEND_32_H */ | 27 | #endif /* _ASM_X86_SUSPEND_32_H */ |
diff --git a/arch/x86/include/asm/svm.h b/arch/x86/include/asm/svm.h index 1b8afa78e869..82ada75f3ebf 100644 --- a/arch/x86/include/asm/svm.h +++ b/arch/x86/include/asm/svm.h | |||
@@ -174,10 +174,6 @@ struct __attribute__ ((__packed__)) vmcb { | |||
174 | #define SVM_CPUID_FEATURE_SHIFT 2 | 174 | #define SVM_CPUID_FEATURE_SHIFT 2 |
175 | #define SVM_CPUID_FUNC 0x8000000a | 175 | #define SVM_CPUID_FUNC 0x8000000a |
176 | 176 | ||
177 | #define MSR_EFER_SVME_MASK (1ULL << 12) | ||
178 | #define MSR_VM_CR 0xc0010114 | ||
179 | #define MSR_VM_HSAVE_PA 0xc0010117ULL | ||
180 | |||
181 | #define SVM_VM_CR_SVM_DISABLE 4 | 177 | #define SVM_VM_CR_SVM_DISABLE 4 |
182 | 178 | ||
183 | #define SVM_SELECTOR_S_SHIFT 4 | 179 | #define SVM_SELECTOR_S_SHIFT 4 |
diff --git a/arch/x86/include/asm/sys_ia32.h b/arch/x86/include/asm/sys_ia32.h index ffb08be2a530..72a6dcd1299b 100644 --- a/arch/x86/include/asm/sys_ia32.h +++ b/arch/x86/include/asm/sys_ia32.h | |||
@@ -70,8 +70,6 @@ struct old_utsname; | |||
70 | asmlinkage long sys32_olduname(struct oldold_utsname __user *); | 70 | asmlinkage long sys32_olduname(struct oldold_utsname __user *); |
71 | long sys32_uname(struct old_utsname __user *); | 71 | long sys32_uname(struct old_utsname __user *); |
72 | 72 | ||
73 | long sys32_ustat(unsigned, struct ustat32 __user *); | ||
74 | |||
75 | asmlinkage long sys32_execve(char __user *, compat_uptr_t __user *, | 73 | asmlinkage long sys32_execve(char __user *, compat_uptr_t __user *, |
76 | compat_uptr_t __user *, struct pt_regs *); | 74 | compat_uptr_t __user *, struct pt_regs *); |
77 | asmlinkage long sys32_clone(unsigned int, unsigned int, struct pt_regs *); | 75 | asmlinkage long sys32_clone(unsigned int, unsigned int, struct pt_regs *); |
diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thread_info.h index df9d5f78385e..8820a73ae090 100644 --- a/arch/x86/include/asm/thread_info.h +++ b/arch/x86/include/asm/thread_info.h | |||
@@ -94,6 +94,7 @@ struct thread_info { | |||
94 | #define TIF_FORCED_TF 24 /* true if TF in eflags artificially */ | 94 | #define TIF_FORCED_TF 24 /* true if TF in eflags artificially */ |
95 | #define TIF_DEBUGCTLMSR 25 /* uses thread_struct.debugctlmsr */ | 95 | #define TIF_DEBUGCTLMSR 25 /* uses thread_struct.debugctlmsr */ |
96 | #define TIF_DS_AREA_MSR 26 /* uses thread_struct.ds_area_msr */ | 96 | #define TIF_DS_AREA_MSR 26 /* uses thread_struct.ds_area_msr */ |
97 | #define TIF_SYSCALL_FTRACE 27 /* for ftrace syscall instrumentation */ | ||
97 | 98 | ||
98 | #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) | 99 | #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) |
99 | #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) | 100 | #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) |
@@ -115,15 +116,17 @@ struct thread_info { | |||
115 | #define _TIF_FORCED_TF (1 << TIF_FORCED_TF) | 116 | #define _TIF_FORCED_TF (1 << TIF_FORCED_TF) |
116 | #define _TIF_DEBUGCTLMSR (1 << TIF_DEBUGCTLMSR) | 117 | #define _TIF_DEBUGCTLMSR (1 << TIF_DEBUGCTLMSR) |
117 | #define _TIF_DS_AREA_MSR (1 << TIF_DS_AREA_MSR) | 118 | #define _TIF_DS_AREA_MSR (1 << TIF_DS_AREA_MSR) |
119 | #define _TIF_SYSCALL_FTRACE (1 << TIF_SYSCALL_FTRACE) | ||
118 | 120 | ||
119 | /* work to do in syscall_trace_enter() */ | 121 | /* work to do in syscall_trace_enter() */ |
120 | #define _TIF_WORK_SYSCALL_ENTRY \ | 122 | #define _TIF_WORK_SYSCALL_ENTRY \ |
121 | (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_EMU | \ | 123 | (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_EMU | _TIF_SYSCALL_FTRACE | \ |
122 | _TIF_SYSCALL_AUDIT | _TIF_SECCOMP | _TIF_SINGLESTEP) | 124 | _TIF_SYSCALL_AUDIT | _TIF_SECCOMP | _TIF_SINGLESTEP) |
123 | 125 | ||
124 | /* work to do in syscall_trace_leave() */ | 126 | /* work to do in syscall_trace_leave() */ |
125 | #define _TIF_WORK_SYSCALL_EXIT \ | 127 | #define _TIF_WORK_SYSCALL_EXIT \ |
126 | (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | _TIF_SINGLESTEP) | 128 | (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | _TIF_SINGLESTEP | \ |
129 | _TIF_SYSCALL_FTRACE) | ||
127 | 130 | ||
128 | /* work to do on interrupt/exception return */ | 131 | /* work to do on interrupt/exception return */ |
129 | #define _TIF_WORK_MASK \ | 132 | #define _TIF_WORK_MASK \ |
@@ -132,7 +135,7 @@ struct thread_info { | |||
132 | _TIF_SINGLESTEP|_TIF_SECCOMP|_TIF_SYSCALL_EMU)) | 135 | _TIF_SINGLESTEP|_TIF_SECCOMP|_TIF_SYSCALL_EMU)) |
133 | 136 | ||
134 | /* work to do on any return to user space */ | 137 | /* work to do on any return to user space */ |
135 | #define _TIF_ALLWORK_MASK (0x0000FFFF & ~_TIF_SECCOMP) | 138 | #define _TIF_ALLWORK_MASK ((0x0000FFFF & ~_TIF_SECCOMP) | _TIF_SYSCALL_FTRACE) |
136 | 139 | ||
137 | /* Only used for 64 bit */ | 140 | /* Only used for 64 bit */ |
138 | #define _TIF_DO_NOTIFY_MASK \ | 141 | #define _TIF_DO_NOTIFY_MASK \ |
diff --git a/arch/x86/include/asm/timer.h b/arch/x86/include/asm/timer.h index a81195eaa2b3..bd37ed444a21 100644 --- a/arch/x86/include/asm/timer.h +++ b/arch/x86/include/asm/timer.h | |||
@@ -12,9 +12,9 @@ unsigned long native_calibrate_tsc(void); | |||
12 | 12 | ||
13 | #ifdef CONFIG_X86_32 | 13 | #ifdef CONFIG_X86_32 |
14 | extern int timer_ack; | 14 | extern int timer_ack; |
15 | extern int recalibrate_cpu_khz(void); | ||
16 | extern irqreturn_t timer_interrupt(int irq, void *dev_id); | 15 | extern irqreturn_t timer_interrupt(int irq, void *dev_id); |
17 | #endif /* CONFIG_X86_32 */ | 16 | #endif /* CONFIG_X86_32 */ |
17 | extern int recalibrate_cpu_khz(void); | ||
18 | 18 | ||
19 | extern int no_timer_check; | 19 | extern int no_timer_check; |
20 | 20 | ||
diff --git a/arch/x86/include/asm/topology.h b/arch/x86/include/asm/topology.h index 77cfb2cfb386..892b119dba6f 100644 --- a/arch/x86/include/asm/topology.h +++ b/arch/x86/include/asm/topology.h | |||
@@ -44,9 +44,6 @@ | |||
44 | 44 | ||
45 | #ifdef CONFIG_X86_32 | 45 | #ifdef CONFIG_X86_32 |
46 | 46 | ||
47 | /* Mappings between node number and cpus on that node. */ | ||
48 | extern cpumask_t node_to_cpumask_map[]; | ||
49 | |||
50 | /* Mappings between logical cpu number and node number */ | 47 | /* Mappings between logical cpu number and node number */ |
51 | extern int cpu_to_node_map[]; | 48 | extern int cpu_to_node_map[]; |
52 | 49 | ||
@@ -57,30 +54,8 @@ static inline int cpu_to_node(int cpu) | |||
57 | } | 54 | } |
58 | #define early_cpu_to_node(cpu) cpu_to_node(cpu) | 55 | #define early_cpu_to_node(cpu) cpu_to_node(cpu) |
59 | 56 | ||
60 | /* Returns a bitmask of CPUs on Node 'node'. | ||
61 | * | ||
62 | * Side note: this function creates the returned cpumask on the stack | ||
63 | * so with a high NR_CPUS count, excessive stack space is used. The | ||
64 | * cpumask_of_node function should be used whenever possible. | ||
65 | */ | ||
66 | static inline cpumask_t node_to_cpumask(int node) | ||
67 | { | ||
68 | return node_to_cpumask_map[node]; | ||
69 | } | ||
70 | |||
71 | /* Returns a bitmask of CPUs on Node 'node'. */ | ||
72 | static inline const struct cpumask *cpumask_of_node(int node) | ||
73 | { | ||
74 | return &node_to_cpumask_map[node]; | ||
75 | } | ||
76 | |||
77 | static inline void setup_node_to_cpumask_map(void) { } | ||
78 | |||
79 | #else /* CONFIG_X86_64 */ | 57 | #else /* CONFIG_X86_64 */ |
80 | 58 | ||
81 | /* Mappings between node number and cpus on that node. */ | ||
82 | extern cpumask_t *node_to_cpumask_map; | ||
83 | |||
84 | /* Mappings between logical cpu number and node number */ | 59 | /* Mappings between logical cpu number and node number */ |
85 | DECLARE_EARLY_PER_CPU(int, x86_cpu_to_node_map); | 60 | DECLARE_EARLY_PER_CPU(int, x86_cpu_to_node_map); |
86 | 61 | ||
@@ -91,8 +66,6 @@ DECLARE_PER_CPU(int, node_number); | |||
91 | #ifdef CONFIG_DEBUG_PER_CPU_MAPS | 66 | #ifdef CONFIG_DEBUG_PER_CPU_MAPS |
92 | extern int cpu_to_node(int cpu); | 67 | extern int cpu_to_node(int cpu); |
93 | extern int early_cpu_to_node(int cpu); | 68 | extern int early_cpu_to_node(int cpu); |
94 | extern const cpumask_t *cpumask_of_node(int node); | ||
95 | extern cpumask_t node_to_cpumask(int node); | ||
96 | 69 | ||
97 | #else /* !CONFIG_DEBUG_PER_CPU_MAPS */ | 70 | #else /* !CONFIG_DEBUG_PER_CPU_MAPS */ |
98 | 71 | ||
@@ -108,42 +81,32 @@ static inline int early_cpu_to_node(int cpu) | |||
108 | return early_per_cpu(x86_cpu_to_node_map, cpu); | 81 | return early_per_cpu(x86_cpu_to_node_map, cpu); |
109 | } | 82 | } |
110 | 83 | ||
111 | /* Returns a pointer to the cpumask of CPUs on Node 'node'. */ | 84 | #endif /* !CONFIG_DEBUG_PER_CPU_MAPS */ |
112 | static inline const cpumask_t *cpumask_of_node(int node) | 85 | |
113 | { | 86 | #endif /* CONFIG_X86_64 */ |
114 | return &node_to_cpumask_map[node]; | ||
115 | } | ||
116 | 87 | ||
117 | /* Returns a bitmask of CPUs on Node 'node'. */ | 88 | /* Mappings between node number and cpus on that node. */ |
118 | static inline cpumask_t node_to_cpumask(int node) | 89 | extern cpumask_var_t node_to_cpumask_map[MAX_NUMNODES]; |
90 | |||
91 | #ifdef CONFIG_DEBUG_PER_CPU_MAPS | ||
92 | extern const struct cpumask *cpumask_of_node(int node); | ||
93 | #else | ||
94 | /* Returns a pointer to the cpumask of CPUs on Node 'node'. */ | ||
95 | static inline const struct cpumask *cpumask_of_node(int node) | ||
119 | { | 96 | { |
120 | return node_to_cpumask_map[node]; | 97 | return node_to_cpumask_map[node]; |
121 | } | 98 | } |
122 | 99 | #endif | |
123 | #endif /* !CONFIG_DEBUG_PER_CPU_MAPS */ | ||
124 | 100 | ||
125 | extern void setup_node_to_cpumask_map(void); | 101 | extern void setup_node_to_cpumask_map(void); |
126 | 102 | ||
127 | /* | 103 | /* |
128 | * Replace default node_to_cpumask_ptr with optimized version | ||
129 | * Deprecated: use "const struct cpumask *mask = cpumask_of_node(node)" | ||
130 | */ | ||
131 | #define node_to_cpumask_ptr(v, node) \ | ||
132 | const cpumask_t *v = cpumask_of_node(node) | ||
133 | |||
134 | #define node_to_cpumask_ptr_next(v, node) \ | ||
135 | v = cpumask_of_node(node) | ||
136 | |||
137 | #endif /* CONFIG_X86_64 */ | ||
138 | |||
139 | /* | ||
140 | * Returns the number of the node containing Node 'node'. This | 104 | * Returns the number of the node containing Node 'node'. This |
141 | * architecture is flat, so it is a pretty simple function! | 105 | * architecture is flat, so it is a pretty simple function! |
142 | */ | 106 | */ |
143 | #define parent_node(node) (node) | 107 | #define parent_node(node) (node) |
144 | 108 | ||
145 | #define pcibus_to_node(bus) __pcibus_to_node(bus) | 109 | #define pcibus_to_node(bus) __pcibus_to_node(bus) |
146 | #define pcibus_to_cpumask(bus) __pcibus_to_cpumask(bus) | ||
147 | 110 | ||
148 | #ifdef CONFIG_X86_32 | 111 | #ifdef CONFIG_X86_32 |
149 | extern unsigned long node_start_pfn[]; | 112 | extern unsigned long node_start_pfn[]; |
@@ -209,52 +172,24 @@ static inline int early_cpu_to_node(int cpu) | |||
209 | return 0; | 172 | return 0; |
210 | } | 173 | } |
211 | 174 | ||
212 | static inline const cpumask_t *cpumask_of_node(int node) | 175 | static inline const struct cpumask *cpumask_of_node(int node) |
213 | { | ||
214 | return &cpu_online_map; | ||
215 | } | ||
216 | static inline cpumask_t node_to_cpumask(int node) | ||
217 | { | ||
218 | return cpu_online_map; | ||
219 | } | ||
220 | static inline int node_to_first_cpu(int node) | ||
221 | { | 176 | { |
222 | return first_cpu(cpu_online_map); | 177 | return cpu_online_mask; |
223 | } | 178 | } |
224 | 179 | ||
225 | static inline void setup_node_to_cpumask_map(void) { } | 180 | static inline void setup_node_to_cpumask_map(void) { } |
226 | 181 | ||
227 | /* | ||
228 | * Replace default node_to_cpumask_ptr with optimized version | ||
229 | * Deprecated: use "const struct cpumask *mask = cpumask_of_node(node)" | ||
230 | */ | ||
231 | #define node_to_cpumask_ptr(v, node) \ | ||
232 | const cpumask_t *v = cpumask_of_node(node) | ||
233 | |||
234 | #define node_to_cpumask_ptr_next(v, node) \ | ||
235 | v = cpumask_of_node(node) | ||
236 | #endif | 182 | #endif |
237 | 183 | ||
238 | #include <asm-generic/topology.h> | 184 | #include <asm-generic/topology.h> |
239 | 185 | ||
240 | #ifdef CONFIG_NUMA | ||
241 | /* Returns the number of the first CPU on Node 'node'. */ | ||
242 | static inline int node_to_first_cpu(int node) | ||
243 | { | ||
244 | return cpumask_first(cpumask_of_node(node)); | ||
245 | } | ||
246 | #endif | ||
247 | |||
248 | extern cpumask_t cpu_coregroup_map(int cpu); | ||
249 | extern const struct cpumask *cpu_coregroup_mask(int cpu); | 186 | extern const struct cpumask *cpu_coregroup_mask(int cpu); |
250 | 187 | ||
251 | #ifdef ENABLE_TOPO_DEFINES | 188 | #ifdef ENABLE_TOPO_DEFINES |
252 | #define topology_physical_package_id(cpu) (cpu_data(cpu).phys_proc_id) | 189 | #define topology_physical_package_id(cpu) (cpu_data(cpu).phys_proc_id) |
253 | #define topology_core_id(cpu) (cpu_data(cpu).cpu_core_id) | 190 | #define topology_core_id(cpu) (cpu_data(cpu).cpu_core_id) |
254 | #define topology_core_siblings(cpu) (per_cpu(cpu_core_map, cpu)) | 191 | #define topology_core_cpumask(cpu) (per_cpu(cpu_core_map, cpu)) |
255 | #define topology_thread_siblings(cpu) (per_cpu(cpu_sibling_map, cpu)) | 192 | #define topology_thread_cpumask(cpu) (per_cpu(cpu_sibling_map, cpu)) |
256 | #define topology_core_cpumask(cpu) (&per_cpu(cpu_core_map, cpu)) | ||
257 | #define topology_thread_cpumask(cpu) (&per_cpu(cpu_sibling_map, cpu)) | ||
258 | 193 | ||
259 | /* indicates that pointers to the topology cpumask_t maps are valid */ | 194 | /* indicates that pointers to the topology cpumask_t maps are valid */ |
260 | #define arch_provides_topology_pointers yes | 195 | #define arch_provides_topology_pointers yes |
@@ -268,7 +203,7 @@ struct pci_bus; | |||
268 | void set_pci_bus_resources_arch_default(struct pci_bus *b); | 203 | void set_pci_bus_resources_arch_default(struct pci_bus *b); |
269 | 204 | ||
270 | #ifdef CONFIG_SMP | 205 | #ifdef CONFIG_SMP |
271 | #define mc_capable() (cpus_weight(per_cpu(cpu_core_map, 0)) != nr_cpu_ids) | 206 | #define mc_capable() (cpumask_weight(cpu_core_mask(0)) != nr_cpu_ids) |
272 | #define smt_capable() (smp_num_siblings > 1) | 207 | #define smt_capable() (smp_num_siblings > 1) |
273 | #endif | 208 | #endif |
274 | 209 | ||
diff --git a/arch/x86/include/asm/unistd_32.h b/arch/x86/include/asm/unistd_32.h index f2bba78430a4..6e72d74cf8dc 100644 --- a/arch/x86/include/asm/unistd_32.h +++ b/arch/x86/include/asm/unistd_32.h | |||
@@ -338,6 +338,8 @@ | |||
338 | #define __NR_dup3 330 | 338 | #define __NR_dup3 330 |
339 | #define __NR_pipe2 331 | 339 | #define __NR_pipe2 331 |
340 | #define __NR_inotify_init1 332 | 340 | #define __NR_inotify_init1 332 |
341 | #define __NR_preadv 333 | ||
342 | #define __NR_pwritev 334 | ||
341 | 343 | ||
342 | #ifdef __KERNEL__ | 344 | #ifdef __KERNEL__ |
343 | 345 | ||
diff --git a/arch/x86/include/asm/unistd_64.h b/arch/x86/include/asm/unistd_64.h index d2e415e6666f..f81829462325 100644 --- a/arch/x86/include/asm/unistd_64.h +++ b/arch/x86/include/asm/unistd_64.h | |||
@@ -653,6 +653,10 @@ __SYSCALL(__NR_dup3, sys_dup3) | |||
653 | __SYSCALL(__NR_pipe2, sys_pipe2) | 653 | __SYSCALL(__NR_pipe2, sys_pipe2) |
654 | #define __NR_inotify_init1 294 | 654 | #define __NR_inotify_init1 294 |
655 | __SYSCALL(__NR_inotify_init1, sys_inotify_init1) | 655 | __SYSCALL(__NR_inotify_init1, sys_inotify_init1) |
656 | #define __NR_preadv 295 | ||
657 | __SYSCALL(__NR_preadv, sys_preadv) | ||
658 | #define __NR_pwritev 296 | ||
659 | __SYSCALL(__NR_pwritev, sys_pwritev) | ||
656 | 660 | ||
657 | 661 | ||
658 | #ifndef __NO_STUBS | 662 | #ifndef __NO_STUBS |
diff --git a/arch/x86/include/asm/uv/uv_hub.h b/arch/x86/include/asm/uv/uv_hub.h index 9f4dfba33b28..d3a98ea1062e 100644 --- a/arch/x86/include/asm/uv/uv_hub.h +++ b/arch/x86/include/asm/uv/uv_hub.h | |||
@@ -11,11 +11,13 @@ | |||
11 | #ifndef _ASM_X86_UV_UV_HUB_H | 11 | #ifndef _ASM_X86_UV_UV_HUB_H |
12 | #define _ASM_X86_UV_UV_HUB_H | 12 | #define _ASM_X86_UV_UV_HUB_H |
13 | 13 | ||
14 | #ifdef CONFIG_X86_64 | ||
14 | #include <linux/numa.h> | 15 | #include <linux/numa.h> |
15 | #include <linux/percpu.h> | 16 | #include <linux/percpu.h> |
16 | #include <linux/timer.h> | 17 | #include <linux/timer.h> |
17 | #include <asm/types.h> | 18 | #include <asm/types.h> |
18 | #include <asm/percpu.h> | 19 | #include <asm/percpu.h> |
20 | #include <asm/uv/uv_mmrs.h> | ||
19 | 21 | ||
20 | 22 | ||
21 | /* | 23 | /* |
@@ -397,6 +399,7 @@ static inline void uv_set_scir_bits(unsigned char value) | |||
397 | uv_write_local_mmr8(uv_hub_info->scir.offset, value); | 399 | uv_write_local_mmr8(uv_hub_info->scir.offset, value); |
398 | } | 400 | } |
399 | } | 401 | } |
402 | |||
400 | static inline void uv_set_cpu_scir_bits(int cpu, unsigned char value) | 403 | static inline void uv_set_cpu_scir_bits(int cpu, unsigned char value) |
401 | { | 404 | { |
402 | if (uv_cpu_hub_info(cpu)->scir.state != value) { | 405 | if (uv_cpu_hub_info(cpu)->scir.state != value) { |
@@ -405,4 +408,15 @@ static inline void uv_set_cpu_scir_bits(int cpu, unsigned char value) | |||
405 | } | 408 | } |
406 | } | 409 | } |
407 | 410 | ||
411 | static inline void uv_hub_send_ipi(int pnode, int apicid, int vector) | ||
412 | { | ||
413 | unsigned long val; | ||
414 | |||
415 | val = (1UL << UVH_IPI_INT_SEND_SHFT) | | ||
416 | ((apicid & 0x3f) << UVH_IPI_INT_APIC_ID_SHFT) | | ||
417 | (vector << UVH_IPI_INT_VECTOR_SHFT); | ||
418 | uv_write_global_mmr64(pnode, UVH_IPI_INT, val); | ||
419 | } | ||
420 | |||
421 | #endif /* CONFIG_X86_64 */ | ||
408 | #endif /* _ASM_X86_UV_UV_HUB_H */ | 422 | #endif /* _ASM_X86_UV_UV_HUB_H */ |
diff --git a/arch/x86/include/asm/uv/uv_mmrs.h b/arch/x86/include/asm/uv/uv_mmrs.h index dd627793a234..2cae46c7c8a2 100644 --- a/arch/x86/include/asm/uv/uv_mmrs.h +++ b/arch/x86/include/asm/uv/uv_mmrs.h | |||
@@ -1,3 +1,4 @@ | |||
1 | |||
1 | /* | 2 | /* |
2 | * This file is subject to the terms and conditions of the GNU General Public | 3 | * This file is subject to the terms and conditions of the GNU General Public |
3 | * License. See the file "COPYING" in the main directory of this archive | 4 | * License. See the file "COPYING" in the main directory of this archive |
@@ -16,6 +17,11 @@ | |||
16 | /* ========================================================================= */ | 17 | /* ========================================================================= */ |
17 | /* UVH_BAU_DATA_CONFIG */ | 18 | /* UVH_BAU_DATA_CONFIG */ |
18 | /* ========================================================================= */ | 19 | /* ========================================================================= */ |
20 | #define UVH_LB_BAU_MISC_CONTROL 0x320170UL | ||
21 | #define UV_ENABLE_INTD_SOFT_ACK_MODE_SHIFT 15 | ||
22 | #define UV_INTD_SOFT_ACK_TIMEOUT_PERIOD_SHIFT 16 | ||
23 | #define UV_INTD_SOFT_ACK_TIMEOUT_PERIOD 0x000000000bUL | ||
24 | /* 1011 timebase 7 (168millisec) * 3 ticks -> 500ms */ | ||
19 | #define UVH_BAU_DATA_CONFIG 0x61680UL | 25 | #define UVH_BAU_DATA_CONFIG 0x61680UL |
20 | #define UVH_BAU_DATA_CONFIG_32 0x0438 | 26 | #define UVH_BAU_DATA_CONFIG_32 0x0438 |
21 | 27 | ||
@@ -243,6 +249,158 @@ union uvh_event_occurred0_u { | |||
243 | #define UVH_EVENT_OCCURRED0_ALIAS_32 0x005f0 | 249 | #define UVH_EVENT_OCCURRED0_ALIAS_32 0x005f0 |
244 | 250 | ||
245 | /* ========================================================================= */ | 251 | /* ========================================================================= */ |
252 | /* UVH_GR0_TLB_INT0_CONFIG */ | ||
253 | /* ========================================================================= */ | ||
254 | #define UVH_GR0_TLB_INT0_CONFIG 0x61b00UL | ||
255 | |||
256 | #define UVH_GR0_TLB_INT0_CONFIG_VECTOR_SHFT 0 | ||
257 | #define UVH_GR0_TLB_INT0_CONFIG_VECTOR_MASK 0x00000000000000ffUL | ||
258 | #define UVH_GR0_TLB_INT0_CONFIG_DM_SHFT 8 | ||
259 | #define UVH_GR0_TLB_INT0_CONFIG_DM_MASK 0x0000000000000700UL | ||
260 | #define UVH_GR0_TLB_INT0_CONFIG_DESTMODE_SHFT 11 | ||
261 | #define UVH_GR0_TLB_INT0_CONFIG_DESTMODE_MASK 0x0000000000000800UL | ||
262 | #define UVH_GR0_TLB_INT0_CONFIG_STATUS_SHFT 12 | ||
263 | #define UVH_GR0_TLB_INT0_CONFIG_STATUS_MASK 0x0000000000001000UL | ||
264 | #define UVH_GR0_TLB_INT0_CONFIG_P_SHFT 13 | ||
265 | #define UVH_GR0_TLB_INT0_CONFIG_P_MASK 0x0000000000002000UL | ||
266 | #define UVH_GR0_TLB_INT0_CONFIG_T_SHFT 15 | ||
267 | #define UVH_GR0_TLB_INT0_CONFIG_T_MASK 0x0000000000008000UL | ||
268 | #define UVH_GR0_TLB_INT0_CONFIG_M_SHFT 16 | ||
269 | #define UVH_GR0_TLB_INT0_CONFIG_M_MASK 0x0000000000010000UL | ||
270 | #define UVH_GR0_TLB_INT0_CONFIG_APIC_ID_SHFT 32 | ||
271 | #define UVH_GR0_TLB_INT0_CONFIG_APIC_ID_MASK 0xffffffff00000000UL | ||
272 | |||
273 | union uvh_gr0_tlb_int0_config_u { | ||
274 | unsigned long v; | ||
275 | struct uvh_gr0_tlb_int0_config_s { | ||
276 | unsigned long vector_ : 8; /* RW */ | ||
277 | unsigned long dm : 3; /* RW */ | ||
278 | unsigned long destmode : 1; /* RW */ | ||
279 | unsigned long status : 1; /* RO */ | ||
280 | unsigned long p : 1; /* RO */ | ||
281 | unsigned long rsvd_14 : 1; /* */ | ||
282 | unsigned long t : 1; /* RO */ | ||
283 | unsigned long m : 1; /* RW */ | ||
284 | unsigned long rsvd_17_31: 15; /* */ | ||
285 | unsigned long apic_id : 32; /* RW */ | ||
286 | } s; | ||
287 | }; | ||
288 | |||
289 | /* ========================================================================= */ | ||
290 | /* UVH_GR0_TLB_INT1_CONFIG */ | ||
291 | /* ========================================================================= */ | ||
292 | #define UVH_GR0_TLB_INT1_CONFIG 0x61b40UL | ||
293 | |||
294 | #define UVH_GR0_TLB_INT1_CONFIG_VECTOR_SHFT 0 | ||
295 | #define UVH_GR0_TLB_INT1_CONFIG_VECTOR_MASK 0x00000000000000ffUL | ||
296 | #define UVH_GR0_TLB_INT1_CONFIG_DM_SHFT 8 | ||
297 | #define UVH_GR0_TLB_INT1_CONFIG_DM_MASK 0x0000000000000700UL | ||
298 | #define UVH_GR0_TLB_INT1_CONFIG_DESTMODE_SHFT 11 | ||
299 | #define UVH_GR0_TLB_INT1_CONFIG_DESTMODE_MASK 0x0000000000000800UL | ||
300 | #define UVH_GR0_TLB_INT1_CONFIG_STATUS_SHFT 12 | ||
301 | #define UVH_GR0_TLB_INT1_CONFIG_STATUS_MASK 0x0000000000001000UL | ||
302 | #define UVH_GR0_TLB_INT1_CONFIG_P_SHFT 13 | ||
303 | #define UVH_GR0_TLB_INT1_CONFIG_P_MASK 0x0000000000002000UL | ||
304 | #define UVH_GR0_TLB_INT1_CONFIG_T_SHFT 15 | ||
305 | #define UVH_GR0_TLB_INT1_CONFIG_T_MASK 0x0000000000008000UL | ||
306 | #define UVH_GR0_TLB_INT1_CONFIG_M_SHFT 16 | ||
307 | #define UVH_GR0_TLB_INT1_CONFIG_M_MASK 0x0000000000010000UL | ||
308 | #define UVH_GR0_TLB_INT1_CONFIG_APIC_ID_SHFT 32 | ||
309 | #define UVH_GR0_TLB_INT1_CONFIG_APIC_ID_MASK 0xffffffff00000000UL | ||
310 | |||
311 | union uvh_gr0_tlb_int1_config_u { | ||
312 | unsigned long v; | ||
313 | struct uvh_gr0_tlb_int1_config_s { | ||
314 | unsigned long vector_ : 8; /* RW */ | ||
315 | unsigned long dm : 3; /* RW */ | ||
316 | unsigned long destmode : 1; /* RW */ | ||
317 | unsigned long status : 1; /* RO */ | ||
318 | unsigned long p : 1; /* RO */ | ||
319 | unsigned long rsvd_14 : 1; /* */ | ||
320 | unsigned long t : 1; /* RO */ | ||
321 | unsigned long m : 1; /* RW */ | ||
322 | unsigned long rsvd_17_31: 15; /* */ | ||
323 | unsigned long apic_id : 32; /* RW */ | ||
324 | } s; | ||
325 | }; | ||
326 | |||
327 | /* ========================================================================= */ | ||
328 | /* UVH_GR1_TLB_INT0_CONFIG */ | ||
329 | /* ========================================================================= */ | ||
330 | #define UVH_GR1_TLB_INT0_CONFIG 0x61f00UL | ||
331 | |||
332 | #define UVH_GR1_TLB_INT0_CONFIG_VECTOR_SHFT 0 | ||
333 | #define UVH_GR1_TLB_INT0_CONFIG_VECTOR_MASK 0x00000000000000ffUL | ||
334 | #define UVH_GR1_TLB_INT0_CONFIG_DM_SHFT 8 | ||
335 | #define UVH_GR1_TLB_INT0_CONFIG_DM_MASK 0x0000000000000700UL | ||
336 | #define UVH_GR1_TLB_INT0_CONFIG_DESTMODE_SHFT 11 | ||
337 | #define UVH_GR1_TLB_INT0_CONFIG_DESTMODE_MASK 0x0000000000000800UL | ||
338 | #define UVH_GR1_TLB_INT0_CONFIG_STATUS_SHFT 12 | ||
339 | #define UVH_GR1_TLB_INT0_CONFIG_STATUS_MASK 0x0000000000001000UL | ||
340 | #define UVH_GR1_TLB_INT0_CONFIG_P_SHFT 13 | ||
341 | #define UVH_GR1_TLB_INT0_CONFIG_P_MASK 0x0000000000002000UL | ||
342 | #define UVH_GR1_TLB_INT0_CONFIG_T_SHFT 15 | ||
343 | #define UVH_GR1_TLB_INT0_CONFIG_T_MASK 0x0000000000008000UL | ||
344 | #define UVH_GR1_TLB_INT0_CONFIG_M_SHFT 16 | ||
345 | #define UVH_GR1_TLB_INT0_CONFIG_M_MASK 0x0000000000010000UL | ||
346 | #define UVH_GR1_TLB_INT0_CONFIG_APIC_ID_SHFT 32 | ||
347 | #define UVH_GR1_TLB_INT0_CONFIG_APIC_ID_MASK 0xffffffff00000000UL | ||
348 | |||
349 | union uvh_gr1_tlb_int0_config_u { | ||
350 | unsigned long v; | ||
351 | struct uvh_gr1_tlb_int0_config_s { | ||
352 | unsigned long vector_ : 8; /* RW */ | ||
353 | unsigned long dm : 3; /* RW */ | ||
354 | unsigned long destmode : 1; /* RW */ | ||
355 | unsigned long status : 1; /* RO */ | ||
356 | unsigned long p : 1; /* RO */ | ||
357 | unsigned long rsvd_14 : 1; /* */ | ||
358 | unsigned long t : 1; /* RO */ | ||
359 | unsigned long m : 1; /* RW */ | ||
360 | unsigned long rsvd_17_31: 15; /* */ | ||
361 | unsigned long apic_id : 32; /* RW */ | ||
362 | } s; | ||
363 | }; | ||
364 | |||
365 | /* ========================================================================= */ | ||
366 | /* UVH_GR1_TLB_INT1_CONFIG */ | ||
367 | /* ========================================================================= */ | ||
368 | #define UVH_GR1_TLB_INT1_CONFIG 0x61f40UL | ||
369 | |||
370 | #define UVH_GR1_TLB_INT1_CONFIG_VECTOR_SHFT 0 | ||
371 | #define UVH_GR1_TLB_INT1_CONFIG_VECTOR_MASK 0x00000000000000ffUL | ||
372 | #define UVH_GR1_TLB_INT1_CONFIG_DM_SHFT 8 | ||
373 | #define UVH_GR1_TLB_INT1_CONFIG_DM_MASK 0x0000000000000700UL | ||
374 | #define UVH_GR1_TLB_INT1_CONFIG_DESTMODE_SHFT 11 | ||
375 | #define UVH_GR1_TLB_INT1_CONFIG_DESTMODE_MASK 0x0000000000000800UL | ||
376 | #define UVH_GR1_TLB_INT1_CONFIG_STATUS_SHFT 12 | ||
377 | #define UVH_GR1_TLB_INT1_CONFIG_STATUS_MASK 0x0000000000001000UL | ||
378 | #define UVH_GR1_TLB_INT1_CONFIG_P_SHFT 13 | ||
379 | #define UVH_GR1_TLB_INT1_CONFIG_P_MASK 0x0000000000002000UL | ||
380 | #define UVH_GR1_TLB_INT1_CONFIG_T_SHFT 15 | ||
381 | #define UVH_GR1_TLB_INT1_CONFIG_T_MASK 0x0000000000008000UL | ||
382 | #define UVH_GR1_TLB_INT1_CONFIG_M_SHFT 16 | ||
383 | #define UVH_GR1_TLB_INT1_CONFIG_M_MASK 0x0000000000010000UL | ||
384 | #define UVH_GR1_TLB_INT1_CONFIG_APIC_ID_SHFT 32 | ||
385 | #define UVH_GR1_TLB_INT1_CONFIG_APIC_ID_MASK 0xffffffff00000000UL | ||
386 | |||
387 | union uvh_gr1_tlb_int1_config_u { | ||
388 | unsigned long v; | ||
389 | struct uvh_gr1_tlb_int1_config_s { | ||
390 | unsigned long vector_ : 8; /* RW */ | ||
391 | unsigned long dm : 3; /* RW */ | ||
392 | unsigned long destmode : 1; /* RW */ | ||
393 | unsigned long status : 1; /* RO */ | ||
394 | unsigned long p : 1; /* RO */ | ||
395 | unsigned long rsvd_14 : 1; /* */ | ||
396 | unsigned long t : 1; /* RO */ | ||
397 | unsigned long m : 1; /* RW */ | ||
398 | unsigned long rsvd_17_31: 15; /* */ | ||
399 | unsigned long apic_id : 32; /* RW */ | ||
400 | } s; | ||
401 | }; | ||
402 | |||
403 | /* ========================================================================= */ | ||
246 | /* UVH_INT_CMPB */ | 404 | /* UVH_INT_CMPB */ |
247 | /* ========================================================================= */ | 405 | /* ========================================================================= */ |
248 | #define UVH_INT_CMPB 0x22080UL | 406 | #define UVH_INT_CMPB 0x22080UL |
diff --git a/arch/x86/include/asm/virtext.h b/arch/x86/include/asm/virtext.h index 593636275238..e0f9aa16358b 100644 --- a/arch/x86/include/asm/virtext.h +++ b/arch/x86/include/asm/virtext.h | |||
@@ -118,7 +118,7 @@ static inline void cpu_svm_disable(void) | |||
118 | 118 | ||
119 | wrmsrl(MSR_VM_HSAVE_PA, 0); | 119 | wrmsrl(MSR_VM_HSAVE_PA, 0); |
120 | rdmsrl(MSR_EFER, efer); | 120 | rdmsrl(MSR_EFER, efer); |
121 | wrmsrl(MSR_EFER, efer & ~MSR_EFER_SVME_MASK); | 121 | wrmsrl(MSR_EFER, efer & ~EFER_SVME); |
122 | } | 122 | } |
123 | 123 | ||
124 | /** Makes sure SVM is disabled, if it is supported on the CPU | 124 | /** Makes sure SVM is disabled, if it is supported on the CPU |
diff --git a/arch/x86/include/asm/vmx.h b/arch/x86/include/asm/vmx.h index d0238e6151d8..498f944010b9 100644 --- a/arch/x86/include/asm/vmx.h +++ b/arch/x86/include/asm/vmx.h | |||
@@ -270,8 +270,9 @@ enum vmcs_field { | |||
270 | 270 | ||
271 | #define INTR_TYPE_EXT_INTR (0 << 8) /* external interrupt */ | 271 | #define INTR_TYPE_EXT_INTR (0 << 8) /* external interrupt */ |
272 | #define INTR_TYPE_NMI_INTR (2 << 8) /* NMI */ | 272 | #define INTR_TYPE_NMI_INTR (2 << 8) /* NMI */ |
273 | #define INTR_TYPE_EXCEPTION (3 << 8) /* processor exception */ | 273 | #define INTR_TYPE_HARD_EXCEPTION (3 << 8) /* processor exception */ |
274 | #define INTR_TYPE_SOFT_INTR (4 << 8) /* software interrupt */ | 274 | #define INTR_TYPE_SOFT_INTR (4 << 8) /* software interrupt */ |
275 | #define INTR_TYPE_SOFT_EXCEPTION (6 << 8) /* software exception */ | ||
275 | 276 | ||
276 | /* GUEST_INTERRUPTIBILITY_INFO flags. */ | 277 | /* GUEST_INTERRUPTIBILITY_INFO flags. */ |
277 | #define GUEST_INTR_STATE_STI 0x00000001 | 278 | #define GUEST_INTR_STATE_STI 0x00000001 |
@@ -311,7 +312,7 @@ enum vmcs_field { | |||
311 | #define DEBUG_REG_ACCESS_TYPE 0x10 /* 4, direction of access */ | 312 | #define DEBUG_REG_ACCESS_TYPE 0x10 /* 4, direction of access */ |
312 | #define TYPE_MOV_TO_DR (0 << 4) | 313 | #define TYPE_MOV_TO_DR (0 << 4) |
313 | #define TYPE_MOV_FROM_DR (1 << 4) | 314 | #define TYPE_MOV_FROM_DR (1 << 4) |
314 | #define DEBUG_REG_ACCESS_REG 0xf00 /* 11:8, general purpose reg. */ | 315 | #define DEBUG_REG_ACCESS_REG(eq) (((eq) >> 8) & 0xf) /* 11:8, general purpose reg. */ |
315 | 316 | ||
316 | 317 | ||
317 | /* segment AR */ | 318 | /* segment AR */ |
diff --git a/arch/x86/include/asm/xen/page.h b/arch/x86/include/asm/xen/page.h index 1a918dde46b5..018a0a400799 100644 --- a/arch/x86/include/asm/xen/page.h +++ b/arch/x86/include/asm/xen/page.h | |||
@@ -124,7 +124,8 @@ static inline unsigned long mfn_to_local_pfn(unsigned long mfn) | |||
124 | 124 | ||
125 | /* VIRT <-> MACHINE conversion */ | 125 | /* VIRT <-> MACHINE conversion */ |
126 | #define virt_to_machine(v) (phys_to_machine(XPADDR(__pa(v)))) | 126 | #define virt_to_machine(v) (phys_to_machine(XPADDR(__pa(v)))) |
127 | #define virt_to_mfn(v) (pfn_to_mfn(PFN_DOWN(__pa(v)))) | 127 | #define virt_to_pfn(v) (PFN_DOWN(__pa(v))) |
128 | #define virt_to_mfn(v) (pfn_to_mfn(virt_to_pfn(v))) | ||
128 | #define mfn_to_virt(m) (__va(mfn_to_pfn(m) << PAGE_SHIFT)) | 129 | #define mfn_to_virt(m) (__va(mfn_to_pfn(m) << PAGE_SHIFT)) |
129 | 130 | ||
130 | static inline unsigned long pte_mfn(pte_t pte) | 131 | static inline unsigned long pte_mfn(pte_t pte) |
diff --git a/arch/x86/include/asm/xsave.h b/arch/x86/include/asm/xsave.h index 08e9a1ac07a9..727acc152344 100644 --- a/arch/x86/include/asm/xsave.h +++ b/arch/x86/include/asm/xsave.h | |||
@@ -7,6 +7,7 @@ | |||
7 | 7 | ||
8 | #define XSTATE_FP 0x1 | 8 | #define XSTATE_FP 0x1 |
9 | #define XSTATE_SSE 0x2 | 9 | #define XSTATE_SSE 0x2 |
10 | #define XSTATE_YMM 0x4 | ||
10 | 11 | ||
11 | #define XSTATE_FPSSE (XSTATE_FP | XSTATE_SSE) | 12 | #define XSTATE_FPSSE (XSTATE_FP | XSTATE_SSE) |
12 | 13 | ||
@@ -15,7 +16,7 @@ | |||
15 | /* | 16 | /* |
16 | * These are the features that the OS can handle currently. | 17 | * These are the features that the OS can handle currently. |
17 | */ | 18 | */ |
18 | #define XCNTXT_MASK (XSTATE_FP | XSTATE_SSE) | 19 | #define XCNTXT_MASK (XSTATE_FP | XSTATE_SSE | XSTATE_YMM) |
19 | 20 | ||
20 | #ifdef CONFIG_X86_64 | 21 | #ifdef CONFIG_X86_64 |
21 | #define REX_PREFIX "0x48, " | 22 | #define REX_PREFIX "0x48, " |