diff options
Diffstat (limited to 'include/asm-i386')
-rw-r--r-- | include/asm-i386/atomic.h | 21 | ||||
-rw-r--r-- | include/asm-i386/elf.h | 2 | ||||
-rw-r--r-- | include/asm-i386/ide.h | 6 | ||||
-rw-r--r-- | include/asm-i386/kprobes.h | 17 | ||||
-rw-r--r-- | include/asm-i386/msi.h | 9 | ||||
-rw-r--r-- | include/asm-i386/pgtable.h | 3 | ||||
-rw-r--r-- | include/asm-i386/processor.h | 6 | ||||
-rw-r--r-- | include/asm-i386/smp.h | 6 | ||||
-rw-r--r-- | include/asm-i386/system.h | 42 |
9 files changed, 101 insertions, 11 deletions
diff --git a/include/asm-i386/atomic.h b/include/asm-i386/atomic.h index 509720be772a..c68557aa04b2 100644 --- a/include/asm-i386/atomic.h +++ b/include/asm-i386/atomic.h | |||
@@ -215,6 +215,27 @@ static __inline__ int atomic_sub_return(int i, atomic_t *v) | |||
215 | return atomic_add_return(-i,v); | 215 | return atomic_add_return(-i,v); |
216 | } | 216 | } |
217 | 217 | ||
218 | #define atomic_cmpxchg(v, old, new) ((int)cmpxchg(&((v)->counter), old, new)) | ||
219 | |||
220 | /** | ||
221 | * atomic_add_unless - add unless the number is a given value | ||
222 | * @v: pointer of type atomic_t | ||
223 | * @a: the amount to add to v... | ||
224 | * @u: ...unless v is equal to u. | ||
225 | * | ||
226 | * Atomically adds @a to @v, so long as it was not @u. | ||
227 | * Returns non-zero if @v was not @u, and zero otherwise. | ||
228 | */ | ||
229 | #define atomic_add_unless(v, a, u) \ | ||
230 | ({ \ | ||
231 | int c, old; \ | ||
232 | c = atomic_read(v); \ | ||
233 | while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \ | ||
234 | c = old; \ | ||
235 | c != (u); \ | ||
236 | }) | ||
237 | #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) | ||
238 | |||
218 | #define atomic_inc_return(v) (atomic_add_return(1,v)) | 239 | #define atomic_inc_return(v) (atomic_add_return(1,v)) |
219 | #define atomic_dec_return(v) (atomic_sub_return(1,v)) | 240 | #define atomic_dec_return(v) (atomic_sub_return(1,v)) |
220 | 241 | ||
diff --git a/include/asm-i386/elf.h b/include/asm-i386/elf.h index fa11117d3cfa..4153d80e4d2b 100644 --- a/include/asm-i386/elf.h +++ b/include/asm-i386/elf.h | |||
@@ -119,6 +119,8 @@ typedef struct user_fxsr_struct elf_fpxregset_t; | |||
119 | */ | 119 | */ |
120 | #define elf_read_implies_exec(ex, executable_stack) (executable_stack != EXSTACK_DISABLE_X) | 120 | #define elf_read_implies_exec(ex, executable_stack) (executable_stack != EXSTACK_DISABLE_X) |
121 | 121 | ||
122 | struct task_struct; | ||
123 | |||
122 | extern int dump_task_regs (struct task_struct *, elf_gregset_t *); | 124 | extern int dump_task_regs (struct task_struct *, elf_gregset_t *); |
123 | extern int dump_task_fpu (struct task_struct *, elf_fpregset_t *); | 125 | extern int dump_task_fpu (struct task_struct *, elf_fpregset_t *); |
124 | extern int dump_task_extended_fpu (struct task_struct *, struct user_fxsr_struct *); | 126 | extern int dump_task_extended_fpu (struct task_struct *, struct user_fxsr_struct *); |
diff --git a/include/asm-i386/ide.h b/include/asm-i386/ide.h index 79dfab87135d..454440193eac 100644 --- a/include/asm-i386/ide.h +++ b/include/asm-i386/ide.h | |||
@@ -41,6 +41,12 @@ static __inline__ int ide_default_irq(unsigned long base) | |||
41 | 41 | ||
42 | static __inline__ unsigned long ide_default_io_base(int index) | 42 | static __inline__ unsigned long ide_default_io_base(int index) |
43 | { | 43 | { |
44 | /* | ||
45 | * If PCI is present then it is not safe to poke around | ||
46 | * the other legacy IDE ports. Only 0x1f0 and 0x170 are | ||
47 | * defined compatibility mode ports for PCI. A user can | ||
48 | * override this using ide= but we must default safe. | ||
49 | */ | ||
44 | if (pci_find_device(PCI_ANY_ID, PCI_ANY_ID, NULL) == NULL) { | 50 | if (pci_find_device(PCI_ANY_ID, PCI_ANY_ID, NULL) == NULL) { |
45 | switch(index) { | 51 | switch(index) { |
46 | case 2: return 0x1e8; | 52 | case 2: return 0x1e8; |
diff --git a/include/asm-i386/kprobes.h b/include/asm-i386/kprobes.h index 8b6d3a90cd78..ca916a892877 100644 --- a/include/asm-i386/kprobes.h +++ b/include/asm-i386/kprobes.h | |||
@@ -49,6 +49,23 @@ struct arch_specific_insn { | |||
49 | kprobe_opcode_t insn[MAX_INSN_SIZE]; | 49 | kprobe_opcode_t insn[MAX_INSN_SIZE]; |
50 | }; | 50 | }; |
51 | 51 | ||
52 | struct prev_kprobe { | ||
53 | struct kprobe *kp; | ||
54 | unsigned long status; | ||
55 | unsigned long old_eflags; | ||
56 | unsigned long saved_eflags; | ||
57 | }; | ||
58 | |||
59 | /* per-cpu kprobe control block */ | ||
60 | struct kprobe_ctlblk { | ||
61 | unsigned long kprobe_status; | ||
62 | unsigned long kprobe_old_eflags; | ||
63 | unsigned long kprobe_saved_eflags; | ||
64 | long *jprobe_saved_esp; | ||
65 | struct pt_regs jprobe_saved_regs; | ||
66 | kprobe_opcode_t jprobes_stack[MAX_STACK_SIZE]; | ||
67 | struct prev_kprobe prev_kprobe; | ||
68 | }; | ||
52 | 69 | ||
53 | /* trap3/1 are intr gates for kprobes. So, restore the status of IF, | 70 | /* trap3/1 are intr gates for kprobes. So, restore the status of IF, |
54 | * if necessary, before executing the original int3/1 (trap) handler. | 71 | * if necessary, before executing the original int3/1 (trap) handler. |
diff --git a/include/asm-i386/msi.h b/include/asm-i386/msi.h index b85393094c83..f041d4495faf 100644 --- a/include/asm-i386/msi.h +++ b/include/asm-i386/msi.h | |||
@@ -10,13 +10,6 @@ | |||
10 | #include <mach_apic.h> | 10 | #include <mach_apic.h> |
11 | 11 | ||
12 | #define LAST_DEVICE_VECTOR 232 | 12 | #define LAST_DEVICE_VECTOR 232 |
13 | #define MSI_DEST_MODE MSI_LOGICAL_MODE | 13 | #define MSI_TARGET_CPU_SHIFT 12 |
14 | #define MSI_TARGET_CPU_SHIFT 12 | ||
15 | |||
16 | #ifdef CONFIG_SMP | ||
17 | #define MSI_TARGET_CPU logical_smp_processor_id() | ||
18 | #else | ||
19 | #define MSI_TARGET_CPU cpu_to_logical_apicid(first_cpu(cpu_online_map)) | ||
20 | #endif | ||
21 | 14 | ||
22 | #endif /* ASM_MSI_H */ | 15 | #endif /* ASM_MSI_H */ |
diff --git a/include/asm-i386/pgtable.h b/include/asm-i386/pgtable.h index 03f3c8ac6383..088a945bf26b 100644 --- a/include/asm-i386/pgtable.h +++ b/include/asm-i386/pgtable.h | |||
@@ -25,6 +25,9 @@ | |||
25 | #include <linux/list.h> | 25 | #include <linux/list.h> |
26 | #include <linux/spinlock.h> | 26 | #include <linux/spinlock.h> |
27 | 27 | ||
28 | struct mm_struct; | ||
29 | struct vm_area_struct; | ||
30 | |||
28 | /* | 31 | /* |
29 | * ZERO_PAGE is a global shared page that is always zero: used | 32 | * ZERO_PAGE is a global shared page that is always zero: used |
30 | * for zero-mapped memory areas etc.. | 33 | * for zero-mapped memory areas etc.. |
diff --git a/include/asm-i386/processor.h b/include/asm-i386/processor.h index 9cd4a05234a1..5c96cf6dcb39 100644 --- a/include/asm-i386/processor.h +++ b/include/asm-i386/processor.h | |||
@@ -720,4 +720,10 @@ extern void mtrr_bp_init(void); | |||
720 | #define mtrr_bp_init() do {} while (0) | 720 | #define mtrr_bp_init() do {} while (0) |
721 | #endif | 721 | #endif |
722 | 722 | ||
723 | #ifdef CONFIG_X86_MCE | ||
724 | extern void mcheck_init(struct cpuinfo_x86 *c); | ||
725 | #else | ||
726 | #define mcheck_init(c) do {} while(0) | ||
727 | #endif | ||
728 | |||
723 | #endif /* __ASM_I386_PROCESSOR_H */ | 729 | #endif /* __ASM_I386_PROCESSOR_H */ |
diff --git a/include/asm-i386/smp.h b/include/asm-i386/smp.h index 13250199976d..61d3ab9db70c 100644 --- a/include/asm-i386/smp.h +++ b/include/asm-i386/smp.h | |||
@@ -45,6 +45,8 @@ extern void unlock_ipi_call_lock(void); | |||
45 | #define MAX_APICID 256 | 45 | #define MAX_APICID 256 |
46 | extern u8 x86_cpu_to_apicid[]; | 46 | extern u8 x86_cpu_to_apicid[]; |
47 | 47 | ||
48 | #define cpu_physical_id(cpu) x86_cpu_to_apicid[cpu] | ||
49 | |||
48 | #ifdef CONFIG_HOTPLUG_CPU | 50 | #ifdef CONFIG_HOTPLUG_CPU |
49 | extern void cpu_exit_clear(void); | 51 | extern void cpu_exit_clear(void); |
50 | extern void cpu_uninit(void); | 52 | extern void cpu_uninit(void); |
@@ -92,6 +94,10 @@ extern int __cpu_disable(void); | |||
92 | extern void __cpu_die(unsigned int cpu); | 94 | extern void __cpu_die(unsigned int cpu); |
93 | #endif /* !__ASSEMBLY__ */ | 95 | #endif /* !__ASSEMBLY__ */ |
94 | 96 | ||
97 | #else /* CONFIG_SMP */ | ||
98 | |||
99 | #define cpu_physical_id(cpu) boot_cpu_physical_apicid | ||
100 | |||
95 | #define NO_PROC_ID 0xFF /* No processor magic marker */ | 101 | #define NO_PROC_ID 0xFF /* No processor magic marker */ |
96 | 102 | ||
97 | #endif | 103 | #endif |
diff --git a/include/asm-i386/system.h b/include/asm-i386/system.h index 97d52ac49e46..772f85da1206 100644 --- a/include/asm-i386/system.h +++ b/include/asm-i386/system.h | |||
@@ -263,6 +263,10 @@ static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int siz | |||
263 | 263 | ||
264 | #ifdef CONFIG_X86_CMPXCHG | 264 | #ifdef CONFIG_X86_CMPXCHG |
265 | #define __HAVE_ARCH_CMPXCHG 1 | 265 | #define __HAVE_ARCH_CMPXCHG 1 |
266 | #define cmpxchg(ptr,o,n)\ | ||
267 | ((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),\ | ||
268 | (unsigned long)(n),sizeof(*(ptr)))) | ||
269 | #endif | ||
266 | 270 | ||
267 | static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old, | 271 | static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old, |
268 | unsigned long new, int size) | 272 | unsigned long new, int size) |
@@ -291,10 +295,42 @@ static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old, | |||
291 | return old; | 295 | return old; |
292 | } | 296 | } |
293 | 297 | ||
294 | #define cmpxchg(ptr,o,n)\ | 298 | #ifndef CONFIG_X86_CMPXCHG |
295 | ((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),\ | 299 | /* |
296 | (unsigned long)(n),sizeof(*(ptr)))) | 300 | * Building a kernel capable running on 80386. It may be necessary to |
301 | * simulate the cmpxchg on the 80386 CPU. For that purpose we define | ||
302 | * a function for each of the sizes we support. | ||
303 | */ | ||
297 | 304 | ||
305 | extern unsigned long cmpxchg_386_u8(volatile void *, u8, u8); | ||
306 | extern unsigned long cmpxchg_386_u16(volatile void *, u16, u16); | ||
307 | extern unsigned long cmpxchg_386_u32(volatile void *, u32, u32); | ||
308 | |||
309 | static inline unsigned long cmpxchg_386(volatile void *ptr, unsigned long old, | ||
310 | unsigned long new, int size) | ||
311 | { | ||
312 | switch (size) { | ||
313 | case 1: | ||
314 | return cmpxchg_386_u8(ptr, old, new); | ||
315 | case 2: | ||
316 | return cmpxchg_386_u16(ptr, old, new); | ||
317 | case 4: | ||
318 | return cmpxchg_386_u32(ptr, old, new); | ||
319 | } | ||
320 | return old; | ||
321 | } | ||
322 | |||
323 | #define cmpxchg(ptr,o,n) \ | ||
324 | ({ \ | ||
325 | __typeof__(*(ptr)) __ret; \ | ||
326 | if (likely(boot_cpu_data.x86 > 3)) \ | ||
327 | __ret = __cmpxchg((ptr), (unsigned long)(o), \ | ||
328 | (unsigned long)(n), sizeof(*(ptr))); \ | ||
329 | else \ | ||
330 | __ret = cmpxchg_386((ptr), (unsigned long)(o), \ | ||
331 | (unsigned long)(n), sizeof(*(ptr))); \ | ||
332 | __ret; \ | ||
333 | }) | ||
298 | #endif | 334 | #endif |
299 | 335 | ||
300 | #ifdef CONFIG_X86_CMPXCHG64 | 336 | #ifdef CONFIG_X86_CMPXCHG64 |