diff options
author | Glauber de Oliveira Costa <gcosta@redhat.com> | 2008-01-30 07:31:31 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-01-30 07:31:31 -0500 |
commit | ca241c75037b32e0216a68e39ad2801d04fa1f87 (patch) | |
tree | be6b42124c9ead67999ee7ec810f9b1f1e25675d /include/asm-x86/processor.h | |
parent | 0ccb8acc51693a2aef0f38024943808046d81251 (diff) |
x86: unify tss_struct
Although slighly different, the tss_struct is very similar in x86_64 and
i386. The really different part, which matchs the hardware vision of it, is
now called x86_hw_tss, and each of the architectures provides yours.
It's then used as a field in the outter tss_struct.
Signed-off-by: Glauber de Oliveira Costa <gcosta@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'include/asm-x86/processor.h')
-rw-r--r-- | include/asm-x86/processor.h | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/include/asm-x86/processor.h b/include/asm-x86/processor.h index 3deb5ba55f55..cede9ad3dc6e 100644 --- a/include/asm-x86/processor.h +++ b/include/asm-x86/processor.h | |||
@@ -8,6 +8,7 @@ struct task_struct; | |||
8 | struct mm_struct; | 8 | struct mm_struct; |
9 | 9 | ||
10 | #include <asm/page.h> | 10 | #include <asm/page.h> |
11 | #include <asm/percpu.h> | ||
11 | #include <asm/system.h> | 12 | #include <asm/system.h> |
12 | 13 | ||
13 | /* | 14 | /* |
@@ -39,6 +40,82 @@ static inline void load_cr3(pgd_t *pgdir) | |||
39 | } | 40 | } |
40 | 41 | ||
41 | #ifdef CONFIG_X86_32 | 42 | #ifdef CONFIG_X86_32 |
43 | /* This is the TSS defined by the hardware. */ | ||
44 | struct x86_hw_tss { | ||
45 | unsigned short back_link, __blh; | ||
46 | unsigned long sp0; | ||
47 | unsigned short ss0, __ss0h; | ||
48 | unsigned long sp1; | ||
49 | unsigned short ss1, __ss1h; /* ss1 caches MSR_IA32_SYSENTER_CS */ | ||
50 | unsigned long sp2; | ||
51 | unsigned short ss2, __ss2h; | ||
52 | unsigned long __cr3; | ||
53 | unsigned long ip; | ||
54 | unsigned long flags; | ||
55 | unsigned long ax, cx, dx, bx; | ||
56 | unsigned long sp, bp, si, di; | ||
57 | unsigned short es, __esh; | ||
58 | unsigned short cs, __csh; | ||
59 | unsigned short ss, __ssh; | ||
60 | unsigned short ds, __dsh; | ||
61 | unsigned short fs, __fsh; | ||
62 | unsigned short gs, __gsh; | ||
63 | unsigned short ldt, __ldth; | ||
64 | unsigned short trace, io_bitmap_base; | ||
65 | } __attribute__((packed)); | ||
66 | #else | ||
67 | struct x86_hw_tss { | ||
68 | u32 reserved1; | ||
69 | u64 sp0; | ||
70 | u64 sp1; | ||
71 | u64 sp2; | ||
72 | u64 reserved2; | ||
73 | u64 ist[7]; | ||
74 | u32 reserved3; | ||
75 | u32 reserved4; | ||
76 | u16 reserved5; | ||
77 | u16 io_bitmap_base; | ||
78 | } __attribute__((packed)) ____cacheline_aligned; | ||
79 | #endif | ||
80 | |||
81 | /* | ||
82 | * Size of io_bitmap. | ||
83 | */ | ||
84 | #define IO_BITMAP_BITS 65536 | ||
85 | #define IO_BITMAP_BYTES (IO_BITMAP_BITS/8) | ||
86 | #define IO_BITMAP_LONGS (IO_BITMAP_BYTES/sizeof(long)) | ||
87 | #define IO_BITMAP_OFFSET offsetof(struct tss_struct, io_bitmap) | ||
88 | #define INVALID_IO_BITMAP_OFFSET 0x8000 | ||
89 | #define INVALID_IO_BITMAP_OFFSET_LAZY 0x9000 | ||
90 | |||
91 | struct tss_struct { | ||
92 | struct x86_hw_tss x86_tss; | ||
93 | |||
94 | /* | ||
95 | * The extra 1 is there because the CPU will access an | ||
96 | * additional byte beyond the end of the IO permission | ||
97 | * bitmap. The extra byte must be all 1 bits, and must | ||
98 | * be within the limit. | ||
99 | */ | ||
100 | unsigned long io_bitmap[IO_BITMAP_LONGS + 1]; | ||
101 | /* | ||
102 | * Cache the current maximum and the last task that used the bitmap: | ||
103 | */ | ||
104 | unsigned long io_bitmap_max; | ||
105 | struct thread_struct *io_bitmap_owner; | ||
106 | /* | ||
107 | * pads the TSS to be cacheline-aligned (size is 0x100) | ||
108 | */ | ||
109 | unsigned long __cacheline_filler[35]; | ||
110 | /* | ||
111 | * .. and then another 0x100 bytes for emergency kernel stack | ||
112 | */ | ||
113 | unsigned long stack[64]; | ||
114 | } __attribute__((packed)); | ||
115 | |||
116 | DECLARE_PER_CPU(struct tss_struct, init_tss); | ||
117 | |||
118 | #ifdef CONFIG_X86_32 | ||
42 | # include "processor_32.h" | 119 | # include "processor_32.h" |
43 | #else | 120 | #else |
44 | # include "processor_64.h" | 121 | # include "processor_64.h" |