1 /* Written 2000 by Andi Kleen */ 2 #ifndef __ARCH_DESC_DEFS_H 3 #define __ARCH_DESC_DEFS_H 4 5 /* 6 * Segment descriptor structure definitions, usable from both x86_64 and i386 7 * archs. 8 */ 9 10 #ifndef __ASSEMBLY__ 11 12 #include <linux/types.h> 13 14 // 8 byte segment descriptor 15 struct desc_struct { 16 u16 limit0; 17 u16 base0; 18 unsigned base1 : 8, type : 4, s : 1, dpl : 2, p : 1; 19 unsigned limit : 4, avl : 1, l : 1, d : 1, g : 1, base2 : 8; 20 } __attribute__((packed)); 21 22 struct n_desc_struct { 23 unsigned int a,b; 24 }; 25 26 enum { 27 GATE_INTERRUPT = 0xE, 28 GATE_TRAP = 0xF, 29 GATE_CALL = 0xC, 30 }; 31 32 // 16byte gate 33 struct gate_struct { 34 u16 offset_low; 35 u16 segment; 36 unsigned ist : 3, zero0 : 5, type : 5, dpl : 2, p : 1; 37 u16 offset_middle; 38 u32 offset_high; 39 u32 zero1; 40 } __attribute__((packed)); 41 42 #define PTR_LOW(x) ((unsigned long)(x) & 0xFFFF) 43 #define PTR_MIDDLE(x) (((unsigned long)(x) >> 16) & 0xFFFF) 44 #define PTR_HIGH(x) ((unsigned long)(x) >> 32) 45 46 enum { 47 DESC_TSS = 0x9, 48 DESC_LDT = 0x2, 49 }; 50 51 // LDT or TSS descriptor in the GDT. 16 bytes. 52 struct ldttss_desc { 53 u16 limit0; 54 u16 base0; 55 unsigned base1 : 8, type : 5, dpl : 2, p : 1; 56 unsigned limit1 : 4, zero0 : 3, g : 1, base2 : 8; 57 u32 base3; 58 u32 zero1; 59 } __attribute__((packed)); 60 61 struct desc_ptr { 62 unsigned short size; 63 unsigned long address; 64 } __attribute__((packed)) ; 65 66 67 #endif /* !__ASSEMBLY__ */ 68 69 #endif 70