blob: 7209302d922756fa20c4c7a24925d9a045350fd5 [file] [log] [blame]
H. Peter Anvin1965aae2008-10-22 22:26:29 -07001#ifndef _ASM_X86_PDA_H
2#define _ASM_X86_PDA_H
Linus Torvalds1da177e2005-04-16 15:20:36 -07003
4#ifndef __ASSEMBLY__
5#include <linux/stddef.h>
6#include <linux/types.h>
7#include <linux/cache.h>
Tejun Heoc8f33292009-01-13 20:41:35 +09008#include <linux/threads.h>
Jan Beulichb556b35e2006-01-11 22:43:00 +01009#include <asm/page.h>
Tejun Heob12d8db2009-01-13 20:41:35 +090010#include <asm/percpu.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070011
Cyrill Gorcunovfe758fb2008-01-30 13:31:25 +010012/* Per processor datastructure. %gs points to it while the kernel runs */
Linus Torvalds1da177e2005-04-16 15:20:36 -070013struct x8664_pda {
Brian Gerstc6f5e0a2009-01-19 00:38:58 +090014 unsigned long unused1;
15 unsigned long unused2;
Cyrill Gorcunovfe758fb2008-01-30 13:31:25 +010016 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 Gerstea927902009-01-19 00:38:58 +090019 unsigned int unused6; /* 36 was cpunumber */
Arjan van de Ven0a4254052006-09-26 10:52:38 +020020#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 Travis3461b0a2008-05-12 21:21:13 +020025 short nodenumber; /* number of current node (32k max) */
26 short in_bootmem; /* pda lives in bootmem */
Andi Kleena15da492006-09-26 10:52:40 +020027 short isidle;
Andi Kleenb9169112005-09-12 18:49:24 +020028} ____cacheline_aligned_in_smp;
Linus Torvalds1da177e2005-04-16 15:20:36 -070029
Tejun Heob12d8db2009-01-13 20:41:35 +090030DECLARE_PER_CPU(struct x8664_pda, __pda);
Thomas Gleixner40fec502008-01-30 13:30:18 +010031extern void pda_init(int);
Ravikiran G Thirumalaidf79efd2006-01-11 22:45:39 +010032
Tejun Heob12d8db2009-01-13 20:41:35 +090033#define cpu_pda(cpu) (&per_cpu(__pda, cpu))
Linus Torvalds1da177e2005-04-16 15:20:36 -070034
Ingo Molnar6dbde352009-01-15 22:15:53 +090035#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 Torvalds1da177e2005-04-16 15:20:36 -070040
Andi Kleen94468682006-11-14 16:57:46 +010041/* This is not atomic against other CPUs -- CPU preemption needs to be off */
Joe Perches46e1abc2008-03-23 01:03:05 -070042#define test_and_clear_bit_pda(bit, field) \
Tejun Heo49357d12009-01-13 20:41:35 +090043 x86_test_and_clear_bit_percpu(bit, __pda.field)
Andi Kleen94468682006-11-14 16:57:46 +010044
Linus Torvalds1da177e2005-04-16 15:20:36 -070045#endif
46
47#define PDA_STACKOFFSET (5*8)
48
H. Peter Anvin1965aae2008-10-22 22:26:29 -070049#endif /* _ASM_X86_PDA_H */