7#ifndef ZEPHYR_INCLUDE_ARCH_X86_IA32_SEGMENTATION_H_
8#define ZEPHYR_INCLUDE_ARCH_X86_IA32_SEGMENTATION_H_
14#define __packed __attribute__((packed))
25#define SEG_TYPE_LDT 0x2
26#define SEG_TYPE_TASK_GATE 0x5
27#define SEG_TYPE_TSS 0x9
28#define SEG_TYPE_TSS_BUSY 0xB
29#define SEG_TYPE_CALL_GATE 0xC
30#define SEG_TYPE_IRQ_GATE 0xE
31#define SEG_TYPE_TRAP_GATE 0xF
37#define DT_NON_READABLE 0
40#define DT_NON_WRITABLE 0
42#define DT_EXPAND_DOWN 1
46#define DT_NONCONFORM 0
48#define DT_TYPE_SYSTEM 0
49#define DT_TYPE_CODEDATA 1
96#define SEG_SELECTOR(index, table, dpl) (index << 3 | table << 2 | dpl)
232#define DT_ZERO_ENTRY { { 0 } }
243#define _LIMIT_AND_BASE(base_p, limit_p, granularity_p) \
244 .base_low = (((uint32_t)base_p) & 0xFFFF), \
245 .base_mid = (((base_p) >> 16) & 0xFF), \
246 .base_hi = (((base_p) >> 24) & 0xFF), \
247 .limit_low = ((limit_p) & 0xFFFF), \
248 .limit_hi = (((limit_p) >> 16) & 0xF), \
249 .granularity = (granularity_p), \
254#define _SEGMENT_AND_OFFSET(segment_p, offset_p) \
255 .segment_selector = (segment_p), \
256 .offset_low = ((offset_p) & 0xFFFF), \
257 .offset_hi = ((offset_p) >> 16)
259#define _DESC_COMMON(dpl_p) \
263#define _SYS_DESC(type_p) \
267#define DT_CODE_SEG_ENTRY(base_p, limit_p, granularity_p, dpl_p, readable_p, \
270 _DESC_COMMON(dpl_p), \
271 _LIMIT_AND_BASE(base_p, limit_p, granularity_p), \
273 .rw = (readable_p), \
274 .cd = (conforming_p), \
276 .descriptor_type = 1 \
279#define DT_DATA_SEG_ENTRY(base_p, limit_p, granularity_p, dpl_p, writable_p, \
282 _DESC_COMMON(dpl_p), \
283 _LIMIT_AND_BASE(base_p, limit_p, granularity_p), \
285 .rw = (writable_p), \
286 .cd = (direction_p), \
288 .descriptor_type = 1 \
291#define DT_LDT_ENTRY(base_p, limit_p, granularity_p, dpl_p) \
293 _DESC_COMMON(dpl_p), \
294 _LIMIT_AND_BASE(base_p, limit_p, granularity_p), \
295 _SYS_DESC(SEG_TYPE_LDT) \
298#define DT_TSS_ENTRY(base_p, limit_p, granularity_p, dpl_p) \
300 _DESC_COMMON(dpl_p), \
301 _LIMIT_AND_BASE(base_p, limit_p, granularity_p), \
302 _SYS_DESC(SEG_TYPE_TSS) \
308#define DT_TSS_STD_ENTRY(base_p, dpl_p) \
309 DT_TSS_ENTRY(base_p, sizeof(struct task_state_segment), DT_GRAN_BYTE, \
312#define DT_TASK_GATE_ENTRY(segment_p, dpl_p) \
314 _DESC_COMMON(dpl_p), \
315 _SYS_DESC(SEG_TYPE_TASK_GATE), \
316 .segment_selector = (segment_p) \
319#define DT_IRQ_GATE_ENTRY(segment_p, offset_p, dpl_p) \
321 _DESC_COMMON(dpl_p), \
322 _SEGMENT_AND_OFFSET(segment_p, offset_p), \
323 _SYS_DESC(SEG_TYPE_IRQ_GATE), \
327#define DT_TRAP_GATE_ENTRY(segment_p, offset_p, dpl_p) \
329 _DESC_COMMON(dpl_p), \
330 _SEGMENT_AND_OFFSET(segment_p, offset_p), \
331 _SYS_DESC(SEG_TYPE_TRAP_GATE), \
335#define DT_CALL_GATE_ENTRY(segment_p, offset_p, dpl_p, param_count_p) \
337 _DESC_COMMON(dpl_p), \
338 _SEGMENT_AND_OFFSET(segment_p, offset_p), \
339 _SYS_DESC(SEG_TYPE_TRAP_GATE), \
340 .reserved_or_param = (param_count_p), \
344#define DTE_BASE(dt_entry) ((dt_entry)->base_low | \
345 ((dt_entry)->base_mid << 16) | \
346 ((dt_entry)->base_hi << 24))
348#define DTE_LIMIT(dt_entry) ((dt_entry)->limit_low | \
349 ((dt_entry)->limit_hi << 16))
351#define DTE_OFFSET(dt_entry) ((dt_entry)->offset_low | \
352 ((dt_entry)->offset_hi << 16))
354#define DT_INIT(entries) { sizeof(entries) - 1, &entries[0] }
397 z_sd_set_seg_offset(sd, seg_selector, offset);
409static inline void _set_tss(
uint16_t sel)
411 __asm__ __volatile__ (
"ltr %0" ::
"r" (sel));
420static inline uint16_t _get_tss(
void)
424 __asm__ __volatile__ (
"str %0" :
"=r" (sel));
436 __asm__ __volatile__ (
"sgdt %0" :
"=m" (*gdt));
447 __asm__ __volatile__ (
"sidt %0" :
"=m" (*idt));
456static inline uint16_t _get_ldt(
void)
460 __asm__ __volatile__ (
"sldt %0" :
"=m" (
ret));
470static inline void _set_ldt(
uint16_t ldt)
472 __asm__ __volatile__ (
"lldt %0" ::
"m" (ldt));
486 __asm__ __volatile__ (
"lgdt %0" ::
"m" (*gdt));
497 __asm__ __volatile__ (
"lidt %0" ::
"m" (*idt));
510 __asm__ __volatile__ (
"mov %%cs, %0" :
"=r" (cs));
524 __asm__ __volatile__ (
"mov %%ds, %0" :
"=r" (ds));
static ZTEST_BMEM volatile int ret
Definition: k_float_disable.c:28
#define SEG_TYPE_IRQ_GATE
Definition: segmentation.h:30
#define DT_TYPE_SYSTEM
Definition: segmentation.h:48
__UINT32_TYPE__ uint32_t
Definition: stdint.h:60
__UINT8_TYPE__ uint8_t
Definition: stdint.h:58
__UINT16_TYPE__ uint16_t
Definition: stdint.h:59
Definition: segmentation.h:224
void * offset
Definition: segmentation.h:226
uint16_t sel
Definition: segmentation.h:228
Definition: segmentation.h:215
uint16_t size
Definition: segmentation.h:216
struct segment_descriptor * entries
Definition: segmentation.h:217
Definition: segmentation.h:107
uint8_t always_0_0
Definition: segmentation.h:144
uint16_t reserved_task_gate_2
Definition: segmentation.h:190
uint16_t base_low
Definition: segmentation.h:127
uint8_t cd
Definition: segmentation.h:158
uint8_t reserved_task_gate_1
Definition: segmentation.h:136
uint8_t base_hi
Definition: segmentation.h:205
uint8_t db
Definition: segmentation.h:202
uint8_t executable
Definition: segmentation.h:160
uint8_t rw
Definition: segmentation.h:156
uint8_t avl
Definition: segmentation.h:197
uint8_t present
Definition: segmentation.h:168
uint8_t reserved_or_param
Definition: segmentation.h:141
uint16_t offset_hi
Definition: segmentation.h:187
uint8_t type
Definition: segmentation.h:174
uint8_t descriptor_type
Definition: segmentation.h:165
uint8_t base_mid
Definition: segmentation.h:133
uint8_t flags_l
Definition: segmentation.h:200
uint8_t accessed
Definition: segmentation.h:153
uint16_t offset_low
Definition: segmentation.h:118
uint16_t limit_low
Definition: segmentation.h:112
uint8_t use_other_union
Definition: segmentation.h:180
uint16_t reserved_task_gate_0
Definition: segmentation.h:115
uint8_t limit_hi
Definition: segmentation.h:194
uint16_t segment_selector
Definition: segmentation.h:124
uint8_t granularity
Definition: segmentation.h:203
uint8_t dpl
Definition: segmentation.h:167
Definition: segmentation.h:54
uint16_t ss
Definition: segmentation.h:81
uint16_t reserved_9
Definition: segmentation.h:86
uint16_t cs
Definition: segmentation.h:79
uint16_t reserved_12
Definition: segmentation.h:92
uint32_t ebp
Definition: segmentation.h:74
uint32_t esp2
Definition: segmentation.h:63
uint16_t ss1
Definition: segmentation.h:61
uint32_t esi
Definition: segmentation.h:75
uint16_t reserved_10
Definition: segmentation.h:88
uint32_t edi
Definition: segmentation.h:76
uint16_t reserved_4
Definition: segmentation.h:65
uint32_t edx
Definition: segmentation.h:71
uint32_t ecx
Definition: segmentation.h:70
uint32_t cr3
Definition: segmentation.h:66
uint16_t iomap
Definition: segmentation.h:93
uint16_t reserved_3
Definition: segmentation.h:62
uint16_t backlink
Definition: segmentation.h:55
uint16_t es
Definition: segmentation.h:77
uint16_t ss0
Definition: segmentation.h:58
uint32_t ebx
Definition: segmentation.h:72
uint16_t fs
Definition: segmentation.h:85
uint16_t reserved_2
Definition: segmentation.h:59
uint32_t esp1
Definition: segmentation.h:60
uint32_t eip
Definition: segmentation.h:67
uint16_t reserved_8
Definition: segmentation.h:84
uint32_t eflags
Definition: segmentation.h:68
uint16_t ldt_ss
Definition: segmentation.h:89
uint16_t ds
Definition: segmentation.h:83
uint16_t gs
Definition: segmentation.h:87
uint16_t ss2
Definition: segmentation.h:64
uint32_t eax
Definition: segmentation.h:69
uint16_t reserved_5
Definition: segmentation.h:78
uint16_t reserved_1
Definition: segmentation.h:56
uint16_t reserved_6
Definition: segmentation.h:80
uint8_t t
Definition: segmentation.h:91
uint16_t reserved_7
Definition: segmentation.h:82
uint32_t esp0
Definition: segmentation.h:57
uint16_t reserved_11
Definition: segmentation.h:90
uint32_t esp
Definition: segmentation.h:73