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 */