#define SEG_TYPE_CODE 0x00001800
#define SEG_TYPE_DATA 0x00001000
#define SEG_TYPE_TSS 0x00000100
-#define SEG_TYPE_INTR 0x00000e00
-#define SEG_TYPE_TRAP 0x00000f00
#define SEG_ACCESSED 0x00000100
#define SEG_PRESENT 0x00008000
void desc_seg(struct desc *desc, int type, uint32_t base, uint32_t limit, int dpl)
{
+ static uint32_t segtype[] = { 0, SEG_TYPE_CODE, SEG_TYPE_DATA, SEG_TYPE_TSS };
+
if(type == SEG_NULL) {
desc->d[0] = desc->d[1] = 0;
return;
}
desc->d[0] = (limit & 0xffff) | (base << 16);
- desc->d[1] = ((base >> 16) & 0xff) | (type << 8) | SEG_PRESENT | (dpl << 13);
- desc->d[1] |= (base & 0xff000000) | (limit & 0xf0000) | SEG_AVL | SEG_GRAN;
-
- switch(type) {
- case SEG_CODE:
- desc->d[1] |= (3 << 11) | SEG_DEF | SEG_RD;
- break;
-
- case SEG_DATA:
- desc->d[1] |= (2 << 11) | SEG_WR;
- break;
- }
+ desc->d[1] = ((base >> 16) & 0xff) | (type << 8) | SEG_PRESENT | (dpl << 13) | segtype[type];
+ desc->d[1] |= (base & 0xff000000) | (limit & 0xf0000) | SEG_GRAN | SEG_DEF | SEG_RD;
}