summaryrefslogtreecommitdiff
path: root/kern/kernel.c
diff options
context:
space:
mode:
Diffstat (limited to 'kern/kernel.c')
-rw-r--r--kern/kernel.c34
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);
}