From e895ca1bf17b2a48687c660a02108d2b995bd513 Mon Sep 17 00:00:00 2001 From: Travis Geiselbrecht Date: Sun, 1 Jun 2008 10:57:21 +0000 Subject: [PATCH] some vm to accomodate needing to have a region search spot be different from the larger address space, specifically the 64bit kernel address space. git-svn-id: svn+ssh://newos.org/var/svn/newos/newos@1259 c25cc9d1-44fa-0310-b259-ad778cb1d433 --- include/kernel/vm.h | 3 ++- include/kernel/vm_priv.h | 1 + kernel/thread.c | 2 +- kernel/vm/vm.c | 25 +++++++++++++++---------- kernel/vm/vm_page.c | 5 ++++- 5 files changed, 23 insertions(+), 13 deletions(-) diff --git a/include/kernel/vm.h b/include/kernel/vm.h index 4fd6461..7c01f25 100644 --- a/include/kernel/vm.h +++ b/include/kernel/vm.h @@ -121,6 +121,7 @@ typedef struct vm_virtual_map { sem_id sem; struct vm_address_space *aspace; addr_t base; + addr_t alloc_base; addr_t size; } vm_virtual_map; @@ -205,7 +206,7 @@ int vm_init(kernel_args *ka); int vm_init_postsem(kernel_args *ka); int vm_init_postthread(kernel_args *ka); -aspace_id vm_create_aspace(const char *name, addr_t base, addr_t size, bool kernel); +aspace_id vm_create_aspace(const char *name, addr_t base, addr_t alloc_base, addr_t size, bool kernel); int vm_delete_aspace(aspace_id); vm_address_space *vm_get_kernel_aspace(void); aspace_id vm_get_kernel_aspace_id(void); diff --git a/include/kernel/vm_priv.h b/include/kernel/vm_priv.h index 31c8199..1369951 100644 --- a/include/kernel/vm_priv.h +++ b/include/kernel/vm_priv.h @@ -46,6 +46,7 @@ addr_t vm_page_num_free_pages(void); // allocates memory from the ka structure addr_t vm_alloc_from_ka_struct(kernel_args *ka, unsigned int size, int lock); +addr_t vm_alloc_ppage_from_kernel_struct(kernel_args *ka); // a global structure holding data about the vm for informational purposes extern vm_info_t vm_info; diff --git a/kernel/thread.c b/kernel/thread.c index 6c47ea5..a2723c3 100644 --- a/kernel/thread.c +++ b/kernel/thread.c @@ -2190,7 +2190,7 @@ proc_id proc_create_proc(const char *path, const char *name, char **args, int ar } // create an address space for this process - p->aspace_id = vm_create_aspace(p->name, USER_BASE, USER_SIZE, false); + p->aspace_id = vm_create_aspace(p->name, USER_BASE, USER_BASE, USER_SIZE, false); if(p->aspace_id < 0) { err = p->aspace_id; goto err4; diff --git a/kernel/vm/vm.c b/kernel/vm/vm.c index c589805..cfcc719 100644 --- a/kernel/vm/vm.c +++ b/kernel/vm/vm.c @@ -1,5 +1,5 @@ /* -** Copyright 2001-2004, Travis Geiselbrecht. All rights reserved. +** Copyright 2001-2008, Travis Geiselbrecht. All rights reserved. ** Distributed under the terms of the NewOS License. */ #include @@ -224,7 +224,7 @@ static int find_and_insert_region_slot(vm_virtual_map *map, addr_t start, addr_t // dprintf("find_and_insert_region_slot: map %p, start 0x%lx, size %ld, end 0x%lx, addr_type %d, region %p\n", // map, start, size, end, addr_type, region); -// dprintf("map->base 0x%x, map->size 0x%x\n", map->base, map->size); +// dprintf("map->base 0x%lx, map->alloc_base 0x%lx, map->size 0x%lx\n", map->base, map->alloc_base, map->size); // do some sanity checking if(start < map->base || size == 0 || (end - 1) > (map->base + (map->size - 1)) || start + size > end) @@ -242,9 +242,9 @@ static int find_and_insert_region_slot(vm_virtual_map *map, addr_t start, addr_t } #if 0 - dprintf("last_r 0x%x, next_r 0x%x\n", last_r, next_r); - if(last_r) dprintf("last_r->base 0x%x, last_r->size 0x%x\n", last_r->base, last_r->size); - if(next_r) dprintf("next_r->base 0x%x, next_r->size 0x%x\n", next_r->base, next_r->size); + dprintf("last_r %p, next_r %p\n", last_r, next_r); + if(last_r) dprintf("last_r->base 0x%lx, last_r->size 0x%lx\n", last_r->base, last_r->size); + if(next_r) dprintf("next_r->base 0x%lx, next_r->size 0x%lx\n", next_r->base, next_r->size); #endif switch(addr_type) { @@ -307,6 +307,7 @@ static int find_and_insert_region_slot(vm_virtual_map *map, addr_t start, addr_t if(foundspot) { region->size = size; +// dprintf("found spot: base 0x%lx, size 0x%lx\n", region->base, region->size); if(last_r) { region->aspace_next = last_r->aspace_next; last_r->aspace_next = region; @@ -429,8 +430,9 @@ static int map_backing_store(vm_address_space *aspace, vm_store *store, void **v search_addr = (addr_t)*vaddr; search_end = (addr_t)*vaddr + size; } else if(addr_type == REGION_ADDR_ANY_ADDRESS) { - search_addr = aspace->virtual_map.base; - search_end = aspace->virtual_map.base + (aspace->virtual_map.size - 1); + search_addr = aspace->virtual_map.alloc_base; + search_end = aspace->virtual_map.alloc_base + + ((aspace->virtual_map.size - 1) - (aspace->virtual_map.alloc_base - aspace->virtual_map.base)); } else { err = ERR_INVALID_ARGS; goto err1b; @@ -708,6 +710,7 @@ region_id vm_map_physical_memory(aspace_id aid, char *name, void **address, int err = map_backing_store(aspace, store, address, 0, size, addr_type, 0, lock, REGION_NO_PRIVATE_MAP, ®ion, name); vm_cache_release_ref(cache_ref); vm_put_aspace(aspace); + if(err < 0) { return err; } @@ -1397,6 +1400,7 @@ static void _dump_aspace(vm_address_space *aspace) dprintf("hash_next: %p\n", aspace->hash_next); dprintf("translation_map: %p\n", &aspace->translation_map); dprintf("virtual_map.base: 0x%lx\n", aspace->virtual_map.base); + dprintf("virtual_map.alloc_base: 0x%lx\n", aspace->virtual_map.alloc_base); dprintf("virtual_map.size: 0x%lx\n", aspace->virtual_map.size); dprintf("virtual_map.change_count: 0x%x\n", aspace->virtual_map.change_count); dprintf("virtual_map.sem: 0x%x\n", aspace->virtual_map.sem); @@ -1528,7 +1532,7 @@ void vm_put_aspace(vm_address_space *aspace) return; } -aspace_id vm_create_aspace(const char *name, addr_t base, addr_t size, bool kernel) +aspace_id vm_create_aspace(const char *name, addr_t base, addr_t alloc_base, addr_t size, bool kernel) { vm_address_space *aspace; int err; @@ -1564,6 +1568,7 @@ aspace_id vm_create_aspace(const char *name, addr_t base, addr_t size, bool kern // initialize the virtual map aspace->virtual_map.base = base; + aspace->virtual_map.alloc_base = alloc_base; aspace->virtual_map.size = size; aspace->virtual_map.region_list = NULL; aspace->virtual_map.region_hint = NULL; @@ -1705,7 +1710,7 @@ int vm_init(kernel_args *ka) // create the initial kernel address space { aspace_id aid; - aid = vm_create_aspace("kernel_land", KERNEL_BASE, KERNEL_SIZE, true); + aid = vm_create_aspace("kernel_land", KERNEL_BASE, KERNEL_ALLOC_BASE, KERNEL_SIZE, true); if(aid < 0) panic("vm_init: error creating kernel address space!\n"); kernel_aspace = vm_get_aspace_by_id(aid); @@ -1807,7 +1812,7 @@ int vm_page_fault(addr_t address, addr_t fault_address, bool is_write, bool is_u { int err; -// dprintf("vm_page_fault: page fault at 0x%x, ip 0x%x\n", address, fault_address); +// dprintf("vm_page_fault: page fault at 0x%lx, ip 0x%lx\n", address, fault_address); *newip = 0; diff --git a/kernel/vm/vm_page.c b/kernel/vm/vm_page.c index 0e46cb9..c776da1 100644 --- a/kernel/vm/vm_page.c +++ b/kernel/vm/vm_page.c @@ -208,6 +208,7 @@ int vm_page_init(kernel_args *ka) unsigned int last_phys_page = 0; dprintf("physical memory ranges:\n"); + dprintf("count %d\n", ka->num_phys_mem_ranges); physical_page_offset = ka->phys_mem_range[0].start / PAGE_SIZE; for(i=0; inum_phys_mem_ranges; i++) { @@ -368,6 +369,8 @@ int vm_mark_page_range_inuse(addr_t start_page, addr_t len) vm_page *page; addr_t i; + dprintf("vm_mark_page_range_inuse: start 0x%lx, len 0x%lx\n", start_page, len); + if(physical_page_offset > start_page) { dprintf("vm_mark_page_range_inuse: start page %ld is before free list\n", start_page); return ERR_INVALID_ARGS; @@ -814,7 +817,7 @@ static bool is_page_in_phys_range(kernel_args *ka, addr_t paddr) return false; } -static addr_t vm_alloc_ppage_from_kernel_struct(kernel_args *ka) +addr_t vm_alloc_ppage_from_kernel_struct(kernel_args *ka) { unsigned int i; -- 2.11.4.GIT