blob: c31ca048a901f71c585bfce5032541731847ffa6 [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 {
Brian Gerstc6f5e0a2009-01-19 00:38:58 +090014 unsigned long unused1;
15 unsigned long unused2;
Brian Gerst9af45652009-01-19 00:38:58 +090016 unsigned long unused3;
Brian Gerst3d1e42a2009-01-19 00:38:58 +090017 unsigned long unused4;
Brian Gerst56895532009-01-19 00:38:58 +090018 int unused5;
Brian Gerstea927902009-01-19 00:38:58 +090019 unsigned int unused6; /* 36 was cpunumber */
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
Mike Travis3461b0a2008-05-12 21:21:13 +020025 short in_bootmem; /* pda lives in bootmem */
Andi Kleenb9169112005-09-12 18:49:24 +020026} ____cacheline_aligned_in_smp;
Linus Torvalds1da177e2005-04-16 15:20:36 -070027
Tejun Heob12d8db2009-01-13 20:41:35 +090028DECLARE_PER_CPU(struct x8664_pda, __pda);
Thomas Gleixner40fec502008-01-30 13:30:18 +010029extern void pda_init(int);
Ravikiran G Thirumalaidf79efd2006-01-11 22:45:39 +010030
Tejun Heob12d8db2009-01-13 20:41:35 +090031#define cpu_pda(cpu) (&per_cpu(__pda, cpu))
Linus Torvalds1da177e2005-04-16 15:20:36 -070032
Ingo Molnar6dbde352009-01-15 22:15:53 +090033#define read_pda(field) percpu_read(__pda.field)
34#define write_pda(field, val) percpu_write(__pda.field, val)
35#define add_pda(field, val) percpu_add(__pda.field, val)
36#define sub_pda(field, val) percpu_sub(__pda.field, val)
37#define or_pda(field, val) percpu_or(__pda.field, val)
Linus Torvalds1da177e2005-04-16 15:20:36 -070038
Andi Kleen94468682006-11-14 16:57:46 +010039/* This is not atomic against other CPUs -- CPU preemption needs to be off */
Joe Perches46e1abc2008-03-23 01:03:05 -070040#define test_and_clear_bit_pda(bit, field) \
Tejun Heo49357d12009-01-13 20:41:35 +090041 x86_test_and_clear_bit_percpu(bit, __pda.field)
Andi Kleen94468682006-11-14 16:57:46 +010042
Linus Torvalds1da177e2005-04-16 15:20:36 -070043#endif
44
H. Peter Anvin1965aae2008-10-22 22:26:29 -070045#endif /* _ASM_X86_PDA_H */