void set_pmde(pgd_t * pgde,struct page* pf,viraddr_t address,uint32_t perm) { #ifdef DEBUG assert(pgde); assert(pf); assert(page2pfn(pf) || !page2pfn(pf)); #endif pmd_t * pmde = NULL; pmde = (pmd_t *)pgd_page_vaddr(*pgde) + pmd_index(address); pmd_val(*pmde) = page2phys(pf) | perm; }
static struct kmem_slab *kmem_small_slab_create(struct kmem_cache *cache, struct page *page) { struct kmem_small_cache *small = (struct kmem_small_cache *)cache; const pfn_t pages = (pfn_t)1 << cache->order; const size_t size = PAGE_SIZE * pages; const size_t off = size - sizeof(struct kmem_small_slab); char *vaddr = VA(page2pfn(page) << PAGE_BITS); struct kmem_small_slab *slab = (struct kmem_small_slab *)(vaddr + off); slab->common.ops = &small_slab_ops; slab->common.total = 0; slab->common.free = 0; slab->free_list = 0; const size_t sz = small->padded_size; for (char *ptr = vaddr; ptr + sz <= (char *)slab; ptr += sz) { kmem_small_slab_free(cache, &slab->common, ptr); ++slab->common.total; ++slab->common.free; } return (struct kmem_slab *)slab; }
void set_pgde(pgd_t * pgde,struct page* pf,viraddr_t address,uint32_t perm) { #ifdef DEBUG assert(pgde); assert(pf); assert(page2pfn(pf) || !page2pfn(pf)); #endif uint32_t pgd_num = pgd_index(address); #ifdef _PAE_ uint32_t pe = perm & ~(_PAGE_RW | _PAGE_USER); #else uint32_t pe = perm; #endif pgd_val(pgde[pgd_num]) = page2phys(pf) | pe; }