paddr_t getppages(unsigned long npages) { int spl; paddr_t addr; spl = splhigh(); // coremap not setup if (!coremap_ready){ addr = ram_stealmem(npages); splx(spl); return addr; } // coremap setup already assert(coremap_ready == 1); if (npages == 1){ addr = coremap_alloc_one_page(NULL); splx(spl); return addr; } else { addr = coremap_alloc_multi_page(npages); splx(spl); return addr; } panic("getppages: unexpected return\n"); }
/* * alloc_kpages * * Allocate some kernel-space virtual pages. * This is the interface kmalloc uses to get pages for its use. * * Synchronization: takes coremap_spinlock. * May block to swap pages out. */ vaddr_t alloc_kpages(int npages) { paddr_t pa; if (npages > 1) { pa = coremap_alloc_multipages(npages); } else { pa = coremap_alloc_one_page(NULL, 0 /* dopin */); } if (pa==INVALID_PADDR) { return 0; } return PADDR_TO_KVADDR(pa); }
/* * coremap_allocuser * * Allocate a page for a user-level process, to hold the passed-in * logical page. * * Synchronization: takes coremap_spinlock. * May block to swap pages out. */ paddr_t coremap_allocuser(struct lpage *lp) { KASSERT(!curthread->t_in_interrupt); return coremap_alloc_one_page(lp, 1 /* dopin */); }