port.cc revision 5605
113759Sgiacomo.gabrielli@arm.com/* 213759Sgiacomo.gabrielli@arm.com * Copyright (c) 2002-2005 The Regents of The University of Michigan 313759Sgiacomo.gabrielli@arm.com * All rights reserved. 413759Sgiacomo.gabrielli@arm.com * 513759Sgiacomo.gabrielli@arm.com * Redistribution and use in source and binary forms, with or without 613759Sgiacomo.gabrielli@arm.com * modification, are permitted provided that the following conditions are 713759Sgiacomo.gabrielli@arm.com * met: redistributions of source code must retain the above copyright 813759Sgiacomo.gabrielli@arm.com * notice, this list of conditions and the following disclaimer; 913759Sgiacomo.gabrielli@arm.com * redistributions in binary form must reproduce the above copyright 1013759Sgiacomo.gabrielli@arm.com * notice, this list of conditions and the following disclaimer in the 1113759Sgiacomo.gabrielli@arm.com * documentation and/or other materials provided with the distribution; 1213759Sgiacomo.gabrielli@arm.com * neither the name of the copyright holders nor the names of its 1313759Sgiacomo.gabrielli@arm.com * contributors may be used to endorse or promote products derived from 1413759Sgiacomo.gabrielli@arm.com * this software without specific prior written permission. 1513759Sgiacomo.gabrielli@arm.com * 1613759Sgiacomo.gabrielli@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1713759Sgiacomo.gabrielli@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1813759Sgiacomo.gabrielli@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1913759Sgiacomo.gabrielli@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2013759Sgiacomo.gabrielli@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2113759Sgiacomo.gabrielli@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2213759Sgiacomo.gabrielli@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2313759Sgiacomo.gabrielli@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2413759Sgiacomo.gabrielli@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2513759Sgiacomo.gabrielli@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2613759Sgiacomo.gabrielli@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2713759Sgiacomo.gabrielli@arm.com * 2813759Sgiacomo.gabrielli@arm.com * Authors: Steve Reinhardt 2913759Sgiacomo.gabrielli@arm.com */ 3013759Sgiacomo.gabrielli@arm.com 3113759Sgiacomo.gabrielli@arm.com/** 3213759Sgiacomo.gabrielli@arm.com * @file 3313759Sgiacomo.gabrielli@arm.com * Port object definitions. 3413759Sgiacomo.gabrielli@arm.com */ 3513759Sgiacomo.gabrielli@arm.com#include <cstring> 3613759Sgiacomo.gabrielli@arm.com 3713759Sgiacomo.gabrielli@arm.com#include "base/chunk_generator.hh" 3813759Sgiacomo.gabrielli@arm.com#include "base/trace.hh" 3913759Sgiacomo.gabrielli@arm.com#include "mem/mem_object.hh" 4013759Sgiacomo.gabrielli@arm.com#include "mem/port.hh" 4113759Sgiacomo.gabrielli@arm.com 4213759Sgiacomo.gabrielli@arm.comclass DefaultPeerPort : public Port 4313759Sgiacomo.gabrielli@arm.com{ 4413759Sgiacomo.gabrielli@arm.com protected: 4513759Sgiacomo.gabrielli@arm.com void blowUp() 4613759Sgiacomo.gabrielli@arm.com { 4713759Sgiacomo.gabrielli@arm.com fatal("%s: Unconnected port!", peer->name()); 4813759Sgiacomo.gabrielli@arm.com } 4913759Sgiacomo.gabrielli@arm.com 5013759Sgiacomo.gabrielli@arm.com public: 5113759Sgiacomo.gabrielli@arm.com DefaultPeerPort() 5213759Sgiacomo.gabrielli@arm.com : Port("default_port", NULL) 5313759Sgiacomo.gabrielli@arm.com { } 5413759Sgiacomo.gabrielli@arm.com 5513759Sgiacomo.gabrielli@arm.com bool recvTiming(PacketPtr) 5613759Sgiacomo.gabrielli@arm.com { 5713759Sgiacomo.gabrielli@arm.com blowUp(); 5813759Sgiacomo.gabrielli@arm.com return false; 5913759Sgiacomo.gabrielli@arm.com } 6013759Sgiacomo.gabrielli@arm.com 6113759Sgiacomo.gabrielli@arm.com Tick recvAtomic(PacketPtr) 6213759Sgiacomo.gabrielli@arm.com { 6313759Sgiacomo.gabrielli@arm.com blowUp(); 6413759Sgiacomo.gabrielli@arm.com return 0; 6513759Sgiacomo.gabrielli@arm.com } 6613759Sgiacomo.gabrielli@arm.com 6713759Sgiacomo.gabrielli@arm.com void recvFunctional(PacketPtr) 6813759Sgiacomo.gabrielli@arm.com { 6913759Sgiacomo.gabrielli@arm.com blowUp(); 7013759Sgiacomo.gabrielli@arm.com } 7113759Sgiacomo.gabrielli@arm.com 7213759Sgiacomo.gabrielli@arm.com void recvStatusChange(Status) 7313759Sgiacomo.gabrielli@arm.com { 7413759Sgiacomo.gabrielli@arm.com blowUp(); 7513759Sgiacomo.gabrielli@arm.com } 7613759Sgiacomo.gabrielli@arm.com 7713759Sgiacomo.gabrielli@arm.com int deviceBlockSize() 7813759Sgiacomo.gabrielli@arm.com { 7913759Sgiacomo.gabrielli@arm.com blowUp(); 8013759Sgiacomo.gabrielli@arm.com return 0; 8113759Sgiacomo.gabrielli@arm.com } 8213759Sgiacomo.gabrielli@arm.com 8313759Sgiacomo.gabrielli@arm.com void getDeviceAddressRanges(AddrRangeList &, bool &) 8413759Sgiacomo.gabrielli@arm.com { 8513759Sgiacomo.gabrielli@arm.com blowUp(); 8613759Sgiacomo.gabrielli@arm.com } 8713759Sgiacomo.gabrielli@arm.com 8813759Sgiacomo.gabrielli@arm.com bool isDefaultPort() const { return true; } 8913759Sgiacomo.gabrielli@arm.com}; 9013759Sgiacomo.gabrielli@arm.com 9113759Sgiacomo.gabrielli@arm.comDefaultPeerPort defaultPeerPort; 9213759Sgiacomo.gabrielli@arm.com 9313759Sgiacomo.gabrielli@arm.comPort::Port(const std::string &_name, MemObject *_owner) 9413759Sgiacomo.gabrielli@arm.com : EventManager(_owner), portName(_name), peer(&defaultPeerPort), 9513759Sgiacomo.gabrielli@arm.com owner(_owner) 9613759Sgiacomo.gabrielli@arm.com{ 9713759Sgiacomo.gabrielli@arm.com} 9813759Sgiacomo.gabrielli@arm.com 9913759Sgiacomo.gabrielli@arm.comPort::~Port() 10013759Sgiacomo.gabrielli@arm.com{ 10113759Sgiacomo.gabrielli@arm.com} 10213759Sgiacomo.gabrielli@arm.com 10313759Sgiacomo.gabrielli@arm.comvoid 10413759Sgiacomo.gabrielli@arm.comPort::setPeer(Port *port) 10513759Sgiacomo.gabrielli@arm.com{ 10613759Sgiacomo.gabrielli@arm.com DPRINTF(Config, "setting peer to %s\n", port->name()); 10713759Sgiacomo.gabrielli@arm.com 10813759Sgiacomo.gabrielli@arm.com peer = port; 10913759Sgiacomo.gabrielli@arm.com} 11013759Sgiacomo.gabrielli@arm.com 11113759Sgiacomo.gabrielli@arm.comvoid 11213759Sgiacomo.gabrielli@arm.comPort::setOwner(MemObject *_owner) 11313759Sgiacomo.gabrielli@arm.com{ 11413759Sgiacomo.gabrielli@arm.com eventq = _owner->queue(); 11513759Sgiacomo.gabrielli@arm.com owner = _owner; 11613759Sgiacomo.gabrielli@arm.com} 11713759Sgiacomo.gabrielli@arm.com 11813759Sgiacomo.gabrielli@arm.comvoid 11913759Sgiacomo.gabrielli@arm.comPort::removeConn() 12013759Sgiacomo.gabrielli@arm.com{ 12113759Sgiacomo.gabrielli@arm.com if (peer->getOwner()) 12213759Sgiacomo.gabrielli@arm.com peer->getOwner()->deletePortRefs(peer); 12313759Sgiacomo.gabrielli@arm.com peer = NULL; 12413759Sgiacomo.gabrielli@arm.com} 12513759Sgiacomo.gabrielli@arm.com 12613759Sgiacomo.gabrielli@arm.comvoid 12713759Sgiacomo.gabrielli@arm.comPort::blobHelper(Addr addr, uint8_t *p, int size, MemCmd cmd) 12813759Sgiacomo.gabrielli@arm.com{ 12913759Sgiacomo.gabrielli@arm.com Request req; 13013759Sgiacomo.gabrielli@arm.com 13113759Sgiacomo.gabrielli@arm.com for (ChunkGenerator gen(addr, size, peerBlockSize()); 13213759Sgiacomo.gabrielli@arm.com !gen.done(); gen.next()) { 13313759Sgiacomo.gabrielli@arm.com req.setPhys(gen.addr(), gen.size(), 0); 13413759Sgiacomo.gabrielli@arm.com Packet pkt(&req, cmd, Packet::Broadcast); 13513759Sgiacomo.gabrielli@arm.com pkt.dataStatic(p); 13613759Sgiacomo.gabrielli@arm.com sendFunctional(&pkt); 13713759Sgiacomo.gabrielli@arm.com p += gen.size(); 13813759Sgiacomo.gabrielli@arm.com } 13913759Sgiacomo.gabrielli@arm.com} 14013759Sgiacomo.gabrielli@arm.com 14113759Sgiacomo.gabrielli@arm.comvoid 14213759Sgiacomo.gabrielli@arm.comPort::writeBlob(Addr addr, uint8_t *p, int size) 14313759Sgiacomo.gabrielli@arm.com{ 14413759Sgiacomo.gabrielli@arm.com blobHelper(addr, p, size, MemCmd::WriteReq); 14513759Sgiacomo.gabrielli@arm.com} 14613759Sgiacomo.gabrielli@arm.com 14713759Sgiacomo.gabrielli@arm.comvoid 14813759Sgiacomo.gabrielli@arm.comPort::readBlob(Addr addr, uint8_t *p, int size) 14913759Sgiacomo.gabrielli@arm.com{ 15013759Sgiacomo.gabrielli@arm.com blobHelper(addr, p, size, MemCmd::ReadReq); 15113759Sgiacomo.gabrielli@arm.com} 15213759Sgiacomo.gabrielli@arm.com 15313759Sgiacomo.gabrielli@arm.comvoid 15413759Sgiacomo.gabrielli@arm.comPort::memsetBlob(Addr addr, uint8_t val, int size) 15513759Sgiacomo.gabrielli@arm.com{ 15613759Sgiacomo.gabrielli@arm.com // quick and dirty... 15713759Sgiacomo.gabrielli@arm.com uint8_t *buf = new uint8_t[size]; 15813759Sgiacomo.gabrielli@arm.com 15913759Sgiacomo.gabrielli@arm.com std::memset(buf, val, size); 16013759Sgiacomo.gabrielli@arm.com blobHelper(addr, buf, size, MemCmd::WriteReq); 16113759Sgiacomo.gabrielli@arm.com 16213759Sgiacomo.gabrielli@arm.com delete [] buf; 16313759Sgiacomo.gabrielli@arm.com} 16413759Sgiacomo.gabrielli@arm.com 16513759Sgiacomo.gabrielli@arm.com 16613759Sgiacomo.gabrielli@arm.comvoid 16713759Sgiacomo.gabrielli@arm.comPort::printAddr(Addr a) 16813759Sgiacomo.gabrielli@arm.com{ 16913759Sgiacomo.gabrielli@arm.com Request req(a, 1, 0); 17013759Sgiacomo.gabrielli@arm.com Packet pkt(&req, MemCmd::PrintReq, Packet::Broadcast); 17113759Sgiacomo.gabrielli@arm.com Packet::PrintReqState prs(std::cerr); 17213759Sgiacomo.gabrielli@arm.com pkt.senderState = &prs; 17313759Sgiacomo.gabrielli@arm.com 17413759Sgiacomo.gabrielli@arm.com sendFunctional(&pkt); 17513759Sgiacomo.gabrielli@arm.com} 17613759Sgiacomo.gabrielli@arm.com