intdev.hh revision 5657
15633Sgblack@eecs.umich.edu/* 25633Sgblack@eecs.umich.edu * Copyright (c) 2008 The Regents of The University of Michigan 35633Sgblack@eecs.umich.edu * All rights reserved. 45633Sgblack@eecs.umich.edu * 55633Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 65633Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 75633Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 85633Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 95633Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 105633Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 115633Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 125633Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 135633Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 145633Sgblack@eecs.umich.edu * this software without specific prior written permission. 155633Sgblack@eecs.umich.edu * 165633Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 175633Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 185633Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 195633Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 205633Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 215633Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 225633Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 235633Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 245633Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255633Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 265633Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275633Sgblack@eecs.umich.edu * 285633Sgblack@eecs.umich.edu * Authors: Gabe Black 295633Sgblack@eecs.umich.edu */ 305633Sgblack@eecs.umich.edu 315633Sgblack@eecs.umich.edu#ifndef __DEV_X86_INTDEV_HH__ 325633Sgblack@eecs.umich.edu#define __DEV_X86_INTDEV_HH__ 335633Sgblack@eecs.umich.edu 345633Sgblack@eecs.umich.edu#include <assert.h> 355651Sgblack@eecs.umich.edu#include <string> 365633Sgblack@eecs.umich.edu 375651Sgblack@eecs.umich.edu#include "arch/x86/x86_traits.hh" 385651Sgblack@eecs.umich.edu#include "mem/mem_object.hh" 395651Sgblack@eecs.umich.edu#include "mem/mport.hh" 405633Sgblack@eecs.umich.edu#include "sim/sim_object.hh" 415633Sgblack@eecs.umich.edu#include "params/X86IntPin.hh" 425633Sgblack@eecs.umich.edu 435633Sgblack@eecs.umich.edunamespace X86ISA { 445633Sgblack@eecs.umich.edu 455633Sgblack@eecs.umich.educlass IntDev 465633Sgblack@eecs.umich.edu{ 475651Sgblack@eecs.umich.edu protected: 485651Sgblack@eecs.umich.edu class IntPort : public MessagePort 495651Sgblack@eecs.umich.edu { 505651Sgblack@eecs.umich.edu IntDev * device; 515651Sgblack@eecs.umich.edu Tick latency; 525651Sgblack@eecs.umich.edu Addr intAddr; 535651Sgblack@eecs.umich.edu public: 545651Sgblack@eecs.umich.edu IntPort(const std::string &_name, MemObject * _parent, 555651Sgblack@eecs.umich.edu IntDev *dev, Tick _latency) : 565651Sgblack@eecs.umich.edu MessagePort(_name, _parent), device(dev), latency(_latency) 575651Sgblack@eecs.umich.edu { 585651Sgblack@eecs.umich.edu } 595651Sgblack@eecs.umich.edu 605651Sgblack@eecs.umich.edu void getDeviceAddressRanges(AddrRangeList &resp, bool &snoop) 615651Sgblack@eecs.umich.edu { 625651Sgblack@eecs.umich.edu snoop = false; 635651Sgblack@eecs.umich.edu device->getIntAddrRange(resp); 645651Sgblack@eecs.umich.edu } 655651Sgblack@eecs.umich.edu 665651Sgblack@eecs.umich.edu Tick recvMessage(PacketPtr pkt) 675651Sgblack@eecs.umich.edu { 685651Sgblack@eecs.umich.edu return device->recvMessage(pkt); 695651Sgblack@eecs.umich.edu } 705651Sgblack@eecs.umich.edu 715651Sgblack@eecs.umich.edu void recvStatusChange(Status status) 725651Sgblack@eecs.umich.edu { 735651Sgblack@eecs.umich.edu if (status == RangeChange) { 745651Sgblack@eecs.umich.edu sendStatusChange(Port::RangeChange); 755651Sgblack@eecs.umich.edu } 765651Sgblack@eecs.umich.edu } 775651Sgblack@eecs.umich.edu 785651Sgblack@eecs.umich.edu }; 795651Sgblack@eecs.umich.edu 805651Sgblack@eecs.umich.edu IntPort * intPort; 815651Sgblack@eecs.umich.edu 825633Sgblack@eecs.umich.edu public: 835651Sgblack@eecs.umich.edu IntDev(MemObject * parent, Tick latency = 0) 845651Sgblack@eecs.umich.edu { 855651Sgblack@eecs.umich.edu if (parent != NULL) { 865651Sgblack@eecs.umich.edu intPort = new IntPort(parent->name() + ".int_port", 875651Sgblack@eecs.umich.edu parent, this, latency); 885651Sgblack@eecs.umich.edu } else { 895651Sgblack@eecs.umich.edu intPort = NULL; 905651Sgblack@eecs.umich.edu } 915651Sgblack@eecs.umich.edu } 925651Sgblack@eecs.umich.edu 935633Sgblack@eecs.umich.edu virtual ~IntDev() 945633Sgblack@eecs.umich.edu {} 955651Sgblack@eecs.umich.edu 965633Sgblack@eecs.umich.edu virtual void 975651Sgblack@eecs.umich.edu signalInterrupt(int line) 985651Sgblack@eecs.umich.edu { 995651Sgblack@eecs.umich.edu panic("signalInterrupt not implemented.\n"); 1005651Sgblack@eecs.umich.edu } 1015651Sgblack@eecs.umich.edu 1025651Sgblack@eecs.umich.edu virtual Tick 1035651Sgblack@eecs.umich.edu recvMessage(PacketPtr pkt) 1045651Sgblack@eecs.umich.edu { 1055651Sgblack@eecs.umich.edu panic("recvMessage not implemented.\n"); 1065651Sgblack@eecs.umich.edu return 0; 1075651Sgblack@eecs.umich.edu } 1085651Sgblack@eecs.umich.edu 1095651Sgblack@eecs.umich.edu virtual void 1105651Sgblack@eecs.umich.edu getIntAddrRange(AddrRangeList &range_list) 1115651Sgblack@eecs.umich.edu { 1125651Sgblack@eecs.umich.edu panic("intAddrRange not implemented.\n"); 1135651Sgblack@eecs.umich.edu } 1145633Sgblack@eecs.umich.edu}; 1155633Sgblack@eecs.umich.edu 1165633Sgblack@eecs.umich.educlass IntPin : public SimObject 1175633Sgblack@eecs.umich.edu{ 1185633Sgblack@eecs.umich.edu protected: 1195633Sgblack@eecs.umich.edu IntDev * device; 1205633Sgblack@eecs.umich.edu int line; 1215633Sgblack@eecs.umich.edu 1225633Sgblack@eecs.umich.edu public: 1235633Sgblack@eecs.umich.edu typedef X86IntPinParams Params; 1245633Sgblack@eecs.umich.edu 1255657Sgblack@eecs.umich.edu IntDev * 1265657Sgblack@eecs.umich.edu getDevice() const 1275657Sgblack@eecs.umich.edu { 1285657Sgblack@eecs.umich.edu return device; 1295657Sgblack@eecs.umich.edu } 1305657Sgblack@eecs.umich.edu 1315633Sgblack@eecs.umich.edu const Params * 1325633Sgblack@eecs.umich.edu params() const 1335633Sgblack@eecs.umich.edu { 1345633Sgblack@eecs.umich.edu return dynamic_cast<const Params *>(_params); 1355633Sgblack@eecs.umich.edu } 1365633Sgblack@eecs.umich.edu 1375633Sgblack@eecs.umich.edu IntPin(Params *p) : SimObject(p), 1385633Sgblack@eecs.umich.edu device(dynamic_cast<IntDev *>(p->device)), line(p->line) 1395633Sgblack@eecs.umich.edu { 1405633Sgblack@eecs.umich.edu assert(device); 1415633Sgblack@eecs.umich.edu } 1425633Sgblack@eecs.umich.edu 1435633Sgblack@eecs.umich.edu void 1445633Sgblack@eecs.umich.edu signalInterrupt() 1455633Sgblack@eecs.umich.edu { 1465633Sgblack@eecs.umich.edu device->signalInterrupt(line); 1475633Sgblack@eecs.umich.edu } 1485633Sgblack@eecs.umich.edu}; 1495633Sgblack@eecs.umich.edu 1505633Sgblack@eecs.umich.edu}; // namespace X86ISA 1515633Sgblack@eecs.umich.edu 1525633Sgblack@eecs.umich.edu#endif //__DEV_X86_INTDEV_HH__ 153