-static uint64_t
-make_seg_desc (uint32_t base,
- uint32_t limit,
- enum seg_system system,
- enum seg_type type,
- int dpl,
- enum seg_granularity granularity)
-{
- uint32_t e0 = ((limit & 0xffff) /* Limit 15:0. */
- | (base << 16)); /* Base 15:0. */
- uint32_t e1 = (((base >> 16) & 0xff) /* Base 23:16. */
- | (system << 12) /* 0=system, 1=code/data. */
- | (type << 8) /* Segment type. */
- | (dpl << 13) /* Descriptor privilege. */
- | (1 << 15) /* Present. */
- | (limit & 0xf0000) /* Limit 16:19. */
- | (1 << 22) /* 32-bit segment. */
- | (granularity << 23) /* Byte/page granularity. */
- | (base & 0xff000000)); /* Base 31:24. */
- return e0 | ((uint64_t) e1 << 32);
-}
-
-static uint64_t
-make_code_desc (int dpl)
-{
- return make_seg_desc (0, 0xfffff, SYS_CODE_DATA, TYPE_CODE | TYPE_READABLE,
- dpl, GRAN_PAGE);
-}
-
-static uint64_t
-make_data_desc (int dpl)
-{
- return make_seg_desc (0, 0xfffff, SYS_CODE_DATA, TYPE_WRITABLE,
- dpl, GRAN_PAGE);
-}
-
-static uint64_t
-make_tss_desc (void *vaddr)
-{
- return make_seg_desc ((uint32_t) vaddr,
- 0x67, SYS_SYSTEM, TYPE_TSS_32_A, 0, GRAN_BYTE);
-}