33 #include "prot-domains.h"
34 #include "segmentation.h"
41 return (desc.base_hi << 24) | (desc.base_mid << 16) | desc.base_lo;
45 prot_domains_reg_multi_seg(
volatile struct dom_kern_data ATTR_KERN_ADDR_SPACE *dkd,
46 uintptr_t mmio,
size_t mmio_sz,
47 uintptr_t meta,
size_t meta_sz)
50 dom_id_t dom_id = PROT_DOMAINS_GET_DOM_ID(dkd);
51 uint32_t kern_data_len;
54 if((dkd < prot_domains_kern_data) ||
55 (prot_domains_kern_data_end <= dkd) ||
56 (((((uintptr_t)dkd) - (uintptr_t)prot_domains_kern_data) %
57 sizeof(dom_kern_data_t)) != 0)) {
61 KERN_READL(tmp, dkd->ldt[DT_SEL_GET_IDX(LDT_SEL_KERN)].raw_hi);
69 if(dom_id == DOM_ID_kern) {
70 kern_data_len = (uint32_t)&_ebss_kern_addr;
76 kern_data_len = (uint32_t)&_ebss_syscall_addr;
78 kern_data_len -= (uint32_t)&_sbss_kern_addr;
80 segment_desc_init(&desc, (uint32_t)&_sbss_kern_addr, kern_data_len,
85 ((dom_id == DOM_ID_kern) ?
87 SEG_TYPE_DATA_RDONLY) |
88 SEG_FLAG(DPL, PRIV_LVL_USER) |
89 SEG_GRAN_BYTE | SEG_DESCTYPE_NSYS);
91 KERN_WRITEL(dkd->ldt[LDT_IDX_KERN].raw_lo, desc.raw_lo);
92 KERN_WRITEL(dkd->ldt[LDT_IDX_KERN].raw_hi, desc.raw_hi);
95 if(SEG_MAX_BYTE_GRAN_LEN < mmio_sz) {
99 segment_desc_init(&desc, mmio, mmio_sz,
100 SEG_FLAG(DPL, PRIV_LVL_USER) | SEG_GRAN_BYTE |
101 SEG_DESCTYPE_NSYS | SEG_TYPE_DATA_RDWR);
103 desc.raw = SEG_DESC_NOT_PRESENT;
106 KERN_WRITEL(dkd->ldt[LDT_IDX_MMIO].raw_lo, desc.raw_lo);
107 KERN_WRITEL(dkd->ldt[LDT_IDX_MMIO].raw_hi, desc.raw_hi);
110 if(SEG_MAX_BYTE_GRAN_LEN < meta_sz) {
114 segment_desc_init(&desc, meta, meta_sz,
115 SEG_FLAG(DPL, PRIV_LVL_USER) | SEG_GRAN_BYTE |
116 SEG_DESCTYPE_NSYS | SEG_TYPE_DATA_RDWR);
118 desc.raw = SEG_DESC_NOT_PRESENT;
121 KERN_WRITEL(dkd->ldt[LDT_IDX_META].raw_lo, desc.raw_lo);
122 KERN_WRITEL(dkd->ldt[LDT_IDX_META].raw_hi, desc.raw_hi);
124 segment_desc_init(&desc,
125 KERN_DATA_OFF_TO_PHYS_ADDR(dkd->ldt),
127 SEG_FLAG(DPL, PRIV_LVL_USER) | SEG_GRAN_BYTE |
128 SEG_DESCTYPE_SYS | SEG_TYPE_LDT);
129 gdt_insert(GDT_IDX_LDT(dom_id), desc);
133 prot_domains_gdt_init()
138 segment_desc_init(&desc,
139 (uint32_t)&_stext_addr,
140 ((uint32_t)&_etext_addr) - (uint32_t)&_stext_addr,
141 SEG_FLAG(DPL, PRIV_LVL_EXC) | SEG_GRAN_BYTE |
143 #
if X86_CONF_PROT_DOMAINS == X86_CONF_PROT_DOMAINS__SWSEG
150 gdt_insert_boot(GDT_IDX_CODE_EXC, desc);
152 segment_desc_init(&desc,
153 (uint32_t)&_sdata_addr,
154 ((uint32_t)&_edata_addr) - (uint32_t)&_sdata_addr,
155 SEG_FLAG(DPL, PRIV_LVL_USER) | SEG_GRAN_BYTE |
156 SEG_DESCTYPE_NSYS | SEG_TYPE_DATA_RDWR);
157 gdt_insert_boot(GDT_IDX_DATA, desc);
159 segment_desc_init(&desc,
160 (uint32_t)&_sbss_kern_addr,
161 ((uint32_t)&_ebss_kern_addr) -
162 (uint32_t)&_sbss_kern_addr,
163 SEG_FLAG(DPL, PRIV_LVL_EXC) | SEG_GRAN_BYTE |
164 SEG_DESCTYPE_NSYS | SEG_TYPE_DATA_RDWR);
165 gdt_insert_boot(GDT_IDX_DATA_KERN_EXC, desc);
167 segment_desc_init(&desc,
168 (uint32_t)DATA_OFF_TO_PHYS_ADDR(stacks_main),
170 SEG_FLAG(DPL, PRIV_LVL_USER) | SEG_GRAN_BYTE |
171 SEG_DESCTYPE_NSYS | SEG_TYPE_DATA_RDWR);
172 gdt_insert_boot(GDT_IDX_STK, desc);
174 segment_desc_set_limit(&desc, STACKS_SIZE_MAIN + STACKS_SIZE_INT);
175 SEG_SET_FLAG(desc, DPL, PRIV_LVL_INT);
176 gdt_insert_boot(GDT_IDX_STK_INT, desc);
178 segment_desc_set_limit(&desc,
182 SEG_SET_FLAG(desc, DPL, PRIV_LVL_EXC);
183 gdt_insert_boot(GDT_IDX_STK_EXC, desc);
188 desc.raw = SEG_DESC_NOT_PRESENT;
189 for(i = 0; i < PROT_DOMAINS_ACTUAL_CNT; i++) {
190 #if X86_CONF_PROT_DOMAINS == X86_CONF_PROT_DOMAINS__TSS
191 gdt_insert_boot(GDT_IDX_TSS(i), desc);
193 gdt_insert_boot(GDT_IDX_LDT(i), desc);
196 __asm__ __volatile__ (
197 "mov %[_default_data_], %%ds\n\t"
198 "mov %[_default_data_], %%es\n\t"
199 "mov %[_kern_data_], %%" SEG_KERN
"s\n\t"
201 : [_default_data_]
"r"(GDT_SEL_DATA),
202 [_kern_data_]
"r"(GDT_SEL_DATA_KERN_EXC));
206 multi_segment_launch_kernel(
void)
209 __asm__ __volatile__ (
210 "mov %[_data_seg_], %%ds\n\t"
211 "mov %[_data_seg_], %%es\n\t"
212 "mov %[_kern_seg_], %%" SEG_KERN
"s\n\t"
213 "mov %[_data_seg_], %%" SEG_META
"s\n\t"
215 : [_data_seg_]
"r" (GDT_SEL_DATA),
216 [_kern_seg_]
"r" (LDT_SEL_KERN)
221 prot_domains_enable_mmio(
void)
223 __asm__ __volatile__ (
"mov %0, %%" SEG_MMIO
"s" ::
"r" (LDT_SEL_MMIO));
227 prot_domains_disable_mmio(
void)
229 __asm__ __volatile__ (
"mov %0, %%" SEG_KERN
"s" ::
"r" (LDT_SEL_KERN));
237 volatile dom_kern_data_t ATTR_KERN_ADDR_SPACE *dkd;
239 KERN_READL(dom_id, drv->dom_id);
241 dkd = prot_domains_kern_data + dom_id;
243 KERN_READL(desc.raw_lo, dkd->ldt[DT_SEL_GET_IDX(LDT_SEL_META)].raw_lo);
244 KERN_READL(desc.raw_hi, dkd->ldt[DT_SEL_GET_IDX(LDT_SEL_META)].raw_hi);
246 return segment_desc_compute_base(desc);
Data associated with each protection domain that is owned by clients of that domain and used to ident...