se_translating_port_proxy.cc revision 2403
110860Sandreas.sandberg@arm.com/* 212111Sandreas.sandberg@arm.com * Copyright (c) 2001-2005 The Regents of The University of Michigan 310860Sandreas.sandberg@arm.com * All rights reserved. 410860Sandreas.sandberg@arm.com * 510860Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without 610860Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are 710860Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright 810860Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer; 910860Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright 1010860Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the 1110860Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution; 1210860Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its 1310860Sandreas.sandberg@arm.com * contributors may be used to endorse or promote products derived from 1410860Sandreas.sandberg@arm.com * this software without specific prior written permission. 1510860Sandreas.sandberg@arm.com * 1610860Sandreas.sandberg@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1710860Sandreas.sandberg@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1810860Sandreas.sandberg@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1910860Sandreas.sandberg@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2010860Sandreas.sandberg@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2110860Sandreas.sandberg@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2210860Sandreas.sandberg@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2310860Sandreas.sandberg@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2410860Sandreas.sandberg@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2510860Sandreas.sandberg@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2610860Sandreas.sandberg@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2710860Sandreas.sandberg@arm.com */ 2810860Sandreas.sandberg@arm.com 2910860Sandreas.sandberg@arm.com#include <string> 3010860Sandreas.sandberg@arm.com#include "mem/port.hh" 3110860Sandreas.sandberg@arm.com#include "mem/translating_port.hh" 3210860Sandreas.sandberg@arm.com#include "mem/page_table.hh" 3310860Sandreas.sandberg@arm.com 3410860Sandreas.sandberg@arm.comTranslatingPort::TranslatingPort(Port *_port, PageTable *p_table) 3510860Sandreas.sandberg@arm.com : port(_port), pTable(p_table) 3610860Sandreas.sandberg@arm.com{ } 3710860Sandreas.sandberg@arm.com 3810860Sandreas.sandberg@arm.comTranslatingPort::~TranslatingPort() 3910860Sandreas.sandberg@arm.com{ } 4010860Sandreas.sandberg@arm.com 4110860Sandreas.sandberg@arm.comFault 4210860Sandreas.sandberg@arm.comTranslatingPort::readBlobFunctional(Addr addr, uint8_t *p, int size) 4310860Sandreas.sandberg@arm.com{ 4410860Sandreas.sandberg@arm.com Addr paddr; 4510860Sandreas.sandberg@arm.com 4610860Sandreas.sandberg@arm.com //@todo Break up things larger than a page size 4710860Sandreas.sandberg@arm.com pTable->page_check(addr, size); 4810860Sandreas.sandberg@arm.com 4910860Sandreas.sandberg@arm.com 5010860Sandreas.sandberg@arm.com if (!pTable->translate(addr,paddr)) 5110860Sandreas.sandberg@arm.com return Machine_Check_Fault; 5210860Sandreas.sandberg@arm.com 5310860Sandreas.sandberg@arm.com port->readBlobFunctional(paddr, p, size); 5410860Sandreas.sandberg@arm.com return No_Fault; 5510860Sandreas.sandberg@arm.com} 5610860Sandreas.sandberg@arm.com 5710860Sandreas.sandberg@arm.comFault 5810860Sandreas.sandberg@arm.comTranslatingPort::writeBlobFunctional(Addr addr, uint8_t *p, int size) 5910860Sandreas.sandberg@arm.com{ 6010860Sandreas.sandberg@arm.com Addr paddr; 6110860Sandreas.sandberg@arm.com 6210860Sandreas.sandberg@arm.com //@todo Break up things larger than a page size 6310860Sandreas.sandberg@arm.com pTable->page_check(addr, size); 6410860Sandreas.sandberg@arm.com 6510860Sandreas.sandberg@arm.com if (!pTable->translate(addr,paddr)) 6610860Sandreas.sandberg@arm.com return Machine_Check_Fault; 6710860Sandreas.sandberg@arm.com 6810860Sandreas.sandberg@arm.com port->writeBlobFunctional(paddr, p, size); 6910860Sandreas.sandberg@arm.com return No_Fault; 7010860Sandreas.sandberg@arm.com} 7110860Sandreas.sandberg@arm.com 7210860Sandreas.sandberg@arm.comFault 7310860Sandreas.sandberg@arm.comTranslatingPort::memsetBlobFunctional(Addr addr, uint8_t val, int size) 7410860Sandreas.sandberg@arm.com{ 7510860Sandreas.sandberg@arm.com Addr paddr; 7610860Sandreas.sandberg@arm.com 7710860Sandreas.sandberg@arm.com //@todo Break up things larger than a page size 7810860Sandreas.sandberg@arm.com //Use the Stever breakup code 7910860Sandreas.sandberg@arm.com pTable->page_check(addr, size); 8010860Sandreas.sandberg@arm.com 8110860Sandreas.sandberg@arm.com if (!pTable->translate(addr,paddr)) 8211891Srjthakur@google.com return Machine_Check_Fault; 8311891Srjthakur@google.com 8411891Srjthakur@google.com port->memsetBlobFunctional(paddr, val, size); 8510860Sandreas.sandberg@arm.com return No_Fault; 8610860Sandreas.sandberg@arm.com} 8710860Sandreas.sandberg@arm.com 8810860Sandreas.sandberg@arm.comFault 8910860Sandreas.sandberg@arm.comTranslatingPort::writeStringFunctional(Addr addr, const char *str) 9010860Sandreas.sandberg@arm.com{ 9112111Sandreas.sandberg@arm.com Addr paddr,vaddr; 9212111Sandreas.sandberg@arm.com uint8_t c; 9310860Sandreas.sandberg@arm.com 9412111Sandreas.sandberg@arm.com vaddr = addr; 9512111Sandreas.sandberg@arm.com 9612111Sandreas.sandberg@arm.com do { 9712111Sandreas.sandberg@arm.com c = *str++; 9812111Sandreas.sandberg@arm.com if (!pTable->translate(vaddr++,paddr)) 9912111Sandreas.sandberg@arm.com return Machine_Check_Fault; 10012111Sandreas.sandberg@arm.com 10112111Sandreas.sandberg@arm.com port->writeBlobFunctional(paddr, &c, 1); 10212111Sandreas.sandberg@arm.com } while (c); 10312111Sandreas.sandberg@arm.com 10412111Sandreas.sandberg@arm.com return No_Fault; 10512111Sandreas.sandberg@arm.com} 10612111Sandreas.sandberg@arm.com 10712111Sandreas.sandberg@arm.comFault 10812111Sandreas.sandberg@arm.comTranslatingPort::readStringFunctional(std::string &str, Addr addr) 10912111Sandreas.sandberg@arm.com{ 11012111Sandreas.sandberg@arm.com Addr paddr,vaddr; 11110860Sandreas.sandberg@arm.com uint8_t c; 11212111Sandreas.sandberg@arm.com 11312111Sandreas.sandberg@arm.com vaddr = addr; 11412111Sandreas.sandberg@arm.com 11510860Sandreas.sandberg@arm.com do { 11610860Sandreas.sandberg@arm.com if (!pTable->translate(vaddr++,paddr)) 11710860Sandreas.sandberg@arm.com return Machine_Check_Fault; 11810860Sandreas.sandberg@arm.com 11910860Sandreas.sandberg@arm.com port->readBlobFunctional(paddr, &c, 1); 12010860Sandreas.sandberg@arm.com str += c; 12110860Sandreas.sandberg@arm.com } while (c); 12210860Sandreas.sandberg@arm.com 12310860Sandreas.sandberg@arm.com return No_Fault; 12410860Sandreas.sandberg@arm.com} 12510860Sandreas.sandberg@arm.com 12610860Sandreas.sandberg@arm.com