/**************************************************************************************
Copyright (c) 2002
The UbixOS Project
$Id$
**************************************************************************************/
#ifndef _GDT_H
#define _GDT_H
/* Descriptor Definitions */
#define dCall 0x0C00 /* 386 Call Gate */
#define dCode 0x1800 /* Code Segment */
#define dData 0x1000 /* Data Segment */
#define dInt 0x0E00 /* 386 Interrupt Gate */
#define dLdt 0x200 /* Local Descriptor Table (LDT) */
#define dTask 0x500 /* Task gate */
#define dTrap 0x0F00 /* 386 Trap Gate */
#define dTss 0x900 /* Task State Segment (TSS) */
/* Descriptor Options */
#define dDpl3 0x6000 /* DPL3 or mask for DPL */
#define dDpl2 0x4000 /* DPL2 or mask for DPL */
#define dDpl1 0x2000 /* DPL1 or mask for DPL */
#define dPresent 0x8000 /* Present */
#define dNpresent 0x8000 /* Not Present */
#define dAcc 0x100 /* Accessed (Data or Code) */
#define dWrite 0x200 /* Writable (Data segments only) */
#define dRead 0x200 /* Readable (Code segments only) */
#define dBusy 0xB00 /* Busy (TSS only) was 200 */
#define dEexdown 0x400 /* Expand down (Data segments only) */
#define dConform 0x400 /* Conforming (Code segments only) */
#define dBig 0x40 /* Default to 32 bit mode */
#define dBiglim 0x80 /* Limit is in 4K units */
/* GDT Descriptor */
struct gdtDescriptor {
unsigned short limitLow; /* Limit 0..15 */
unsigned short baseLow; /* Base 0..15 */
unsigned char baseMed; /* Base 16..23 */
unsigned char access; /* Access Byte */
unsigned int limitHigh:4; /* Limit 16..19 */
unsigned int granularity:4; /* Granularity */
unsigned char baseHigh; /* Base 24..31 */
} __attribute__ ((packed));
struct gdtGate {
unsigned short offsetLow; /* Offset 0..15 */
unsigned short selector; /* Selector */
unsigned short access; /* Access Flags */
unsigned short offsetHigh; /* Offset 16..31 */
} __attribute__ ((packed));
union descriptorTableunion {
struct gdtDescriptor descriptor; /* Normal descriptor */
struct gdtGate gate; /* Gate descriptor */
unsigned long dummy; /* Any other info */
};
#define descriptorTable(name,length) union descriptorTableunion name[length] =
#define standardDescriptor(base, limit, control) {descriptor: {(limit & 0xffff), (base & 0xffff), ((base >> 16) & 0xff), \
((control+dPresent) >> 8), (limit >> 16), \
((control & 0xff) >> 4), (base >> 24)}}
#define gateDescriptor(offset, selector, control) {gate: {(offset & 0xffff), selector, \
(control+dPresent), (offset >> 16) }}
#endif