Streamline interface to Request object.
src/SConscript: mem/request.cc no longer needed (all functions inline). src/cpu/simple/atomic.cc: src/cpu/simple/base.cc: src/cpu/simple/timing.cc: src/dev/io_device.cc: src/mem/port.cc: Modified Request object interface. src/mem/packet.hh: Modified Request object interface. Address & size are always set together now, so track with single flag. src/mem/request.hh: Streamline interface to support a handful of calls that set multiple fields reflecting common usage patterns. Reduce number of validFoo booleans by combining flags for fields which must be set together. --HG-- extra : convert_revision : 3b499de90d6d5f12f0cc7a9a788663265677fe10
This commit is contained in:
parent
91e3aa6295
commit
d77d39daee
|
@ -95,7 +95,6 @@ base_sources = Split('''
|
||||||
mem/packet.cc
|
mem/packet.cc
|
||||||
mem/physical.cc
|
mem/physical.cc
|
||||||
mem/port.cc
|
mem/port.cc
|
||||||
mem/request.cc
|
|
||||||
|
|
||||||
sim/builder.cc
|
sim/builder.cc
|
||||||
sim/configfile.cc
|
sim/configfile.cc
|
||||||
|
|
|
@ -120,26 +120,17 @@ AtomicSimpleCPU::AtomicSimpleCPU(Params *p)
|
||||||
{
|
{
|
||||||
_status = Idle;
|
_status = Idle;
|
||||||
|
|
||||||
ifetch_req = new Request(true);
|
// @todo fix me and get the real cpu id & thread number!!!
|
||||||
ifetch_req->setAsid(0);
|
ifetch_req = new Request();
|
||||||
// @todo fix me and get the real cpu iD!!!
|
|
||||||
ifetch_req->setCpuNum(0);
|
|
||||||
ifetch_req->setSize(sizeof(MachInst));
|
|
||||||
ifetch_pkt = new Packet(ifetch_req, Packet::ReadReq, Packet::Broadcast);
|
ifetch_pkt = new Packet(ifetch_req, Packet::ReadReq, Packet::Broadcast);
|
||||||
ifetch_pkt->dataStatic(&inst);
|
ifetch_pkt->dataStatic(&inst);
|
||||||
|
|
||||||
data_read_req = new Request(true);
|
data_read_req = new Request();
|
||||||
// @todo fix me and get the real cpu iD!!!
|
|
||||||
data_read_req->setCpuNum(0);
|
|
||||||
data_read_req->setAsid(0);
|
|
||||||
data_read_pkt = new Packet(data_read_req, Packet::ReadReq,
|
data_read_pkt = new Packet(data_read_req, Packet::ReadReq,
|
||||||
Packet::Broadcast);
|
Packet::Broadcast);
|
||||||
data_read_pkt->dataStatic(&dataReg);
|
data_read_pkt->dataStatic(&dataReg);
|
||||||
|
|
||||||
data_write_req = new Request(true);
|
data_write_req = new Request();
|
||||||
// @todo fix me and get the real cpu iD!!!
|
|
||||||
data_write_req->setCpuNum(0);
|
|
||||||
data_write_req->setAsid(0);
|
|
||||||
data_write_pkt = new Packet(data_write_req, Packet::WriteReq,
|
data_write_pkt = new Packet(data_write_req, Packet::WriteReq,
|
||||||
Packet::Broadcast);
|
Packet::Broadcast);
|
||||||
}
|
}
|
||||||
|
@ -236,10 +227,7 @@ template <class T>
|
||||||
Fault
|
Fault
|
||||||
AtomicSimpleCPU::read(Addr addr, T &data, unsigned flags)
|
AtomicSimpleCPU::read(Addr addr, T &data, unsigned flags)
|
||||||
{
|
{
|
||||||
data_read_req->setVaddr(addr);
|
data_read_req->setVirt(0, addr, sizeof(T), flags, cpuXC->readPC());
|
||||||
data_read_req->setSize(sizeof(T));
|
|
||||||
data_read_req->setFlags(flags);
|
|
||||||
data_read_req->setTime(curTick);
|
|
||||||
|
|
||||||
if (traceData) {
|
if (traceData) {
|
||||||
traceData->setAddr(addr);
|
traceData->setAddr(addr);
|
||||||
|
@ -314,10 +302,7 @@ template <class T>
|
||||||
Fault
|
Fault
|
||||||
AtomicSimpleCPU::write(T data, Addr addr, unsigned flags, uint64_t *res)
|
AtomicSimpleCPU::write(T data, Addr addr, unsigned flags, uint64_t *res)
|
||||||
{
|
{
|
||||||
data_write_req->setVaddr(addr);
|
data_write_req->setVirt(0, addr, sizeof(T), flags, cpuXC->readPC());
|
||||||
data_write_req->setTime(curTick);
|
|
||||||
data_write_req->setSize(sizeof(T));
|
|
||||||
data_write_req->setFlags(flags);
|
|
||||||
|
|
||||||
if (traceData) {
|
if (traceData) {
|
||||||
traceData->setAddr(addr);
|
traceData->setAddr(addr);
|
||||||
|
@ -408,7 +393,6 @@ AtomicSimpleCPU::tick()
|
||||||
|
|
||||||
checkForInterrupts();
|
checkForInterrupts();
|
||||||
|
|
||||||
ifetch_req->resetMin();
|
|
||||||
Fault fault = setupFetchRequest(ifetch_req);
|
Fault fault = setupFetchRequest(ifetch_req);
|
||||||
|
|
||||||
if (fault == NoFault) {
|
if (fault == NoFault) {
|
||||||
|
|
|
@ -357,13 +357,9 @@ BaseSimpleCPU::setupFetchRequest(Request *req)
|
||||||
DPRINTF(Fetch,"Fetch: PC:%08p NPC:%08p NNPC:%08p\n",cpuXC->readPC(),
|
DPRINTF(Fetch,"Fetch: PC:%08p NPC:%08p NNPC:%08p\n",cpuXC->readPC(),
|
||||||
cpuXC->readNextPC(),cpuXC->readNextNPC());
|
cpuXC->readNextPC(),cpuXC->readNextNPC());
|
||||||
|
|
||||||
req->setVaddr(cpuXC->readPC() & ~3);
|
req->setVirt(0, cpuXC->readPC() & ~3, sizeof(MachInst),
|
||||||
req->setTime(curTick);
|
(FULL_SYSTEM && (cpuXC->readPC() & 1)) ? PHYSICAL : 0,
|
||||||
#if FULL_SYSTEM
|
cpuXC->readPC());
|
||||||
req->setFlags((cpuXC->readPC() & 1) ? PHYSICAL : 0);
|
|
||||||
#else
|
|
||||||
req->setFlags(0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
Fault fault = cpuXC->translateInstReq(req);
|
Fault fault = cpuXC->translateInstReq(req);
|
||||||
|
|
||||||
|
|
|
@ -172,12 +172,10 @@ template <class T>
|
||||||
Fault
|
Fault
|
||||||
TimingSimpleCPU::read(Addr addr, T &data, unsigned flags)
|
TimingSimpleCPU::read(Addr addr, T &data, unsigned flags)
|
||||||
{
|
{
|
||||||
Request *data_read_req = new Request(true);
|
// need to fill in CPU & thread IDs here
|
||||||
|
Request *data_read_req = new Request();
|
||||||
|
|
||||||
data_read_req->setVaddr(addr);
|
data_read_req->setVirt(0, addr, sizeof(T), flags, cpuXC->readPC());
|
||||||
data_read_req->setSize(sizeof(T));
|
|
||||||
data_read_req->setFlags(flags);
|
|
||||||
data_read_req->setTime(curTick);
|
|
||||||
|
|
||||||
if (traceData) {
|
if (traceData) {
|
||||||
traceData->setAddr(data_read_req->getVaddr());
|
traceData->setAddr(data_read_req->getVaddr());
|
||||||
|
@ -255,11 +253,9 @@ template <class T>
|
||||||
Fault
|
Fault
|
||||||
TimingSimpleCPU::write(T data, Addr addr, unsigned flags, uint64_t *res)
|
TimingSimpleCPU::write(T data, Addr addr, unsigned flags, uint64_t *res)
|
||||||
{
|
{
|
||||||
Request *data_write_req = new Request(true);
|
// need to fill in CPU & thread IDs here
|
||||||
data_write_req->setVaddr(addr);
|
Request *data_write_req = new Request();
|
||||||
data_write_req->setTime(curTick);
|
data_write_req->setVirt(0, addr, sizeof(T), flags, cpuXC->readPC());
|
||||||
data_write_req->setSize(sizeof(T));
|
|
||||||
data_write_req->setFlags(flags);
|
|
||||||
|
|
||||||
// translate to physical address
|
// translate to physical address
|
||||||
Fault fault = cpuXC->translateDataWriteReq(data_write_req);
|
Fault fault = cpuXC->translateDataWriteReq(data_write_req);
|
||||||
|
@ -340,8 +336,8 @@ TimingSimpleCPU::fetch()
|
||||||
{
|
{
|
||||||
checkForInterrupts();
|
checkForInterrupts();
|
||||||
|
|
||||||
Request *ifetch_req = new Request(true);
|
// need to fill in CPU & thread IDs here
|
||||||
ifetch_req->setSize(sizeof(MachInst));
|
Request *ifetch_req = new Request();
|
||||||
Fault fault = setupFetchRequest(ifetch_req);
|
Fault fault = setupFetchRequest(ifetch_req);
|
||||||
|
|
||||||
ifetch_pkt = new Packet(ifetch_req, Packet::ReadReq, Packet::Broadcast);
|
ifetch_pkt = new Packet(ifetch_req, Packet::ReadReq, Packet::Broadcast);
|
||||||
|
|
|
@ -166,15 +166,12 @@ DmaPort::dmaAction(Packet::Command cmd, Addr addr, int size, Event *event,
|
||||||
|
|
||||||
for (ChunkGenerator gen(addr, size, peerBlockSize());
|
for (ChunkGenerator gen(addr, size, peerBlockSize());
|
||||||
!gen.done(); gen.next()) {
|
!gen.done(); gen.next()) {
|
||||||
Request *req = new Request(false);
|
Request *req = new Request(gen.addr(), gen.size(), 0);
|
||||||
req->setPaddr(gen.addr());
|
|
||||||
req->setSize(gen.size());
|
|
||||||
req->setTime(curTick);
|
|
||||||
Packet *pkt = new Packet(req, cmd, Packet::Broadcast);
|
Packet *pkt = new Packet(req, cmd, Packet::Broadcast);
|
||||||
|
|
||||||
// Increment the data pointer on a write
|
// Increment the data pointer on a write
|
||||||
if (data)
|
if (data)
|
||||||
pkt->dataStatic(data + prevSize) ;
|
pkt->dataStatic(data + prevSize);
|
||||||
|
|
||||||
prevSize += gen.size();
|
prevSize += gen.size();
|
||||||
|
|
||||||
|
|
|
@ -91,10 +91,8 @@ class Packet
|
||||||
* (unlike * addr, size, and src). */
|
* (unlike * addr, size, and src). */
|
||||||
short dest;
|
short dest;
|
||||||
|
|
||||||
/** Is the 'addr' field valid? */
|
/** Are the 'addr' and 'size' fields valid? */
|
||||||
bool addrValid;
|
bool addrSizeValid;
|
||||||
/** Is the 'size' field valid? */
|
|
||||||
bool sizeValid;
|
|
||||||
/** Is the 'src' field valid? */
|
/** Is the 'src' field valid? */
|
||||||
bool srcValid;
|
bool srcValid;
|
||||||
|
|
||||||
|
@ -192,11 +190,8 @@ class Packet
|
||||||
short getDest() const { return dest; }
|
short getDest() const { return dest; }
|
||||||
void setDest(short _dest) { dest = _dest; }
|
void setDest(short _dest) { dest = _dest; }
|
||||||
|
|
||||||
Addr getAddr() const { assert(addrValid); return addr; }
|
Addr getAddr() const { assert(addrSizeValid); return addr; }
|
||||||
void setAddr(Addr _addr) { addr = _addr; addrValid = true; }
|
int getSize() const { assert(addrSizeValid); return size; }
|
||||||
|
|
||||||
int getSize() const { assert(sizeValid); return size; }
|
|
||||||
void setSize(int _size) { size = _size; sizeValid = true; }
|
|
||||||
|
|
||||||
/** Constructor. Note that a Request object must be constructed
|
/** Constructor. Note that a Request object must be constructed
|
||||||
* first, but the Requests's physical address and size fields
|
* first, but the Requests's physical address and size fields
|
||||||
|
@ -205,7 +200,7 @@ class Packet
|
||||||
Packet(Request *_req, Command _cmd, short _dest)
|
Packet(Request *_req, Command _cmd, short _dest)
|
||||||
: data(NULL), staticData(false), dynamicData(false), arrayData(false),
|
: data(NULL), staticData(false), dynamicData(false), arrayData(false),
|
||||||
addr(_req->paddr), size(_req->size), dest(_dest),
|
addr(_req->paddr), size(_req->size), dest(_dest),
|
||||||
addrValid(_req->validPaddr), sizeValid(_req->validSize),
|
addrSizeValid(_req->validPaddr),
|
||||||
srcValid(false),
|
srcValid(false),
|
||||||
req(_req), coherence(NULL), senderState(NULL), cmd(_cmd),
|
req(_req), coherence(NULL), senderState(NULL), cmd(_cmd),
|
||||||
result(Unknown)
|
result(Unknown)
|
||||||
|
@ -223,9 +218,9 @@ class Packet
|
||||||
* multiple transactions. */
|
* multiple transactions. */
|
||||||
void reinitFromRequest() {
|
void reinitFromRequest() {
|
||||||
assert(req->validPaddr);
|
assert(req->validPaddr);
|
||||||
setAddr(req->paddr);
|
addr = req->paddr;
|
||||||
assert(req->validSize);
|
size = req->size;
|
||||||
setSize(req->size);
|
addrSizeValid = true;
|
||||||
result = Unknown;
|
result = Unknown;
|
||||||
if (dynamicData) {
|
if (dynamicData) {
|
||||||
deleteData();
|
deleteData();
|
||||||
|
|
|
@ -45,13 +45,12 @@ Port::setPeer(Port *port)
|
||||||
void
|
void
|
||||||
Port::blobHelper(Addr addr, uint8_t *p, int size, Packet::Command cmd)
|
Port::blobHelper(Addr addr, uint8_t *p, int size, Packet::Command cmd)
|
||||||
{
|
{
|
||||||
Request req(false);
|
Request req;
|
||||||
Packet pkt(&req, cmd, Packet::Broadcast);
|
Packet pkt(&req, cmd, Packet::Broadcast);
|
||||||
|
|
||||||
for (ChunkGenerator gen(addr, size, peerBlockSize());
|
for (ChunkGenerator gen(addr, size, peerBlockSize());
|
||||||
!gen.done(); gen.next()) {
|
!gen.done(); gen.next()) {
|
||||||
req.setPaddr(gen.addr());
|
req.setPhys(gen.addr(), gen.size(), 0);
|
||||||
req.setSize(gen.size());
|
|
||||||
pkt.reinitFromRequest();
|
pkt.reinitFromRequest();
|
||||||
pkt.dataStatic(p);
|
pkt.dataStatic(p);
|
||||||
sendFunctional(&pkt);
|
sendFunctional(&pkt);
|
||||||
|
|
|
@ -61,139 +61,155 @@ const unsigned NO_ALIGN_FAULT = 0x400;
|
||||||
|
|
||||||
class Request
|
class Request
|
||||||
{
|
{
|
||||||
//@todo Make Accesor functions, make these private.
|
|
||||||
public:
|
|
||||||
/** Constructor, needs a bool to signify if it is/isn't Cpu Request. */
|
|
||||||
Request(bool isCpu);
|
|
||||||
|
|
||||||
/** reset the request to it's initial state so it can be reused.*/
|
|
||||||
void resetAll(bool isCpu);
|
|
||||||
|
|
||||||
/** reset the request's addrs times, etc, so but not everything to same
|
|
||||||
* time. */
|
|
||||||
void resetMin();
|
|
||||||
|
|
||||||
//First non-cpu request fields
|
|
||||||
private:
|
private:
|
||||||
/** The physical address of the request. */
|
/**
|
||||||
|
* The physical address of the request. Valid only if validPaddr
|
||||||
|
* is set. */
|
||||||
Addr paddr;
|
Addr paddr;
|
||||||
/** Wether or not paddr is valid (has been written yet). */
|
|
||||||
bool validPaddr;
|
|
||||||
|
|
||||||
/** The size of the request. */
|
/**
|
||||||
|
* The size of the request. This field must be set when vaddr or
|
||||||
|
* paddr is written via setVirt() or setPhys(), so it is always
|
||||||
|
* valid as long as one of the address fields is valid. */
|
||||||
int size;
|
int size;
|
||||||
/** Wether or not size is valid (has been written yet). */
|
|
||||||
bool validSize;
|
|
||||||
|
|
||||||
/** The time this request was started. Used to calculate latencies. */
|
|
||||||
Tick time;
|
|
||||||
/** Wether or not time is valid (has been written yet). */
|
|
||||||
bool validTime;
|
|
||||||
|
|
||||||
/** Destination address if this is a block copy. */
|
|
||||||
Addr copyDest;
|
|
||||||
/** Wether or not copyDest is valid (has been written yet). */
|
|
||||||
bool validCopyDest;
|
|
||||||
|
|
||||||
/** Flag structure for the request. */
|
/** Flag structure for the request. */
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
|
|
||||||
//Accsesors for non-cpu request fields
|
/**
|
||||||
public:
|
* The time this request was started. Used to calculate
|
||||||
/** Accesor for paddr. */
|
* latencies. This field is set to curTick any time paddr or vaddr
|
||||||
Addr getPaddr();
|
* is written. */
|
||||||
/** Accesor for paddr. */
|
Tick time;
|
||||||
void setPaddr(Addr _paddr);
|
|
||||||
|
|
||||||
/** Accesor for size. */
|
|
||||||
int getSize();
|
|
||||||
/** Accesor for size. */
|
|
||||||
void setSize(int _size);
|
|
||||||
|
|
||||||
/** Accesor for time. */
|
|
||||||
Tick getTime();
|
|
||||||
/** Accesor for time. */
|
|
||||||
void setTime(Tick _time);
|
|
||||||
|
|
||||||
/** Accesor for copy dest. */
|
|
||||||
Addr getCopyDest();
|
|
||||||
/** Accesor for copy dest. */
|
|
||||||
void setCopyDest(Addr _copyDest);
|
|
||||||
|
|
||||||
/** Accesor for flags. */
|
|
||||||
uint32_t getFlags();
|
|
||||||
/** Accesor for paddr. */
|
|
||||||
void setFlags(uint32_t _flags);
|
|
||||||
|
|
||||||
//Now cpu-request fields
|
|
||||||
private:
|
|
||||||
/** Bool to signify if this is a cpuRequest. */
|
|
||||||
bool cpuReq;
|
|
||||||
|
|
||||||
/** The virtual address of the request. */
|
|
||||||
Addr vaddr;
|
|
||||||
/** Wether or not the vaddr is valid. */
|
|
||||||
bool validVaddr;
|
|
||||||
|
|
||||||
/** The address space ID. */
|
/** The address space ID. */
|
||||||
int asid;
|
int asid;
|
||||||
/** Wether or not the asid is valid. */
|
/** The virtual address of the request. */
|
||||||
bool validAsid;
|
Addr vaddr;
|
||||||
|
|
||||||
/** The return value of store conditional. */
|
/** The return value of store conditional. */
|
||||||
uint64_t scResult;
|
uint64_t scResult;
|
||||||
/** Wether or not the sc result is valid. */
|
|
||||||
bool validScResult;
|
|
||||||
|
|
||||||
/** The cpu number for statistics. */
|
/** The cpu number (for statistics, typically). */
|
||||||
int cpuNum;
|
int cpuNum;
|
||||||
/** Wether or not the cpu number is valid. */
|
/** The requesting thread id (for statistics, typically). */
|
||||||
bool validCpuNum;
|
|
||||||
|
|
||||||
/** The requesting thread id. */
|
|
||||||
int threadNum;
|
int threadNum;
|
||||||
/** Wether or not the thread id is valid. */
|
|
||||||
bool validThreadNum;
|
|
||||||
|
|
||||||
/** program counter of initiating access; for tracing/debugging */
|
/** program counter of initiating access; for tracing/debugging */
|
||||||
Addr pc;
|
Addr pc;
|
||||||
/** Wether or not the pc is valid. */
|
|
||||||
|
/** Whether or not paddr is valid (has been written yet). */
|
||||||
|
bool validPaddr;
|
||||||
|
/** Whether or not the asid & vaddr are valid. */
|
||||||
|
bool validAsidVaddr;
|
||||||
|
/** Whether or not the sc result is valid. */
|
||||||
|
bool validScResult;
|
||||||
|
/** Whether or not the cpu number & thread ID are valid. */
|
||||||
|
bool validCpuAndThreadNums;
|
||||||
|
/** Whether or not the pc is valid. */
|
||||||
bool validPC;
|
bool validPC;
|
||||||
|
|
||||||
//Accessor Functions for cpu request fields
|
|
||||||
public:
|
public:
|
||||||
/** Accesor function to determine if this is a cpu request or not.*/
|
/** Minimal constructor. No fields are initialized. */
|
||||||
bool isCpuRequest();
|
Request()
|
||||||
|
: validPaddr(false), validAsidVaddr(false),
|
||||||
|
validScResult(false), validCpuAndThreadNums(false), validPC(false)
|
||||||
|
{}
|
||||||
|
|
||||||
/** Accesor function for vaddr.*/
|
/**
|
||||||
Addr getVaddr();
|
* Constructor for physical (e.g. device) requests. Initializes
|
||||||
/** Accesor function for vaddr.*/
|
* just physical address, size, flags, and timestamp (to curTick).
|
||||||
void setVaddr(Addr _vaddr);
|
* These fields are adequate to perform a request. */
|
||||||
|
Request(Addr _paddr, int _size, int _flags)
|
||||||
|
: validCpuAndThreadNums(false)
|
||||||
|
{ setPhys(_paddr, _size, _flags); }
|
||||||
|
|
||||||
/** Accesor function for asid.*/
|
/**
|
||||||
int getAsid();
|
* Set up CPU and thread numbers. */
|
||||||
/** Accesor function for asid.*/
|
void setThreadContext(int _cpuNum, int _threadNum)
|
||||||
void setAsid(int _asid);
|
{
|
||||||
|
cpuNum = _cpuNum;
|
||||||
|
threadNum = _threadNum;
|
||||||
|
validCpuAndThreadNums = true;
|
||||||
|
}
|
||||||
|
|
||||||
/** Accesor function for store conditional return value.*/
|
/**
|
||||||
uint64_t getScResult();
|
* Set up a physical (e.g. device) request in a previously
|
||||||
/** Accesor function for store conditional return value.*/
|
* allocated Request object. */
|
||||||
void setScResult(uint64_t _scResult);
|
void setPhys(Addr _paddr, int _size, int _flags)
|
||||||
|
{
|
||||||
|
paddr = _paddr;
|
||||||
|
size = _size;
|
||||||
|
flags = _flags;
|
||||||
|
time = curTick;
|
||||||
|
validPaddr = true;
|
||||||
|
validAsidVaddr = false;
|
||||||
|
validPC = false;
|
||||||
|
validScResult = false;
|
||||||
|
}
|
||||||
|
|
||||||
/** Accesor function for cpu number.*/
|
/**
|
||||||
int getCpuNum();
|
* Set up a virtual (e.g., CPU) request in a previously
|
||||||
/** Accesor function for cpu number.*/
|
* allocated Request object. */
|
||||||
void setCpuNum(int _cpuNum);
|
void setVirt(int _asid, Addr _vaddr, int _size, int _flags, Addr _pc)
|
||||||
|
{
|
||||||
|
asid = _asid;
|
||||||
|
vaddr = _vaddr;
|
||||||
|
size = _size;
|
||||||
|
flags = _flags;
|
||||||
|
pc = _pc;
|
||||||
|
time = curTick;
|
||||||
|
validPaddr = false;
|
||||||
|
validAsidVaddr = true;
|
||||||
|
validPC = true;
|
||||||
|
validScResult = false;
|
||||||
|
}
|
||||||
|
|
||||||
/** Accesor function for thread number.*/
|
/** Set just the physical address. This should only be used to
|
||||||
int getThreadNum();
|
* record the result of a translation, and thus the vaddr must be
|
||||||
/** Accesor function for thread number.*/
|
* valid before this method is called. Otherwise, use setPhys()
|
||||||
void setThreadNum(int _threadNum);
|
* to guarantee that the size and flags are also set.
|
||||||
|
*/
|
||||||
|
void setPaddr(Addr _paddr)
|
||||||
|
{
|
||||||
|
assert(validAsidVaddr);
|
||||||
|
paddr = _paddr;
|
||||||
|
validPaddr = true;
|
||||||
|
}
|
||||||
|
|
||||||
/** Accesor function for pc.*/
|
/** Accessor for paddr. */
|
||||||
Addr getPC();
|
Addr getPaddr() { assert(validPaddr); return paddr; }
|
||||||
/** Accesor function for pc.*/
|
|
||||||
void setPC(Addr _pc);
|
/** Accessor for size. */
|
||||||
|
int getSize() { assert(validPaddr || validAsidVaddr); return size; }
|
||||||
|
/** Accessor for time. */
|
||||||
|
Tick getTime() { assert(validPaddr || validAsidVaddr); return time; }
|
||||||
|
|
||||||
|
/** Accessor for flags. */
|
||||||
|
uint32_t getFlags() { assert(validPaddr || validAsidVaddr); return flags; }
|
||||||
|
/** Accessor for paddr. */
|
||||||
|
void setFlags(uint32_t _flags)
|
||||||
|
{ assert(validPaddr || validAsidVaddr); flags = _flags; }
|
||||||
|
|
||||||
|
/** Accessor function for vaddr.*/
|
||||||
|
Addr getVaddr() { assert(validAsidVaddr); return vaddr; }
|
||||||
|
|
||||||
|
/** Accessor function for asid.*/
|
||||||
|
int getAsid() { assert(validAsidVaddr); return asid; }
|
||||||
|
|
||||||
|
/** Accessor function for store conditional return value.*/
|
||||||
|
uint64_t getScResult() { assert(validScResult); return scResult; }
|
||||||
|
/** Accessor function for store conditional return value.*/
|
||||||
|
void setScResult(uint64_t _scResult)
|
||||||
|
{ scResult = _scResult; validScResult = true; }
|
||||||
|
|
||||||
|
/** Accessor function for cpu number.*/
|
||||||
|
int getCpuNum() { assert(validCpuAndThreadNums); return cpuNum; }
|
||||||
|
/** Accessor function for thread number.*/
|
||||||
|
int getThreadNum() { assert(validCpuAndThreadNums); return threadNum; }
|
||||||
|
|
||||||
|
/** Accessor function for pc.*/
|
||||||
|
Addr getPC() { assert(validPC); return pc; }
|
||||||
|
|
||||||
friend class Packet;
|
friend class Packet;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue