diff options
Diffstat (limited to 'include/asm-x86')
-rw-r--r-- | include/asm-x86/amd_iommu_types.h | 8 | ||||
-rw-r--r-- | include/asm-x86/atomic_64.h | 8 | ||||
-rw-r--r-- | include/asm-x86/efi.h | 2 | ||||
-rw-r--r-- | include/asm-x86/geode.h | 3 | ||||
-rw-r--r-- | include/asm-x86/hw_irq.h | 12 | ||||
-rw-r--r-- | include/asm-x86/i387.h | 34 | ||||
-rw-r--r-- | include/asm-x86/io.h | 18 | ||||
-rw-r--r-- | include/asm-x86/irq_vectors.h | 10 | ||||
-rw-r--r-- | include/asm-x86/kexec.h | 8 | ||||
-rw-r--r-- | include/asm-x86/mman.h | 1 | ||||
-rw-r--r-- | include/asm-x86/mmzone_32.h | 6 | ||||
-rw-r--r-- | include/asm-x86/percpu.h | 2 | ||||
-rw-r--r-- | include/asm-x86/pgtable_64.h | 2 | ||||
-rw-r--r-- | include/asm-x86/processor.h | 23 | ||||
-rw-r--r-- | include/asm-x86/spinlock.h | 4 |
15 files changed, 112 insertions, 29 deletions
diff --git a/include/asm-x86/amd_iommu_types.h b/include/asm-x86/amd_iommu_types.h index 22aa58ca1991..dcc812067394 100644 --- a/include/asm-x86/amd_iommu_types.h +++ b/include/asm-x86/amd_iommu_types.h | |||
@@ -31,9 +31,6 @@ | |||
31 | #define ALIAS_TABLE_ENTRY_SIZE 2 | 31 | #define ALIAS_TABLE_ENTRY_SIZE 2 |
32 | #define RLOOKUP_TABLE_ENTRY_SIZE (sizeof(void *)) | 32 | #define RLOOKUP_TABLE_ENTRY_SIZE (sizeof(void *)) |
33 | 33 | ||
34 | /* helper macros */ | ||
35 | #define LOW_U32(x) ((x) & ((1ULL << 32)-1)) | ||
36 | |||
37 | /* Length of the MMIO region for the AMD IOMMU */ | 34 | /* Length of the MMIO region for the AMD IOMMU */ |
38 | #define MMIO_REGION_LENGTH 0x4000 | 35 | #define MMIO_REGION_LENGTH 0x4000 |
39 | 36 | ||
@@ -69,6 +66,9 @@ | |||
69 | #define MMIO_EVT_TAIL_OFFSET 0x2018 | 66 | #define MMIO_EVT_TAIL_OFFSET 0x2018 |
70 | #define MMIO_STATUS_OFFSET 0x2020 | 67 | #define MMIO_STATUS_OFFSET 0x2020 |
71 | 68 | ||
69 | /* MMIO status bits */ | ||
70 | #define MMIO_STATUS_COM_WAIT_INT_MASK 0x04 | ||
71 | |||
72 | /* feature control bits */ | 72 | /* feature control bits */ |
73 | #define CONTROL_IOMMU_EN 0x00ULL | 73 | #define CONTROL_IOMMU_EN 0x00ULL |
74 | #define CONTROL_HT_TUN_EN 0x01ULL | 74 | #define CONTROL_HT_TUN_EN 0x01ULL |
@@ -89,6 +89,7 @@ | |||
89 | #define CMD_INV_IOMMU_PAGES 0x03 | 89 | #define CMD_INV_IOMMU_PAGES 0x03 |
90 | 90 | ||
91 | #define CMD_COMPL_WAIT_STORE_MASK 0x01 | 91 | #define CMD_COMPL_WAIT_STORE_MASK 0x01 |
92 | #define CMD_COMPL_WAIT_INT_MASK 0x02 | ||
92 | #define CMD_INV_IOMMU_PAGES_SIZE_MASK 0x01 | 93 | #define CMD_INV_IOMMU_PAGES_SIZE_MASK 0x01 |
93 | #define CMD_INV_IOMMU_PAGES_PDE_MASK 0x02 | 94 | #define CMD_INV_IOMMU_PAGES_PDE_MASK 0x02 |
94 | 95 | ||
@@ -99,6 +100,7 @@ | |||
99 | #define DEV_ENTRY_TRANSLATION 0x01 | 100 | #define DEV_ENTRY_TRANSLATION 0x01 |
100 | #define DEV_ENTRY_IR 0x3d | 101 | #define DEV_ENTRY_IR 0x3d |
101 | #define DEV_ENTRY_IW 0x3e | 102 | #define DEV_ENTRY_IW 0x3e |
103 | #define DEV_ENTRY_NO_PAGE_FAULT 0x62 | ||
102 | #define DEV_ENTRY_EX 0x67 | 104 | #define DEV_ENTRY_EX 0x67 |
103 | #define DEV_ENTRY_SYSMGT1 0x68 | 105 | #define DEV_ENTRY_SYSMGT1 0x68 |
104 | #define DEV_ENTRY_SYSMGT2 0x69 | 106 | #define DEV_ENTRY_SYSMGT2 0x69 |
diff --git a/include/asm-x86/atomic_64.h b/include/asm-x86/atomic_64.h index a0095191c02e..91c7d03e65bc 100644 --- a/include/asm-x86/atomic_64.h +++ b/include/asm-x86/atomic_64.h | |||
@@ -228,7 +228,7 @@ static inline void atomic64_add(long i, atomic64_t *v) | |||
228 | { | 228 | { |
229 | asm volatile(LOCK_PREFIX "addq %1,%0" | 229 | asm volatile(LOCK_PREFIX "addq %1,%0" |
230 | : "=m" (v->counter) | 230 | : "=m" (v->counter) |
231 | : "ir" (i), "m" (v->counter)); | 231 | : "er" (i), "m" (v->counter)); |
232 | } | 232 | } |
233 | 233 | ||
234 | /** | 234 | /** |
@@ -242,7 +242,7 @@ static inline void atomic64_sub(long i, atomic64_t *v) | |||
242 | { | 242 | { |
243 | asm volatile(LOCK_PREFIX "subq %1,%0" | 243 | asm volatile(LOCK_PREFIX "subq %1,%0" |
244 | : "=m" (v->counter) | 244 | : "=m" (v->counter) |
245 | : "ir" (i), "m" (v->counter)); | 245 | : "er" (i), "m" (v->counter)); |
246 | } | 246 | } |
247 | 247 | ||
248 | /** | 248 | /** |
@@ -260,7 +260,7 @@ static inline int atomic64_sub_and_test(long i, atomic64_t *v) | |||
260 | 260 | ||
261 | asm volatile(LOCK_PREFIX "subq %2,%0; sete %1" | 261 | asm volatile(LOCK_PREFIX "subq %2,%0; sete %1" |
262 | : "=m" (v->counter), "=qm" (c) | 262 | : "=m" (v->counter), "=qm" (c) |
263 | : "ir" (i), "m" (v->counter) : "memory"); | 263 | : "er" (i), "m" (v->counter) : "memory"); |
264 | return c; | 264 | return c; |
265 | } | 265 | } |
266 | 266 | ||
@@ -341,7 +341,7 @@ static inline int atomic64_add_negative(long i, atomic64_t *v) | |||
341 | 341 | ||
342 | asm volatile(LOCK_PREFIX "addq %2,%0; sets %1" | 342 | asm volatile(LOCK_PREFIX "addq %2,%0; sets %1" |
343 | : "=m" (v->counter), "=qm" (c) | 343 | : "=m" (v->counter), "=qm" (c) |
344 | : "ir" (i), "m" (v->counter) : "memory"); | 344 | : "er" (i), "m" (v->counter) : "memory"); |
345 | return c; | 345 | return c; |
346 | } | 346 | } |
347 | 347 | ||
diff --git a/include/asm-x86/efi.h b/include/asm-x86/efi.h index 7ed2bd7a7f51..d4f2b0abe929 100644 --- a/include/asm-x86/efi.h +++ b/include/asm-x86/efi.h | |||
@@ -86,7 +86,7 @@ extern u64 efi_call6(void *fp, u64 arg1, u64 arg2, u64 arg3, | |||
86 | efi_call6((void *)(efi.systab->runtime->f), (u64)(a1), (u64)(a2), \ | 86 | efi_call6((void *)(efi.systab->runtime->f), (u64)(a1), (u64)(a2), \ |
87 | (u64)(a3), (u64)(a4), (u64)(a5), (u64)(a6)) | 87 | (u64)(a3), (u64)(a4), (u64)(a5), (u64)(a6)) |
88 | 88 | ||
89 | extern void *efi_ioremap(unsigned long addr, unsigned long size); | 89 | extern void __iomem *efi_ioremap(unsigned long addr, unsigned long size); |
90 | 90 | ||
91 | #endif /* CONFIG_X86_32 */ | 91 | #endif /* CONFIG_X86_32 */ |
92 | 92 | ||
diff --git a/include/asm-x86/geode.h b/include/asm-x86/geode.h index bb06027fc83e..2c1cda0b8a86 100644 --- a/include/asm-x86/geode.h +++ b/include/asm-x86/geode.h | |||
@@ -50,6 +50,7 @@ extern int geode_get_dev_base(unsigned int dev); | |||
50 | #define MSR_PIC_YSEL_HIGH 0x51400021 | 50 | #define MSR_PIC_YSEL_HIGH 0x51400021 |
51 | #define MSR_PIC_ZSEL_LOW 0x51400022 | 51 | #define MSR_PIC_ZSEL_LOW 0x51400022 |
52 | #define MSR_PIC_ZSEL_HIGH 0x51400023 | 52 | #define MSR_PIC_ZSEL_HIGH 0x51400023 |
53 | #define MSR_PIC_IRQM_LPC 0x51400025 | ||
53 | 54 | ||
54 | #define MSR_MFGPT_IRQ 0x51400028 | 55 | #define MSR_MFGPT_IRQ 0x51400028 |
55 | #define MSR_MFGPT_NR 0x51400029 | 56 | #define MSR_MFGPT_NR 0x51400029 |
@@ -237,7 +238,7 @@ static inline u16 geode_mfgpt_read(int timer, u16 reg) | |||
237 | } | 238 | } |
238 | 239 | ||
239 | extern int geode_mfgpt_toggle_event(int timer, int cmp, int event, int enable); | 240 | extern int geode_mfgpt_toggle_event(int timer, int cmp, int event, int enable); |
240 | extern int geode_mfgpt_set_irq(int timer, int cmp, int irq, int enable); | 241 | extern int geode_mfgpt_set_irq(int timer, int cmp, int *irq, int enable); |
241 | extern int geode_mfgpt_alloc_timer(int timer, int domain); | 242 | extern int geode_mfgpt_alloc_timer(int timer, int domain); |
242 | 243 | ||
243 | #define geode_mfgpt_setup_irq(t, c, i) geode_mfgpt_set_irq((t), (c), (i), 1) | 244 | #define geode_mfgpt_setup_irq(t, c, i) geode_mfgpt_set_irq((t), (c), (i), 1) |
diff --git a/include/asm-x86/hw_irq.h b/include/asm-x86/hw_irq.h index 77ba51df5668..edd0b95f14d0 100644 --- a/include/asm-x86/hw_irq.h +++ b/include/asm-x86/hw_irq.h | |||
@@ -98,9 +98,17 @@ extern void (*const interrupt[NR_IRQS])(void); | |||
98 | #else | 98 | #else |
99 | typedef int vector_irq_t[NR_VECTORS]; | 99 | typedef int vector_irq_t[NR_VECTORS]; |
100 | DECLARE_PER_CPU(vector_irq_t, vector_irq); | 100 | DECLARE_PER_CPU(vector_irq_t, vector_irq); |
101 | extern spinlock_t vector_lock; | ||
102 | #endif | 101 | #endif |
103 | extern void setup_vector_irq(int cpu); | 102 | |
103 | #if defined(CONFIG_X86_IO_APIC) && defined(CONFIG_X86_64) | ||
104 | extern void lock_vector_lock(void); | ||
105 | extern void unlock_vector_lock(void); | ||
106 | extern void __setup_vector_irq(int cpu); | ||
107 | #else | ||
108 | static inline void lock_vector_lock(void) {} | ||
109 | static inline void unlock_vector_lock(void) {} | ||
110 | static inline void __setup_vector_irq(int cpu) {} | ||
111 | #endif | ||
104 | 112 | ||
105 | #endif /* !ASSEMBLY_ */ | 113 | #endif /* !ASSEMBLY_ */ |
106 | 114 | ||
diff --git a/include/asm-x86/i387.h b/include/asm-x86/i387.h index 96fa8449ff11..56d00e31aec0 100644 --- a/include/asm-x86/i387.h +++ b/include/asm-x86/i387.h | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/sched.h> | 13 | #include <linux/sched.h> |
14 | #include <linux/kernel_stat.h> | 14 | #include <linux/kernel_stat.h> |
15 | #include <linux/regset.h> | 15 | #include <linux/regset.h> |
16 | #include <linux/hardirq.h> | ||
16 | #include <asm/asm.h> | 17 | #include <asm/asm.h> |
17 | #include <asm/processor.h> | 18 | #include <asm/processor.h> |
18 | #include <asm/sigcontext.h> | 19 | #include <asm/sigcontext.h> |
@@ -62,8 +63,6 @@ static inline int restore_fpu_checking(struct i387_fxsave_struct *fx) | |||
62 | #else | 63 | #else |
63 | : [fx] "cdaSDb" (fx), "m" (*fx), "0" (0)); | 64 | : [fx] "cdaSDb" (fx), "m" (*fx), "0" (0)); |
64 | #endif | 65 | #endif |
65 | if (unlikely(err)) | ||
66 | init_fpu(current); | ||
67 | return err; | 66 | return err; |
68 | } | 67 | } |
69 | 68 | ||
@@ -236,6 +235,37 @@ static inline void kernel_fpu_end(void) | |||
236 | preempt_enable(); | 235 | preempt_enable(); |
237 | } | 236 | } |
238 | 237 | ||
238 | /* | ||
239 | * Some instructions like VIA's padlock instructions generate a spurious | ||
240 | * DNA fault but don't modify SSE registers. And these instructions | ||
241 | * get used from interrupt context aswell. To prevent these kernel instructions | ||
242 | * in interrupt context interact wrongly with other user/kernel fpu usage, we | ||
243 | * should use them only in the context of irq_ts_save/restore() | ||
244 | */ | ||
245 | static inline int irq_ts_save(void) | ||
246 | { | ||
247 | /* | ||
248 | * If we are in process context, we are ok to take a spurious DNA fault. | ||
249 | * Otherwise, doing clts() in process context require pre-emption to | ||
250 | * be disabled or some heavy lifting like kernel_fpu_begin() | ||
251 | */ | ||
252 | if (!in_interrupt()) | ||
253 | return 0; | ||
254 | |||
255 | if (read_cr0() & X86_CR0_TS) { | ||
256 | clts(); | ||
257 | return 1; | ||
258 | } | ||
259 | |||
260 | return 0; | ||
261 | } | ||
262 | |||
263 | static inline void irq_ts_restore(int TS_state) | ||
264 | { | ||
265 | if (TS_state) | ||
266 | stts(); | ||
267 | } | ||
268 | |||
239 | #ifdef CONFIG_X86_64 | 269 | #ifdef CONFIG_X86_64 |
240 | 270 | ||
241 | static inline void save_init_fpu(struct task_struct *tsk) | 271 | static inline void save_init_fpu(struct task_struct *tsk) |
diff --git a/include/asm-x86/io.h b/include/asm-x86/io.h index bf5d629b3a39..0f954dc89cb3 100644 --- a/include/asm-x86/io.h +++ b/include/asm-x86/io.h | |||
@@ -21,7 +21,7 @@ extern void __iomem *fix_ioremap(unsigned idx, unsigned long phys); | |||
21 | 21 | ||
22 | #define build_mmio_read(name, size, type, reg, barrier) \ | 22 | #define build_mmio_read(name, size, type, reg, barrier) \ |
23 | static inline type name(const volatile void __iomem *addr) \ | 23 | static inline type name(const volatile void __iomem *addr) \ |
24 | { type ret; asm volatile("mov" size " %1,%0":"=" reg (ret) \ | 24 | { type ret; asm volatile("mov" size " %1,%0":reg (ret) \ |
25 | :"m" (*(volatile type __force *)addr) barrier); return ret; } | 25 | :"m" (*(volatile type __force *)addr) barrier); return ret; } |
26 | 26 | ||
27 | #define build_mmio_write(name, size, type, reg, barrier) \ | 27 | #define build_mmio_write(name, size, type, reg, barrier) \ |
@@ -29,13 +29,13 @@ static inline void name(type val, volatile void __iomem *addr) \ | |||
29 | { asm volatile("mov" size " %0,%1": :reg (val), \ | 29 | { asm volatile("mov" size " %0,%1": :reg (val), \ |
30 | "m" (*(volatile type __force *)addr) barrier); } | 30 | "m" (*(volatile type __force *)addr) barrier); } |
31 | 31 | ||
32 | build_mmio_read(readb, "b", unsigned char, "q", :"memory") | 32 | build_mmio_read(readb, "b", unsigned char, "=q", :"memory") |
33 | build_mmio_read(readw, "w", unsigned short, "r", :"memory") | 33 | build_mmio_read(readw, "w", unsigned short, "=r", :"memory") |
34 | build_mmio_read(readl, "l", unsigned int, "r", :"memory") | 34 | build_mmio_read(readl, "l", unsigned int, "=r", :"memory") |
35 | 35 | ||
36 | build_mmio_read(__readb, "b", unsigned char, "q", ) | 36 | build_mmio_read(__readb, "b", unsigned char, "=q", ) |
37 | build_mmio_read(__readw, "w", unsigned short, "r", ) | 37 | build_mmio_read(__readw, "w", unsigned short, "=r", ) |
38 | build_mmio_read(__readl, "l", unsigned int, "r", ) | 38 | build_mmio_read(__readl, "l", unsigned int, "=r", ) |
39 | 39 | ||
40 | build_mmio_write(writeb, "b", unsigned char, "q", :"memory") | 40 | build_mmio_write(writeb, "b", unsigned char, "q", :"memory") |
41 | build_mmio_write(writew, "w", unsigned short, "r", :"memory") | 41 | build_mmio_write(writew, "w", unsigned short, "r", :"memory") |
@@ -59,8 +59,8 @@ build_mmio_write(__writel, "l", unsigned int, "r", ) | |||
59 | #define mmiowb() barrier() | 59 | #define mmiowb() barrier() |
60 | 60 | ||
61 | #ifdef CONFIG_X86_64 | 61 | #ifdef CONFIG_X86_64 |
62 | build_mmio_read(readq, "q", unsigned long, "r", :"memory") | 62 | build_mmio_read(readq, "q", unsigned long, "=r", :"memory") |
63 | build_mmio_read(__readq, "q", unsigned long, "r", ) | 63 | build_mmio_read(__readq, "q", unsigned long, "=r", ) |
64 | build_mmio_write(writeq, "q", unsigned long, "r", :"memory") | 64 | build_mmio_write(writeq, "q", unsigned long, "r", :"memory") |
65 | build_mmio_write(__writeq, "q", unsigned long, "r", ) | 65 | build_mmio_write(__writeq, "q", unsigned long, "r", ) |
66 | 66 | ||
diff --git a/include/asm-x86/irq_vectors.h b/include/asm-x86/irq_vectors.h index 90b1d1f12f08..b95d167b7fb2 100644 --- a/include/asm-x86/irq_vectors.h +++ b/include/asm-x86/irq_vectors.h | |||
@@ -109,7 +109,15 @@ | |||
109 | #define LAST_VM86_IRQ 15 | 109 | #define LAST_VM86_IRQ 15 |
110 | #define invalid_vm86_irq(irq) ((irq) < 3 || (irq) > 15) | 110 | #define invalid_vm86_irq(irq) ((irq) < 3 || (irq) > 15) |
111 | 111 | ||
112 | #if !defined(CONFIG_X86_VOYAGER) | 112 | #ifdef CONFIG_X86_64 |
113 | # if NR_CPUS < MAX_IO_APICS | ||
114 | # define NR_IRQS (NR_VECTORS + (32 * NR_CPUS)) | ||
115 | # else | ||
116 | # define NR_IRQS (NR_VECTORS + (32 * MAX_IO_APICS)) | ||
117 | # endif | ||
118 | # define NR_IRQ_VECTORS NR_IRQS | ||
119 | |||
120 | #elif !defined(CONFIG_X86_VOYAGER) | ||
113 | 121 | ||
114 | # if defined(CONFIG_X86_IO_APIC) || defined(CONFIG_PARAVIRT) || defined(CONFIG_X86_VISWS) | 122 | # if defined(CONFIG_X86_IO_APIC) || defined(CONFIG_PARAVIRT) || defined(CONFIG_X86_VISWS) |
115 | 123 | ||
diff --git a/include/asm-x86/kexec.h b/include/asm-x86/kexec.h index c0e52a14fd4d..4246ab7dc988 100644 --- a/include/asm-x86/kexec.h +++ b/include/asm-x86/kexec.h | |||
@@ -41,6 +41,10 @@ | |||
41 | # define PAGES_NR 17 | 41 | # define PAGES_NR 17 |
42 | #endif | 42 | #endif |
43 | 43 | ||
44 | #ifdef CONFIG_X86_32 | ||
45 | # define KEXEC_CONTROL_CODE_MAX_SIZE 2048 | ||
46 | #endif | ||
47 | |||
44 | #ifndef __ASSEMBLY__ | 48 | #ifndef __ASSEMBLY__ |
45 | 49 | ||
46 | #include <linux/string.h> | 50 | #include <linux/string.h> |
@@ -63,7 +67,7 @@ | |||
63 | /* Maximum address we can use for the control code buffer */ | 67 | /* Maximum address we can use for the control code buffer */ |
64 | # define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE | 68 | # define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE |
65 | 69 | ||
66 | # define KEXEC_CONTROL_CODE_SIZE 4096 | 70 | # define KEXEC_CONTROL_PAGE_SIZE 4096 |
67 | 71 | ||
68 | /* The native architecture */ | 72 | /* The native architecture */ |
69 | # define KEXEC_ARCH KEXEC_ARCH_386 | 73 | # define KEXEC_ARCH KEXEC_ARCH_386 |
@@ -79,7 +83,7 @@ | |||
79 | # define KEXEC_CONTROL_MEMORY_LIMIT (0xFFFFFFFFFFUL) | 83 | # define KEXEC_CONTROL_MEMORY_LIMIT (0xFFFFFFFFFFUL) |
80 | 84 | ||
81 | /* Allocate one page for the pdp and the second for the code */ | 85 | /* Allocate one page for the pdp and the second for the code */ |
82 | # define KEXEC_CONTROL_CODE_SIZE (4096UL + 4096UL) | 86 | # define KEXEC_CONTROL_PAGE_SIZE (4096UL + 4096UL) |
83 | 87 | ||
84 | /* The native architecture */ | 88 | /* The native architecture */ |
85 | # define KEXEC_ARCH KEXEC_ARCH_X86_64 | 89 | # define KEXEC_ARCH KEXEC_ARCH_X86_64 |
diff --git a/include/asm-x86/mman.h b/include/asm-x86/mman.h index c1682b542daf..90bc4108a4fd 100644 --- a/include/asm-x86/mman.h +++ b/include/asm-x86/mman.h | |||
@@ -12,6 +12,7 @@ | |||
12 | #define MAP_NORESERVE 0x4000 /* don't check for reservations */ | 12 | #define MAP_NORESERVE 0x4000 /* don't check for reservations */ |
13 | #define MAP_POPULATE 0x8000 /* populate (prefault) pagetables */ | 13 | #define MAP_POPULATE 0x8000 /* populate (prefault) pagetables */ |
14 | #define MAP_NONBLOCK 0x10000 /* do not block on IO */ | 14 | #define MAP_NONBLOCK 0x10000 /* do not block on IO */ |
15 | #define MAP_STACK 0x20000 /* give out an address that is best suited for process/thread stacks */ | ||
15 | 16 | ||
16 | #define MCL_CURRENT 1 /* lock all current mappings */ | 17 | #define MCL_CURRENT 1 /* lock all current mappings */ |
17 | #define MCL_FUTURE 2 /* lock all future mappings */ | 18 | #define MCL_FUTURE 2 /* lock all future mappings */ |
diff --git a/include/asm-x86/mmzone_32.h b/include/asm-x86/mmzone_32.h index b2298a227567..5862e6460658 100644 --- a/include/asm-x86/mmzone_32.h +++ b/include/asm-x86/mmzone_32.h | |||
@@ -97,10 +97,16 @@ static inline int pfn_valid(int pfn) | |||
97 | reserve_bootmem_node(NODE_DATA(0), (addr), (size), (flags)) | 97 | reserve_bootmem_node(NODE_DATA(0), (addr), (size), (flags)) |
98 | #define alloc_bootmem(x) \ | 98 | #define alloc_bootmem(x) \ |
99 | __alloc_bootmem_node(NODE_DATA(0), (x), SMP_CACHE_BYTES, __pa(MAX_DMA_ADDRESS)) | 99 | __alloc_bootmem_node(NODE_DATA(0), (x), SMP_CACHE_BYTES, __pa(MAX_DMA_ADDRESS)) |
100 | #define alloc_bootmem_nopanic(x) \ | ||
101 | __alloc_bootmem_node_nopanic(NODE_DATA(0), (x), SMP_CACHE_BYTES, \ | ||
102 | __pa(MAX_DMA_ADDRESS)) | ||
100 | #define alloc_bootmem_low(x) \ | 103 | #define alloc_bootmem_low(x) \ |
101 | __alloc_bootmem_node(NODE_DATA(0), (x), SMP_CACHE_BYTES, 0) | 104 | __alloc_bootmem_node(NODE_DATA(0), (x), SMP_CACHE_BYTES, 0) |
102 | #define alloc_bootmem_pages(x) \ | 105 | #define alloc_bootmem_pages(x) \ |
103 | __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, __pa(MAX_DMA_ADDRESS)) | 106 | __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, __pa(MAX_DMA_ADDRESS)) |
107 | #define alloc_bootmem_pages_nopanic(x) \ | ||
108 | __alloc_bootmem_node_nopanic(NODE_DATA(0), (x), PAGE_SIZE, \ | ||
109 | __pa(MAX_DMA_ADDRESS)) | ||
104 | #define alloc_bootmem_low_pages(x) \ | 110 | #define alloc_bootmem_low_pages(x) \ |
105 | __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, 0) | 111 | __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, 0) |
106 | #define alloc_bootmem_node(pgdat, x) \ | 112 | #define alloc_bootmem_node(pgdat, x) \ |
diff --git a/include/asm-x86/percpu.h b/include/asm-x86/percpu.h index 4e91ee1e37aa..f643a3a92da0 100644 --- a/include/asm-x86/percpu.h +++ b/include/asm-x86/percpu.h | |||
@@ -182,7 +182,7 @@ do { \ | |||
182 | DEFINE_PER_CPU(_type, _name) = _initvalue; \ | 182 | DEFINE_PER_CPU(_type, _name) = _initvalue; \ |
183 | __typeof__(_type) _name##_early_map[NR_CPUS] __initdata = \ | 183 | __typeof__(_type) _name##_early_map[NR_CPUS] __initdata = \ |
184 | { [0 ... NR_CPUS-1] = _initvalue }; \ | 184 | { [0 ... NR_CPUS-1] = _initvalue }; \ |
185 | __typeof__(_type) *_name##_early_ptr = _name##_early_map | 185 | __typeof__(_type) *_name##_early_ptr __refdata = _name##_early_map |
186 | 186 | ||
187 | #define EXPORT_EARLY_PER_CPU_SYMBOL(_name) \ | 187 | #define EXPORT_EARLY_PER_CPU_SYMBOL(_name) \ |
188 | EXPORT_PER_CPU_SYMBOL(_name) | 188 | EXPORT_PER_CPU_SYMBOL(_name) |
diff --git a/include/asm-x86/pgtable_64.h b/include/asm-x86/pgtable_64.h index ac5fff4cc58a..549144d03d99 100644 --- a/include/asm-x86/pgtable_64.h +++ b/include/asm-x86/pgtable_64.h | |||
@@ -151,7 +151,7 @@ static inline void native_pgd_clear(pgd_t *pgd) | |||
151 | #define VMALLOC_END _AC(0xffffe1ffffffffff, UL) | 151 | #define VMALLOC_END _AC(0xffffe1ffffffffff, UL) |
152 | #define VMEMMAP_START _AC(0xffffe20000000000, UL) | 152 | #define VMEMMAP_START _AC(0xffffe20000000000, UL) |
153 | #define MODULES_VADDR _AC(0xffffffffa0000000, UL) | 153 | #define MODULES_VADDR _AC(0xffffffffa0000000, UL) |
154 | #define MODULES_END _AC(0xfffffffffff00000, UL) | 154 | #define MODULES_END _AC(0xffffffffff000000, UL) |
155 | #define MODULES_LEN (MODULES_END - MODULES_VADDR) | 155 | #define MODULES_LEN (MODULES_END - MODULES_VADDR) |
156 | 156 | ||
157 | #ifndef __ASSEMBLY__ | 157 | #ifndef __ASSEMBLY__ |
diff --git a/include/asm-x86/processor.h b/include/asm-x86/processor.h index 5f58da401b43..4df3e2f6fb56 100644 --- a/include/asm-x86/processor.h +++ b/include/asm-x86/processor.h | |||
@@ -728,6 +728,29 @@ extern unsigned long boot_option_idle_override; | |||
728 | extern unsigned long idle_halt; | 728 | extern unsigned long idle_halt; |
729 | extern unsigned long idle_nomwait; | 729 | extern unsigned long idle_nomwait; |
730 | 730 | ||
731 | /* | ||
732 | * on systems with caches, caches must be flashed as the absolute | ||
733 | * last instruction before going into a suspended halt. Otherwise, | ||
734 | * dirty data can linger in the cache and become stale on resume, | ||
735 | * leading to strange errors. | ||
736 | * | ||
737 | * perform a variety of operations to guarantee that the compiler | ||
738 | * will not reorder instructions. wbinvd itself is serializing | ||
739 | * so the processor will not reorder. | ||
740 | * | ||
741 | * Systems without cache can just go into halt. | ||
742 | */ | ||
743 | static inline void wbinvd_halt(void) | ||
744 | { | ||
745 | mb(); | ||
746 | /* check for clflush to determine if wbinvd is legal */ | ||
747 | if (cpu_has_clflush) | ||
748 | asm volatile("cli; wbinvd; 1: hlt; jmp 1b" : : : "memory"); | ||
749 | else | ||
750 | while (1) | ||
751 | halt(); | ||
752 | } | ||
753 | |||
731 | extern void enable_sep_cpu(void); | 754 | extern void enable_sep_cpu(void); |
732 | extern int sysenter_setup(void); | 755 | extern int sysenter_setup(void); |
733 | 756 | ||
diff --git a/include/asm-x86/spinlock.h b/include/asm-x86/spinlock.h index 4f9a9861799a..e39c790dbfd2 100644 --- a/include/asm-x86/spinlock.h +++ b/include/asm-x86/spinlock.h | |||
@@ -65,7 +65,7 @@ static inline int __ticket_spin_is_contended(raw_spinlock_t *lock) | |||
65 | { | 65 | { |
66 | int tmp = ACCESS_ONCE(lock->slock); | 66 | int tmp = ACCESS_ONCE(lock->slock); |
67 | 67 | ||
68 | return (((tmp >> 8) & 0xff) - (tmp & 0xff)) > 1; | 68 | return (((tmp >> 8) - tmp) & 0xff) > 1; |
69 | } | 69 | } |
70 | 70 | ||
71 | static __always_inline void __ticket_spin_lock(raw_spinlock_t *lock) | 71 | static __always_inline void __ticket_spin_lock(raw_spinlock_t *lock) |
@@ -127,7 +127,7 @@ static inline int __ticket_spin_is_contended(raw_spinlock_t *lock) | |||
127 | { | 127 | { |
128 | int tmp = ACCESS_ONCE(lock->slock); | 128 | int tmp = ACCESS_ONCE(lock->slock); |
129 | 129 | ||
130 | return (((tmp >> 16) & 0xffff) - (tmp & 0xffff)) > 1; | 130 | return (((tmp >> 16) - tmp) & 0xffff) > 1; |
131 | } | 131 | } |
132 | 132 | ||
133 | static __always_inline void __ticket_spin_lock(raw_spinlock_t *lock) | 133 | static __always_inline void __ticket_spin_lock(raw_spinlock_t *lock) |