H. Peter Anvin | 1965aae | 2008-10-22 22:26:29 -0700 | [diff] [blame] | 1 | #ifndef _ASM_X86_PDA_H |
| 2 | #define _ASM_X86_PDA_H |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 3 | |
| 4 | #ifndef __ASSEMBLY__ |
| 5 | #include <linux/stddef.h> |
| 6 | #include <linux/types.h> |
| 7 | #include <linux/cache.h> |
Tejun Heo | c8f3329 | 2009-01-13 20:41:35 +0900 | [diff] [blame] | 8 | #include <linux/threads.h> |
Jan Beulich | b556b35e | 2006-01-11 22:43:00 +0100 | [diff] [blame] | 9 | #include <asm/page.h> |
Tejun Heo | b12d8db | 2009-01-13 20:41:35 +0900 | [diff] [blame] | 10 | #include <asm/percpu.h> |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 11 | |
Cyrill Gorcunov | fe758fb | 2008-01-30 13:31:25 +0100 | [diff] [blame] | 12 | /* Per processor datastructure. %gs points to it while the kernel runs */ |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 13 | struct x8664_pda { |
Brian Gerst | c6f5e0a | 2009-01-19 00:38:58 +0900 | [diff] [blame^] | 14 | unsigned long unused1; |
| 15 | unsigned long unused2; |
Cyrill Gorcunov | fe758fb | 2008-01-30 13:31:25 +0100 | [diff] [blame] | 16 | unsigned long kernelstack; /* 16 top of kernel stack for current */ |
| 17 | unsigned long oldrsp; /* 24 user rsp for system call */ |
| 18 | int irqcount; /* 32 Irq nesting counter. Starts -1 */ |
Brian Gerst | ea92790 | 2009-01-19 00:38:58 +0900 | [diff] [blame] | 19 | unsigned int unused6; /* 36 was cpunumber */ |
Arjan van de Ven | 0a425405 | 2006-09-26 10:52:38 +0200 | [diff] [blame] | 20 | #ifdef CONFIG_CC_STACKPROTECTOR |
| 21 | unsigned long stack_canary; /* 40 stack canary value */ |
| 22 | /* gcc-ABI: this canary MUST be at |
| 23 | offset 40!!! */ |
| 24 | #endif |
Mike Travis | 3461b0a | 2008-05-12 21:21:13 +0200 | [diff] [blame] | 25 | short nodenumber; /* number of current node (32k max) */ |
| 26 | short in_bootmem; /* pda lives in bootmem */ |
Andi Kleen | a15da49 | 2006-09-26 10:52:40 +0200 | [diff] [blame] | 27 | short isidle; |
Andi Kleen | b916911 | 2005-09-12 18:49:24 +0200 | [diff] [blame] | 28 | } ____cacheline_aligned_in_smp; |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 29 | |
Tejun Heo | b12d8db | 2009-01-13 20:41:35 +0900 | [diff] [blame] | 30 | DECLARE_PER_CPU(struct x8664_pda, __pda); |
Thomas Gleixner | 40fec50 | 2008-01-30 13:30:18 +0100 | [diff] [blame] | 31 | extern void pda_init(int); |
Ravikiran G Thirumalai | df79efd | 2006-01-11 22:45:39 +0100 | [diff] [blame] | 32 | |
Tejun Heo | b12d8db | 2009-01-13 20:41:35 +0900 | [diff] [blame] | 33 | #define cpu_pda(cpu) (&per_cpu(__pda, cpu)) |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 34 | |
Ingo Molnar | 6dbde35 | 2009-01-15 22:15:53 +0900 | [diff] [blame] | 35 | #define read_pda(field) percpu_read(__pda.field) |
| 36 | #define write_pda(field, val) percpu_write(__pda.field, val) |
| 37 | #define add_pda(field, val) percpu_add(__pda.field, val) |
| 38 | #define sub_pda(field, val) percpu_sub(__pda.field, val) |
| 39 | #define or_pda(field, val) percpu_or(__pda.field, val) |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 40 | |
Andi Kleen | 9446868 | 2006-11-14 16:57:46 +0100 | [diff] [blame] | 41 | /* This is not atomic against other CPUs -- CPU preemption needs to be off */ |
Joe Perches | 46e1abc | 2008-03-23 01:03:05 -0700 | [diff] [blame] | 42 | #define test_and_clear_bit_pda(bit, field) \ |
Tejun Heo | 49357d1 | 2009-01-13 20:41:35 +0900 | [diff] [blame] | 43 | x86_test_and_clear_bit_percpu(bit, __pda.field) |
Andi Kleen | 9446868 | 2006-11-14 16:57:46 +0100 | [diff] [blame] | 44 | |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 45 | #endif |
| 46 | |
| 47 | #define PDA_STACKOFFSET (5*8) |
| 48 | |
H. Peter Anvin | 1965aae | 2008-10-22 22:26:29 -0700 | [diff] [blame] | 49 | #endif /* _ASM_X86_PDA_H */ |