#include "base/fast_alloc.hh"
#include "base/flags.hh"
#include "base/misc.hh"
-#include "sim/host.hh"
+#include "base/types.hh"
#include "sim/core.hh"
class Request;
/** This request is to a memory mapped register. */
static const FlagsType MMAPED_IPR = 0x00002000;
- /** The request should not cause a page fault. */
- static const FlagsType NO_FAULT = 0x00010000;
/** The request should ignore unaligned access faults */
static const FlagsType NO_ALIGN_FAULT = 0x00020000;
/** The request should ignore unaligned access faults */
* The physical address of the request. Valid only if validPaddr
* is set.
*/
- Addr paddr;
+ Addr _paddr;
/**
* 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;
/** Flag structure for the request. */
- Flags flags;
+ Flags _flags;
/** Private flags for field validity checking. */
PrivateFlags privateFlags;
* latencies. This field is set to curTick any time paddr or vaddr
* is written.
*/
- Tick time;
+ Tick _time;
/** The address space ID. */
- int asid;
+ int _asid;
/** The virtual address of the request. */
- Addr vaddr;
+ Addr _vaddr;
/**
* Extra data for the request, such as the return value of
* store conditional or the compare value for a CAS. */
- uint64_t extraData;
+ uint64_t _extraData;
/** The context ID (for statistics, typically). */
int _contextId;
int _threadId;
/** program counter of initiating access; for tracing/debugging */
- Addr pc;
+ Addr _pc;
public:
- /** Minimal constructor. No fields are initialized. */
+ /** Minimal constructor. No fields are initialized.
+ * (Note that _flags and privateFlags are cleared by Flags
+ * default constructor.)
+ */
Request()
{}
setPhys(paddr, size, flags);
}
+ Request(Addr paddr, int size, Flags flags, Tick time)
+ {
+ setPhys(paddr, size, flags, time);
+ }
+
+ Request(Addr paddr, int size, Flags flags, Tick time, Addr pc)
+ {
+ setPhys(paddr, size, flags, time);
+ privateFlags.set(VALID_PC);
+ _pc = pc;
+ }
+
Request(int asid, Addr vaddr, int size, Flags flags, Addr pc,
- int cid, int tid)
+ int cid, ThreadID tid)
{
setVirt(asid, vaddr, size, flags, pc);
setThreadContext(cid, tid);
* Set up CPU and thread numbers.
*/
void
- setThreadContext(int context_id, int thread_id)
+ setThreadContext(int context_id, ThreadID tid)
{
_contextId = context_id;
- _threadId = thread_id;
+ _threadId = tid;
privateFlags.set(VALID_CONTEXT_ID|VALID_THREAD_ID);
}
* allocated Request object.
*/
void
- setPhys(Addr _paddr, int _size, Flags _flags)
+ setPhys(Addr paddr, int size, Flags flags, Tick time)
{
- assert(_size >= 0);
- paddr = _paddr;
- size = _size;
- time = curTick;
+ assert(size >= 0);
+ _paddr = paddr;
+ _size = size;
+ _time = time;
- flags.clear(~STICKY_FLAGS);
- flags.set(_flags);
+ _flags.clear(~STICKY_FLAGS);
+ _flags.set(flags);
privateFlags.clear(~STICKY_PRIVATE_FLAGS);
privateFlags.set(VALID_PADDR|VALID_SIZE);
}
+ void
+ setPhys(Addr paddr, int size, Flags flags)
+ {
+ setPhys(paddr, size, flags, curTick);
+ }
+
/**
* Set up a virtual (e.g., CPU) request in a previously
* allocated Request object.
*/
void
- setVirt(int _asid, Addr _vaddr, int _size, Flags _flags, Addr _pc)
+ setVirt(int asid, Addr vaddr, int size, Flags flags, Addr pc)
{
- assert(_size >= 0);
- asid = _asid;
- vaddr = _vaddr;
- size = _size;
- flags = _flags;
- pc = _pc;
- time = curTick;
-
- flags.clear(~STICKY_FLAGS);
- flags.set(_flags);
+ assert(size >= 0);
+ _asid = asid;
+ _vaddr = vaddr;
+ _size = size;
+ _pc = pc;
+ _time = curTick;
+
+ _flags.clear(~STICKY_FLAGS);
+ _flags.set(flags);
privateFlags.clear(~STICKY_PRIVATE_FLAGS);
privateFlags.set(VALID_VADDR|VALID_SIZE|VALID_PC);
}
* to guarantee that the size and flags are also set.
*/
void
- setPaddr(Addr _paddr)
+ setPaddr(Addr paddr)
{
assert(privateFlags.isSet(VALID_VADDR));
- paddr = _paddr;
+ _paddr = paddr;
privateFlags.set(VALID_PADDR);
}
{
assert(privateFlags.isSet(VALID_VADDR));
assert(privateFlags.noneSet(VALID_PADDR));
- assert(split_addr > vaddr && split_addr < vaddr + size);
+ assert(split_addr > _vaddr && split_addr < _vaddr + _size);
req1 = new Request;
*req1 = *this;
req2 = new Request;
*req2 = *this;
- req1->size = split_addr - vaddr;
- req2->vaddr = split_addr;
- req2->size = size - req1->size;
+ req1->_size = split_addr - _vaddr;
+ req2->_vaddr = split_addr;
+ req2->_size = _size - req1->_size;
}
/**
getPaddr()
{
assert(privateFlags.isSet(VALID_PADDR));
- return paddr;
+ return _paddr;
}
/**
getSize()
{
assert(privateFlags.isSet(VALID_SIZE));
- return size;
+ return _size;
}
/** Accessor for time. */
Tick
- getTime()
+ time() const
{
assert(privateFlags.isSet(VALID_PADDR|VALID_VADDR));
- return time;
+ return _time;
+ }
+
+ void
+ time(Tick time)
+ {
+ assert(privateFlags.isSet(VALID_PADDR|VALID_VADDR));
+ _time = time;
}
/** Accessor for flags. */
getFlags()
{
assert(privateFlags.isSet(VALID_PADDR|VALID_VADDR));
- return flags;
+ return _flags;
}
+ /** Note that unlike other accessors, this function sets *specific
+ flags* (ORs them in); it does not assign its argument to the
+ _flags field. Thus this method should rightly be called
+ setFlags() and not just flags(). */
void
- setFlags(Flags _flags)
+ setFlags(Flags flags)
{
assert(privateFlags.isSet(VALID_PADDR|VALID_VADDR));
- flags.set(_flags);
+ _flags.set(flags);
}
/** Accessor function for vaddr.*/
getVaddr()
{
assert(privateFlags.isSet(VALID_VADDR));
- return vaddr;
+ return _vaddr;
}
/** Accessor function for asid.*/
getAsid()
{
assert(privateFlags.isSet(VALID_VADDR));
- return asid;
+ return _asid;
}
/** Accessor function for asi.*/
getAsi()
{
assert(privateFlags.isSet(VALID_VADDR));
- return flags & ASI_BITS;
- }
-
- /** Accessor function for MMAPED_IPR flag. */
- bool
- isMmapedIpr()
- {
- assert(privateFlags.isSet(VALID_PADDR));
- return flags.isSet(MMAPED_IPR);
- }
-
- void
- setMmapedIpr(bool r)
- {
- assert(VALID_VADDR);
- flags.set(MMAPED_IPR);
+ return _flags & ASI_BITS;
}
/** Accessor function to check if sc result is valid. */
getExtraData() const
{
assert(privateFlags.isSet(VALID_EXTRA_DATA));
- return extraData;
+ return _extraData;
}
/** Accessor function for store conditional return value.*/
void
- setExtraData(uint64_t _extraData)
+ setExtraData(uint64_t extraData)
{
- extraData = _extraData;
+ _extraData = extraData;
privateFlags.set(VALID_EXTRA_DATA);
}
getPC() const
{
assert(privateFlags.isSet(VALID_PC));
- return pc;
+ return _pc;
}
- /** Accessor Function to Check Cacheability. */
- bool isUncacheable() const { return flags.isSet(UNCACHEABLE); }
- bool isInstFetch() const { return flags.isSet(INST_FETCH); }
- bool isPrefetch() const { return flags.isSet(PREFETCH); }
- bool isLLSC() const { return flags.isSet(LLSC); }
- bool isLocked() const { return flags.isSet(LOCKED); }
- bool isSwap() const { return flags.isSet(MEM_SWAP|MEM_SWAP_COND); }
- bool isCondSwap() const { return flags.isSet(MEM_SWAP_COND); }
+ /** Accessor functions for flags. Note that these are for testing
+ only; setting flags should be done via setFlags(). */
+ bool isUncacheable() const { return _flags.isSet(UNCACHEABLE); }
+ bool isInstFetch() const { return _flags.isSet(INST_FETCH); }
+ bool isPrefetch() const { return _flags.isSet(PREFETCH); }
+ bool isLLSC() const { return _flags.isSet(LLSC); }
+ bool isLocked() const { return _flags.isSet(LOCKED); }
+ bool isSwap() const { return _flags.isSet(MEM_SWAP|MEM_SWAP_COND); }
+ bool isCondSwap() const { return _flags.isSet(MEM_SWAP_COND); }
+ bool isMmapedIpr() const { return _flags.isSet(MMAPED_IPR); }
bool
isMisaligned() const
{
- if (flags.isSet(NO_ALIGN_FAULT))
+ if (_flags.isSet(NO_ALIGN_FAULT))
return false;
- if ((vaddr & 0x1))
+ if ((_vaddr & 0x1))
return true;
- if (flags.isSet(NO_HALF_WORD_ALIGN_FAULT))
+ if (_flags.isSet(NO_HALF_WORD_ALIGN_FAULT))
return false;
- if ((vaddr & 0x2))
+ if ((_vaddr & 0x2))
return true;
return false;