コード例 #1
0
ファイル: vmm.c プロジェクト: imphil/sources
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);
    }
}
コード例 #2
0
ファイル: vmm.c プロジェクト: chethann/optimsoc
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);
}