1 /* 2 * Copyright (c) 2023 Intel Corporation 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 #ifndef _IA_STRUCTS_H_ 8 #define _IA_STRUCTS_H_ 9 10 #include <stdint.h> 11 12 #ifndef __ASSEMBLER__ 13 14 /* GDT entry descriptor */ 15 struct gdt_entry { 16 union { 17 struct { 18 uint32_t dword_lo; /* lower dword */ 19 uint32_t dword_up; /* upper dword */ 20 }; 21 struct { 22 uint16_t limit_lw; /* limit (0:15) */ 23 uint16_t base_addr_lw; /* base address (0:15) */ 24 uint8_t base_addr_mb; /* base address (16:23) */ 25 uint8_t flags; /* flags */ 26 uint8_t limit_ub; /* limit (16:19) */ 27 uint8_t base_addr_ub; /* base address (24:31) */ 28 }; 29 }; 30 31 } __attribute__((packed)); 32 33 typedef struct gdt_entry ldt_entry; 34 35 /* GDT header */ 36 struct gdt_header { 37 uint16_t limit; /* GDT limit size */ 38 struct gdt_entry *entries; /* pointer to GDT entries */ 39 } __attribute__((packed)); 40 41 /* IDT entry descriptor */ 42 struct idt_entry { 43 union { 44 struct { 45 uint32_t dword_lo; /* lower dword */ 46 uint32_t dword_up; /* upper dword */ 47 }; 48 49 struct { 50 uint16_t offset_lw; /* offset (0:15) */ 51 uint16_t seg_selector; /* segment selector */ 52 uint8_t zero; /* must be set to zero */ 53 uint8_t flags; /* flags */ 54 uint16_t offset_uw; /* offset (16:31) */ 55 }; 56 }; 57 } __attribute__((packed)); 58 59 /* IDT header */ 60 struct idt_header { 61 uint16_t limit; /* IDT limit size */ 62 struct idt_entry *entries; /* pointer to IDT entries */ 63 } __attribute__((packed)); 64 65 /* TSS entry descriptor */ 66 struct tss_entry { 67 uint16_t prev_task_link; 68 uint16_t reserved1; 69 uint8_t *esp0; 70 uint16_t ss0; 71 uint16_t reserved2; 72 uint8_t *esp1; 73 uint16_t ss1; 74 int16_t reserved3; 75 uint8_t *esp2; 76 uint16_t ss2; 77 uint16_t reserved4; 78 uint32_t cr3; 79 int32_t eip; 80 uint32_t eflags; 81 uint32_t eax; 82 uint32_t ecx; 83 int32_t edx; 84 uint32_t ebx; 85 uint32_t esp; 86 uint32_t ebp; 87 uint32_t esi; 88 uint32_t edi; 89 int16_t es; 90 uint16_t reserved5; 91 uint16_t cs; 92 uint16_t reserved6; 93 uint16_t ss; 94 uint16_t reserved7; 95 uint16_t ds; 96 uint16_t reserved8; 97 uint16_t fs; 98 uint16_t reserved9; 99 uint16_t gs; 100 uint16_t reserved10; 101 uint16_t ldt_seg_selector; 102 uint16_t reserved11; 103 uint16_t trap_debug; 104 /* offset from TSS base for I/O perms */ 105 uint16_t iomap_base_addr; 106 } __attribute__((packed)); 107 108 #endif 109 110 /* code segment flag, E/R, Present = 1, DPL = 0, Acesssed = 1 */ 111 #define GDT_DESC_CODE_FLAGS (0x9B) 112 113 /* data segment flag, R/W, Present = 1, DPL = 0, Acesssed = 1 */ 114 #define GDT_DESC_DATA_FLAGS (0x93) 115 116 /* TSS segment limit size */ 117 #define GDT_DESC_TSS_LIMIT (0x67) 118 119 /* TSS segment flag, Present = 1, DPL = 0, Acesssed = 1 */ 120 #define GDT_DESC_TSS_FLAGS (0x89) 121 122 /* LDT segment flag, Present = 1, DPL = 0 */ 123 #define GDT_DESC_LDT_FLAGS (0x82) 124 125 /* IDT descriptor flag, Present = 1, DPL = 0, 32-bit interrupt gate */ 126 #define IDT_DESC_FLAGS (0x8E) 127 128 #define GEN_GDT_DESC_LO(base, limit, flags) \ 129 ((((limit) >> 12) & 0xFFFF) | (((base) & 0xFFFF) << 16)) 130 131 #define GEN_GDT_DESC_UP(base, limit, flags) \ 132 ((((base) >> 16) & 0xFF) | (((flags) << 8) & 0xFF00) | \ 133 (((limit) >> 12) & 0xFF0000) | ((base) & 0xFF000000) | 0xc00000) 134 135 #define GEN_IDT_DESC_LO(offset, selector, flags) \ 136 (((uint32_t)(offset) & 0xFFFF) | (((selector) & 0xFFFF) << 16)) 137 138 #define GEN_IDT_DESC_UP(offset, selector, flags) \ 139 (((uint32_t)(offset) & 0xFFFF0000) | (((flags) & 0xFF) << 8)) 140 141 #endif 142