diff options
Diffstat (limited to 'include/asm-x86/desc.h')
-rw-r--r-- | include/asm-x86/desc.h | 61 |
1 files changed, 31 insertions, 30 deletions
diff --git a/include/asm-x86/desc.h b/include/asm-x86/desc.h index 5b6a05d3a771..268a012bcd79 100644 --- a/include/asm-x86/desc.h +++ b/include/asm-x86/desc.h | |||
@@ -62,8 +62,8 @@ static inline struct desc_struct *get_cpu_gdt_table(unsigned int cpu) | |||
62 | } | 62 | } |
63 | 63 | ||
64 | static inline void pack_gate(gate_desc *gate, unsigned char type, | 64 | static inline void pack_gate(gate_desc *gate, unsigned char type, |
65 | unsigned long base, unsigned dpl, unsigned flags, unsigned short seg) | 65 | unsigned long base, unsigned dpl, unsigned flags, |
66 | 66 | unsigned short seg) | |
67 | { | 67 | { |
68 | gate->a = (seg << 16) | (base & 0xffff); | 68 | gate->a = (seg << 16) | (base & 0xffff); |
69 | gate->b = (base & 0xffff0000) | | 69 | gate->b = (base & 0xffff0000) | |
@@ -84,22 +84,23 @@ static inline int desc_empty(const void *ptr) | |||
84 | #define load_TR_desc() native_load_tr_desc() | 84 | #define load_TR_desc() native_load_tr_desc() |
85 | #define load_gdt(dtr) native_load_gdt(dtr) | 85 | #define load_gdt(dtr) native_load_gdt(dtr) |
86 | #define load_idt(dtr) native_load_idt(dtr) | 86 | #define load_idt(dtr) native_load_idt(dtr) |
87 | #define load_tr(tr) __asm__ __volatile("ltr %0"::"m" (tr)) | 87 | #define load_tr(tr) asm volatile("ltr %0"::"m" (tr)) |
88 | #define load_ldt(ldt) __asm__ __volatile("lldt %0"::"m" (ldt)) | 88 | #define load_ldt(ldt) asm volatile("lldt %0"::"m" (ldt)) |
89 | 89 | ||
90 | #define store_gdt(dtr) native_store_gdt(dtr) | 90 | #define store_gdt(dtr) native_store_gdt(dtr) |
91 | #define store_idt(dtr) native_store_idt(dtr) | 91 | #define store_idt(dtr) native_store_idt(dtr) |
92 | #define store_tr(tr) (tr = native_store_tr()) | 92 | #define store_tr(tr) (tr = native_store_tr()) |
93 | #define store_ldt(ldt) __asm__ ("sldt %0":"=m" (ldt)) | 93 | #define store_ldt(ldt) asm("sldt %0":"=m" (ldt)) |
94 | 94 | ||
95 | #define load_TLS(t, cpu) native_load_tls(t, cpu) | 95 | #define load_TLS(t, cpu) native_load_tls(t, cpu) |
96 | #define set_ldt native_set_ldt | 96 | #define set_ldt native_set_ldt |
97 | 97 | ||
98 | #define write_ldt_entry(dt, entry, desc) \ | 98 | #define write_ldt_entry(dt, entry, desc) \ |
99 | native_write_ldt_entry(dt, entry, desc) | 99 | native_write_ldt_entry(dt, entry, desc) |
100 | #define write_gdt_entry(dt, entry, desc, type) \ | 100 | #define write_gdt_entry(dt, entry, desc, type) \ |
101 | native_write_gdt_entry(dt, entry, desc, type) | 101 | native_write_gdt_entry(dt, entry, desc, type) |
102 | #define write_idt_entry(dt, entry, g) native_write_idt_entry(dt, entry, g) | 102 | #define write_idt_entry(dt, entry, g) \ |
103 | native_write_idt_entry(dt, entry, g) | ||
103 | #endif | 104 | #endif |
104 | 105 | ||
105 | static inline void native_write_idt_entry(gate_desc *idt, int entry, | 106 | static inline void native_write_idt_entry(gate_desc *idt, int entry, |
@@ -138,8 +139,8 @@ static inline void pack_descriptor(struct desc_struct *desc, unsigned long base, | |||
138 | { | 139 | { |
139 | desc->a = ((base & 0xffff) << 16) | (limit & 0xffff); | 140 | desc->a = ((base & 0xffff) << 16) | (limit & 0xffff); |
140 | desc->b = (base & 0xff000000) | ((base & 0xff0000) >> 16) | | 141 | desc->b = (base & 0xff000000) | ((base & 0xff0000) >> 16) | |
141 | (limit & 0x000f0000) | ((type & 0xff) << 8) | | 142 | (limit & 0x000f0000) | ((type & 0xff) << 8) | |
142 | ((flags & 0xf) << 20); | 143 | ((flags & 0xf) << 20); |
143 | desc->p = 1; | 144 | desc->p = 1; |
144 | } | 145 | } |
145 | 146 | ||
@@ -159,7 +160,6 @@ static inline void set_tssldt_descriptor(void *d, unsigned long addr, | |||
159 | desc->base2 = (PTR_MIDDLE(addr) >> 8) & 0xFF; | 160 | desc->base2 = (PTR_MIDDLE(addr) >> 8) & 0xFF; |
160 | desc->base3 = PTR_HIGH(addr); | 161 | desc->base3 = PTR_HIGH(addr); |
161 | #else | 162 | #else |
162 | |||
163 | pack_descriptor((struct desc_struct *)d, addr, size, 0x80 | type, 0); | 163 | pack_descriptor((struct desc_struct *)d, addr, size, 0x80 | type, 0); |
164 | #endif | 164 | #endif |
165 | } | 165 | } |
@@ -177,7 +177,8 @@ static inline void __set_tss_desc(unsigned cpu, unsigned int entry, void *addr) | |||
177 | * last valid byte | 177 | * last valid byte |
178 | */ | 178 | */ |
179 | set_tssldt_descriptor(&tss, (unsigned long)addr, DESC_TSS, | 179 | set_tssldt_descriptor(&tss, (unsigned long)addr, DESC_TSS, |
180 | IO_BITMAP_OFFSET + IO_BITMAP_BYTES + sizeof(unsigned long) - 1); | 180 | IO_BITMAP_OFFSET + IO_BITMAP_BYTES + |
181 | sizeof(unsigned long) - 1); | ||
181 | write_gdt_entry(d, entry, &tss, DESC_TSS); | 182 | write_gdt_entry(d, entry, &tss, DESC_TSS); |
182 | } | 183 | } |
183 | 184 | ||
@@ -186,7 +187,7 @@ static inline void __set_tss_desc(unsigned cpu, unsigned int entry, void *addr) | |||
186 | static inline void native_set_ldt(const void *addr, unsigned int entries) | 187 | static inline void native_set_ldt(const void *addr, unsigned int entries) |
187 | { | 188 | { |
188 | if (likely(entries == 0)) | 189 | if (likely(entries == 0)) |
189 | __asm__ __volatile__("lldt %w0"::"q" (0)); | 190 | asm volatile("lldt %w0"::"q" (0)); |
190 | else { | 191 | else { |
191 | unsigned cpu = smp_processor_id(); | 192 | unsigned cpu = smp_processor_id(); |
192 | ldt_desc ldt; | 193 | ldt_desc ldt; |
@@ -195,7 +196,7 @@ static inline void native_set_ldt(const void *addr, unsigned int entries) | |||
195 | DESC_LDT, entries * sizeof(ldt) - 1); | 196 | DESC_LDT, entries * sizeof(ldt) - 1); |
196 | write_gdt_entry(get_cpu_gdt_table(cpu), GDT_ENTRY_LDT, | 197 | write_gdt_entry(get_cpu_gdt_table(cpu), GDT_ENTRY_LDT, |
197 | &ldt, DESC_LDT); | 198 | &ldt, DESC_LDT); |
198 | __asm__ __volatile__("lldt %w0"::"q" (GDT_ENTRY_LDT*8)); | 199 | asm volatile("lldt %w0"::"q" (GDT_ENTRY_LDT*8)); |
199 | } | 200 | } |
200 | } | 201 | } |
201 | 202 | ||
@@ -240,15 +241,15 @@ static inline void native_load_tls(struct thread_struct *t, unsigned int cpu) | |||
240 | gdt[GDT_ENTRY_TLS_MIN + i] = t->tls_array[i]; | 241 | gdt[GDT_ENTRY_TLS_MIN + i] = t->tls_array[i]; |
241 | } | 242 | } |
242 | 243 | ||
243 | #define _LDT_empty(info) (\ | 244 | #define _LDT_empty(info) \ |
244 | (info)->base_addr == 0 && \ | 245 | ((info)->base_addr == 0 && \ |
245 | (info)->limit == 0 && \ | 246 | (info)->limit == 0 && \ |
246 | (info)->contents == 0 && \ | 247 | (info)->contents == 0 && \ |
247 | (info)->read_exec_only == 1 && \ | 248 | (info)->read_exec_only == 1 && \ |
248 | (info)->seg_32bit == 0 && \ | 249 | (info)->seg_32bit == 0 && \ |
249 | (info)->limit_in_pages == 0 && \ | 250 | (info)->limit_in_pages == 0 && \ |
250 | (info)->seg_not_present == 1 && \ | 251 | (info)->seg_not_present == 1 && \ |
251 | (info)->useable == 0) | 252 | (info)->useable == 0) |
252 | 253 | ||
253 | #ifdef CONFIG_X86_64 | 254 | #ifdef CONFIG_X86_64 |
254 | #define LDT_empty(info) (_LDT_empty(info) && ((info)->lm == 0)) | 255 | #define LDT_empty(info) (_LDT_empty(info) && ((info)->lm == 0)) |
@@ -287,7 +288,7 @@ static inline unsigned long get_desc_limit(const struct desc_struct *desc) | |||
287 | } | 288 | } |
288 | 289 | ||
289 | static inline void _set_gate(int gate, unsigned type, void *addr, | 290 | static inline void _set_gate(int gate, unsigned type, void *addr, |
290 | unsigned dpl, unsigned ist, unsigned seg) | 291 | unsigned dpl, unsigned ist, unsigned seg) |
291 | { | 292 | { |
292 | gate_desc s; | 293 | gate_desc s; |
293 | pack_gate(&s, type, (unsigned long)addr, dpl, ist, seg); | 294 | pack_gate(&s, type, (unsigned long)addr, dpl, ist, seg); |
@@ -370,10 +371,10 @@ static inline void set_system_gate_ist(int n, void *addr, unsigned ist) | |||
370 | * Will read the base address of GDT_ENTRY_ESPFIX_SS and put it into %eax. | 371 | * Will read the base address of GDT_ENTRY_ESPFIX_SS and put it into %eax. |
371 | */ | 372 | */ |
372 | #define GET_DESC_BASE(idx, gdt, base, lo_w, lo_b, hi_b) \ | 373 | #define GET_DESC_BASE(idx, gdt, base, lo_w, lo_b, hi_b) \ |
373 | movb idx*8+4(gdt), lo_b; \ | 374 | movb idx * 8 + 4(gdt), lo_b; \ |
374 | movb idx*8+7(gdt), hi_b; \ | 375 | movb idx * 8 + 7(gdt), hi_b; \ |
375 | shll $16, base; \ | 376 | shll $16, base; \ |
376 | movw idx*8+2(gdt), lo_w; | 377 | movw idx * 8 + 2(gdt), lo_w; |
377 | 378 | ||
378 | 379 | ||
379 | #endif /* __ASSEMBLY__ */ | 380 | #endif /* __ASSEMBLY__ */ |