void _optimsoc_itlb_miss(void) { optimsoc_page_dir_t dir; // Get current thread's page directory dir = _optimsoc_thread_get_pagedir_current(); VERIFY_DIR_ADDR(dir); // Load vaddr from EEAR uint32_t vaddr = or1k_mfspr(OR1K_SPR_SYS_EEAR_ADDR(0)); // Trace debug runtime_trace_itlb_miss(vaddr); // Lookup page optimsoc_pte_t pte = _optimsoc_vmm_lookup(dir, vaddr); if (pte) { // Update TLB _optimsoc_set_itlb(vaddr, pte); } else { // Raise page fault assert(_optimsoc_vmm_ifault_handler); _optimsoc_vmm_ifault_handler(vaddr); } }
void itlb_miss() { struct optimsoc_scheduler_core *core_ctx; core_ctx = &optimsoc_scheduler_core[optimsoc_get_domain_coreid()]; void *vaddr = (void*) or1k_mfspr(SPR_EEAR_BASE); runtime_trace_itlb_miss(vaddr); /* Look up virtual address in the page table */ struct page_table_entry_t* entry; entry = find_page_entry(core_ctx->active_thread->task->page_table, vaddr); assert(entry != NULL); /* Write address back to ITLB */ arch_set_itlb(entry->vaddr_base, entry->paddr_base); }