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 <[EMAIL PROTECTED]>
---
 arch/x86/kernel/paravirt_32.c  |    4 ++--
 arch/x86/kernel/smpcommon_32.c |    7 ++++---
 arch/x86/xen/enlighten.c       |    5 ++---
 include/asm-x86/desc_32.h      |   29 +++++++++++++++--------------
 include/asm-x86/paravirt.h     |    9 ++++++---
 5 files changed, 29 insertions(+), 25 deletions(-)

diff --git a/arch/x86/kernel/paravirt_32.c b/arch/x86/kernel/paravirt_32.c
index 9ed46da..edff853 100644
--- a/arch/x86/kernel/paravirt_32.c
+++ b/arch/x86/kernel/paravirt_32.c
@@ -379,8 +379,8 @@ struct pv_cpu_ops pv_cpu_ops = {
        .store_idt = native_store_idt,
        .store_tr = native_store_tr,
        .load_tls = native_load_tls,
-       .write_ldt_entry = write_dt_entry,
-       .write_gdt_entry = write_dt_entry,
+       .write_ldt_entry = write_ldt_entry,
+       .write_gdt_entry = write_gdt_entry,
        .write_idt_entry = write_idt_entry,
        .load_sp0 = native_load_sp0,
 
diff --git a/arch/x86/kernel/smpcommon_32.c b/arch/x86/kernel/smpcommon_32.c
index bbfe85a..a6f9b41 100644
--- a/arch/x86/kernel/smpcommon_32.c
+++ b/arch/x86/kernel/smpcommon_32.c
@@ -14,10 +14,11 @@ __cpuinit void init_gdt(int cpu)
 {
        struct desc_struct *gdt = get_cpu_gdt_table(cpu);
 
-       pack_descriptor((u32 *)&gdt[GDT_ENTRY_PERCPU].a,
-                       (u32 *)&gdt[GDT_ENTRY_PERCPU].b,
+       pack_descriptor(&gdt[GDT_ENTRY_PERCPU],
                        __per_cpu_offset[cpu], 0xFFFFF,
-                       0x80 | DESCTYPE_S | 0x2, 0x8);
+                       0x80 | 0x2, 0x8);
+
+       gdt[GDT_ENTRY_PERCPU].s = 1;
 
        per_cpu(this_cpu_off, cpu) = __per_cpu_offset[cpu];
        per_cpu(cpu_number, cpu) = cpu;
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
index 829a450..a552103 100644
--- a/arch/x86/xen/enlighten.c
+++ b/arch/x86/xen/enlighten.c
@@ -474,7 +474,7 @@ static void xen_load_idt(const struct desc_ptr *desc)
 /* Write a GDT descriptor entry.  Ignore LDT descriptors, since
    they're handled differently. */
 static void xen_write_gdt_entry(struct desc_struct *dt, int entry,
-                               u32 low, u32 high)
+                               void *desc, int size)
 {
        preempt_disable();
 
@@ -486,10 +486,9 @@ static void xen_write_gdt_entry(struct desc_struct *dt, 
int entry,
 
        default: {
                xmaddr_t maddr = virt_to_machine(&dt[entry]);
-               u64 desc = (u64)high << 32 | low;
 
                xen_mc_flush();
-               if (HYPERVISOR_update_descriptor(maddr.maddr, desc))
+               if (HYPERVISOR_update_descriptor(maddr.maddr, *(u64 *)desc))
                        BUG();
        }
 
diff --git a/include/asm-x86/desc_32.h b/include/asm-x86/desc_32.h
index 3653c9f..622b0e7 100644
--- a/include/asm-x86/desc_32.h
+++ b/include/asm-x86/desc_32.h
@@ -28,11 +28,11 @@ extern struct desc_ptr idt_descr;
 extern gate_desc idt_table[];
 extern void set_intr_gate(unsigned int irq, void * addr);
 
-static inline void pack_descriptor(__u32 *a, __u32 *b,
+static inline void pack_descriptor(struct desc_struct *desc,
        unsigned long base, unsigned long limit, unsigned char type, unsigned 
char flags)
 {
-       *a = ((base & 0xffff) << 16) | (limit & 0xffff);
-       *b = (base & 0xff000000) | ((base & 0xff0000) >> 16) |
+       desc->a = ((base & 0xffff) << 16) | (limit & 0xffff);
+       desc->b = (base & 0xff000000) | ((base & 0xff0000) >> 16) |
                (limit & 0x000f0000) | ((type & 0xff) << 8) | ((flags & 0xf) << 
20);
 }
 
@@ -69,7 +69,8 @@ static inline void pack_gate(gate_desc *gate,
 #define set_ldt native_set_ldt
 
 #define write_ldt_entry(dt, entry, a, b) write_dt_entry(dt, entry, a, b)
-#define write_gdt_entry(dt, entry, a, b) write_dt_entry(dt, entry, a, b)
+#define write_gdt_entry(dt, entry, desc, size) \
+                               native_write_gdt_entry(dt, entry, desc, size)
 #define write_idt_entry(dt, entry, g) native_write_idt_entry(dt, entry, g)
 #endif
 
@@ -78,11 +79,10 @@ static inline void native_write_idt_entry(gate_desc *idt, 
int entry, gate_desc *
        memcpy(&idt[entry], gate, sizeof(*gate));
 }
 
-static inline void write_dt_entry(struct desc_struct *dt,
-                                 int entry, u32 entry_low, u32 entry_high)
+static inline void native_write_gdt_entry(struct desc_struct *gdt, int entry,
+                                          void *desc, int size)
 {
-       dt[entry].a = entry_low;
-       dt[entry].b = entry_high;
+       memcpy(&gdt[entry], desc, size);
 }
 
 static inline void native_set_ldt(const void *addr, unsigned int entries)
@@ -91,12 +91,13 @@ static inline void native_set_ldt(const void *addr, 
unsigned int entries)
                __asm__ __volatile__("lldt %w0"::"q" (0));
        else {
                unsigned cpu = smp_processor_id();
-               __u32 a, b;
+               ldt_desc ldt;
 
-               pack_descriptor(&a, &b, (unsigned long)addr,
+               pack_descriptor(&ldt, (unsigned long)addr,
                                entries * sizeof(struct desc_struct) - 1,
                                DESCTYPE_LDT, 0);
-               write_gdt_entry(get_cpu_gdt_table(cpu), GDT_ENTRY_LDT, a, b);
+               write_gdt_entry(get_cpu_gdt_table(cpu), GDT_ENTRY_LDT,
+                               &ldt, sizeof(ldt));
                __asm__ __volatile__("lldt %w0"::"q" (GDT_ENTRY_LDT*8));
        }
 }
@@ -152,11 +153,11 @@ static inline void _set_gate(int gate, unsigned int type, 
void *addr, unsigned s
 
 static inline void __set_tss_desc(unsigned int cpu, unsigned int entry, const 
void *addr)
 {
-       __u32 a, b;
-       pack_descriptor(&a, &b, (unsigned long)addr,
+       tss_desc tss;
+       pack_descriptor(&tss, (unsigned long)addr,
                        offsetof(struct tss_struct, __cacheline_filler) - 1,
                        DESCTYPE_TSS, 0);
-       write_gdt_entry(get_cpu_gdt_table(cpu), entry, a, b);
+       write_gdt_entry(get_cpu_gdt_table(cpu), entry, &tss, sizeof(tss));
 }
 
 
diff --git a/include/asm-x86/paravirt.h b/include/asm-x86/paravirt.h
index d369b85..a3e22b7 100644
--- a/include/asm-x86/paravirt.h
+++ b/include/asm-x86/paravirt.h
@@ -99,7 +99,7 @@ struct pv_cpu_ops {
        void (*write_ldt_entry)(struct desc_struct *,
                                int entrynum, u32 low, u32 high);
        void (*write_gdt_entry)(struct desc_struct *,
-                               int entrynum, u32 low, u32 high);
+                               int entrynum, void *desc, int size);
        void (*write_idt_entry)(gate_desc *,
                                int entrynum, gate_desc *gate);
        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)
 {
        PVOP_VCALL4(pv_cpu_ops.write_ldt_entry, dt, entry, low, high);
 }
-static inline void write_gdt_entry(void *dt, int entry, u32 low, u32 high)
+
+static inline void write_gdt_entry(struct desc_struct *dt, int entry,
+                                  void *desc, int size)
 {
-       PVOP_VCALL4(pv_cpu_ops.write_gdt_entry, dt, entry, low, high);
+       PVOP_VCALL4(pv_cpu_ops.write_gdt_entry, dt, entry, desc, size);
 }
+
 static inline void write_idt_entry(gate_desc *dt, int entry, gate_desc *g)
 {
        PVOP_VCALL4(pv_cpu_ops.write_idt_entry, dt, entry, g);
-- 
1.4.4.2

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization

Reply via email to