mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-23 17:30:02 +00:00
x86/ldttss: Clean up 32-bit descriptors
Like the IDT descriptors, the LDT/TSS descriptors are pointlessly different on 32 and 64 bit kernels. Unify them and get rid of the duplicated code. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: Andy Lutomirski <luto@kernel.org> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Josh Poimboeuf <jpoimboe@redhat.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Steven Rostedt <rostedt@goodmis.org> Link: http://lkml.kernel.org/r/20170828064958.289634692@linutronix.de Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
38e9e81f4c
commit
87cc037674
2 changed files with 16 additions and 39 deletions
|
@ -166,42 +166,22 @@ native_write_gdt_entry(struct desc_struct *gdt, int entry, const void *desc, int
|
|||
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
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
/* 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
|
||||
u32 base3;
|
||||
u32 zero1;
|
||||
#endif
|
||||
} __attribute__((packed));
|
||||
|
||||
|
||||
#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;
|
||||
#endif
|
||||
typedef struct ldttss_desc ldt_desc;
|
||||
typedef struct ldttss_desc tss_desc;
|
||||
|
||||
struct idt_bits {
|
||||
u16 ist : 3,
|
||||
|
|
Loading…
Reference in a new issue