diff --git a/src/arch/amdgpu/vega/pagetable_walker.cc b/src/arch/amdgpu/vega/pagetable_walker.cc index 2a8238f0fe..96ac0fe179 100644 --- a/src/arch/amdgpu/vega/pagetable_walker.cc +++ b/src/arch/amdgpu/vega/pagetable_walker.cc @@ -245,7 +245,16 @@ Walker::WalkerState::walkStateMachine(PageTableEntry &pte, Addr &nextRead, switch(state) { case PDE2: - fatal_if(pde.p, "Fragment in PDE2 not implemented"); + if (pde.p) { + DPRINTF(GPUPTWalker, "Treating PDE2 as PTE: %#016x frag: %d\n", + (uint64_t)pte, pte.fragment); + entry.pte = pte; + int fragment = pte.fragment; + entry.logBytes = PageShift + std::min(3*9, fragment); + entry.vaddr <<= PageShift; + entry.vaddr = entry.vaddr & ~mask(entry.logBytes); + doEndWalk = true; + } // Read the pde1Addr part1 = ((((uint64_t)pte) >> 6) << 3); @@ -257,7 +266,16 @@ Walker::WalkerState::walkStateMachine(PageTableEntry &pte, Addr &nextRead, nextState = PDE1; break; case PDE1: - fatal_if(pde.p, "Fragment in PDE1 not implemented"); + if (pde.p) { + DPRINTF(GPUPTWalker, "Treating PDE1 as PTE: %#016x frag: %d\n", + (uint64_t)pte, pte.fragment); + entry.pte = pte; + int fragment = pte.fragment; + entry.logBytes = PageShift + std::min(2*9, fragment); + entry.vaddr <<= PageShift; + entry.vaddr = entry.vaddr & ~mask(entry.logBytes); + doEndWalk = true; + } // Read the pde0Addr part1 = ((((uint64_t)pte) >> 6) << 3);