Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 010d4f82 authored by Glauber de Oliveira Costa's avatar Glauber de Oliveira Costa Committed by Ingo Molnar
Browse files

x86: introduce gate_desc type.



To account for the differences in gate descriptor in i386 and x86_64
a gate_desc type is introduced.

Signed-off-by: default avatarGlauber de Oliveira Costa <gcosta@redhat.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 7e6ebe14
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -76,7 +76,7 @@ char ignore_fpu_irq = 0;
 * F0 0F bug workaround.. We have a special link segment
 * F0 0F bug workaround.. We have a special link segment
 * for this.
 * for this.
 */
 */
struct desc_struct idt_table[256]
gate_desc idt_table[256]
	__attribute__((__section__(".data.idt"))) = { { { { 0, 0 } } }, };
	__attribute__((__section__(".data.idt"))) = { { { { 0, 0 } } }, };


asmlinkage void divide_error(void);
asmlinkage void divide_error(void);
+8 −7
Original line number Original line Diff line number Diff line
@@ -3,6 +3,7 @@


#include <asm/ldt.h>
#include <asm/ldt.h>
#include <asm/segment.h>
#include <asm/segment.h>
#include <asm/desc_defs.h>


#ifndef __ASSEMBLY__
#ifndef __ASSEMBLY__


@@ -24,7 +25,7 @@ static inline struct desc_struct *get_cpu_gdt_table(unsigned int cpu)
}
}


extern struct desc_ptr idt_descr;
extern struct desc_ptr idt_descr;
extern struct desc_struct idt_table[];
extern gate_desc idt_table[];
extern void set_intr_gate(unsigned int irq, void * addr);
extern void set_intr_gate(unsigned int irq, void * addr);


static inline void pack_descriptor(__u32 *a, __u32 *b,
static inline void pack_descriptor(__u32 *a, __u32 *b,
@@ -35,11 +36,11 @@ static inline void pack_descriptor(__u32 *a, __u32 *b,
		(limit & 0x000f0000) | ((type & 0xff) << 8) | ((flags & 0xf) << 20);
		(limit & 0x000f0000) | ((type & 0xff) << 8) | ((flags & 0xf) << 20);
}
}


static inline void pack_gate(__u32 *a, __u32 *b,
static inline void pack_gate(gate_desc *gate,
	unsigned long base, unsigned short seg, unsigned char type, unsigned char flags)
	unsigned long base, unsigned short seg, unsigned char type, unsigned char flags)
{
{
	*a = (seg << 16) | (base & 0xffff);
	gate->a = (seg << 16) | (base & 0xffff);
	*b = (base & 0xffff0000) | ((type & 0xff) << 8) | (flags & 0xff);
	gate->b = (base & 0xffff0000) | ((type & 0xff) << 8) | (flags & 0xff);
}
}


#define DESCTYPE_LDT 	0x82	/* present, system, DPL-0, LDT */
#define DESCTYPE_LDT 	0x82	/* present, system, DPL-0, LDT */
@@ -139,9 +140,9 @@ static inline void native_load_tls(struct thread_struct *t, unsigned int cpu)


static inline void _set_gate(int gate, unsigned int type, void *addr, unsigned short seg)
static inline void _set_gate(int gate, unsigned int type, void *addr, unsigned short seg)
{
{
	__u32 a, b;
	gate_desc g;
	pack_gate(&a, &b, (unsigned long)addr, seg, type, 0);
	pack_gate(&g, (unsigned long)addr, seg, type, 0);
	write_idt_entry(idt_table, gate, a, b);
	write_idt_entry(idt_table, gate, g.a, g.b);
}
}


static inline void __set_tss_desc(unsigned int cpu, unsigned int entry, const void *addr)
static inline void __set_tss_desc(unsigned int cpu, unsigned int entry, const void *addr)
+2 −2
Original line number Original line Diff line number Diff line
@@ -30,7 +30,7 @@ static inline unsigned long __store_tr(void)


#define store_tr(tr) (tr) = __store_tr()
#define store_tr(tr) (tr) = __store_tr()


extern struct gate_struct idt_table[];
extern gate_desc idt_table[];
extern struct desc_ptr cpu_gdt_descr[];
extern struct desc_ptr cpu_gdt_descr[];


static inline void write_ldt_entry(struct desc_struct *ldt,
static inline void write_ldt_entry(struct desc_struct *ldt,
@@ -58,7 +58,7 @@ static inline void store_gdt(struct desc_ptr *ptr)
static inline void _set_gate(void *adr, unsigned type, unsigned long func,
static inline void _set_gate(void *adr, unsigned type, unsigned long func,
			     unsigned dpl, unsigned ist)
			     unsigned dpl, unsigned ist)
{
{
	struct gate_struct s;
	gate_desc s;


	s.offset_low = PTR_LOW(func);
	s.offset_low = PTR_LOW(func);
	s.segment = __KERNEL_CS;
	s.segment = __KERNEL_CS;
+7 −1
Original line number Original line Diff line number Diff line
@@ -39,7 +39,7 @@ enum {
};
};


// 16byte gate
// 16byte gate
struct gate_struct {
struct gate_struct64 {
	u16 offset_low;
	u16 offset_low;
	u16 segment;
	u16 segment;
	unsigned ist : 3, zero0 : 5, type : 5, dpl : 2, p : 1;
	unsigned ist : 3, zero0 : 5, type : 5, dpl : 2, p : 1;
@@ -67,6 +67,12 @@ struct ldttss_desc {
	u32 zero1;
	u32 zero1;
} __attribute__((packed));
} __attribute__((packed));


#ifdef CONFIG_X86_64
typedef struct gate_struct64 gate_desc;
#else
typedef struct desc_struct gate_desc;
#endif

struct desc_ptr {
struct desc_ptr {
	unsigned short size;
	unsigned short size;
	unsigned long address;
	unsigned long address;