31 #ifndef CPU_X86_MM_PROT_DOMAINS_H_
32 #define CPU_X86_MM_PROT_DOMAINS_H_
41 #define X86_CONF_PROT_DOMAINS__NONE 0
42 #define X86_CONF_PROT_DOMAINS__PAGING 1
43 #define X86_CONF_PROT_DOMAINS__TSS 2
44 #define X86_CONF_PROT_DOMAINS__SWSEG 3
46 #define X86_CONF_PROT_DOMAINS_MULTI_SEG \
47 ((X86_CONF_PROT_DOMAINS == X86_CONF_PROT_DOMAINS__TSS) || \
48 (X86_CONF_PROT_DOMAINS == X86_CONF_PROT_DOMAINS__SWSEG))
51 #define PRIV_LVL_EXC 0
52 #if X86_CONF_PROT_DOMAINS != X86_CONF_PROT_DOMAINS__NONE
54 #define PRIV_LVL_INT 2
56 #define PRIV_LVL_USER 3
58 #define PRIV_LVL_INT PRIV_LVL_EXC
59 #define PRIV_LVL_USER PRIV_LVL_EXC
66 #define EFLAGS_IOPL(pl) ((pl) << 12)
68 #define EFLAGS_IF (1u << 9)
73 typedef uint32_t dom_id_t;
75 #if X86_CONF_PROT_DOMAINS == X86_CONF_PROT_DOMAINS__PAGING
76 #include "paging-prot-domains.h"
77 #elif X86_CONF_PROT_DOMAINS == X86_CONF_PROT_DOMAINS__TSS
78 #include "tss-prot-domains.h"
79 #elif X86_CONF_PROT_DOMAINS == X86_CONF_PROT_DOMAINS__SWSEG
80 #include "swseg-prot-domains.h"
83 #ifndef ATTR_META_ADDR_SPACE
84 #define ATTR_META_ADDR_SPACE
86 #ifndef ATTR_MMIO_ADDR_SPACE
87 #define ATTR_MMIO_ADDR_SPACE
89 #ifndef ATTR_KERN_ADDR_SPACE
90 #define ATTR_KERN_ADDR_SPACE
94 #define MMIO_READL(dst, src) dst = (src)
95 #define MMIO_READW(dst, src) dst = (src)
96 #define MMIO_READB(dst, src) dst = (src)
97 #define MMIO_WRITEL(dst, src) MMIO_READL(dst, src)
98 #define MMIO_WRITEW(dst, src) MMIO_READW(dst, src)
99 #define MMIO_WRITEB(dst, src) MMIO_READB(dst, src)
102 #define KERN_READL(dst, src) dst = (src)
103 #define KERN_READW(dst, src) dst = (src)
104 #define KERN_READB(dst, src) dst = (src)
105 #define KERN_WRITEL(dst, src) KERN_READL(dst, src)
106 #define KERN_WRITEW(dst, src) KERN_READW(dst, src)
107 #define KERN_WRITEB(dst, src) KERN_READB(dst, src)
110 #define META_READL(dst, src) dst = (src)
111 #define META_READW(dst, src) dst = (src)
112 #define META_READB(dst, src) dst = (src)
113 #define META_WRITEL(dst, src) META_READL(dst, src)
114 #define META_WRITEW(dst, src) META_READw(dst, src)
115 #define META_WRITEB(dst, src) META_READB(dst, src)
118 #ifndef MEMCPY_FROM_META
119 #define MEMCPY_FROM_META(dst, src, sz) \
120 memcpy((void *)(dst), (const void *)(src), (sz))
121 #define MEMCPY_TO_META(dst, src, sz) MEMCPY_FROM_META(dst, src, sz)
126 extern uint32_t _stext_addr, _etext_addr;
128 #if X86_CONF_PROT_DOMAINS != X86_CONF_PROT_DOMAINS__NONE
131 #define ATTR_BSS_META __attribute__((section(".meta_bss"))) ATTR_META_ADDR_SPACE
133 #define ATTR_BSS_KERN __attribute__((section(".kern_bss"))) ATTR_KERN_ADDR_SPACE
135 #define ATTR_CODE_BOOT __attribute__((section(".boot_text")))
141 #define ATTR_BSS_KERN_PAGE_ALIGNED \
142 __attribute__((section(".page_aligned_kern_bss")))
145 extern uint32_t _sbss_kern_addr, _ebss_kern_addr;
147 extern uint32_t _ebss_syscall_addr;
149 extern uint32_t _sdata_addr, _edata_addr;
159 #define PROT_DOMAINS_FLAG_BUSY BIT(0)
161 #define PROT_DOMAINS_FLAG_PIO BIT(1)
163 #define PROT_DOMAINS_FLAG_INITED BIT(2)
170 typedef struct dom_kern_data dom_kern_data_t;
172 extern volatile dom_kern_data_t ATTR_KERN_ADDR_SPACE prot_domains_kern_data[];
173 extern volatile dom_kern_data_t ATTR_KERN_ADDR_SPACE prot_domains_kern_data_end[];
175 #define PROT_DOMAINS_ACTUAL_CNT \
176 (prot_domains_kern_data_end - prot_domains_kern_data)
178 #define PROT_DOMAINS_GET_DOM_ID(dkd) \
179 ((dom_id_t)((dkd) - prot_domains_kern_data))
181 void prot_domains_syscall_dispatcher(
void);
183 #if X86_CONF_PROT_DOMAINS != X86_CONF_PROT_DOMAINS__TSS
193 #ifndef PROT_DOMAINS_ALLOC_IMPL
194 #define PROT_DOMAINS_ALLOC_IMPL(nm)
198 #define PROT_DOMAINS_PDCS_NM(nm) _pdcs_##nm
199 #define PROT_DOMAINS_ALLOC(typ, nm) \
200 static dom_kern_data_t __attribute__((section(".prot_dom_bss"))) \
201 ATTR_KERN_ADDR_SPACE PROT_DOMAINS_PDCS_NM(nm); \
202 PROT_DOMAINS_ALLOC_IMPL(nm); \
203 static typ ATTR_BSS_KERN nm
204 #define PROT_DOMAINS_INIT_ID(nm) \
205 KERN_WRITEL((nm).dom_id, PROT_DOMAINS_GET_DOM_ID(&PROT_DOMAINS_PDCS_NM(nm)))
210 void prot_domains_gdt_init() ATTR_CODE_BOOT;
214 void prot_domains_init();
215 void prot_domains_impl_init();
220 #define prot_domains_leave_boot_stage1()
225 #define prot_domains_leave_main()
227 void prot_domains_launch_kernel(
void);
232 #define PROT_DOMAINS_INIT_RET_ADDR_CNT 2
234 #if X86_CONF_PROT_DOMAINS == X86_CONF_PROT_DOMAINS__TSS
235 void prot_domains_launch_app(
void);
238 #define prot_domains_launch_app app_main
243 #define ATTR_BSS_META
244 #define ATTR_BSS_KERN
245 #define ATTR_CODE_BOOT
253 #define PROT_DOMAINS_MMIO(dcd) ((dcd).mmio)
256 #define PROT_DOMAINS_META(dcd) ((dcd).meta)
258 #define PROT_DOMAINS_ALLOC(typ, nm) static typ nm
259 #define PROT_DOMAINS_INIT_ID(nm)
261 #define prot_domains_gdt_init()
263 #define prot_domains_init()
266 #define prot_domains_leave_boot_stage1 main
267 #define prot_domains_leave_main ENABLE_IRQ(); app_main
269 #define PROT_DOMAINS_INIT_RET_ADDR_CNT 0
282 #if X86_CONF_PROT_DOMAINS == X86_CONF_PROT_DOMAINS__NONE
283 #define prot_domains_reg(dcd, mmio_, mmio_sz, meta_, meta_sz, pio) \
284 (dcd)->mmio = (mmio_); \
285 (dcd)->meta = (meta_)
306 #if X86_CONF_PROT_DOMAINS == X86_CONF_PROT_DOMAINS__NONE
307 #define prot_domains_copy_dcd(dst, src) *(dst) = *(src)
321 KERN_READL(dst->dom_id, src->dom_id);
322 #if X86_CONF_PROT_DOMAINS == X86_CONF_PROT_DOMAINS__TSS
323 KERN_READL(dst->
tss_sel, src->tss_sel);
328 #if !X86_CONF_PROT_DOMAINS_MULTI_SEG
329 #define prot_domains_enable_mmio()
330 #define prot_domains_disable_mmio()
332 #define KERN_DATA_OFF_TO_PHYS_ADDR(x) ((uintptr_t)(x))
333 #define DATA_OFF_TO_PHYS_ADDR(x) ((uintptr_t)(x))
336 #if X86_CONF_PROT_DOMAINS == X86_CONF_PROT_DOMAINS__NONE
337 #define prot_domains_lookup_meta_phys_base(drv) 0
340 uintptr_t prot_domains_lookup_meta_phys_base(
dom_client_data_t ATTR_KERN_ADDR_SPACE *drv);
343 #if X86_CONF_PROT_DOMAINS != X86_CONF_PROT_DOMAINS__PAGING
344 #define PROT_DOMAINS_META_OFF_TO_PHYS(off, meta_phys_base) \
345 ((meta_phys_base) + (off))
348 #if X86_CONF_PROT_DOMAINS == X86_CONF_PROT_DOMAINS__NONE
349 #define PROT_DOMAINS_ENTER_ISR(...)
350 #define PROT_DOMAINS_LEAVE_ISR(...)
352 #define PROT_DOMAINS_ENTER_ISR_COMMON(exc) \
353 ".if !" #exc "\n\t" \
355 "mov %%esp, %%ebx\n\t" \
360 "mov 44(%%esp), %%esp\n\t" \
362 #define PROT_DOMAINS_LEAVE_ISR_COMMON(exc) \
364 ".if !" #exc "\n\t" \
365 "mov %%ebx, %%esp\n\t" \
369 #ifdef X86_CONF_PROT_DOMAINS_MULTI_SEG
#define __attribute__(nothing)
Define attribute to nothing since it isn't handled by IAR.
uint32_t tss_sel
The selector is only 16 bits, but it is padded to 32 bits.
uintptr_t meta
Domain-defined metadata base address.
Data associated with each protection domain that is owned by clients of that domain and used to ident...
uintptr_t mmio
MMIO range base address.
int main(void)
This is main...