diff options
Diffstat (limited to 'kern/kernel.c')
-rw-r--r-- | kern/kernel.c | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/kern/kernel.c b/kern/kernel.c index 2752aaa4..e5238368 100644 --- a/kern/kernel.c +++ b/kern/kernel.c @@ -34,27 +34,41 @@ #include <vm/vm_object.h> #include <vm/vm_prot.h> -#define OBJ_SIZE (PAGE_SIZE * 10) +#define OBJ_SIZE (PAGE_SIZE * 4) static void -kernel_test(void *arg) +kernel_test_fault(void *arg) { struct vm_object *object; + struct vm_map *map; unsigned long addr; int error, flags; (void)arg; + map = thread_self()->task->map; + object = vm_anon_create(OBJ_SIZE); assert(object != NULL); addr = 0; flags = VM_MAP_FLAGS(VM_PROT_ALL, VM_PROT_ALL, VM_INHERIT_DEFAULT, VM_ADV_DEFAULT, 0); - error = vm_map_enter(kernel_map, object, 0, &addr, OBJ_SIZE, 0, flags); + error = vm_map_enter(map, object, 0, &addr, OBJ_SIZE, 0, flags); assert(!error); printk("anonymous object mapped at %#lx\n", addr); - vm_map_info(kernel_map); - memset((void *)addr, '\0', OBJ_SIZE); + vm_map_info(map); + printk("filling object\n"); + memset((void *)addr, 0xff, OBJ_SIZE); + printk("object filled\n"); + printk("removing physical mappings\n"); + + /* TODO pmap_remove() */ + pmap_kremove(addr, addr + OBJ_SIZE); + pmap_update(kernel_pmap, addr, addr + OBJ_SIZE); + + printk("filling object again\n"); + memset((void *)addr, 0xff, OBJ_SIZE); + printk("object filled\n"); } static void @@ -62,14 +76,18 @@ start_test(void) { struct thread_attr attr; struct thread *thread; + struct task *task; int error; - attr.name = "test"; + error = task_create(&task, "test_fault"); + assert(!error); + + attr.name = "test_fault"; attr.cpumap = NULL; - attr.task = NULL; + attr.task = task; attr.policy = THREAD_SCHED_POLICY_TS; attr.priority = THREAD_SCHED_TS_PRIO_DEFAULT; - error = thread_create(&thread, &attr, kernel_test, NULL); + error = thread_create(&thread, &attr, kernel_test_fault, NULL); assert(!error); } |