gem5
v21.0.1.0
Main Page
Related Pages
Modules
Namespaces
Namespace List
Namespace Members
All
_
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
Functions
_
a
b
c
d
e
f
g
h
i
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
Variables
_
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
Typedefs
a
c
d
e
f
g
h
i
m
n
o
p
r
s
t
u
v
w
x
Enumerations
a
c
d
e
f
i
l
m
o
p
r
s
t
v
x
Enumerator
a
b
c
d
e
f
g
h
i
k
l
m
n
o
p
q
r
s
t
u
v
w
x
z
Classes
Class List
Class Index
Class Hierarchy
Class Members
All
:
_
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
~
Functions
_
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
~
Variables
_
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
Typedefs
a
b
c
d
e
f
g
h
i
k
l
m
n
o
p
q
r
s
t
u
v
w
y
Enumerations
a
b
c
d
e
f
g
h
i
l
m
n
o
p
r
s
t
u
w
Enumerator
a
b
c
d
e
f
g
h
i
k
l
m
n
o
p
q
r
s
t
u
v
w
x
z
Related Functions
:
a
b
c
d
e
f
g
h
i
k
l
m
n
o
p
q
r
s
t
u
v
w
x
Files
File List
File Members
All
_
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
z
Functions
_
a
b
c
d
e
f
g
h
i
k
l
m
n
o
p
q
r
s
t
u
v
w
z
Variables
_
a
b
c
d
e
f
g
h
i
j
l
m
n
o
p
r
s
t
u
v
Typedefs
_
a
b
c
d
e
f
g
h
i
l
m
n
o
p
q
r
s
t
u
v
w
Enumerations
_
a
b
c
d
e
f
g
h
i
l
m
o
p
q
r
s
t
v
Enumerator
_
a
b
c
d
e
f
g
h
i
k
l
m
n
o
p
q
r
s
t
u
v
w
x
Macros
_
a
b
c
d
e
f
g
h
i
k
l
m
n
o
p
q
r
s
t
u
v
w
x
z
•
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Modules
Pages
mem
ruby
slicc_interface
RubyRequest.cc
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2019,2021 ARM Limited
3
* All rights reserved.
4
*
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.
13
*
14
* Copyright (c) 2011 Mark D. Hill and David A. Wood
15
* All rights reserved.
16
*
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.
27
*
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.
39
*/
40
41
#include "
mem/ruby/slicc_interface/RubyRequest.hh
"
42
43
#include <iostream>
44
45
#include "
mem/ruby/slicc_interface/RubySlicc_Util.hh
"
46
47
void
48
RubyRequest::print
(std::ostream& out)
const
49
{
50
out <<
"[RubyRequest: "
;
51
out << std::hex <<
"LineAddress = 0x"
<<
m_LineAddress
<< std::dec <<
" "
;
52
out << std::hex <<
"PhysicalAddress = 0x"
<<
m_PhysicalAddress
;
53
out << std::dec <<
" "
<<
"Type = "
<<
m_Type
<<
" "
;
54
out << std::hex <<
"ProgramCounter = 0x"
<<
m_ProgramCounter
<< std::dec;
55
out <<
" "
<<
"AccessMode = "
<<
m_AccessMode
<<
" "
;
56
out <<
"Size = "
<<
m_Size
<<
" "
;
57
out <<
"Prefetch = "
<<
m_Prefetch
<<
" "
;
58
// out << "Time = " << getTime() << " ";
59
out <<
"]"
;
60
}
61
62
bool
63
RubyRequest::functionalRead
(
Packet
*pkt)
64
{
65
// This needs a little explanation. Initially I thought that this
66
// message should be read. But the way the memtester works for now,
67
// we should not be reading this message as memtester updates the
68
// functional memory only after a write has actually taken place.
69
return
false
;
70
}
71
72
bool
73
RubyRequest::functionalRead
(
Packet
*pkt,
WriteMask
&
mask
)
74
{
75
return
false
;
76
}
77
78
bool
79
RubyRequest::functionalWrite
(
Packet
*pkt)
80
{
81
// This needs a little explanation. I am not sure if this message
82
// should be written. Essentially the question is how are writes
83
// ordered. I am assuming that if a functional write is issued after
84
// a timing write to the same address, then the functional write
85
// has to overwrite the data for the timing request, even if the
86
// timing request has still not been ordered globally.
87
88
if
(!pkt->
hasData
() || !
m_pkt
->
hasData
())
89
return
false
;
90
91
uint8_t *
data
=
m_pkt
->
getPtr
<uint8_t>();
92
93
if
(pkt->
isMaskedWrite
() ||
m_pkt
->
isMaskedWrite
()) {
94
warn
(
"Skiping functional write to/from a masked write packet"
95
" (addr: %#x, other addr: %#x).\n"
,
m_PhysicalAddress
,
96
pkt->
getAddr
());
97
return
false
;
98
}
99
100
Addr
wBase = pkt->
getAddr
();
101
Addr
wTail = wBase + pkt->
getSize
();
102
Addr
mBase =
m_PhysicalAddress
;
103
Addr
mTail = mBase +
m_Size
;
104
105
const
uint8_t * pktData = pkt->
getConstPtr
<uint8_t>();
106
107
Addr
cBase = std::max(wBase, mBase);
108
Addr
cTail = std::min(wTail, mTail);
109
110
for
(
Addr
i
= cBase;
i
< cTail; ++
i
) {
111
data
[
i
- mBase] = pktData[
i
- wBase];
112
}
113
114
// also overwrite the WTData
115
testAndWrite
(
m_PhysicalAddress
,
m_WTData
, pkt);
116
117
return
cBase < cTail;
118
}
RubyRequest::m_pkt
PacketPtr m_pkt
Definition:
RubyRequest.hh:65
RubyRequest::functionalWrite
bool functionalWrite(Packet *pkt)
Definition:
RubyRequest.cc:79
warn
#define warn(...)
Definition:
logging.hh:239
RubyRequest::m_Prefetch
PrefetchBit m_Prefetch
Definition:
RubyRequest.hh:64
data
const char data[]
Definition:
circlebuf.test.cc:47
Packet::getAddr
Addr getAddr() const
Definition:
packet.hh:755
ArmISA::i
Bitfield< 7 > i
Definition:
miscregs_types.hh:63
RubyRequest::m_ProgramCounter
Addr m_ProgramCounter
Definition:
RubyRequest.hh:61
RubyRequest::m_AccessMode
RubyAccessMode m_AccessMode
Definition:
RubyRequest.hh:62
RubyRequest::m_LineAddress
Addr m_LineAddress
Definition:
RubyRequest.hh:59
RubyRequest.hh
RubyRequest::print
void print(std::ostream &out) const
Definition:
RubyRequest.cc:48
Packet::getSize
unsigned getSize() const
Definition:
packet.hh:765
RubyRequest::m_PhysicalAddress
Addr m_PhysicalAddress
Definition:
RubyRequest.hh:58
RubyRequest::functionalRead
bool functionalRead(Packet *pkt)
The two functions below are used for reading / writing the message functionally.
Definition:
RubyRequest.cc:63
testAndWrite
bool testAndWrite(Addr addr, DataBlock &blk, Packet *pkt)
This function accepts an address, a data block and a packet.
Definition:
RubySlicc_Util.hh:253
RubySlicc_Util.hh
RubyRequest::m_Type
RubyRequestType m_Type
Definition:
RubyRequest.hh:60
Addr
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition:
types.hh:148
RubyRequest::m_Size
int m_Size
Definition:
RubyRequest.hh:63
RubyRequest::m_WTData
DataBlock m_WTData
Definition:
RubyRequest.hh:68
Packet::hasData
bool hasData() const
Definition:
packet.hh:577
Packet
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
Definition:
packet.hh:258
Packet::isMaskedWrite
bool isMaskedWrite() const
Definition:
packet.hh:1374
Packet::getPtr
T * getPtr()
get a pointer to the data ptr.
Definition:
packet.hh:1158
Packet::getConstPtr
const T * getConstPtr() const
Definition:
packet.hh:1167
WriteMask
Definition:
WriteMask.hh:53
ArmISA::mask
Bitfield< 28, 24 > mask
Definition:
miscregs_types.hh:711
Generated on Tue Jun 22 2021 15:28:30 for gem5 by
doxygen
1.8.17