36 #include "prot-domains.h"
41 uint32_t prot_domains_main_esp;
42 syscalls_entrypoint_t ATTR_KERN_ADDR_SPACE *prot_domains_syscall;
48 uintptr_t mmio,
size_t mmio_sz,
49 uintptr_t meta,
size_t meta_sz,
55 volatile struct dom_kern_data ATTR_KERN_ADDR_SPACE *dkd;
57 KERN_READL(dom_id, dcd->dom_id);
59 dkd = prot_domains_kern_data + dom_id;
61 prot_domains_reg_multi_seg(dkd, mmio, mmio_sz, meta, meta_sz);
66 eflags = EFLAGS_IOPL(pio ? PRIV_LVL_USER : PRIV_LVL_INT);
67 if(dom_id == DOM_ID_app) {
74 KERN_WRITEL(dkd->tss.ebp, 0);
75 KERN_WRITEL(dkd->tss.ebx, 0);
76 KERN_WRITEL(dkd->tss.esi,
BIT(dom_id));
77 KERN_WRITEL(dkd->tss.eip,
78 (dom_id == DOM_ID_app) ?
80 (uint32_t)prot_domains_syscall_dispatcher);
81 KERN_WRITEL(dkd->tss.cs, GDT_SEL_CODE);
82 KERN_WRITEL(dkd->tss.ds, GDT_SEL_DATA);
83 KERN_WRITEL(dkd->tss.es, GDT_SEL_DATA);
84 KERN_WRITEL(dkd->tss.fs, LDT_SEL_KERN);
85 KERN_WRITEL(dkd->tss.gs,
86 (meta_sz == 0) ? GDT_SEL_NULL : LDT_SEL_META);
87 KERN_WRITEL(dkd->tss.ss, GDT_SEL_STK);
92 KERN_WRITEL(dkd->tss.esp,
94 STACKS_INIT_TOP + (2 *
sizeof(uintptr_t)));
95 KERN_WRITEL(dkd->tss.eflags, eflags);
96 KERN_WRITEL(dkd->tss.ldt, GDT_SEL_LDT(dom_id));
97 KERN_WRITEL(dkd->tss.esp2, STACKS_SIZE_MAIN + STACKS_SIZE_INT);
98 KERN_WRITEL(dkd->tss.ss2, GDT_SEL_STK_INT);
99 KERN_WRITEL(dkd->tss.esp0,
100 STACKS_SIZE_MAIN + STACKS_SIZE_INT + STACKS_SIZE_EXC);
101 KERN_WRITEL(dkd->tss.ss0, GDT_SEL_STK_EXC);
102 KERN_WRITEW(dkd->tss.t, 0);
103 KERN_WRITEW(dkd->tss.iomap_base,
sizeof(
tss_t));
104 KERN_WRITEL(dkd->tss.cr3, 0);
106 segment_desc_init(&desc,
107 KERN_DATA_OFF_TO_PHYS_ADDR((uint32_t)&(dkd->tss)),
112 SEG_FLAG(DPL, PRIV_LVL_USER) | SEG_TYPE_TSS32_AVAIL);
114 gdt_insert(GDT_IDX_TSS(dom_id), desc);
116 KERN_WRITEW(dcd->tss_sel, GDT_SEL(GDT_IDX_TSS(dom_id), PRIV_LVL_USER));
119 void dev_not_avail_isr(
void);
121 prot_domains_impl_init(
void)
123 __asm__ __volatile__ (
"ltr %0" ::
"r" ((uint16_t)GDT_SEL_TSS(DOM_ID_kern)));
124 __asm__ __volatile__ (
"lldt %0" ::
"r" ((uint16_t)GDT_SEL_LDT(DOM_ID_kern)));
126 idt_set_intr_gate_desc(7,
127 (uint32_t)dev_not_avail_isr,
128 GDT_SEL_CODE_EXC, PRIV_LVL_EXC);
133 prot_domains_launch_kernel(
void)
135 multi_segment_launch_kernel();
138 __asm__ __volatile__ (
140 "pushl %[_top_of_stk_]\n\t"
141 "pushl %[_eflags_]\n\t"
143 "pushl %[_kern_start_]\n\t"
146 : [_ss_]
"g" (GDT_SEL_STK),
147 [_eflags_]
"g" (EFLAGS_IOPL(PRIV_LVL_USER)),
148 [_cs_]
"g" (GDT_SEL_CODE),
149 [_kern_start_]
"g" (
main),
151 [_top_of_stk_]
"g" (STACKS_INIT_TOP +
sizeof(uint32_t))
156 prot_domains_launch_app()
158 far_pointer_t app_ptr = { 0, GDT_SEL_TSS(DOM_ID_app) };
159 __asm__ __volatile__ (
"ljmp *%0" ::
"m" (app_ptr));
#define BIT(x)
Useful to reference a single bit of a byte.
Data associated with each protection domain that is owned by clients of that domain and used to ident...
int main()
This is main...