diff options
author | Glauber de Oliveira Costa <gcosta@redhat.com> | 2008-01-30 07:31:13 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-01-30 07:31:13 -0500 |
commit | 014b15be30c04622d130946ab7c0a9101b523a8a (patch) | |
tree | 9138df88eb59da0021a4ac10c8ce4c66f9a62e13 /include/asm-x86 | |
parent | 18245d5b6e54ca76b60b687e43eb893f9e9dd611 (diff) |
x86: change write_gdt_entry signature.
This patch changes the write_gdt_entry function signature.
Instead of the old "a" and "b" parameters, it now receives
a pointer to a desc_struct, and the size of the entry being
handled. This is because x86_64 can have some 16-byte entries
as well as 8-byte ones.
Signed-off-by: Glauber de Oliveira Costa <gcosta@redhat.com>
CC: Zachary Amsden <zach@vmware.com>
CC: Jeremy Fitzhardinge <Jeremy.Fitzhardinge.citrix.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'include/asm-x86')
-rw-r--r-- | include/asm-x86/desc_32.h | 34 | ||||
-rw-r--r-- | include/asm-x86/paravirt.h | 9 |
2 files changed, 28 insertions, 15 deletions
diff --git a/include/asm-x86/desc_32.h b/include/asm-x86/desc_32.h index 03700991c5db..41d8214c6173 100644 --- a/include/asm-x86/desc_32.h +++ b/include/asm-x86/desc_32.h | |||
@@ -28,12 +28,13 @@ extern struct desc_ptr idt_descr; | |||
28 | extern gate_desc idt_table[]; | 28 | extern gate_desc idt_table[]; |
29 | extern void set_intr_gate(unsigned int irq, void * addr); | 29 | extern void set_intr_gate(unsigned int irq, void * addr); |
30 | 30 | ||
31 | static inline void pack_descriptor(__u32 *a, __u32 *b, | 31 | static inline void pack_descriptor(struct desc_struct *desc, |
32 | unsigned long base, unsigned long limit, unsigned char type, unsigned char flags) | 32 | unsigned long base, unsigned long limit, unsigned char type, unsigned char flags) |
33 | { | 33 | { |
34 | *a = ((base & 0xffff) << 16) | (limit & 0xffff); | 34 | desc->a = ((base & 0xffff) << 16) | (limit & 0xffff); |
35 | *b = (base & 0xff000000) | ((base & 0xff0000) >> 16) | | 35 | desc->b = (base & 0xff000000) | ((base & 0xff0000) >> 16) | |
36 | (limit & 0x000f0000) | ((type & 0xff) << 8) | ((flags & 0xf) << 20); | 36 | (limit & 0x000f0000) | ((type & 0xff) << 8) | ((flags & 0xf) << 20); |
37 | desc->p = 1; | ||
37 | } | 38 | } |
38 | 39 | ||
39 | static inline void pack_gate(gate_desc *gate, | 40 | static inline void pack_gate(gate_desc *gate, |
@@ -69,7 +70,8 @@ static inline void pack_gate(gate_desc *gate, | |||
69 | #define set_ldt native_set_ldt | 70 | #define set_ldt native_set_ldt |
70 | 71 | ||
71 | #define write_ldt_entry(dt, entry, a, b) write_dt_entry(dt, entry, a, b) | 72 | #define write_ldt_entry(dt, entry, a, b) write_dt_entry(dt, entry, a, b) |
72 | #define write_gdt_entry(dt, entry, a, b) write_dt_entry(dt, entry, a, b) | 73 | #define write_gdt_entry(dt, entry, desc, type) \ |
74 | native_write_gdt_entry(dt, entry, desc, type) | ||
73 | #define write_idt_entry(dt, entry, g) native_write_idt_entry(dt, entry, g) | 75 | #define write_idt_entry(dt, entry, g) native_write_idt_entry(dt, entry, g) |
74 | #endif | 76 | #endif |
75 | 77 | ||
@@ -79,6 +81,12 @@ static inline void native_write_idt_entry(gate_desc *idt, int entry, | |||
79 | memcpy(&idt[entry], gate, sizeof(*gate)); | 81 | memcpy(&idt[entry], gate, sizeof(*gate)); |
80 | } | 82 | } |
81 | 83 | ||
84 | static inline void native_write_gdt_entry(struct desc_struct *gdt, int entry, | ||
85 | const void *desc, int type) | ||
86 | { | ||
87 | memcpy(&gdt[entry], desc, sizeof(struct desc_struct)); | ||
88 | } | ||
89 | |||
82 | static inline void write_dt_entry(struct desc_struct *dt, | 90 | static inline void write_dt_entry(struct desc_struct *dt, |
83 | int entry, u32 entry_low, u32 entry_high) | 91 | int entry, u32 entry_low, u32 entry_high) |
84 | { | 92 | { |
@@ -86,18 +94,20 @@ static inline void write_dt_entry(struct desc_struct *dt, | |||
86 | dt[entry].b = entry_high; | 94 | dt[entry].b = entry_high; |
87 | } | 95 | } |
88 | 96 | ||
97 | |||
89 | static inline void native_set_ldt(const void *addr, unsigned int entries) | 98 | static inline void native_set_ldt(const void *addr, unsigned int entries) |
90 | { | 99 | { |
91 | if (likely(entries == 0)) | 100 | if (likely(entries == 0)) |
92 | __asm__ __volatile__("lldt %w0"::"q" (0)); | 101 | __asm__ __volatile__("lldt %w0"::"q" (0)); |
93 | else { | 102 | else { |
94 | unsigned cpu = smp_processor_id(); | 103 | unsigned cpu = smp_processor_id(); |
95 | __u32 a, b; | 104 | ldt_desc ldt; |
96 | 105 | ||
97 | pack_descriptor(&a, &b, (unsigned long)addr, | 106 | pack_descriptor(&ldt, (unsigned long)addr, |
98 | entries * sizeof(struct desc_struct) - 1, | 107 | entries * sizeof(struct desc_struct) - 1, |
99 | DESCTYPE_LDT, 0); | 108 | DESC_LDT, 0); |
100 | write_gdt_entry(get_cpu_gdt_table(cpu), GDT_ENTRY_LDT, a, b); | 109 | write_gdt_entry(get_cpu_gdt_table(cpu), GDT_ENTRY_LDT, |
110 | &ldt, DESC_LDT); | ||
101 | __asm__ __volatile__("lldt %w0"::"q" (GDT_ENTRY_LDT*8)); | 111 | __asm__ __volatile__("lldt %w0"::"q" (GDT_ENTRY_LDT*8)); |
102 | } | 112 | } |
103 | } | 113 | } |
@@ -153,11 +163,11 @@ static inline void _set_gate(int gate, unsigned int type, void *addr, unsigned s | |||
153 | 163 | ||
154 | static inline void __set_tss_desc(unsigned int cpu, unsigned int entry, const void *addr) | 164 | static inline void __set_tss_desc(unsigned int cpu, unsigned int entry, const void *addr) |
155 | { | 165 | { |
156 | __u32 a, b; | 166 | tss_desc tss; |
157 | pack_descriptor(&a, &b, (unsigned long)addr, | 167 | pack_descriptor(&tss, (unsigned long)addr, |
158 | offsetof(struct tss_struct, __cacheline_filler) - 1, | 168 | offsetof(struct tss_struct, __cacheline_filler) - 1, |
159 | DESCTYPE_TSS, 0); | 169 | DESC_TSS, 0); |
160 | write_gdt_entry(get_cpu_gdt_table(cpu), entry, a, b); | 170 | write_gdt_entry(get_cpu_gdt_table(cpu), entry, &tss, DESC_TSS); |
161 | } | 171 | } |
162 | 172 | ||
163 | 173 | ||
diff --git a/include/asm-x86/paravirt.h b/include/asm-x86/paravirt.h index 86a9d7b0920f..3f2abf295e2a 100644 --- a/include/asm-x86/paravirt.h +++ b/include/asm-x86/paravirt.h | |||
@@ -99,7 +99,7 @@ struct pv_cpu_ops { | |||
99 | void (*write_ldt_entry)(struct desc_struct *, | 99 | void (*write_ldt_entry)(struct desc_struct *, |
100 | int entrynum, u32 low, u32 high); | 100 | int entrynum, u32 low, u32 high); |
101 | void (*write_gdt_entry)(struct desc_struct *, | 101 | void (*write_gdt_entry)(struct desc_struct *, |
102 | int entrynum, u32 low, u32 high); | 102 | int entrynum, const void *desc, int size); |
103 | void (*write_idt_entry)(gate_desc *, | 103 | void (*write_idt_entry)(gate_desc *, |
104 | int entrynum, const gate_desc *gate); | 104 | int entrynum, const gate_desc *gate); |
105 | void (*load_sp0)(struct tss_struct *tss, struct thread_struct *t); | 105 | void (*load_sp0)(struct tss_struct *tss, struct thread_struct *t); |
@@ -664,10 +664,13 @@ static inline void write_ldt_entry(void *dt, int entry, u32 low, u32 high) | |||
664 | { | 664 | { |
665 | PVOP_VCALL4(pv_cpu_ops.write_ldt_entry, dt, entry, low, high); | 665 | PVOP_VCALL4(pv_cpu_ops.write_ldt_entry, dt, entry, low, high); |
666 | } | 666 | } |
667 | static inline void write_gdt_entry(void *dt, int entry, u32 low, u32 high) | 667 | |
668 | static inline void write_gdt_entry(struct desc_struct *dt, int entry, | ||
669 | void *desc, int type) | ||
668 | { | 670 | { |
669 | PVOP_VCALL4(pv_cpu_ops.write_gdt_entry, dt, entry, low, high); | 671 | PVOP_VCALL4(pv_cpu_ops.write_gdt_entry, dt, entry, desc, type); |
670 | } | 672 | } |
673 | |||
671 | static inline void write_idt_entry(gate_desc *dt, int entry, const gate_desc *g) | 674 | static inline void write_idt_entry(gate_desc *dt, int entry, const gate_desc *g) |
672 | { | 675 | { |
673 | PVOP_VCALL3(pv_cpu_ops.write_idt_entry, dt, entry, g); | 676 | PVOP_VCALL3(pv_cpu_ops.write_idt_entry, dt, entry, g); |