]> pilppa.org Git - linux-2.6-omap-h63xx.git/blob - include/asm-x86/desc_64.h
x86: unify paravirt pieces of descriptor handling
[linux-2.6-omap-h63xx.git] / include / asm-x86 / desc_64.h
1 /* Written 2000 by Andi Kleen */
2 #ifndef __ARCH_DESC_H
3 #define __ARCH_DESC_H
4
5 #include <linux/threads.h>
6 #include <asm/ldt.h>
7
8 #ifndef __ASSEMBLY__
9
10 #include <linux/string.h>
11
12 #include <asm/segment.h>
13
14 static inline void _set_gate(int gate, unsigned type, unsigned long func,
15                              unsigned dpl, unsigned ist)
16 {
17         gate_desc s;
18
19         s.offset_low = PTR_LOW(func);
20         s.segment = __KERNEL_CS;
21         s.ist = ist;
22         s.p = 1;
23         s.dpl = dpl;
24         s.zero0 = 0;
25         s.zero1 = 0;
26         s.type = type;
27         s.offset_middle = PTR_MIDDLE(func);
28         s.offset_high = PTR_HIGH(func);
29         /*
30          * does not need to be atomic because it is only done once at
31          * setup time
32          */
33         write_idt_entry(idt_table, gate, &s);
34 }
35
36 static inline void set_intr_gate(int nr, void *func)
37 {
38         BUG_ON((unsigned)nr > 0xFF);
39         _set_gate(nr, GATE_INTERRUPT, (unsigned long) func, 0, 0);
40 }
41
42 static inline void set_intr_gate_ist(int nr, void *func, unsigned ist)
43 {
44         BUG_ON((unsigned)nr > 0xFF);
45         _set_gate(nr, GATE_INTERRUPT, (unsigned long) func, 0, ist);
46 }
47
48 static inline void set_system_gate(int nr, void *func)
49 {
50         BUG_ON((unsigned)nr > 0xFF);
51         _set_gate(nr, GATE_INTERRUPT, (unsigned long) func, 3, 0);
52 }
53
54 static inline void set_system_gate_ist(int nr, void *func, unsigned ist)
55 {
56         _set_gate(nr, GATE_INTERRUPT, (unsigned long) func, 3, ist);
57 }
58
59 static inline void set_tss_desc(unsigned cpu, void *addr)
60 {
61         struct desc_struct *d = get_cpu_gdt_table(cpu);
62         tss_desc tss;
63
64         /*
65          * sizeof(unsigned long) coming from an extra "long" at the end
66          * of the iobitmap. See tss_struct definition in processor.h
67          *
68          * -1? seg base+limit should be pointing to the address of the
69          * last valid byte
70          */
71         set_tssldt_descriptor(&tss,
72                 (unsigned long)addr, DESC_TSS,
73                 IO_BITMAP_OFFSET + IO_BITMAP_BYTES + sizeof(unsigned long) - 1);
74         write_gdt_entry(d, GDT_ENTRY_TSS, &tss, DESC_TSS);
75 }
76
77 #endif /* !__ASSEMBLY__ */
78
79 #endif