blob: 47f274fe6953b0e4963eff70de820d3fc7d890ff [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 Beulichb556b352006-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 {
Arjan van de Ven29a9af62006-09-26 10:52:38 +020014 struct task_struct *pcurrent; /* 0 Current process */
Tejun Heo9939dda2009-01-13 20:41:35 +090015 unsigned long dummy;
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 */
19 unsigned int cpunumber; /* 36 Logical CPU number */
Arjan van de Ven0a425402006-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
25 char *irqstackptr;
Mike Travis3461b0a2008-05-12 21:21:13 +020026 short nodenumber; /* number of current node (32k max) */
27 short in_bootmem; /* pda lives in bootmem */
Linus Torvalds1da177e2005-04-16 15:20:36 -070028 unsigned int __softirq_pending;
29 unsigned int __nmi_count; /* number of NMI on this CPUs */
Andi Kleena15da492006-09-26 10:52:40 +020030 short mmu_state;
31 short isidle;
Arjan van de Vendf920042006-03-25 16:31:01 +010032 struct mm_struct *active_mm;
Linus Torvalds1da177e2005-04-16 15:20:36 -070033 unsigned apic_timer_irqs;
Thomas Gleixner4e77ae32007-10-12 23:04:07 +020034 unsigned irq0_irqs;
Joe Korty38e760a2007-10-17 18:04:40 +020035 unsigned irq_resched_count;
36 unsigned irq_call_count;
37 unsigned irq_tlb_count;
38 unsigned irq_thermal_count;
39 unsigned irq_threshold_count;
40 unsigned irq_spurious_count;
Andi Kleenb9169112005-09-12 18:49:24 +020041} ____cacheline_aligned_in_smp;
Linus Torvalds1da177e2005-04-16 15:20:36 -070042
Tejun Heob12d8db2009-01-13 20:41:35 +090043DECLARE_PER_CPU(struct x8664_pda, __pda);
Thomas Gleixner40fec502008-01-30 13:30:18 +010044extern void pda_init(int);
Ravikiran G Thirumalaidf79efd2006-01-11 22:45:39 +010045
Tejun Heob12d8db2009-01-13 20:41:35 +090046#define cpu_pda(cpu) (&per_cpu(__pda, cpu))
Linus Torvalds1da177e2005-04-16 15:20:36 -070047
Ingo Molnar6dbde352009-01-15 22:15:53 +090048#define read_pda(field) percpu_read(__pda.field)
49#define write_pda(field, val) percpu_write(__pda.field, val)
50#define add_pda(field, val) percpu_add(__pda.field, val)
51#define sub_pda(field, val) percpu_sub(__pda.field, val)
52#define or_pda(field, val) percpu_or(__pda.field, val)
Linus Torvalds1da177e2005-04-16 15:20:36 -070053
Andi Kleen94468682006-11-14 16:57:46 +010054/* This is not atomic against other CPUs -- CPU preemption needs to be off */
Joe Perches46e1abc2008-03-23 01:03:05 -070055#define test_and_clear_bit_pda(bit, field) \
Tejun Heo49357d12009-01-13 20:41:35 +090056 x86_test_and_clear_bit_percpu(bit, __pda.field)
Andi Kleen94468682006-11-14 16:57:46 +010057
Linus Torvalds1da177e2005-04-16 15:20:36 -070058#endif
59
60#define PDA_STACKOFFSET (5*8)
61
H. Peter Anvin1965aae2008-10-22 22:26:29 -070062#endif /* _ASM_X86_PDA_H */