提交 006c474e 创建 作者: Nickolai Zeldovich's avatar Nickolai Zeldovich

vmap methods

上级 fc9785c7
......@@ -71,7 +71,7 @@ dosegment(uptr a0, u64 a1)
if(vmn_load(vmn, args->ip, ph.offset, ph.filesz) < 0)
goto bad;
if(vmap_insert(args->vmap, vmn, ph.vaddr) < 0)
if(args->vmap->insert(vmn, ph.vaddr) < 0)
goto bad;
prof_end(dosegment_prof);
......@@ -95,7 +95,7 @@ static void dostack(uptr a0, u64 a1)
// Allocate a one-page stack at the top of the (user) address space
if((vmn = vmn_allocpg(USTACKPAGES)) == 0)
goto bad;
if(vmap_insert(args->vmap, vmn, USERTOP-(USTACKPAGES*PGSIZE)) < 0)
if(args->vmap->insert(vmn, USERTOP-(USTACKPAGES*PGSIZE)) < 0)
goto bad;
vmn = 0;
......@@ -146,7 +146,7 @@ static void doheap(uptr a0, u64 a1)
// XXX pre-allocate 32 pages..
if((vmn = vmn_allocpg(32)) == 0)
goto bad;
if(vmap_insert(args->vmap, vmn, BRK) < 0)
if(args->vmap->insert(vmn, BRK) < 0)
goto bad;
vmn = 0;
prof_end(doheap_prof);
......
......@@ -254,8 +254,6 @@ enum vmntype { EAGER, ONDEMAND };
struct vmap * vmap_alloc(void);
struct vmnode* vmn_alloc(u64, enum vmntype);
struct vmnode* vmn_allocpg(u64);
int vmap_insert(struct vmap*, struct vmnode *, uptr);
struct vma * vmap_lookup(struct vmap*, uptr, uptr);
int copyout(struct vmap *, uptr, void*, u64);
void vmn_free(struct vmnode *);
void switchuvm(struct proc*);
......
......@@ -280,7 +280,7 @@ inituser(void)
vmn_allocpg(PGROUNDUP(_initcode_size) / PGSIZE);
if(vmn == 0)
panic("userinit: vmn_allocpg");
if(vmap_insert(p->vmap, vmn, 0) < 0)
if(p->vmap->insert(vmn, 0) < 0)
panic("userinit: vmap_insert");
if(copyout(p->vmap, 0, _initcode_start, _initcode_size) < 0)
panic("userinit: copyout");
......@@ -427,7 +427,7 @@ growproc(int n)
u64 newn = n;
gc_begin_epoch();
while(newn > 0){
struct vma *e = vmap_lookup(m, newstart, 1);
vma *e = m->lookup(newstart, 1);
if(e == 0)
break;
if(e->va_end >= newstart + newn){
......@@ -449,7 +449,7 @@ growproc(int n)
}
// is there space for newstart..newstart+newn?
if(vmap_lookup(m, newstart, newn) != 0){
if(m->lookup(newstart, newn) != 0){
cprintf("growproc: not enough room in address space; brk %lx n %d\n",
myproc()->brk, n);
return -1;
......@@ -458,7 +458,7 @@ growproc(int n)
// would the newly allocated region abut the next-higher
// vma? we can't allow that, since then a future sbrk()
// would start to use the next region (e.g. the stack).
if(vmap_lookup(m, PGROUNDUP(newstart+newn), 1) != 0){
if(m->lookup(PGROUNDUP(newstart+newn), 1) != 0){
cprintf("growproc: would abut next vma; brk %lx n %d\n",
myproc()->brk, n);
return -1;
......@@ -473,7 +473,7 @@ growproc(int n)
release(&m->lock); // XXX
if(vmap_insert(m, vmn, newstart) < 0){
if(m->insert(vmn, newstart) < 0){
vmn_free(vmn);
cprintf("growproc: vmap_insert failed\n");
return -1;
......
......@@ -114,7 +114,7 @@ sys_map(void)
if (vmn == 0)
return -1;
if (vmap_insert(myproc()->vmap, vmn, PGROUNDDOWN(addr)) < 0) {
if (myproc()->vmap->insert(vmn, PGROUNDDOWN(addr)) < 0) {
vmn_free(vmn);
return -1;
}
......
......@@ -170,7 +170,7 @@ pagefault_ondemand(struct vmap *vmap, uptr va, u32 err, struct vma *m)
if (vmn_doload(m->n, m->n->ip, m->n->offset, m->n->sz) < 0) {
panic("pagefault: couldn't load");
}
m = vmap_lookup(vmap, va, 1);
m = vmap->lookup(va, 1);
if (!m)
panic("pagefault_ondemand");
acquire(&m->lock); // re-acquire lock on m
......@@ -211,7 +211,7 @@ pagefault(struct vmap *vmap, uptr va, u32 err)
return 0;
gc_begin_epoch();
struct vma *m = vmap_lookup(vmap, va, 1);
vma *m = vmap->lookup(va, 1);
if (m == 0) {
gc_end_epoch();
return -1;
......@@ -273,7 +273,7 @@ copyout(struct vmap *vmap, uptr va, void *p, u64 len)
while(len > 0){
uptr va0 = (uptr)PGROUNDDOWN(va);
gc_begin_epoch();
struct vma *vma = vmap_lookup(vmap, va, 1);
vma *vma = vmap->lookup(va, 1);
if(vma == 0) {
gc_end_epoch();
return -1;
......@@ -335,48 +335,48 @@ vmap::~vmap()
// This code can't handle regions at the very end
// of the address space, e.g. 0xffffffff..0x0
// We key vma's by their end address.
struct vma *
vmap_lookup(struct vmap *m, uptr start, uptr len)
vma *
vmap::lookup(uptr start, uptr len)
{
if(start + len < start)
panic("vmap_lookup bad len");
panic("vmap::lookup bad len");
range *r = m->cr.search(start, len);
range *r = cr.search(start, len);
if (r != 0) {
struct vma *e = (struct vma *) (r->value);
if (e->va_end <= e->va_start)
vma *e = (struct vma *) (r->value);
if (e->va_end <= e->va_start)
panic("malformed va");
if (e->va_start < start+len && e->va_end > start) {
return e;
}
if (e->va_start < start+len && e->va_end > start)
return e;
}
return 0;
}
int
vmap_insert(struct vmap *m, struct vmnode *n, uptr va_start)
vmap::insert(vmnode *n, uptr va_start)
{
acquire(&m->lock);
acquire(&lock);
u64 len = n->npages * PGSIZE;
if(vmap_lookup(m, va_start, len)){
if (lookup(va_start, len)) {
cprintf("vmap_insert: overlap\n");
release(&m->lock);
release(&lock);
return -1;
}
struct vma *e = new vma();
vma *e = new vma();
if (e == 0) {
release(&m->lock);
release(&lock);
return -1;
}
e->va_start = va_start;
e->va_end = va_start + len;
e->n = n;
n->ref++;
m->cr.add(e->va_start, len, (void *) e);
release(&m->lock);
cr.add(e->va_start, len, (void *) e);
release(&lock);
return 0;
}
......
......@@ -49,4 +49,7 @@ struct vmap {
vmap();
~vmap();
vma* lookup(uptr start, uptr len);
int insert(vmnode *n, uptr va_start);
};
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论