Like the IDT descriptors the LDT/TSS descriptors are pointlessly different
on 32 and 64 bit.

Unify them and get rid of the duplicated code.

Signed-off-by: Thomas Gleixner <t...@linutronix.de>
---
 arch/x86/include/asm/desc.h      |   26 +++-----------------------
 arch/x86/include/asm/desc_defs.h |   27 ++++++++++++---------------
 2 files changed, 15 insertions(+), 38 deletions(-)

--- a/arch/x86/include/asm/desc.h
+++ b/arch/x86/include/asm/desc.h
@@ -166,42 +166,22 @@ native_write_gdt_entry(struct desc_struc
        memcpy(&gdt[entry], desc, size);
 }
 
-static inline void pack_descriptor(struct desc_struct *desc, unsigned long 
base,
-                                  unsigned long limit, unsigned char type,
-                                  unsigned char flags)
-{
-       desc->limit0            = (u16) limit;
-       desc->base0             = (u16) base;
-       desc->base1             = (base >> 16) & 0xFF;
-       desc->type              = type & 0x0F;
-       desc->s                 = 0;
-       desc->dpl               = 0;
-       desc->p                 = 1;
-       desc->limit1            = (limit >> 16) & 0xF;
-       desc->avl               = (flags >> 0) & 0x01;
-       desc->l                 = (flags >> 1) & 0x01;
-       desc->d                 = (flags >> 2) & 0x01;
-       desc->g                 = (flags >> 3) & 0x01;
-}
-
 static inline void set_tssldt_descriptor(void *d, unsigned long addr,
                                         unsigned type, unsigned size)
 {
-#ifdef CONFIG_X86_64
-       struct ldttss_desc64 *desc = d;
+       struct ldttss_desc *desc = d;
 
        memset(desc, 0, sizeof(*desc));
 
-       desc->limit0            = size & 0xFFFF;
+       desc->limit0            = (u16) size;
        desc->base0             = (u16) addr;
        desc->base1             = (addr >> 16) & 0xFF;
        desc->type              = type;
        desc->p                 = 1;
        desc->limit1            = (size >> 16) & 0xF;
        desc->base2             = (addr >> 24) & 0xFF;
+#ifdef CONFIG_X86_64
        desc->base3             = (u32) (addr >> 32);
-#else
-       pack_descriptor((struct desc_struct *)d, addr, size, type, 0);
 #endif
 }
 
--- a/arch/x86/include/asm/desc_defs.h
+++ b/arch/x86/include/asm/desc_defs.h
@@ -49,24 +49,21 @@ enum {
        DESCTYPE_S = 0x10,      /* !system */
 };
 
-/* LDT or TSS descriptor in the GDT. 16 bytes. */
-struct ldttss_desc64 {
-       u16 limit0;
-       u16 base0;
-       unsigned base1 : 8, type : 5, dpl : 2, p : 1;
-       unsigned limit1 : 4, zero0 : 3, g : 1, base2 : 8;
-       u32 base3;
-       u32 zero1;
-} __attribute__((packed));
-
+/* LDT or TSS descriptor in the GDT. */
+struct ldttss_desc {
+       u16     limit0;
+       u16     base0;
 
+       u16     base1 : 8, type : 5, dpl : 2, p : 1;
+       u16     limit1 : 4, zero0 : 3, g : 1, base2 : 8;
 #ifdef CONFIG_X86_64
-typedef struct ldttss_desc64 ldt_desc;
-typedef struct ldttss_desc64 tss_desc;
-#else
-typedef struct desc_struct ldt_desc;
-typedef struct desc_struct tss_desc;
+       u32     base3;
+       u32     zero1;
 #endif
+} __attribute__((packed));
+
+typedef struct ldttss_desc ldt_desc;
+typedef struct ldttss_desc tss_desc;
 
 struct idt_bits {
        u16             ist     : 3,


Reply via email to