1: /* Constants for protected mode. */ 2: 3: /* Table sizes. */ 4: #define GDT_SIZE (FIRST_LDT_INDEX + NR_TASKS + NR_PROCS) /* spec. and LDT's */ 5: #define IDT_SIZE (IRQ8_VECTOR + 8) /* only up to the highest vector */ 6: #define LDT_SIZE 4 /* contains CS, DS and two extras */ 7: 8: /* Fixed global descriptors. 1 to 7 are prescribed by the BIOS. */ 9: #define GDT_INDEX 1 /* GDT descriptor */ 10: #define IDT_INDEX 2 /* IDT descriptor */ 11: #define DS_INDEX 3 /* kernel DS */ 12: #define ES_INDEX 4 /* kernel ES (386: flag 4 Gb at startup) */ 13: #define SS_INDEX 5 /* kernel SS (386: monitor SS at startup) */ 14: #define CS_INDEX 6 /* kernel CS */ 15: #define MON_CS_INDEX 7 /* temp for BIOS (386: monitor CS at startup) */ 16: #define TSS_INDEX 8 /* kernel TSS */ 17: #define DS_286_INDEX 9 /* scratch 16-bit source segment */ 18: #define ES_286_INDEX 10 /* scratch 16-bit destination segment */ 19: #define A_INDEX 11 /* 64K memory segment at A0000 */ 20: #define B_INDEX 12 /* 64K memory segment at B0000 */ 21: #define C_INDEX 13 /* 64K memory segment at C0000 */ 22: #define D_INDEX 14 /* 64K memory segment at D0000 */ 23: #define FIRST_LDT_INDEX 15 /* rest of descriptors are LDT's */ 24: 25: #define GDT_SELECTOR 0x08 /* (GDT_INDEX * DESC_SIZE) bad for asld */ 26: #define IDT_SELECTOR 0x10 /* (IDT_INDEX * DESC_SIZE) */ 27: #define DS_SELECTOR 0x18 /* (DS_INDEX * DESC_SIZE) */ 28: #define ES_SELECTOR 0x20 /* (ES_INDEX * DESC_SIZE) */ 29: #define FLAT_DS_SELECTOR 0x21 /* less privileged ES */ 30: #define SS_SELECTOR 0x28 /* (SS_INDEX * DESC_SIZE) */ 31: #define CS_SELECTOR 0x30 /* (CS_INDEX * DESC_SIZE) */ 32: #define MON_CS_SELECTOR 0x38 /* (MON_CS_INDEX * DESC_SIZE) */ 33: #define TSS_SELECTOR 0x40 /* (TSS_INDEX * DESC_SIZE) */ 34: #define DS_286_SELECTOR 0x49 /* (DS_286_INDEX*DESC_SIZE + TASK_PRIVILEGE) */ 35: #define ES_286_SELECTOR 0x51 /* (ES_286_INDEX*DESC_SIZE + TASK_PRIVILEGE) */ 36: 37: /* Fixed local descriptors. */ 38: #define CS_LDT_INDEX 0 /* process CS */ 39: #define DS_LDT_INDEX 1 /* process DS=ES=FS=GS=SS */ 40: #define EXTRA_LDT_INDEX 2 /* first of the extra LDT entries */ 41: 42: /* Privileges. */ 43: #define INTR_PRIVILEGE 0 /* kernel and interrupt handlers */ 44: #define TASK_PRIVILEGE 1 45: #define USER_PRIVILEGE 3 46: 47: /* 286 hardware constants. */ 48: 49: /* Exception vector numbers. */ 50: #define BOUNDS_VECTOR 5 /* bounds check failed */ 51: #define INVAL_OP_VECTOR 6 /* invalid opcode */ 52: #define COPROC_NOT_VECTOR 7 /* coprocessor not available */ 53: #define DOUBLE_FAULT_VECTOR 8 54: #define COPROC_SEG_VECTOR 9 /* coprocessor segment overrun */ 55: #define INVAL_TSS_VECTOR 10 /* invalid TSS */ 56: #define SEG_NOT_VECTOR 11 /* segment not present */ 57: #define STACK_FAULT_VECTOR 12 /* stack exception */ 58: #define PROTECTION_VECTOR 13 /* general protection */ 59: 60: /* Selector bits. */ 61: #define TI 0x04 /* table indicator */ 62: #define RPL 0x03 /* requester privilege level */ 63: 64: /* Descriptor structure offsets. */ 65: #define DESC_BASE 2 /* to base_low */ 66: #define DESC_BASE_MIDDLE 4 /* to base_middle */ 67: #define DESC_ACCESS 5 /* to access byte */ 68: #define DESC_SIZE 8 /* sizeof (struct segdesc_s) */ 69: 70: /* Base and limit sizes and shifts. */ 71: #define BASE_MIDDLE_SHIFT 16 /* shift for base --> base_middle */ 72: 73: /* Access-byte and type-byte bits. */ 74: #define PRESENT 0x80 /* set for descriptor present */ 75: #define DPL 0x60 /* descriptor privilege level mask */ 76: #define DPL_SHIFT 5 77: #define SEGMENT 0x10 /* set for segment-type descriptors */ 78: 79: /* Access-byte bits. */ 80: #define EXECUTABLE 0x08 /* set for executable segment */ 81: #define CONFORMING 0x04 /* set for conforming segment if executable */ 82: #define EXPAND_DOWN 0x04 /* set for expand-down segment if !executable*/ 83: #define READABLE 0x02 /* set for readable segment if executable */ 84: #define WRITEABLE 0x02 /* set for writeable segment if !executable */ 85: #define TSS_BUSY 0x02 /* set if TSS descriptor is busy */ 86: #define ACCESSED 0x01 /* set if segment accessed */ 87: 88: /* Special descriptor types. */ 89: #define AVL_286_TSS 1 /* available 286 TSS */ 90: #define LDT 2 /* local descriptor table */ 91: #define BUSY_286_TSS 3 /* set transparently to the software */ 92: #define CALL_286_GATE 4 /* not used */ 93: #define TASK_GATE 5 /* only used by debugger */ 94: #define INT_286_GATE 6 /* interrupt gate, used for all vectors */ 95: #define TRAP_286_GATE 7 /* not used */ 96: 97: /* Extra 386 hardware constants. */ 98: 99: /* Exception vector numbers. */ 100: #define PAGE_FAULT_VECTOR 14 101: #define COPROC_ERR_VECTOR 16 /* coprocessor error */ 102: 103: /* Descriptor structure offsets. */ 104: #define DESC_GRANULARITY 6 /* to granularity byte */ 105: #define DESC_BASE_HIGH 7 /* to base_high */ 106: 107: /* Base and limit sizes and shifts. */ 108: #define BASE_HIGH_SHIFT 24 /* shift for base --> base_high */ 109: #define BYTE_GRAN_MAX 0xFFFFFL /* maximum size for byte granular segment */ 110: #define GRANULARITY_SHIFT 16 /* shift for limit --> granularity */ 111: #define OFFSET_HIGH_SHIFT 16 /* shift for (gate) offset --> offset_high */ 112: #define PAGE_GRAN_SHIFT 12 /* extra shift for page granular limits */ 113: 114: /* Type-byte bits. */ 115: #define DESC_386_BIT 0x08 /* 386 types are obtained by ORing with this */ 116: /* LDT's and TASK_GATE's don't need it */ 117: 118: /* Granularity byte. */ 119: #define GRANULAR 0x80 /* set for 4K granularilty */ 120: #define DEFAULT 0x40 /* set for 32-bit defaults (executable seg) */ 121: #define BIG 0x40 /* set for "BIG" (expand-down seg) */ 122: #define AVL 0x10 /* 0 for available */ 123: #define LIMIT_HIGH 0x0F /* mask for high bits of limit */