Rev 1184 | Rev 1201 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1184 | Rev 1187 | ||
---|---|---|---|
Line 64... | Line 64... | ||
64 | #define AR_TRAP (0xf) |
64 | #define AR_TRAP (0xf) |
65 | 65 | ||
66 | #define DPL_KERNEL (PL_KERNEL<<5) |
66 | #define DPL_KERNEL (PL_KERNEL<<5) |
67 | #define DPL_USER (PL_USER<<5) |
67 | #define DPL_USER (PL_USER<<5) |
68 | 68 | ||
69 | #define IO_MAP_BASE (104) |
69 | #define TSS_BASIC_SIZE 104 |
70 | 70 | ||
71 | #ifndef __ASM__ |
71 | #ifndef __ASM__ |
72 | 72 | ||
73 | struct descriptor { |
73 | struct descriptor { |
74 | unsigned limit_0_15: 16; |
74 | unsigned limit_0_15: 16; |
Line 80... | Line 80... | ||
80 | unsigned longmode: 1; |
80 | unsigned longmode: 1; |
81 | unsigned special: 1; |
81 | unsigned special: 1; |
82 | unsigned granularity : 1; |
82 | unsigned granularity : 1; |
83 | unsigned base_24_31: 8; |
83 | unsigned base_24_31: 8; |
84 | } __attribute__ ((packed)); |
84 | } __attribute__ ((packed)); |
- | 85 | typedef struct descriptor descriptor_t; |
|
85 | 86 | ||
86 | struct tss_descriptor { |
87 | struct tss_descriptor { |
87 | unsigned limit_0_15: 16; |
88 | unsigned limit_0_15: 16; |
88 | unsigned base_0_15: 16; |
89 | unsigned base_0_15: 16; |
89 | unsigned base_16_23: 8; |
90 | unsigned base_16_23: 8; |
90 | unsigned type: 4; |
91 | unsigned type: 4; |
91 | unsigned : 1; |
92 | unsigned : 1; |
92 | unsigned dpl : 2; |
93 | unsigned dpl : 2; |
93 | unsigned present : 1; |
94 | unsigned present : 1; |
94 | unsigned limit_16_19: 4; |
95 | unsigned limit_16_19: 4; |
95 | unsigned available: 1; |
96 | unsigned available: 1; |
96 | unsigned : 2; |
97 | unsigned : 2; |
97 | unsigned granularity : 1; |
98 | unsigned granularity : 1; |
98 | unsigned base_24_31: 8; |
99 | unsigned base_24_31: 8; |
99 | unsigned base_32_63 : 32; |
100 | unsigned base_32_63 : 32; |
100 | unsigned : 32; |
101 | unsigned : 32; |
101 | } __attribute__ ((packed)); |
102 | } __attribute__ ((packed)); |
- | 103 | typedef struct tss_descriptor tss_descriptor_t; |
|
102 | 104 | ||
103 | struct idescriptor { |
105 | struct idescriptor { |
104 | unsigned offset_0_15: 16; |
106 | unsigned offset_0_15: 16; |
105 | unsigned selector: 16; |
107 | unsigned selector: 16; |
106 | unsigned ist:3; |
108 | unsigned ist:3; |
Line 110... | Line 112... | ||
110 | unsigned present : 1; |
112 | unsigned present : 1; |
111 | unsigned offset_16_31: 16; |
113 | unsigned offset_16_31: 16; |
112 | unsigned offset_32_63: 32; |
114 | unsigned offset_32_63: 32; |
113 | unsigned : 32; |
115 | unsigned : 32; |
114 | } __attribute__ ((packed)); |
116 | } __attribute__ ((packed)); |
- | 117 | typedef struct idescriptor idescriptor_t; |
|
115 | 118 | ||
116 | struct ptr_16_64 { |
119 | struct ptr_16_64 { |
117 | __u16 limit; |
120 | __u16 limit; |
118 | __u64 base; |
121 | __u64 base; |
119 | } __attribute__ ((packed)); |
122 | } __attribute__ ((packed)); |
- | 123 | typedef struct ptr_16_64 ptr_16_64_t; |
|
120 | 124 | ||
121 | struct ptr_16_32 { |
125 | struct ptr_16_32 { |
122 | __u16 limit; |
126 | __u16 limit; |
123 | __u32 base; |
127 | __u32 base; |
124 | } __attribute__ ((packed)); |
128 | } __attribute__ ((packed)); |
- | 129 | typedef struct ptr_16_32 ptr_16_32_t; |
|
125 | 130 | ||
126 | struct tss { |
131 | struct tss { |
127 | __u32 reserve1; |
132 | __u32 reserve1; |
128 | __u64 rsp0; |
133 | __u64 rsp0; |
129 | __u64 rsp1; |
134 | __u64 rsp1; |
Line 139... | Line 144... | ||
139 | __u64 reserve3; |
144 | __u64 reserve3; |
140 | __u16 reserve4; |
145 | __u16 reserve4; |
141 | __u16 iomap_base; |
146 | __u16 iomap_base; |
142 | __u8 iomap[0x10000 + 1]; /* 64K + 1 terminating byte */ |
147 | __u8 iomap[0x10000 + 1]; /* 64K + 1 terminating byte */ |
143 | } __attribute__ ((packed)); |
148 | } __attribute__ ((packed)); |
- | 149 | typedef struct tss tss_t; |
|
144 | 150 | ||
145 | extern struct tss *tss_p; |
151 | extern tss_t *tss_p; |
146 | 152 | ||
147 | extern struct descriptor gdt[]; |
153 | extern descriptor_t gdt[]; |
148 | extern struct idescriptor idt[]; |
154 | extern idescriptor_t idt[]; |
149 | 155 | ||
150 | extern struct ptr_16_64 gdtr; |
156 | extern ptr_16_64_t gdtr; |
151 | extern struct ptr_16_32 bootstrap_gdtr; |
157 | extern ptr_16_32_t bootstrap_gdtr; |
152 | extern struct ptr_16_32 protected_ap_gdtr; |
158 | extern ptr_16_32_t protected_ap_gdtr; |
153 | 159 | ||
154 | extern void pm_init(void); |
160 | extern void pm_init(void); |
155 | 161 | ||
156 | extern void gdt_tss_setbase(struct descriptor *d, __address base); |
162 | extern void gdt_tss_setbase(descriptor_t *d, __address base); |
157 | extern void gdt_tss_setlimit(struct descriptor *d, __u32 limit); |
163 | extern void gdt_tss_setlimit(descriptor_t *d, __u32 limit); |
158 | 164 | ||
159 | extern void idt_init(void); |
165 | extern void idt_init(void); |
160 | extern void idt_setoffset(struct idescriptor *d, __address offset); |
166 | extern void idt_setoffset(idescriptor_t *d, __address offset); |
161 | 167 | ||
162 | extern void tss_initialize(struct tss *t); |
168 | extern void tss_initialize(tss_t *t); |
163 | 169 | ||
164 | #endif /* __ASM__ */ |
170 | #endif /* __ASM__ */ |
165 | 171 | ||
166 | #endif |
172 | #endif |