2006-12-07 02:14:04 +01:00
/* 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>
2008-01-30 13:31:11 +01:00
/*
* 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
*/
2006-12-07 02:14:04 +01:00
// 8 byte segment descriptor
struct desc_struct {
2008-01-30 13:31:11 +01:00
union {
struct { unsigned int a , 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 ;
} ;
2006-12-07 02:14:04 +01:00
2008-01-30 13:31:11 +01:00
} ;
} __attribute__ ( ( packed ) ) ;
2006-12-07 02:14:04 +01:00
enum {
GATE_INTERRUPT = 0xE ,
GATE_TRAP = 0xF ,
GATE_CALL = 0xC ,
2008-01-30 13:31:14 +01:00
GATE_TASK = 0x5 ,
2006-12-07 02:14:04 +01:00
} ;
// 16byte gate
2008-01-30 13:31:12 +01:00
struct gate_struct64 {
2006-12-07 02:14:04 +01:00
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 ) ) ;
2008-01-30 13:31:14 +01:00
# 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)
2006-12-07 02:14:04 +01:00
enum {
DESC_TSS = 0x9 ,
DESC_LDT = 0x2 ,
2008-01-30 13:31:14 +01:00
DESCTYPE_S = 0x10 , /* !system */
2006-12-07 02:14:04 +01:00
} ;
// LDT or TSS descriptor in the GDT. 16 bytes.
2008-01-30 13:31:13 +01:00
struct ldttss_desc64 {
2006-12-07 02:14:04 +01:00
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 ) ) ;
2008-01-30 13:31:12 +01:00
# ifdef CONFIG_X86_64
typedef struct gate_struct64 gate_desc ;
2008-01-30 13:31:13 +01:00
typedef struct ldttss_desc64 ldt_desc ;
2008-01-30 13:31:13 +01:00
typedef struct ldttss_desc64 tss_desc ;
2008-01-30 13:31:12 +01:00
# else
typedef struct desc_struct gate_desc ;
2008-01-30 13:31:13 +01:00
typedef struct desc_struct ldt_desc ;
2008-01-30 13:31:13 +01:00
typedef struct desc_struct tss_desc ;
2008-01-30 13:31:12 +01:00
# endif
2006-12-07 02:14:04 +01:00
struct desc_ptr {
unsigned short size ;
unsigned long address ;
} __attribute__ ( ( packed ) ) ;
# endif /* !__ASSEMBLY__ */
# endif