vtophys.cc revision 4070
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. 272665Ssaidi@eecs.umich.edu * 284070Ssaidi@eecs.umich.edu * Authors: Ali Saidi 292650Ssaidi@eecs.umich.edu */ 302650Ssaidi@eecs.umich.edu 312650Ssaidi@eecs.umich.edu#include <string> 322650Ssaidi@eecs.umich.edu 333529Sgblack@eecs.umich.edu#include "arch/sparc/vtophys.hh" 344070Ssaidi@eecs.umich.edu#include "arch/sparc/tlb.hh" 354070Ssaidi@eecs.umich.edu#include "base/compiler.hh" 362650Ssaidi@eecs.umich.edu#include "base/chunk_generator.hh" 372650Ssaidi@eecs.umich.edu#include "base/trace.hh" 382680Sktlim@umich.edu#include "cpu/thread_context.hh" 392650Ssaidi@eecs.umich.edu#include "mem/vport.hh" 402650Ssaidi@eecs.umich.edu 412650Ssaidi@eecs.umich.eduusing namespace std; 422650Ssaidi@eecs.umich.edu 433529Sgblack@eecs.umich.edunamespace SparcISA 442650Ssaidi@eecs.umich.edu{ 453529Sgblack@eecs.umich.edu Addr vtophys(Addr vaddr) 463529Sgblack@eecs.umich.edu { 474070Ssaidi@eecs.umich.edu // In SPARC it's almost always impossible to turn a VA->PA w/o a context 484070Ssaidi@eecs.umich.edu // The only times we can kinda do it are if we have a SegKPM mapping 494070Ssaidi@eecs.umich.edu // and can find the real address in the tlb or we have a physical 504070Ssaidi@eecs.umich.edu // adddress already (beacuse we are looking at the hypervisor) 514070Ssaidi@eecs.umich.edu // Either case is rare, so we'll just panic. 524070Ssaidi@eecs.umich.edu 534070Ssaidi@eecs.umich.edu panic("vtophys() without context on SPARC largly worthless\n"); 544070Ssaidi@eecs.umich.edu M5_DUMMY_RETURN 552650Ssaidi@eecs.umich.edu } 562650Ssaidi@eecs.umich.edu 573529Sgblack@eecs.umich.edu Addr vtophys(ThreadContext *tc, Addr addr) 583529Sgblack@eecs.umich.edu { 594070Ssaidi@eecs.umich.edu // Here we have many options and are really implementing something like 604070Ssaidi@eecs.umich.edu // a fill handler to find the address since there isn't a multilevel 614070Ssaidi@eecs.umich.edu // table for us to walk around. 624070Ssaidi@eecs.umich.edu // 634070Ssaidi@eecs.umich.edu // 1. We are currently hyperpriv, return the address unmodified 644070Ssaidi@eecs.umich.edu // 2. The mmu is off return(ra->pa) 654070Ssaidi@eecs.umich.edu // 3. We are currently priv, use ctx0* tsbs to find the page 664070Ssaidi@eecs.umich.edu // 4. We are not priv, use ctxN0* tsbs to find the page 674070Ssaidi@eecs.umich.edu // For all accesses we check the tlbs first since it's possible that 684070Ssaidi@eecs.umich.edu // long standing pages (e.g. locked kernel mappings) won't be in the tsb 694070Ssaidi@eecs.umich.edu uint64_t tlbdata = tc->readMiscReg(MISCREG_TLB_DATA); 702650Ssaidi@eecs.umich.edu 714070Ssaidi@eecs.umich.edu bool hpriv = bits(tlbdata,0,0); 724070Ssaidi@eecs.umich.edu //bool priv = bits(tlbdata,2,2); 734070Ssaidi@eecs.umich.edu bool addr_mask = bits(tlbdata,3,3); 744070Ssaidi@eecs.umich.edu bool data_real = !bits(tlbdata,5,5); 754070Ssaidi@eecs.umich.edu bool inst_real = !bits(tlbdata,4,4); 764070Ssaidi@eecs.umich.edu bool ctx_zero = bits(tlbdata,18,16) > 0; 774070Ssaidi@eecs.umich.edu int part_id = bits(tlbdata,15,8); 784070Ssaidi@eecs.umich.edu int pri_context = bits(tlbdata,47,32); 794070Ssaidi@eecs.umich.edu //int sec_context = bits(tlbdata,63,48); 802650Ssaidi@eecs.umich.edu 814070Ssaidi@eecs.umich.edu FunctionalPort *mem = tc->getPhysPort(); 824070Ssaidi@eecs.umich.edu ITB* itb = tc->getITBPtr(); 834070Ssaidi@eecs.umich.edu DTB* dtb = tc->getDTBPtr(); 844070Ssaidi@eecs.umich.edu TlbEntry* tbe; 854070Ssaidi@eecs.umich.edu PageTableEntry pte; 864070Ssaidi@eecs.umich.edu Addr tsbs[4]; 874070Ssaidi@eecs.umich.edu Addr va_tag; 884070Ssaidi@eecs.umich.edu TteTag ttetag; 892650Ssaidi@eecs.umich.edu 904070Ssaidi@eecs.umich.edu if (hpriv) 914070Ssaidi@eecs.umich.edu return addr; 923529Sgblack@eecs.umich.edu 934070Ssaidi@eecs.umich.edu if (addr_mask) 944070Ssaidi@eecs.umich.edu addr = addr & VAddrAMask; 953529Sgblack@eecs.umich.edu 964070Ssaidi@eecs.umich.edu tbe = dtb->lookup(addr, part_id, data_real, ctx_zero ? 0 : pri_context , false); 974070Ssaidi@eecs.umich.edu if (tbe) goto foundtbe; 984070Ssaidi@eecs.umich.edu 994070Ssaidi@eecs.umich.edu tbe = itb->lookup(addr, part_id, inst_real, ctx_zero ? 0 : pri_context, false); 1004070Ssaidi@eecs.umich.edu if (tbe) goto foundtbe; 1014070Ssaidi@eecs.umich.edu 1024070Ssaidi@eecs.umich.edu // We didn't find it in the tlbs, so lets look at the TSBs 1034070Ssaidi@eecs.umich.edu dtb->GetTsbPtr(tc, addr, ctx_zero ? 0 : pri_context, tsbs); 1044070Ssaidi@eecs.umich.edu va_tag = bits(addr, 63, 22); 1054070Ssaidi@eecs.umich.edu for (int x = 0; x < 4; x++) { 1064070Ssaidi@eecs.umich.edu ttetag = betoh(mem->read<uint64_t>(tsbs[x])); 1074070Ssaidi@eecs.umich.edu if (ttetag.valid() && ttetag.va() == va_tag) { 1084070Ssaidi@eecs.umich.edu pte.populate(betoh(mem->read<uint64_t>(tsbs[x]) + sizeof(uint64_t)), 1094070Ssaidi@eecs.umich.edu PageTableEntry::sun4v); // I think it's sun4v at least! 1104070Ssaidi@eecs.umich.edu DPRINTF(VtoPhys, "Virtual(%#x)->Physical(%#x) found in TTE\n", addr, 1114070Ssaidi@eecs.umich.edu pte.paddrMask() | addr & pte.sizeMask()); 1124070Ssaidi@eecs.umich.edu goto foundpte; 1134070Ssaidi@eecs.umich.edu } 1144070Ssaidi@eecs.umich.edu } 1154070Ssaidi@eecs.umich.edu panic("couldn't translate %#x\n", addr); 1164070Ssaidi@eecs.umich.edu 1174070Ssaidi@eecs.umich.edufoundtbe: 1184070Ssaidi@eecs.umich.edu pte = tbe->pte; 1194070Ssaidi@eecs.umich.edu DPRINTF(VtoPhys, "Virtual(%#x)->Physical(%#x) found in TLB\n", addr, 1204070Ssaidi@eecs.umich.edu pte.paddrMask() | addr & pte.sizeMask()); 1214070Ssaidi@eecs.umich.edufoundpte: 1224070Ssaidi@eecs.umich.edu return pte.paddrMask() | addr & pte.sizeMask(); 1233529Sgblack@eecs.umich.edu } 1242650Ssaidi@eecs.umich.edu} 125