status_t ARMVMTranslationMap32Bit::Query(addr_t va, phys_addr_t *_physical, uint32 *_flags) { // default the flags to not present *_flags = 0; *_physical = 0; int index = VADDR_TO_PDENT(va); page_directory_entry *pd = fPagingStructures->pgdir_virt; if ((pd[index] & ARM_PDE_TYPE_MASK) == 0) { // no pagetable here return B_OK; } Thread* thread = thread_get_current_thread(); ThreadCPUPinner pinner(thread); page_table_entry* pt = (page_table_entry*)fPageMapper->GetPageTableAt( pd[index] & ARM_PDE_ADDRESS_MASK); page_table_entry entry = pt[VADDR_TO_PTENT(va)]; *_physical = (entry & ARM_PDE_ADDRESS_MASK) | VADDR_TO_PGOFF(va); #if 0 //IRA // read in the page state flags if ((entry & ARM_PTE_USER) != 0) { *_flags |= ((entry & ARM_PTE_WRITABLE) != 0 ? B_WRITE_AREA : 0) | B_READ_AREA; } *_flags |= ((entry & ARM_PTE_WRITABLE) != 0 ? B_KERNEL_WRITE_AREA : 0) | B_KERNEL_READ_AREA | ((entry & ARM_PTE_DIRTY) != 0 ? PAGE_MODIFIED : 0) | ((entry & ARM_PTE_ACCESSED) != 0 ? PAGE_ACCESSED : 0) | ((entry & ARM_PTE_PRESENT) != 0 ? PAGE_PRESENT : 0); #else *_flags = B_KERNEL_WRITE_AREA | B_KERNEL_READ_AREA; if (*_physical != 0) *_flags |= PAGE_PRESENT; #endif pinner.Unlock(); TRACE("query_tmap: returning pa 0x%lx for va 0x%lx\n", *_physical, va); return B_OK; }
status_t ARMVMTranslationMap32Bit::QueryInterrupt(addr_t va, phys_addr_t *_physical, uint32 *_flags) { *_flags = 0; *_physical = 0; int index = VADDR_TO_PDENT(va); page_directory_entry* pd = fPagingStructures->pgdir_virt; if ((pd[index] & ARM_PDE_TYPE_MASK) == 0) { // no pagetable here return B_OK; } // map page table entry page_table_entry* pt = (page_table_entry*)ARMPagingMethod32Bit::Method() ->PhysicalPageMapper()->InterruptGetPageTableAt( pd[index] & ARM_PDE_ADDRESS_MASK); page_table_entry entry = pt[VADDR_TO_PTENT(va)]; if ((entry & ARM_PTE_TYPE_MASK) != 0) *_physical = (entry & ARM_PTE_ADDRESS_MASK) | VADDR_TO_PGOFF(va); #if 0 // read in the page state flags if ((entry & X86_PTE_USER) != 0) { *_flags |= ((entry & X86_PTE_WRITABLE) != 0 ? B_WRITE_AREA : 0) | B_READ_AREA; } *_flags |= ((entry & X86_PTE_WRITABLE) != 0 ? B_KERNEL_WRITE_AREA : 0) | B_KERNEL_READ_AREA | ((entry & X86_PTE_DIRTY) != 0 ? PAGE_MODIFIED : 0) | ((entry & X86_PTE_ACCESSED) != 0 ? PAGE_ACCESSED : 0) | ((entry & X86_PTE_PRESENT) != 0 ? PAGE_PRESENT : 0); #else *_flags = B_KERNEL_WRITE_AREA | B_KERNEL_READ_AREA; if (*_physical != 0) *_flags |= PAGE_PRESENT; #endif return B_OK; }