vtophys.cc revision 5568:d14250d688d2
12929Sktlim@umich.edu/* 22929Sktlim@umich.edu * Copyright (c) 2002-2005 The Regents of The University of Michigan 32932Sktlim@umich.edu * All rights reserved. 42929Sktlim@umich.edu * 52929Sktlim@umich.edu * Redistribution and use in source and binary forms, with or without 62929Sktlim@umich.edu * modification, are permitted provided that the following conditions are 72929Sktlim@umich.edu * met: redistributions of source code must retain the above copyright 82929Sktlim@umich.edu * notice, this list of conditions and the following disclaimer; 92929Sktlim@umich.edu * redistributions in binary form must reproduce the above copyright 102929Sktlim@umich.edu * notice, this list of conditions and the following disclaimer in the 112929Sktlim@umich.edu * documentation and/or other materials provided with the distribution; 122929Sktlim@umich.edu * neither the name of the copyright holders nor the names of its 132929Sktlim@umich.edu * contributors may be used to endorse or promote products derived from 142929Sktlim@umich.edu * this software without specific prior written permission. 152929Sktlim@umich.edu * 162929Sktlim@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172929Sktlim@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182929Sktlim@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192929Sktlim@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202929Sktlim@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212929Sktlim@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222929Sktlim@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232929Sktlim@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242929Sktlim@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252929Sktlim@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262929Sktlim@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272929Sktlim@umich.edu * 282932Sktlim@umich.edu * Authors: Nathan Binkert 292932Sktlim@umich.edu * Steve Reinhardt 302932Sktlim@umich.edu * Ali Saidi 312929Sktlim@umich.edu */ 326007Ssteve.reinhardt@amd.com 337735SAli.Saidi@ARM.com#include <string> 342929Sktlim@umich.edu 352929Sktlim@umich.edu#include "arch/alpha/ev5.hh" 362929Sktlim@umich.edu#include "arch/alpha/vtophys.hh" 372929Sktlim@umich.edu#include "base/chunk_generator.hh" 382929Sktlim@umich.edu#include "base/trace.hh" 392929Sktlim@umich.edu#include "cpu/thread_context.hh" 402929Sktlim@umich.edu#include "mem/vport.hh" 418947Sandreas.hansson@arm.com 428947Sandreas.hansson@arm.comusing namespace std; 438947Sandreas.hansson@arm.com 442929Sktlim@umich.edunamespace AlphaISA { 452929Sktlim@umich.edu 462929Sktlim@umich.eduPageTableEntry 472929Sktlim@umich.edukernel_pte_lookup(FunctionalPort *mem, Addr ptbr, VAddr vaddr) 482929Sktlim@umich.edu{ 492929Sktlim@umich.edu Addr level1_pte = ptbr + vaddr.level1(); 506007Ssteve.reinhardt@amd.com PageTableEntry level1 = mem->read<uint64_t>(level1_pte); 516007Ssteve.reinhardt@amd.com if (!level1.valid()) { 526007Ssteve.reinhardt@amd.com DPRINTF(VtoPhys, "level 1 PTE not valid, va = %#\n", vaddr); 536007Ssteve.reinhardt@amd.com return 0; 546007Ssteve.reinhardt@amd.com } 556007Ssteve.reinhardt@amd.com 566007Ssteve.reinhardt@amd.com Addr level2_pte = level1.paddr() + vaddr.level2(); 576007Ssteve.reinhardt@amd.com PageTableEntry level2 = mem->read<uint64_t>(level2_pte); 586007Ssteve.reinhardt@amd.com if (!level2.valid()) { 596007Ssteve.reinhardt@amd.com DPRINTF(VtoPhys, "level 2 PTE not valid, va = %#x\n", vaddr); 606007Ssteve.reinhardt@amd.com return 0; 616007Ssteve.reinhardt@amd.com } 626007Ssteve.reinhardt@amd.com 636007Ssteve.reinhardt@amd.com Addr level3_pte = level2.paddr() + vaddr.level3(); 646007Ssteve.reinhardt@amd.com PageTableEntry level3 = mem->read<uint64_t>(level3_pte); 656007Ssteve.reinhardt@amd.com if (!level3.valid()) { 669435SAndreas.Sandberg@ARM.com DPRINTF(VtoPhys, "level 3 PTE not valid, va = %#x\n", vaddr); 679435SAndreas.Sandberg@ARM.com return 0; 689435SAndreas.Sandberg@ARM.com } 696007Ssteve.reinhardt@amd.com return level3; 706007Ssteve.reinhardt@amd.com} 716007Ssteve.reinhardt@amd.com 726007Ssteve.reinhardt@amd.comAddr 736007Ssteve.reinhardt@amd.comvtophys(Addr vaddr) 746007Ssteve.reinhardt@amd.com{ 756007Ssteve.reinhardt@amd.com Addr paddr = 0; 766007Ssteve.reinhardt@amd.com if (IsUSeg(vaddr)) 776007Ssteve.reinhardt@amd.com DPRINTF(VtoPhys, "vtophys: invalid vaddr %#x", vaddr); 786007Ssteve.reinhardt@amd.com else if (IsK0Seg(vaddr)) 792929Sktlim@umich.edu paddr = K0Seg2Phys(vaddr); 802929Sktlim@umich.edu else 812929Sktlim@umich.edu panic("vtophys: ptbr is not set on virtual lookup"); 826007Ssteve.reinhardt@amd.com 836007Ssteve.reinhardt@amd.com DPRINTF(VtoPhys, "vtophys(%#x) -> %#x\n", vaddr, paddr); 846007Ssteve.reinhardt@amd.com 859781Sandreas.hansson@arm.com return paddr; 866007Ssteve.reinhardt@amd.com} 876007Ssteve.reinhardt@amd.com 882929Sktlim@umich.eduAddr 892929Sktlim@umich.eduvtophys(ThreadContext *tc, Addr addr) 902929Sktlim@umich.edu{ 912929Sktlim@umich.edu VAddr vaddr = addr; 922929Sktlim@umich.edu Addr ptbr = tc->readMiscRegNoEffect(IPR_PALtemp20); 936011Ssteve.reinhardt@amd.com Addr paddr = 0; 946007Ssteve.reinhardt@amd.com //@todo Andrew couldn't remember why he commented some of this code 956007Ssteve.reinhardt@amd.com //so I put it back in. Perhaps something to do with gdb debugging? 966007Ssteve.reinhardt@amd.com if (PcPAL(vaddr) && (vaddr < PalMax)) { 976007Ssteve.reinhardt@amd.com paddr = vaddr & ~ULL(1); 986007Ssteve.reinhardt@amd.com } else { 996007Ssteve.reinhardt@amd.com if (IsK0Seg(vaddr)) { 1006007Ssteve.reinhardt@amd.com paddr = K0Seg2Phys(vaddr); 1016007Ssteve.reinhardt@amd.com } else if (!ptbr) { 1026007Ssteve.reinhardt@amd.com paddr = vaddr; 1036007Ssteve.reinhardt@amd.com } else { 1046007Ssteve.reinhardt@amd.com PageTableEntry pte = 1056007Ssteve.reinhardt@amd.com kernel_pte_lookup(tc->getPhysPort(), ptbr, vaddr); 1066007Ssteve.reinhardt@amd.com if (pte.valid()) 10710742Sandreas.hansson@arm.com paddr = pte.paddr() | vaddr.offset(); 10810742Sandreas.hansson@arm.com } 10910384SCurtis.Dunham@arm.com } 11010742Sandreas.hansson@arm.com 1116007Ssteve.reinhardt@amd.com 1129781Sandreas.hansson@arm.com DPRINTF(VtoPhys, "vtophys(%#x) -> %#x\n", vaddr, paddr); 1139781Sandreas.hansson@arm.com 1149781Sandreas.hansson@arm.com return paddr; 1159781Sandreas.hansson@arm.com} 1167735SAli.Saidi@ARM.com 1176011Ssteve.reinhardt@amd.com} // namespace AlphaISA 1186007Ssteve.reinhardt@amd.com 1199781Sandreas.hansson@arm.com