2 * Copyright (c) 2012,2015,2017 ARM Limited
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated
11 * unmodified and in its entirety in all distributions of the software,
12 * modified or unmodified, in source code or in binary form.
14 * Copyright (c) 2002-2005 The Regents of The University of Michigan
15 * All rights reserved.
17 * Redistribution and use in source and binary forms, with or without
18 * modification, are permitted provided that the following conditions are
19 * met: redistributions of source code must retain the above copyright
20 * notice, this list of conditions and the following disclaimer;
21 * redistributions in binary form must reproduce the above copyright
22 * notice, this list of conditions and the following disclaimer in the
23 * documentation and/or other materials provided with the distribution;
24 * neither the name of the copyright holders nor the names of its
25 * contributors may be used to endorse or promote products derived from
26 * this software without specific prior written permission.
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
31 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
32 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
33 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
34 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
36 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
37 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
38 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
43 * Port object definitions.
45 #include "mem/port.hh"
47 #include "base/trace.hh"
48 #include "sim/sim_object.hh"
53 class DefaultRequestPort
: public RequestPort
59 throw UnboundPortException();
63 DefaultRequestPort() : RequestPort("default_request_port", nullptr) {}
66 Tick
recvAtomicSnoop(PacketPtr
) override
{ blowUp(); }
69 bool recvTimingResp(PacketPtr
) override
{ blowUp(); }
70 void recvTimingSnoopReq(PacketPtr
) override
{ blowUp(); }
71 void recvReqRetry() override
{ blowUp(); }
72 void recvRetrySnoopResp() override
{ blowUp(); }
74 // Functional protocol.
75 void recvFunctionalSnoop(PacketPtr
) override
{ blowUp(); }
78 class DefaultResponsePort
: public ResponsePort
84 throw UnboundPortException();
88 DefaultResponsePort() : ResponsePort("default_response_port", nullptr) {}
91 Tick
recvAtomic(PacketPtr
) override
{ blowUp(); }
94 bool recvTimingReq(PacketPtr
) override
{ blowUp(); }
95 bool tryTiming(PacketPtr
) override
{ blowUp(); }
96 bool recvTimingSnoopResp(PacketPtr
) override
{ blowUp(); }
97 void recvRespRetry() override
{ blowUp(); }
99 // Functional protocol.
100 void recvFunctional(PacketPtr
) override
{ blowUp(); }
103 AddrRangeList
getAddrRanges() const override
{ return AddrRangeList(); }
106 DefaultRequestPort defaultRequestPort
;
107 DefaultResponsePort defaultResponsePort
;
109 } // anonymous namespace
114 RequestPort::RequestPort(const std::string
& name
, SimObject
* _owner
,
115 PortID _id
) : Port(name
, _id
), _responsePort(&defaultResponsePort
),
120 RequestPort::~RequestPort()
125 RequestPort::bind(Port
&peer
)
127 auto *response_port
= dynamic_cast<ResponsePort
*>(&peer
);
128 fatal_if(!response_port
, "Can't bind port %s to non-response port %s.",
129 name(), peer
.name());
130 // request port keeps track of the response port
131 _responsePort
= response_port
;
133 // response port also keeps track of request port
134 _responsePort
->responderBind(*this);
138 RequestPort::unbind()
140 panic_if(!isConnected(), "Can't unbind request port %s which is "
141 "not bound.", name());
142 _responsePort
->responderUnbind();
143 _responsePort
= &defaultResponsePort
;
148 RequestPort::getAddrRanges() const
150 return _responsePort
->getAddrRanges();
154 RequestPort::printAddr(Addr a
)
156 auto req
= std::make_shared
<Request
>(
157 a
, 1, 0, Request::funcRequestorId
);
159 Packet
pkt(req
, MemCmd::PrintReq
);
160 Packet::PrintReqState
prs(std::cerr
);
161 pkt
.senderState
= &prs
;
163 sendFunctional(&pkt
);
169 ResponsePort::ResponsePort(const std::string
& name
, SimObject
* _owner
,
170 PortID id
) : Port(name
, id
), _requestPort(&defaultRequestPort
),
171 defaultBackdoorWarned(false), owner(*_owner
)
175 ResponsePort::~ResponsePort()
180 ResponsePort::responderUnbind()
182 _requestPort
= &defaultRequestPort
;
187 ResponsePort::responderBind(RequestPort
& request_port
)
189 _requestPort
= &request_port
;
190 Port::bind(request_port
);
194 ResponsePort::recvAtomicBackdoor(PacketPtr pkt
, MemBackdoorPtr
&backdoor
)
196 if (!defaultBackdoorWarned
) {
197 warn("Port %s doesn't support requesting a back door.", name());
198 defaultBackdoorWarned
= true;
200 return recvAtomic(pkt
);