struct addrspace * as_create(void) { struct addrspace *as; as = kmalloc(sizeof(struct addrspace)); if (as == NULL) { return NULL; } /* * Initialize as needed. */ as->pt_locks = kmalloc(PT_LEVEL_SIZE * sizeof(struct lock*)); for (int i = 0; i < PT_LEVEL_SIZE; i++) as->pt_locks[i] = NULL; as->pagetable = pagetable_create(); KASSERT(as->pt_locks); KASSERT(as->pagetable); as->as_regions = array_create(); as->heap_start = 0; as->heap_end = 0; return as; }
int pagetable_map( struct pagetable *p, unsigned vaddr, unsigned paddr, int flags ) { struct pagetable *q; struct pageentry *e; unsigned a = vaddr>>22; unsigned b = (vaddr>>12) & 0x3ff; if(flags&PAGE_FLAG_ALLOC) { paddr = (unsigned) memory_alloc_page(0); if(!paddr) return 0; } e = &p->entry[a]; if(!e->present) { q = pagetable_create(); if(!q) return 0; e->present = 1; e->readwrite = 1; e->user = (flags&PAGE_FLAG_KERNEL) ? 0 : 1; e->writethrough = 0; e->nocache = 0; e->accessed = 0; e->dirty = 0; e->pagesize = 0; e->globalpage = (flags&PAGE_FLAG_KERNEL) ? 1 : 0; e->avail = 0; e->addr = (((unsigned)q) >> 12); } else {
static bool cmd_test_heap() { pagetable_t pt; pagetable_create(&pt, (void *)0x8000000000, PAGE_SIZE * 1024); pagetable_activate(&pt); struct heap *heap = heap_create(&pt, (void *)0x9000000000, 1024); void *ptr1 = heap_alloc(heap, 128); void *ptr2 = heap_alloc(heap, 0xff00); void *ptr3 = heap_alloc(heap, 8); heap_free(heap, ptr1); heap_free(heap, ptr2); heap_free(heap, ptr3); heap_destroy(heap); pagetable_activate(NULL); pagetable_destroy(&pt); return true; }