Lines Matching refs:aspace

43 static inline bool is_inside_aspace(const vmm_aspace_t *aspace, vaddr_t vaddr) {  in is_inside_aspace()  argument
44 return (vaddr >= aspace->base && vaddr <= aspace->base + aspace->size - 1); in is_inside_aspace()
47 static bool is_region_inside_aspace(const vmm_aspace_t *aspace, vaddr_t vaddr, size_t size) { in is_region_inside_aspace() argument
49 if (!is_inside_aspace(aspace, vaddr)) in is_region_inside_aspace()
60 if (vaddr + size - 1 > aspace->base + aspace->size - 1) in is_region_inside_aspace()
66 static size_t trim_to_aspace(const vmm_aspace_t *aspace, vaddr_t vaddr, size_t size) { in trim_to_aspace() argument
67 DEBUG_ASSERT(is_inside_aspace(aspace, vaddr)); in trim_to_aspace()
72 size_t offset = vaddr - aspace->base; in trim_to_aspace()
82 if (offset + size >= aspace->size - 1) in trim_to_aspace()
83 size = aspace->size - offset; in trim_to_aspace()
110 static status_t add_region_to_aspace(vmm_aspace_t *aspace, vmm_region_t *r) { in add_region_to_aspace() argument
111 DEBUG_ASSERT(aspace); in add_region_to_aspace()
115 aspace, aspace->base, aspace->size, r, r->base, r->size); in add_region_to_aspace()
118 if (r->size == 0 || !is_region_inside_aspace(aspace, r->base, r->size)) { in add_region_to_aspace()
127 last = list_peek_head_type(&aspace->region_list, vmm_region_t, node); in add_region_to_aspace()
130 list_add_head(&aspace->region_list, &r->node); in add_region_to_aspace()
135 list_for_every_entry(&aspace->region_list, last, vmm_region_t, node) { in add_region_to_aspace()
139 … vmm_region_t *next = list_next_type(&aspace->region_list, &last->node, vmm_region_t, node); in add_region_to_aspace()
157 __WEAK vaddr_t arch_mmu_pick_spot(arch_aspace_t *aspace, vaddr_t base, uint prev_region_arch_mmu_fl… in arch_mmu_pick_spot() argument
167 static inline bool check_gap(vmm_aspace_t *aspace, in check_gap() argument
179 gap_beg = aspace->base; in check_gap()
186 if (gap_beg == (aspace->base + aspace->size)) in check_gap()
188 gap_end = aspace->base + aspace->size - 1; in check_gap()
191 …*pva = arch_mmu_pick_spot(&aspace->arch_aspace, gap_beg, prev ? prev->arch_mmu_flags : ARCH_MMU_FL… in check_gap()
210 static vaddr_t alloc_spot(vmm_aspace_t *aspace, size_t size, uint8_t align_pow2, in alloc_spot() argument
212 DEBUG_ASSERT(aspace); in alloc_spot()
215 LTRACEF("aspace %p size 0x%zx align %hhu\n", aspace, size, align_pow2); in alloc_spot()
225 if (check_gap(aspace, NULL, in alloc_spot()
226 list_peek_head_type(&aspace->region_list, vmm_region_t, node), in alloc_spot()
231 list_for_every_entry(&aspace->region_list, r, vmm_region_t, node) { in alloc_spot()
232 if (check_gap(aspace, r, in alloc_spot()
233 list_next_type(&aspace->region_list, &r->node, vmm_region_t, node), in alloc_spot()
243 *before = r ? &r->node : &aspace->region_list; in alloc_spot()
248 static vmm_region_t *alloc_region(vmm_aspace_t *aspace, const char *name, size_t size, in alloc_region() argument
259 if (add_region_to_aspace(aspace, r) < 0) { in alloc_region()
268 vaddr = alloc_spot(aspace, size, align_pow2, arch_mmu_flags, &before); in alloc_region()
288 status_t vmm_reserve_space(vmm_aspace_t *aspace, const char *name, size_t size, vaddr_t vaddr) { in vmm_reserve_space() argument
289 LTRACEF("aspace %p name '%s' size 0x%zx vaddr 0x%lx\n", aspace, name, size, vaddr); in vmm_reserve_space()
291 DEBUG_ASSERT(aspace); in vmm_reserve_space()
298 if (!aspace) in vmm_reserve_space()
305 if (!is_inside_aspace(aspace, vaddr)) in vmm_reserve_space()
309 size = trim_to_aspace(aspace, vaddr, size); in vmm_reserve_space()
315 arch_mmu_query(&aspace->arch_aspace, vaddr, NULL, &arch_mmu_flags); in vmm_reserve_space()
318 vmm_region_t *r = alloc_region(aspace, name, size, vaddr, 0, in vmm_reserve_space()
325 status_t vmm_alloc_physical(vmm_aspace_t *aspace, const char *name, size_t size, in vmm_alloc_physical() argument
330 aspace, name, size, ptr ? *ptr : 0, paddr, vmm_flags, arch_mmu_flags); in vmm_alloc_physical()
332 DEBUG_ASSERT(aspace); in vmm_alloc_physical()
339 if (!aspace) in vmm_alloc_physical()
360 vmm_region_t *r = alloc_region(aspace, name, size, vaddr, align_log2, vmm_flags, in vmm_alloc_physical()
372 int err = arch_mmu_map(&aspace->arch_aspace, r->base, paddr, size / PAGE_SIZE, arch_mmu_flags); in vmm_alloc_physical()
382 status_t vmm_alloc_contiguous(vmm_aspace_t *aspace, const char *name, size_t size, void **ptr, in vmm_alloc_contiguous() argument
387 aspace, name, size, ptr ? *ptr : 0, align_pow2, vmm_flags, arch_mmu_flags); in vmm_alloc_contiguous()
389 DEBUG_ASSERT(aspace); in vmm_alloc_contiguous()
426 vmm_region_t *r = alloc_region(aspace, name, size, vaddr, align_pow2, vmm_flags, in vmm_alloc_contiguous()
438 arch_mmu_map(&aspace->arch_aspace, r->base, pa, size / PAGE_SIZE, arch_mmu_flags); in vmm_alloc_contiguous()
456 status_t vmm_alloc(vmm_aspace_t *aspace, const char *name, size_t size, void **ptr, in vmm_alloc() argument
461 aspace, name, size, ptr ? *ptr : 0, align_pow2, vmm_flags, arch_mmu_flags); in vmm_alloc()
463 DEBUG_ASSERT(aspace); in vmm_alloc()
502 vmm_region_t *r = alloc_region(aspace, name, size, vaddr, align_pow2, vmm_flags, in vmm_alloc()
524 arch_mmu_map(&aspace->arch_aspace, va, pa, 1, arch_mmu_flags); in vmm_alloc()
542 static vmm_region_t *vmm_find_region(const vmm_aspace_t *aspace, vaddr_t vaddr) { in vmm_find_region() argument
545 DEBUG_ASSERT(aspace); in vmm_find_region()
547 if (!aspace) in vmm_find_region()
551 list_for_every_entry(&aspace->region_list, r, vmm_region_t, node) { in vmm_find_region()
559 status_t vmm_free_region(vmm_aspace_t *aspace, vaddr_t vaddr) { in vmm_free_region() argument
562 vmm_region_t *r = vmm_find_region (aspace, vaddr); in vmm_free_region()
572 arch_mmu_unmap(&aspace->arch_aspace, r->base, r->size / PAGE_SIZE); in vmm_free_region()
588 vmm_aspace_t *aspace = calloc(1, sizeof(vmm_aspace_t)); in vmm_create_aspace() local
589 if (!aspace) in vmm_create_aspace()
593 strlcpy(aspace->name, name, sizeof(aspace->name)); in vmm_create_aspace()
595 strlcpy(aspace->name, "unnamed", sizeof(aspace->name)); in vmm_create_aspace()
597 aspace->flags = flags; in vmm_create_aspace()
599 if (aspace->flags & VMM_ASPACE_FLAG_KERNEL) { in vmm_create_aspace()
600 aspace->base = KERNEL_ASPACE_BASE; in vmm_create_aspace()
601 aspace->size = KERNEL_ASPACE_SIZE; in vmm_create_aspace()
603 aspace->base = USER_ASPACE_BASE; in vmm_create_aspace()
604 aspace->size = USER_ASPACE_SIZE; in vmm_create_aspace()
608 err = arch_mmu_init_aspace(&aspace->arch_aspace, aspace->base, aspace->size, in vmm_create_aspace()
609 … (aspace->flags & VMM_ASPACE_FLAG_KERNEL) ? ARCH_ASPACE_FLAG_KERNEL : 0); in vmm_create_aspace()
611 free(aspace); in vmm_create_aspace()
615 list_clear_node(&aspace->node); in vmm_create_aspace()
616 list_initialize(&aspace->region_list); in vmm_create_aspace()
619 list_add_head(&aspace_list, &aspace->node); in vmm_create_aspace()
622 *_aspace = aspace; in vmm_create_aspace()
627 status_t vmm_free_aspace(vmm_aspace_t *aspace) { in vmm_free_aspace() argument
630 if (!list_in_list(&aspace->node)) { in vmm_free_aspace()
634 list_delete(&aspace->node); in vmm_free_aspace()
640 while ((r = list_remove_head_type(&aspace->region_list, vmm_region_t, node))) { in vmm_free_aspace()
645 arch_mmu_unmap(&aspace->arch_aspace, r->base, r->size / PAGE_SIZE); in vmm_free_aspace()
660 if (current_thread->aspace == aspace) { in vmm_free_aspace()
662 current_thread->aspace = NULL; in vmm_free_aspace()
663 vmm_context_switch(aspace, NULL); in vmm_free_aspace()
668 arch_mmu_destroy_aspace(&aspace->arch_aspace); in vmm_free_aspace()
671 free(aspace); in vmm_free_aspace()
682 void vmm_set_active_aspace(vmm_aspace_t *aspace) { in vmm_set_active_aspace() argument
683 LTRACEF("aspace %p\n", aspace); in vmm_set_active_aspace()
688 if (aspace == t->aspace) in vmm_set_active_aspace()
693 vmm_aspace_t *old = t->aspace; in vmm_set_active_aspace()
694 t->aspace = aspace; in vmm_set_active_aspace()
695 vmm_context_switch(old, t->aspace); in vmm_set_active_aspace()
767 vmm_aspace_t *aspace; in cmd_vmm() local
768 status_t err = vmm_create_aspace(&aspace, "test", 0); in cmd_vmm()
769 printf("vmm_create_aspace returns %d, aspace %p\n", err, aspace); in cmd_vmm()
771 vmm_aspace_t *aspace; in cmd_vmm() local
772 status_t err = vmm_create_aspace(&aspace, "test", 0); in cmd_vmm()
773 printf("vmm_create_aspace returns %d, aspace %p\n", err, aspace); in cmd_vmm()
777 test_aspace = aspace; in cmd_vmm()
778 get_current_thread()->aspace = aspace; in cmd_vmm()
783 vmm_aspace_t *aspace = (void *)argv[2].u; in cmd_vmm() local
784 if (test_aspace == aspace) in cmd_vmm()
787 if (get_current_thread()->aspace == aspace) { in cmd_vmm()
788 get_current_thread()->aspace = NULL; in cmd_vmm()
792 status_t err = vmm_free_aspace(aspace); in cmd_vmm()
798 get_current_thread()->aspace = test_aspace; in cmd_vmm()