31 #ifndef CPU_X86_MM_SEGMENTATION_H_
32 #define CPU_X86_MM_SEGMENTATION_H_
36 #define SEG_FLAG(lbl, val) \
37 (((val) & (~0u >> (32 - SEG_WIDTH_##lbl))) << SEG_SHAMT_##lbl)
39 #define SEG_SET_FLAG(desc, lbl, val) \
40 (desc).flags = ((desc).flags & ~SEG_FLAG(lbl, ~0u)) | SEG_FLAG(lbl, val)
42 #define SEG_WIDTH_TYPE 4
43 #define SEG_SHAMT_TYPE 0
44 #define SEG_WIDTH_DESCTYPE 1
45 #define SEG_SHAMT_DESCTYPE 4
46 #define SEG_WIDTH_DPL 2
47 #define SEG_SHAMT_DPL 5
48 #define SEG_WIDTH_PRESENT 1
49 #define SEG_SHAMT_PRESENT 7
50 #define SEG_WIDTH_LIMIT_HI 4
51 #define SEG_SHAMT_LIMIT_HI 8
52 #define SEG_WIDTH_AVL 1
53 #define SEG_SHAMT_AVL 12
54 #define SEG_WIDTH_LONG_MODE 1
55 #define SEG_SHAMT_LONG_MODE 13
57 #define SEG_WIDTH_DIRECTION 1
58 #define SEG_SHAMT_DIRECTION 14
59 #define SEG_WIDTH_GRAN 1
60 #define SEG_SHAMT_GRAN 15
62 #define SEG_TYPE_DATA_RDONLY SEG_FLAG(TYPE, 0x00)
63 #define SEG_TYPE_DATA_RDWR SEG_FLAG(TYPE, 0x02)
64 #define SEG_TYPE_CODE_EXRD SEG_FLAG(TYPE, 0x0A)
65 #define SEG_TYPE_CODE_EX SEG_FLAG(TYPE, 0x08)
66 #define SEG_TYPE_LDT SEG_FLAG(TYPE, 0x02)
67 #define SEG_TYPE_TSS32_AVAIL SEG_FLAG(TYPE, 0x09)
69 #define SEG_DESCTYPE_SYS SEG_FLAG(DESCTYPE, 0)
70 #define SEG_DESCTYPE_NSYS SEG_FLAG(DESCTYPE, 1)
72 #define SEG_PRESENT SEG_FLAG(PRESENT, 1)
74 #define SEG_DEFL_OPSZ_32BIT SEG_FLAG(DIRECTION, 1)
76 #define SEG_GRAN_BYTE SEG_FLAG(GRAN, 0)
77 #define SEG_GRAN_PAGE SEG_FLAG(GRAN, 1)
83 #define SEG_MAX_BYTE_GRAN_LEN (1 << 20)
92 uint32_t base_lo : 16;
93 uint32_t base_mid : 8;
98 uint32_t raw_lo, raw_hi;
103 #define SEG_DESC_NOT_PRESENT 0
112 uint32_t limit = len - 1;
114 SEG_SET_FLAG(*c_this, LIMIT_HI, limit >> 16);
115 c_this->lim_lo = limit;
128 uint32_t base, uint32_t len, uint16_t flags)
133 c_this->base_mid = base >> 16;
134 c_this->base_hi = base >> 24;
137 c_this->base_lo = base;
139 c_this->flags = SEG_FLAG(PRESENT, 1) | SEG_DEFL_OPSZ_32BIT | flags;
144 segment_desc_set_limit(c_this, len);
#define __attribute__(nothing)
Define attribute to nothing since it isn't handled by IAR.