/** Initializes page tables. * * 1:1 virtual-physical mapping is created in kernel address space. Mapping * for table with exception vectors is also created. */ void page_arch_init(void) { int flags = PAGE_CACHEABLE; page_mapping_operations = &pt_mapping_operations; page_table_lock(AS_KERNEL, true); uintptr_t cur; /* Kernel identity mapping */ for (cur = PHYSMEM_START_ADDR; cur < min(config.identity_size, config.physmem_end); cur += FRAME_SIZE) page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, flags); #ifdef HIGH_EXCEPTION_VECTORS /* Create mapping for exception table at high offset */ uintptr_t ev_frame = (uintptr_t) frame_alloc(ONE_FRAME, FRAME_NONE); page_mapping_insert(AS_KERNEL, EXC_BASE_ADDRESS, ev_frame, flags); #else #error "Only high exception vector supported now" #endif page_table_unlock(AS_KERNEL, true); as_switch(NULL, AS_KERNEL); boot_page_table_free(); }
void page_arch_init(void) { int flags = PAGE_CACHEABLE | PAGE_EXEC; page_mapping_operations = &pt_mapping_operations; page_table_lock(AS_KERNEL, true); /* Kernel identity mapping */ // FIXME: // We need to consider the possibility that // identity_base > identity_size and physmem_end. // This might lead to overflow if identity_size is too big. for (uintptr_t cur = PHYSMEM_START_ADDR; cur < min(KA2PA(config.identity_base) + config.identity_size, config.physmem_end); cur += FRAME_SIZE) page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, flags); page_table_unlock(AS_KERNEL, true); as_switch(NULL, AS_KERNEL); /* Switch MMU to new context table */ asi_u32_write(ASI_MMUREGS, MMU_CONTEXT_TABLE, KA2PA(as_context_table) >> 4); }