fs_translating_port_proxy.cc revision 12532
16166Ssteve.reinhardt@amd.com/* 26166Ssteve.reinhardt@amd.com * Copyright (c) 2011,2013 ARM Limited 36166Ssteve.reinhardt@amd.com * All rights reserved 46166Ssteve.reinhardt@amd.com * 56166Ssteve.reinhardt@amd.com * The license below extends only to copyright in the software and shall 66166Ssteve.reinhardt@amd.com * not be construed as granting a license to any other intellectual 76166Ssteve.reinhardt@amd.com * property including but not limited to intellectual property relating 86166Ssteve.reinhardt@amd.com * to a hardware implementation of the functionality of the software 96166Ssteve.reinhardt@amd.com * licensed hereunder. You may use the software subject to the license 106166Ssteve.reinhardt@amd.com * terms below provided that you ensure that this notice is replicated 116166Ssteve.reinhardt@amd.com * unmodified and in its entirety in all distributions of the software, 126166Ssteve.reinhardt@amd.com * modified or unmodified, in source code or in binary form. 136166Ssteve.reinhardt@amd.com * 146166Ssteve.reinhardt@amd.com * Copyright (c) 2006 The Regents of The University of Michigan 156166Ssteve.reinhardt@amd.com * All rights reserved. 166166Ssteve.reinhardt@amd.com * 176166Ssteve.reinhardt@amd.com * Redistribution and use in source and binary forms, with or without 186166Ssteve.reinhardt@amd.com * modification, are permitted provided that the following conditions are 196166Ssteve.reinhardt@amd.com * met: redistributions of source code must retain the above copyright 206166Ssteve.reinhardt@amd.com * notice, this list of conditions and the following disclaimer; 216166Ssteve.reinhardt@amd.com * redistributions in binary form must reproduce the above copyright 226166Ssteve.reinhardt@amd.com * notice, this list of conditions and the following disclaimer in the 236166Ssteve.reinhardt@amd.com * documentation and/or other materials provided with the distribution; 246166Ssteve.reinhardt@amd.com * neither the name of the copyright holders nor the names of its 256166Ssteve.reinhardt@amd.com * contributors may be used to endorse or promote products derived from 266166Ssteve.reinhardt@amd.com * this software without specific prior written permission. 276166Ssteve.reinhardt@amd.com * 286166Ssteve.reinhardt@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 296166Ssteve.reinhardt@amd.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 306166Ssteve.reinhardt@amd.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 316928SBrad.Beckmann@amd.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 326928SBrad.Beckmann@amd.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 336928SBrad.Beckmann@amd.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 346166Ssteve.reinhardt@amd.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 356928SBrad.Beckmann@amd.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 366928SBrad.Beckmann@amd.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 376928SBrad.Beckmann@amd.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 386928SBrad.Beckmann@amd.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 396928SBrad.Beckmann@amd.com * 409113SBrad.Beckmann@amd.com * Authors: Ali Saidi 416928SBrad.Beckmann@amd.com * Andreas Hansson 426928SBrad.Beckmann@amd.com */ 438920Snilay@cs.wisc.edu 446928SBrad.Beckmann@amd.com/** 456928SBrad.Beckmann@amd.com * @file 468920Snilay@cs.wisc.edu * Port object definitions. 476928SBrad.Beckmann@amd.com */ 487570SBrad.Beckmann@amd.com 497570SBrad.Beckmann@amd.com#include "mem/fs_translating_port_proxy.hh" 506928SBrad.Beckmann@amd.com 516928SBrad.Beckmann@amd.com#include "arch/vtophys.hh" 526928SBrad.Beckmann@amd.com#include "base/chunk_generator.hh" 537570SBrad.Beckmann@amd.com#include "cpu/base.hh" 547570SBrad.Beckmann@amd.com#include "cpu/thread_context.hh" 557570SBrad.Beckmann@amd.com#include "sim/system.hh" 567570SBrad.Beckmann@amd.com 577570SBrad.Beckmann@amd.comusing namespace TheISA; 587570SBrad.Beckmann@amd.com 597570SBrad.Beckmann@amd.comFSTranslatingPortProxy::FSTranslatingPortProxy(ThreadContext *tc) 607570SBrad.Beckmann@amd.com : PortProxy(tc->getCpuPtr()->getDataPort(), 617570SBrad.Beckmann@amd.com tc->getSystemPtr()->cacheLineSize()), _tc(tc) 627570SBrad.Beckmann@amd.com{ 637570SBrad.Beckmann@amd.com} 647570SBrad.Beckmann@amd.com 657570SBrad.Beckmann@amd.comFSTranslatingPortProxy::FSTranslatingPortProxy(MasterPort &port, 666928SBrad.Beckmann@amd.com unsigned int cacheLineSize) 676928SBrad.Beckmann@amd.com : PortProxy(port, cacheLineSize), _tc(NULL) 6810524Snilay@cs.wisc.edu{ 6910524Snilay@cs.wisc.edu} 706289Snate@binkert.org 719827Sakash.bagdia@arm.comFSTranslatingPortProxy::~FSTranslatingPortProxy() 729827Sakash.bagdia@arm.com{ 739827Sakash.bagdia@arm.com} 749827Sakash.bagdia@arm.com 759793Sakash.bagdia@arm.comvoid 769793Sakash.bagdia@arm.comFSTranslatingPortProxy::readBlob(Addr addr, uint8_t *p, int size) const 779793Sakash.bagdia@arm.com{ 789827Sakash.bagdia@arm.com Addr paddr; 799827Sakash.bagdia@arm.com for (ChunkGenerator gen(addr, size, TheISA::PageBytes); !gen.done(); 806928SBrad.Beckmann@amd.com gen.next()) 819826Sandreas.hansson@arm.com { 8210519Snilay@cs.wisc.edu if (_tc) 836928SBrad.Beckmann@amd.com paddr = TheISA::vtophys(_tc,gen.addr()); 849793Sakash.bagdia@arm.com else 859827Sakash.bagdia@arm.com paddr = TheISA::vtophys(gen.addr()); 869827Sakash.bagdia@arm.com 879793Sakash.bagdia@arm.com PortProxy::readBlobPhys(paddr, 0, p, gen.size()); 8810120Snilay@cs.wisc.edu p += gen.size(); 896928SBrad.Beckmann@amd.com } 908876Sandreas.hansson@arm.com} 918876Sandreas.hansson@arm.com 928876Sandreas.hansson@arm.comvoid 936928SBrad.Beckmann@amd.comFSTranslatingPortProxy::writeBlob(Addr addr, const uint8_t *p, int size) const 946928SBrad.Beckmann@amd.com{ 956928SBrad.Beckmann@amd.com Addr paddr; 966928SBrad.Beckmann@amd.com for (ChunkGenerator gen(addr, size, TheISA::PageBytes); !gen.done(); 9710120Snilay@cs.wisc.edu gen.next()) 986928SBrad.Beckmann@amd.com { 996928SBrad.Beckmann@amd.com if (_tc) 1006928SBrad.Beckmann@amd.com paddr = TheISA::vtophys(_tc,gen.addr()); 1016928SBrad.Beckmann@amd.com else 1026166Ssteve.reinhardt@amd.com paddr = TheISA::vtophys(gen.addr()); 1038801Sgblack@eecs.umich.edu 1046928SBrad.Beckmann@amd.com PortProxy::writeBlobPhys(paddr, 0, p, gen.size()); 1056928SBrad.Beckmann@amd.com p += gen.size(); 1066928SBrad.Beckmann@amd.com } 1076928SBrad.Beckmann@amd.com} 108 109void 110FSTranslatingPortProxy::memsetBlob(Addr address, uint8_t v, int size) const 111{ 112 Addr paddr; 113 for (ChunkGenerator gen(address, size, TheISA::PageBytes); !gen.done(); 114 gen.next()) 115 { 116 if (_tc) 117 paddr = TheISA::vtophys(_tc,gen.addr()); 118 else 119 paddr = TheISA::vtophys(gen.addr()); 120 121 PortProxy::memsetBlobPhys(paddr, 0, v, gen.size()); 122 } 123} 124 125void 126CopyOut(ThreadContext *tc, void *dest, Addr src, size_t cplen) 127{ 128 uint8_t *dst = (uint8_t *)dest; 129 tc->getVirtProxy().readBlob(src, dst, cplen); 130} 131 132void 133CopyIn(ThreadContext *tc, Addr dest, const void *source, size_t cplen) 134{ 135 uint8_t *src = (uint8_t *)source; 136 tc->getVirtProxy().writeBlob(dest, src, cplen); 137} 138 139void 140CopyStringOut(ThreadContext *tc, char *dst, Addr vaddr, size_t maxlen) 141{ 142 char *start = dst; 143 FSTranslatingPortProxy &vp = tc->getVirtProxy(); 144 145 bool foundNull = false; 146 while ((dst - start + 1) < maxlen && !foundNull) { 147 vp.readBlob(vaddr++, (uint8_t*)dst, 1); 148 if (*dst == '\0') 149 foundNull = true; 150 dst++; 151 } 152 153 if (!foundNull) 154 *dst = '\0'; 155} 156 157void 158CopyStringIn(ThreadContext *tc, const char *src, Addr vaddr) 159{ 160 FSTranslatingPortProxy &vp = tc->getVirtProxy(); 161 for (ChunkGenerator gen(vaddr, strlen(src), TheISA::PageBytes); !gen.done(); 162 gen.next()) 163 { 164 vp.writeBlob(gen.addr(), (uint8_t*)src, gen.size()); 165 src += gen.size(); 166 } 167} 168