vtophys.cc revision 2650
12650Ssaidi@eecs.umich.edu/* 22650Ssaidi@eecs.umich.edu * Copyright (c) 2002-2005 The Regents of The University of Michigan 32650Ssaidi@eecs.umich.edu * All rights reserved. 42650Ssaidi@eecs.umich.edu * 52650Ssaidi@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 62650Ssaidi@eecs.umich.edu * modification, are permitted provided that the following conditions are 72650Ssaidi@eecs.umich.edu * met: redistributions of source code must retain the above copyright 82650Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 92650Ssaidi@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 102650Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 112650Ssaidi@eecs.umich.edu * documentation and/or other materials provided with the distribution; 122650Ssaidi@eecs.umich.edu * neither the name of the copyright holders nor the names of its 132650Ssaidi@eecs.umich.edu * contributors may be used to endorse or promote products derived from 142650Ssaidi@eecs.umich.edu * this software without specific prior written permission. 152650Ssaidi@eecs.umich.edu * 162650Ssaidi@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172650Ssaidi@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182650Ssaidi@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192650Ssaidi@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202650Ssaidi@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212650Ssaidi@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222650Ssaidi@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232650Ssaidi@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242650Ssaidi@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252650Ssaidi@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262650Ssaidi@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272650Ssaidi@eecs.umich.edu */ 282650Ssaidi@eecs.umich.edu 292650Ssaidi@eecs.umich.edu#include <string> 302650Ssaidi@eecs.umich.edu 312650Ssaidi@eecs.umich.edu#include "arch/alpha/ev5.hh" 322650Ssaidi@eecs.umich.edu#include "arch/alpha/vtophys.hh" 332650Ssaidi@eecs.umich.edu#include "base/chunk_generator.hh" 342650Ssaidi@eecs.umich.edu#include "base/trace.hh" 352650Ssaidi@eecs.umich.edu#include "cpu/exec_context.hh" 362650Ssaidi@eecs.umich.edu#include "mem/vport.hh" 372650Ssaidi@eecs.umich.edu 382650Ssaidi@eecs.umich.eduusing namespace std; 392650Ssaidi@eecs.umich.eduusing namespace AlphaISA; 402650Ssaidi@eecs.umich.edu 412650Ssaidi@eecs.umich.eduAlphaISA::PageTableEntry 422650Ssaidi@eecs.umich.eduAlphaISA::kernel_pte_lookup(FunctionalPort *mem, Addr ptbr, AlphaISA::VAddr vaddr) 432650Ssaidi@eecs.umich.edu{ 442650Ssaidi@eecs.umich.edu Addr level1_pte = ptbr + vaddr.level1(); 452650Ssaidi@eecs.umich.edu AlphaISA::PageTableEntry level1 = mem->read<uint64_t>(level1_pte); 462650Ssaidi@eecs.umich.edu if (!level1.valid()) { 472650Ssaidi@eecs.umich.edu DPRINTF(VtoPhys, "level 1 PTE not valid, va = %#\n", vaddr); 482650Ssaidi@eecs.umich.edu return 0; 492650Ssaidi@eecs.umich.edu } 502650Ssaidi@eecs.umich.edu 512650Ssaidi@eecs.umich.edu Addr level2_pte = level1.paddr() + vaddr.level2(); 522650Ssaidi@eecs.umich.edu AlphaISA::PageTableEntry level2 = mem->read<uint64_t>(level2_pte); 532650Ssaidi@eecs.umich.edu if (!level2.valid()) { 542650Ssaidi@eecs.umich.edu DPRINTF(VtoPhys, "level 2 PTE not valid, va = %#x\n", vaddr); 552650Ssaidi@eecs.umich.edu return 0; 562650Ssaidi@eecs.umich.edu } 572650Ssaidi@eecs.umich.edu 582650Ssaidi@eecs.umich.edu Addr level3_pte = level2.paddr() + vaddr.level3(); 592650Ssaidi@eecs.umich.edu AlphaISA::PageTableEntry level3 = mem->read<uint64_t>(level3_pte); 602650Ssaidi@eecs.umich.edu if (!level3.valid()) { 612650Ssaidi@eecs.umich.edu DPRINTF(VtoPhys, "level 3 PTE not valid, va = %#x\n", vaddr); 622650Ssaidi@eecs.umich.edu return 0; 632650Ssaidi@eecs.umich.edu } 642650Ssaidi@eecs.umich.edu return level3; 652650Ssaidi@eecs.umich.edu} 662650Ssaidi@eecs.umich.edu 672650Ssaidi@eecs.umich.eduAddr 682650Ssaidi@eecs.umich.eduAlphaISA::vtophys(Addr vaddr) 692650Ssaidi@eecs.umich.edu{ 702650Ssaidi@eecs.umich.edu Addr paddr = 0; 712650Ssaidi@eecs.umich.edu if (AlphaISA::IsUSeg(vaddr)) 722650Ssaidi@eecs.umich.edu DPRINTF(VtoPhys, "vtophys: invalid vaddr %#x", vaddr); 732650Ssaidi@eecs.umich.edu else if (AlphaISA::IsK0Seg(vaddr)) 742650Ssaidi@eecs.umich.edu paddr = AlphaISA::K0Seg2Phys(vaddr); 752650Ssaidi@eecs.umich.edu else 762650Ssaidi@eecs.umich.edu panic("vtophys: ptbr is not set on virtual lookup"); 772650Ssaidi@eecs.umich.edu 782650Ssaidi@eecs.umich.edu DPRINTF(VtoPhys, "vtophys(%#x) -> %#x\n", vaddr, paddr); 792650Ssaidi@eecs.umich.edu 802650Ssaidi@eecs.umich.edu return paddr; 812650Ssaidi@eecs.umich.edu} 822650Ssaidi@eecs.umich.edu 832650Ssaidi@eecs.umich.eduAddr 842650Ssaidi@eecs.umich.eduAlphaISA::vtophys(ExecContext *xc, Addr addr) 852650Ssaidi@eecs.umich.edu{ 862650Ssaidi@eecs.umich.edu AlphaISA::VAddr vaddr = addr; 872650Ssaidi@eecs.umich.edu Addr ptbr = xc->readMiscReg(AlphaISA::IPR_PALtemp20); 882650Ssaidi@eecs.umich.edu Addr paddr = 0; 892650Ssaidi@eecs.umich.edu //@todo Andrew couldn't remember why he commented some of this code 902650Ssaidi@eecs.umich.edu //so I put it back in. Perhaps something to do with gdb debugging? 912650Ssaidi@eecs.umich.edu if (AlphaISA::PcPAL(vaddr) && (vaddr < EV5::PalMax)) { 922650Ssaidi@eecs.umich.edu paddr = vaddr & ~ULL(1); 932650Ssaidi@eecs.umich.edu } else { 942650Ssaidi@eecs.umich.edu if (AlphaISA::IsK0Seg(vaddr)) { 952650Ssaidi@eecs.umich.edu paddr = AlphaISA::K0Seg2Phys(vaddr); 962650Ssaidi@eecs.umich.edu } else if (!ptbr) { 972650Ssaidi@eecs.umich.edu paddr = vaddr; 982650Ssaidi@eecs.umich.edu } else { 992650Ssaidi@eecs.umich.edu AlphaISA::PageTableEntry pte = 1002650Ssaidi@eecs.umich.edu kernel_pte_lookup(xc->getPhysPort(), ptbr, vaddr); 1012650Ssaidi@eecs.umich.edu if (pte.valid()) 1022650Ssaidi@eecs.umich.edu paddr = pte.paddr() | vaddr.offset(); 1032650Ssaidi@eecs.umich.edu } 1042650Ssaidi@eecs.umich.edu } 1052650Ssaidi@eecs.umich.edu 1062650Ssaidi@eecs.umich.edu 1072650Ssaidi@eecs.umich.edu DPRINTF(VtoPhys, "vtophys(%#x) -> %#x\n", vaddr, paddr); 1082650Ssaidi@eecs.umich.edu 1092650Ssaidi@eecs.umich.edu return paddr; 1102650Ssaidi@eecs.umich.edu} 1112650Ssaidi@eecs.umich.edu 1122650Ssaidi@eecs.umich.edu 1132650Ssaidi@eecs.umich.eduvoid 1142650Ssaidi@eecs.umich.eduAlphaISA::CopyOut(ExecContext *xc, void *dest, Addr src, size_t cplen) 1152650Ssaidi@eecs.umich.edu{ 1162650Ssaidi@eecs.umich.edu uint8_t *dst = (uint8_t *)dest; 1172650Ssaidi@eecs.umich.edu VirtualPort *vp = xc->getVirtPort(xc); 1182650Ssaidi@eecs.umich.edu 1192650Ssaidi@eecs.umich.edu vp->readBlob(src, dst, cplen); 1202650Ssaidi@eecs.umich.edu 1212650Ssaidi@eecs.umich.edu xc->delVirtPort(vp); 1222650Ssaidi@eecs.umich.edu 1232650Ssaidi@eecs.umich.edu} 1242650Ssaidi@eecs.umich.edu 1252650Ssaidi@eecs.umich.eduvoid 1262650Ssaidi@eecs.umich.eduAlphaISA::CopyIn(ExecContext *xc, Addr dest, void *source, size_t cplen) 1272650Ssaidi@eecs.umich.edu{ 1282650Ssaidi@eecs.umich.edu uint8_t *src = (uint8_t *)source; 1292650Ssaidi@eecs.umich.edu VirtualPort *vp = xc->getVirtPort(xc); 1302650Ssaidi@eecs.umich.edu 1312650Ssaidi@eecs.umich.edu vp->writeBlob(dest, src, cplen); 1322650Ssaidi@eecs.umich.edu 1332650Ssaidi@eecs.umich.edu xc->delVirtPort(vp); 1342650Ssaidi@eecs.umich.edu} 1352650Ssaidi@eecs.umich.edu 1362650Ssaidi@eecs.umich.eduvoid 1372650Ssaidi@eecs.umich.eduAlphaISA::CopyStringOut(ExecContext *xc, char *dst, Addr vaddr, size_t maxlen) 1382650Ssaidi@eecs.umich.edu{ 1392650Ssaidi@eecs.umich.edu int len = 0; 1402650Ssaidi@eecs.umich.edu VirtualPort *vp = xc->getVirtPort(xc); 1412650Ssaidi@eecs.umich.edu 1422650Ssaidi@eecs.umich.edu do { 1432650Ssaidi@eecs.umich.edu vp->readBlob(vaddr++, (uint8_t*)dst++, 1); 1442650Ssaidi@eecs.umich.edu len++; 1452650Ssaidi@eecs.umich.edu } while (len < maxlen && dst[len] != 0 ); 1462650Ssaidi@eecs.umich.edu 1472650Ssaidi@eecs.umich.edu xc->delVirtPort(vp); 1482650Ssaidi@eecs.umich.edu dst[len] = 0; 1492650Ssaidi@eecs.umich.edu} 1502650Ssaidi@eecs.umich.edu 1512650Ssaidi@eecs.umich.eduvoid 1522650Ssaidi@eecs.umich.eduAlphaISA::CopyStringIn(ExecContext *xc, char *src, Addr vaddr) 1532650Ssaidi@eecs.umich.edu{ 1542650Ssaidi@eecs.umich.edu VirtualPort *vp = xc->getVirtPort(xc); 1552650Ssaidi@eecs.umich.edu for (ChunkGenerator gen(vaddr, strlen(src), AlphaISA::PageBytes); !gen.done(); 1562650Ssaidi@eecs.umich.edu gen.next()) 1572650Ssaidi@eecs.umich.edu { 1582650Ssaidi@eecs.umich.edu vp->writeBlob(gen.addr(), (uint8_t*)src, gen.size()); 1592650Ssaidi@eecs.umich.edu src += gen.size(); 1602650Ssaidi@eecs.umich.edu } 1612650Ssaidi@eecs.umich.edu xc->delVirtPort(vp); 1622650Ssaidi@eecs.umich.edu} 163