Esempio n. 1
0
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;
}
Esempio n. 2
0
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 {
Esempio n. 3
0
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;
}