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 |