12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- /* Written 2000 by Andi Kleen */
- #ifndef __ARCH_DESC_DEFS_H
- #define __ARCH_DESC_DEFS_H
- /*
- * Segment descriptor structure definitions, usable from both x86_64 and i386
- * archs.
- */
- #ifndef __ASSEMBLY__
- #include <linux/types.h>
- /*
- * FIXME: Acessing the desc_struct through its fields is more elegant,
- * and should be the one valid thing to do. However, a lot of open code
- * still touches the a and b acessors, and doing this allow us to do it
- * incrementally. We keep the signature as a struct, rather than an union,
- * so we can get rid of it transparently in the future -- glommer
- */
- /* 8 byte segment descriptor */
- struct desc_struct {
- union {
- struct {
- unsigned int a;
- unsigned int b;
- };
- struct {
- u16 limit0;
- u16 base0;
- unsigned base1: 8, type: 4, s: 1, dpl: 2, p: 1;
- unsigned limit: 4, avl: 1, l: 1, d: 1, g: 1, base2: 8;
- };
- };
- } __attribute__((packed));
- enum {
- GATE_INTERRUPT = 0xE,
- GATE_TRAP = 0xF,
- GATE_CALL = 0xC,
- GATE_TASK = 0x5,
- };
- /* 16byte gate */
- struct gate_struct64 {
- u16 offset_low;
- u16 segment;
- unsigned ist : 3, zero0 : 5, type : 5, dpl : 2, p : 1;
- u16 offset_middle;
- u32 offset_high;
- u32 zero1;
- } __attribute__((packed));
- #define PTR_LOW(x) ((unsigned long long)(x) & 0xFFFF)
- #define PTR_MIDDLE(x) (((unsigned long long)(x) >> 16) & 0xFFFF)
- #define PTR_HIGH(x) ((unsigned long long)(x) >> 32)
- enum {
- DESC_TSS = 0x9,
- DESC_LDT = 0x2,
- 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));
- #ifdef CONFIG_X86_64
- typedef struct gate_struct64 gate_desc;
- typedef struct ldttss_desc64 ldt_desc;
- typedef struct ldttss_desc64 tss_desc;
- #else
- typedef struct desc_struct gate_desc;
- typedef struct desc_struct ldt_desc;
- typedef struct desc_struct tss_desc;
- #endif
- struct desc_ptr {
- unsigned short size;
- unsigned long address;
- } __attribute__((packed)) ;
- #endif /* !__ASSEMBLY__ */
- #endif
|