request.hh revision 9044
12810Srdreslin@umich.edu/* 211375Sandreas.hansson@arm.com * Copyright (c) 2002-2005 The Regents of The University of Michigan 311051Sandreas.hansson@arm.com * All rights reserved. 411051Sandreas.hansson@arm.com * 511051Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 611051Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are 711051Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright 811051Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer; 911051Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright 1011051Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 1111051Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution; 1211051Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its 1311051Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from 1411051Sandreas.hansson@arm.com * this software without specific prior written permission. 1511051Sandreas.hansson@arm.com * 162810Srdreslin@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172810Srdreslin@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182810Srdreslin@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192810Srdreslin@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202810Srdreslin@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212810Srdreslin@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222810Srdreslin@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232810Srdreslin@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242810Srdreslin@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252810Srdreslin@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262810Srdreslin@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272810Srdreslin@umich.edu * 282810Srdreslin@umich.edu * Authors: Ron Dreslinski 292810Srdreslin@umich.edu * Steve Reinhardt 302810Srdreslin@umich.edu * Ali Saidi 312810Srdreslin@umich.edu */ 322810Srdreslin@umich.edu 332810Srdreslin@umich.edu/** 342810Srdreslin@umich.edu * @file 352810Srdreslin@umich.edu * Declaration of a request, the overall memory request consisting of 362810Srdreslin@umich.edu the parts of the request that are persistent throughout the transaction. 372810Srdreslin@umich.edu */ 382810Srdreslin@umich.edu 392810Srdreslin@umich.edu#ifndef __MEM_REQUEST_HH__ 402810Srdreslin@umich.edu#define __MEM_REQUEST_HH__ 412810Srdreslin@umich.edu 4211051Sandreas.hansson@arm.com#include <cassert> 4311051Sandreas.hansson@arm.com#include <climits> 442810Srdreslin@umich.edu 4511051Sandreas.hansson@arm.com#include "base/flags.hh" 4611051Sandreas.hansson@arm.com#include "base/misc.hh" 472810Srdreslin@umich.edu#include "base/types.hh" 482810Srdreslin@umich.edu#include "sim/core.hh" 492810Srdreslin@umich.edu 502810Srdreslin@umich.educlass Request; 5111051Sandreas.hansson@arm.com 522810Srdreslin@umich.edutypedef Request* RequestPtr; 532810Srdreslin@umich.edutypedef uint16_t MasterID; 5411051Sandreas.hansson@arm.com 552810Srdreslin@umich.educlass Request 5611051Sandreas.hansson@arm.com{ 5711051Sandreas.hansson@arm.com public: 5811051Sandreas.hansson@arm.com typedef uint32_t FlagsType; 5911051Sandreas.hansson@arm.com typedef ::Flags<FlagsType> Flags; 6011051Sandreas.hansson@arm.com 6111288Ssteve.reinhardt@amd.com /** ASI information for this request if it exists. */ 6211051Sandreas.hansson@arm.com static const FlagsType ASI_BITS = 0x000000FF; 6311051Sandreas.hansson@arm.com /** The request was an instruction fetch. */ 6411051Sandreas.hansson@arm.com static const FlagsType INST_FETCH = 0x00000100; 6511051Sandreas.hansson@arm.com /** The virtual address is also the physical address. */ 6611051Sandreas.hansson@arm.com static const FlagsType PHYSICAL = 0x00000200; 6711053Sandreas.hansson@arm.com /** The request is an ALPHA VPTE pal access (hw_ld). */ 6811053Sandreas.hansson@arm.com static const FlagsType VPTE = 0x00000400; 6911051Sandreas.hansson@arm.com /** Use the alternate mode bits in ALPHA. */ 7011051Sandreas.hansson@arm.com static const FlagsType ALTMODE = 0x00000800; 7111051Sandreas.hansson@arm.com /** The request is to an uncacheable address. */ 7211197Sandreas.hansson@arm.com static const FlagsType UNCACHEABLE = 0x00001000; 7311197Sandreas.hansson@arm.com /** This request is to a memory mapped register. */ 7411199Sandreas.hansson@arm.com static const FlagsType MMAPPED_IPR = 0x00002000; 7511197Sandreas.hansson@arm.com /** This request is a clear exclusive. */ 7611197Sandreas.hansson@arm.com static const FlagsType CLEAR_LL = 0x00004000; 7711197Sandreas.hansson@arm.com 7811051Sandreas.hansson@arm.com /** The request should not cause a memory access. */ 7911051Sandreas.hansson@arm.com static const FlagsType NO_ACCESS = 0x00080000; 8011051Sandreas.hansson@arm.com /** This request will lock or unlock the accessed memory. When used with 8111051Sandreas.hansson@arm.com * a load, the access locks the particular chunk of memory. When used 8211051Sandreas.hansson@arm.com * with a store, it unlocks. The rule is that locked accesses have to be 8311051Sandreas.hansson@arm.com * made up of a locked load, some operation on the data, and then a locked 8411051Sandreas.hansson@arm.com * store. 8511051Sandreas.hansson@arm.com */ 8611051Sandreas.hansson@arm.com static const FlagsType LOCKED = 0x00100000; 8711051Sandreas.hansson@arm.com /** The request is a Load locked/store conditional. */ 8811051Sandreas.hansson@arm.com static const FlagsType LLSC = 0x00200000; 8911051Sandreas.hansson@arm.com /** This request is for a memory swap. */ 9011051Sandreas.hansson@arm.com static const FlagsType MEM_SWAP = 0x00400000; 9111051Sandreas.hansson@arm.com static const FlagsType MEM_SWAP_COND = 0x00800000; 9211051Sandreas.hansson@arm.com 9311051Sandreas.hansson@arm.com /** The request is a prefetch. */ 9411051Sandreas.hansson@arm.com static const FlagsType PREFETCH = 0x01000000; 9511051Sandreas.hansson@arm.com /** The request should be prefetched into the exclusive state. */ 9611051Sandreas.hansson@arm.com static const FlagsType PF_EXCLUSIVE = 0x02000000; 9711051Sandreas.hansson@arm.com /** The request should be marked as LRU. */ 9811051Sandreas.hansson@arm.com static const FlagsType EVICT_NEXT = 0x04000000; 9911051Sandreas.hansson@arm.com 10011051Sandreas.hansson@arm.com /** These flags are *not* cleared when a Request object is reused 10111051Sandreas.hansson@arm.com (assigned a new address). */ 10211051Sandreas.hansson@arm.com static const FlagsType STICKY_FLAGS = INST_FETCH; 10311051Sandreas.hansson@arm.com 10411051Sandreas.hansson@arm.com /** Request Ids that are statically allocated 10511051Sandreas.hansson@arm.com * @{*/ 10611051Sandreas.hansson@arm.com /** This request id is used for writeback requests by the caches */ 10711051Sandreas.hansson@arm.com static const MasterID wbMasterId = 0; 10811051Sandreas.hansson@arm.com /** This request id is used for functional requests that don't come from a 10911051Sandreas.hansson@arm.com * particular device 11011051Sandreas.hansson@arm.com */ 11111051Sandreas.hansson@arm.com static const MasterID funcMasterId = 1; 11211051Sandreas.hansson@arm.com /** This request id is used for message signaled interrupts */ 11311051Sandreas.hansson@arm.com static const MasterID intMasterId = 2; 11411051Sandreas.hansson@arm.com /** Invalid request id for assertion checking only. It is invalid behavior 11511051Sandreas.hansson@arm.com * to ever send this id as part of a request. 11611051Sandreas.hansson@arm.com * @todo C++1x replace with numeric_limits when constexpr is added */ 11711051Sandreas.hansson@arm.com static const MasterID invldMasterId = USHRT_MAX; 11811051Sandreas.hansson@arm.com /** @} */ 11911051Sandreas.hansson@arm.com 12011051Sandreas.hansson@arm.com private: 12111051Sandreas.hansson@arm.com typedef uint8_t PrivateFlagsType; 12211051Sandreas.hansson@arm.com typedef ::Flags<PrivateFlagsType> PrivateFlags; 12311051Sandreas.hansson@arm.com 12411051Sandreas.hansson@arm.com /** Whether or not the size is valid. */ 12511051Sandreas.hansson@arm.com static const PrivateFlagsType VALID_SIZE = 0x00000001; 12611051Sandreas.hansson@arm.com /** Whether or not paddr is valid (has been written yet). */ 12711051Sandreas.hansson@arm.com static const PrivateFlagsType VALID_PADDR = 0x00000002; 12811051Sandreas.hansson@arm.com /** Whether or not the vaddr & asid are valid. */ 12911051Sandreas.hansson@arm.com static const PrivateFlagsType VALID_VADDR = 0x00000004; 13011051Sandreas.hansson@arm.com /** Whether or not the pc is valid. */ 13111051Sandreas.hansson@arm.com static const PrivateFlagsType VALID_PC = 0x00000010; 13211051Sandreas.hansson@arm.com /** Whether or not the context ID is valid. */ 13311051Sandreas.hansson@arm.com static const PrivateFlagsType VALID_CONTEXT_ID = 0x00000020; 13411051Sandreas.hansson@arm.com static const PrivateFlagsType VALID_THREAD_ID = 0x00000040; 13511051Sandreas.hansson@arm.com /** Whether or not the sc result is valid. */ 13611051Sandreas.hansson@arm.com static const PrivateFlagsType VALID_EXTRA_DATA = 0x00000080; 13711051Sandreas.hansson@arm.com 13811051Sandreas.hansson@arm.com /** These flags are *not* cleared when a Request object is reused 13911051Sandreas.hansson@arm.com (assigned a new address). */ 14011051Sandreas.hansson@arm.com static const PrivateFlagsType STICKY_PRIVATE_FLAGS = 14111051Sandreas.hansson@arm.com VALID_CONTEXT_ID | VALID_THREAD_ID; 14211051Sandreas.hansson@arm.com 14311051Sandreas.hansson@arm.com private: 14411051Sandreas.hansson@arm.com /** 14511051Sandreas.hansson@arm.com * The physical address of the request. Valid only if validPaddr 14611051Sandreas.hansson@arm.com * is set. 14711051Sandreas.hansson@arm.com */ 14811051Sandreas.hansson@arm.com Addr _paddr; 14911051Sandreas.hansson@arm.com 15011051Sandreas.hansson@arm.com /** 15111051Sandreas.hansson@arm.com * The size of the request. This field must be set when vaddr or 15211051Sandreas.hansson@arm.com * paddr is written via setVirt() or setPhys(), so it is always 15311051Sandreas.hansson@arm.com * valid as long as one of the address fields is valid. 15411051Sandreas.hansson@arm.com */ 15511051Sandreas.hansson@arm.com int _size; 15611051Sandreas.hansson@arm.com 15711051Sandreas.hansson@arm.com /** The requestor ID which is unique in the system for all ports 15811051Sandreas.hansson@arm.com * that are capable of issuing a transaction 15911051Sandreas.hansson@arm.com */ 16011051Sandreas.hansson@arm.com MasterID _masterId; 16111284Sandreas.hansson@arm.com 16211051Sandreas.hansson@arm.com /** Flag structure for the request. */ 16311051Sandreas.hansson@arm.com Flags _flags; 16411051Sandreas.hansson@arm.com 16511051Sandreas.hansson@arm.com /** Private flags for field validity checking. */ 16611051Sandreas.hansson@arm.com PrivateFlags privateFlags; 16711051Sandreas.hansson@arm.com 16811051Sandreas.hansson@arm.com /** 16911284Sandreas.hansson@arm.com * The time this request was started. Used to calculate 17011284Sandreas.hansson@arm.com * latencies. This field is set to curTick() any time paddr or vaddr 17111284Sandreas.hansson@arm.com * is written. 17211284Sandreas.hansson@arm.com */ 17311051Sandreas.hansson@arm.com Tick _time; 17411284Sandreas.hansson@arm.com 17511051Sandreas.hansson@arm.com /** The address space ID. */ 17611051Sandreas.hansson@arm.com int _asid; 17711051Sandreas.hansson@arm.com 17811284Sandreas.hansson@arm.com /** The virtual address of the request. */ 17911284Sandreas.hansson@arm.com Addr _vaddr; 18011284Sandreas.hansson@arm.com 18111284Sandreas.hansson@arm.com /** 18211051Sandreas.hansson@arm.com * Extra data for the request, such as the return value of 18311288Ssteve.reinhardt@amd.com * store conditional or the compare value for a CAS. */ 18411288Ssteve.reinhardt@amd.com uint64_t _extraData; 18511051Sandreas.hansson@arm.com 18611051Sandreas.hansson@arm.com /** The context ID (for statistics, typically). */ 18711051Sandreas.hansson@arm.com int _contextId; 18811051Sandreas.hansson@arm.com /** The thread ID (id within this CPU) */ 18911286Sandreas.hansson@arm.com int _threadId; 19011286Sandreas.hansson@arm.com 19111286Sandreas.hansson@arm.com /** program counter of initiating access; for tracing/debugging */ 19211051Sandreas.hansson@arm.com Addr _pc; 19311286Sandreas.hansson@arm.com 19411051Sandreas.hansson@arm.com public: 19511051Sandreas.hansson@arm.com /** Minimal constructor. No fields are initialized. 19611051Sandreas.hansson@arm.com * (Note that _flags and privateFlags are cleared by Flags 19711051Sandreas.hansson@arm.com * default constructor.) 19811051Sandreas.hansson@arm.com */ 19911051Sandreas.hansson@arm.com Request() 20011051Sandreas.hansson@arm.com {} 20111051Sandreas.hansson@arm.com 20211051Sandreas.hansson@arm.com /** 20311051Sandreas.hansson@arm.com * Constructor for physical (e.g. device) requests. Initializes 20411051Sandreas.hansson@arm.com * just physical address, size, flags, and timestamp (to curTick()). 20511284Sandreas.hansson@arm.com * These fields are adequate to perform a request. 20611051Sandreas.hansson@arm.com */ 20711051Sandreas.hansson@arm.com Request(Addr paddr, int size, Flags flags, MasterID mid) 20811051Sandreas.hansson@arm.com { 20911051Sandreas.hansson@arm.com setPhys(paddr, size, flags, mid); 21011051Sandreas.hansson@arm.com } 21111284Sandreas.hansson@arm.com 21211051Sandreas.hansson@arm.com Request(Addr paddr, int size, Flags flags, MasterID mid, Tick time) 21311284Sandreas.hansson@arm.com { 21411051Sandreas.hansson@arm.com setPhys(paddr, size, flags, mid, time); 21511197Sandreas.hansson@arm.com } 21611197Sandreas.hansson@arm.com 21711197Sandreas.hansson@arm.com Request(Addr paddr, int size, Flags flags, MasterID mid, Tick time, Addr pc) 21811197Sandreas.hansson@arm.com { 21911051Sandreas.hansson@arm.com setPhys(paddr, size, flags, mid, time); 22011284Sandreas.hansson@arm.com privateFlags.set(VALID_PC); 22111051Sandreas.hansson@arm.com _pc = pc; 22211284Sandreas.hansson@arm.com } 22311284Sandreas.hansson@arm.com 22411284Sandreas.hansson@arm.com Request(int asid, Addr vaddr, int size, Flags flags, MasterID mid, Addr pc, 22511051Sandreas.hansson@arm.com int cid, ThreadID tid) 22611051Sandreas.hansson@arm.com { 22711051Sandreas.hansson@arm.com setVirt(asid, vaddr, size, flags, mid, pc); 22811284Sandreas.hansson@arm.com setThreadContext(cid, tid); 22911284Sandreas.hansson@arm.com } 23011284Sandreas.hansson@arm.com 23111284Sandreas.hansson@arm.com ~Request() {} 23211051Sandreas.hansson@arm.com 23311051Sandreas.hansson@arm.com /** 23411051Sandreas.hansson@arm.com * Set up CPU and thread numbers. 23511284Sandreas.hansson@arm.com */ 23611284Sandreas.hansson@arm.com void 23711284Sandreas.hansson@arm.com setThreadContext(int context_id, ThreadID tid) 23811197Sandreas.hansson@arm.com { 23911284Sandreas.hansson@arm.com _contextId = context_id; 24011284Sandreas.hansson@arm.com _threadId = tid; 24111284Sandreas.hansson@arm.com privateFlags.set(VALID_CONTEXT_ID|VALID_THREAD_ID); 24211284Sandreas.hansson@arm.com } 24311284Sandreas.hansson@arm.com 24411284Sandreas.hansson@arm.com /** 24511284Sandreas.hansson@arm.com * Set up a physical (e.g. device) request in a previously 24611284Sandreas.hansson@arm.com * allocated Request object. 24711284Sandreas.hansson@arm.com */ 24811284Sandreas.hansson@arm.com void 24911284Sandreas.hansson@arm.com setPhys(Addr paddr, int size, Flags flags, MasterID mid, Tick time) 25011284Sandreas.hansson@arm.com { 25111284Sandreas.hansson@arm.com assert(size >= 0); 25211284Sandreas.hansson@arm.com _paddr = paddr; 25311284Sandreas.hansson@arm.com _size = size; 25411197Sandreas.hansson@arm.com _time = time; 25511284Sandreas.hansson@arm.com _masterId = mid; 25611284Sandreas.hansson@arm.com _flags.clear(~STICKY_FLAGS); 25711284Sandreas.hansson@arm.com _flags.set(flags); 25811284Sandreas.hansson@arm.com privateFlags.clear(~STICKY_PRIVATE_FLAGS); 25911284Sandreas.hansson@arm.com privateFlags.set(VALID_PADDR|VALID_SIZE); 26011284Sandreas.hansson@arm.com } 26111284Sandreas.hansson@arm.com 26211197Sandreas.hansson@arm.com void 26311051Sandreas.hansson@arm.com setPhys(Addr paddr, int size, Flags flags, MasterID mid) 26411051Sandreas.hansson@arm.com { 26511051Sandreas.hansson@arm.com setPhys(paddr, size, flags, mid, curTick()); 26611051Sandreas.hansson@arm.com } 26711051Sandreas.hansson@arm.com 26811284Sandreas.hansson@arm.com /** 26911284Sandreas.hansson@arm.com * Set up a virtual (e.g., CPU) request in a previously 27011051Sandreas.hansson@arm.com * allocated Request object. 27111051Sandreas.hansson@arm.com */ 27211051Sandreas.hansson@arm.com void 27311051Sandreas.hansson@arm.com setVirt(int asid, Addr vaddr, int size, Flags flags, MasterID mid, Addr pc) 27411284Sandreas.hansson@arm.com { 27511051Sandreas.hansson@arm.com assert(size >= 0); 27611051Sandreas.hansson@arm.com _asid = asid; 27711051Sandreas.hansson@arm.com _vaddr = vaddr; 27811284Sandreas.hansson@arm.com _size = size; 27911051Sandreas.hansson@arm.com _masterId = mid; 28011197Sandreas.hansson@arm.com _pc = pc; 28111197Sandreas.hansson@arm.com _time = curTick(); 28211197Sandreas.hansson@arm.com 28311197Sandreas.hansson@arm.com _flags.clear(~STICKY_FLAGS); 28411288Ssteve.reinhardt@amd.com _flags.set(flags); 28511051Sandreas.hansson@arm.com privateFlags.clear(~STICKY_PRIVATE_FLAGS); 28611051Sandreas.hansson@arm.com privateFlags.set(VALID_VADDR|VALID_SIZE|VALID_PC); 28711051Sandreas.hansson@arm.com } 28811051Sandreas.hansson@arm.com 28911051Sandreas.hansson@arm.com /** 29011051Sandreas.hansson@arm.com * Set just the physical address. This should only be used to 29111051Sandreas.hansson@arm.com * record the result of a translation, and thus the vaddr must be 29211051Sandreas.hansson@arm.com * valid before this method is called. Otherwise, use setPhys() 29311051Sandreas.hansson@arm.com * to guarantee that the size and flags are also set. 29411051Sandreas.hansson@arm.com */ 29511051Sandreas.hansson@arm.com void 29611051Sandreas.hansson@arm.com setPaddr(Addr paddr) 29711051Sandreas.hansson@arm.com { 29811051Sandreas.hansson@arm.com assert(privateFlags.isSet(VALID_VADDR)); 29911051Sandreas.hansson@arm.com _paddr = paddr; 30011051Sandreas.hansson@arm.com privateFlags.set(VALID_PADDR); 30111051Sandreas.hansson@arm.com } 30211051Sandreas.hansson@arm.com 30311051Sandreas.hansson@arm.com /** 30411051Sandreas.hansson@arm.com * Generate two requests as if this request had been split into two 30511051Sandreas.hansson@arm.com * pieces. The original request can't have been translated already. 30611288Ssteve.reinhardt@amd.com */ 30711051Sandreas.hansson@arm.com void splitOnVaddr(Addr split_addr, RequestPtr &req1, RequestPtr &req2) 30811051Sandreas.hansson@arm.com { 30911051Sandreas.hansson@arm.com assert(privateFlags.isSet(VALID_VADDR)); 31011051Sandreas.hansson@arm.com assert(privateFlags.noneSet(VALID_PADDR)); 31111051Sandreas.hansson@arm.com assert(split_addr > _vaddr && split_addr < _vaddr + _size); 31211051Sandreas.hansson@arm.com req1 = new Request; 31311051Sandreas.hansson@arm.com *req1 = *this; 31411051Sandreas.hansson@arm.com req2 = new Request; 31511051Sandreas.hansson@arm.com *req2 = *this; 31611051Sandreas.hansson@arm.com req1->_size = split_addr - _vaddr; 31711199Sandreas.hansson@arm.com req2->_vaddr = split_addr; 31811051Sandreas.hansson@arm.com req2->_size = _size - req1->_size; 31911051Sandreas.hansson@arm.com } 32011051Sandreas.hansson@arm.com 32111051Sandreas.hansson@arm.com /** 32211051Sandreas.hansson@arm.com * Accessor for paddr. 32311051Sandreas.hansson@arm.com */ 32411051Sandreas.hansson@arm.com bool 32511484Snikos.nikoleris@arm.com hasPaddr() 32611051Sandreas.hansson@arm.com { 32711051Sandreas.hansson@arm.com return privateFlags.isSet(VALID_PADDR); 32811051Sandreas.hansson@arm.com } 32911051Sandreas.hansson@arm.com 33011051Sandreas.hansson@arm.com Addr 33111051Sandreas.hansson@arm.com getPaddr() 33211051Sandreas.hansson@arm.com { 33311051Sandreas.hansson@arm.com assert(privateFlags.isSet(VALID_PADDR)); 33411051Sandreas.hansson@arm.com return _paddr; 33511051Sandreas.hansson@arm.com } 33611051Sandreas.hansson@arm.com 33711051Sandreas.hansson@arm.com /** 33811051Sandreas.hansson@arm.com * Accessor for size. 33911051Sandreas.hansson@arm.com */ 34011051Sandreas.hansson@arm.com bool 34111051Sandreas.hansson@arm.com hasSize() 34211051Sandreas.hansson@arm.com { 34311199Sandreas.hansson@arm.com return privateFlags.isSet(VALID_SIZE); 34411051Sandreas.hansson@arm.com } 34511051Sandreas.hansson@arm.com 34611051Sandreas.hansson@arm.com int 34711051Sandreas.hansson@arm.com getSize() 34811051Sandreas.hansson@arm.com { 34911051Sandreas.hansson@arm.com assert(privateFlags.isSet(VALID_SIZE)); 35011051Sandreas.hansson@arm.com return _size; 35111051Sandreas.hansson@arm.com } 35211375Sandreas.hansson@arm.com 35311375Sandreas.hansson@arm.com /** Accessor for time. */ 35411375Sandreas.hansson@arm.com Tick 35511199Sandreas.hansson@arm.com time() const 35611199Sandreas.hansson@arm.com { 35711199Sandreas.hansson@arm.com assert(privateFlags.isSet(VALID_PADDR|VALID_VADDR)); 35811199Sandreas.hansson@arm.com return _time; 35911199Sandreas.hansson@arm.com } 36011199Sandreas.hansson@arm.com 36111199Sandreas.hansson@arm.com void 36211199Sandreas.hansson@arm.com time(Tick time) 36311199Sandreas.hansson@arm.com { 36411199Sandreas.hansson@arm.com assert(privateFlags.isSet(VALID_PADDR|VALID_VADDR)); 36511199Sandreas.hansson@arm.com _time = time; 36611199Sandreas.hansson@arm.com } 36711199Sandreas.hansson@arm.com 36811199Sandreas.hansson@arm.com /** Accessor for flags. */ 36911199Sandreas.hansson@arm.com Flags 37011199Sandreas.hansson@arm.com getFlags() 37111199Sandreas.hansson@arm.com { 37211199Sandreas.hansson@arm.com assert(privateFlags.isSet(VALID_PADDR|VALID_VADDR)); 37311199Sandreas.hansson@arm.com return _flags; 37411199Sandreas.hansson@arm.com } 37511375Sandreas.hansson@arm.com 37611199Sandreas.hansson@arm.com /** Note that unlike other accessors, this function sets *specific 37711199Sandreas.hansson@arm.com flags* (ORs them in); it does not assign its argument to the 37811051Sandreas.hansson@arm.com _flags field. Thus this method should rightly be called 37911051Sandreas.hansson@arm.com setFlags() and not just flags(). */ 38011051Sandreas.hansson@arm.com void 38111051Sandreas.hansson@arm.com setFlags(Flags flags) 38211051Sandreas.hansson@arm.com { 38311199Sandreas.hansson@arm.com assert(privateFlags.isSet(VALID_PADDR|VALID_VADDR)); 38411051Sandreas.hansson@arm.com _flags.set(flags); 38511199Sandreas.hansson@arm.com } 38611199Sandreas.hansson@arm.com 38711199Sandreas.hansson@arm.com /** Accessor function for vaddr.*/ 38811199Sandreas.hansson@arm.com Addr 38911199Sandreas.hansson@arm.com getVaddr() 39011199Sandreas.hansson@arm.com { 39111199Sandreas.hansson@arm.com assert(privateFlags.isSet(VALID_VADDR)); 39211199Sandreas.hansson@arm.com return _vaddr; 39311199Sandreas.hansson@arm.com } 39411199Sandreas.hansson@arm.com 39511199Sandreas.hansson@arm.com /** Accesssor for the requestor id. */ 39611199Sandreas.hansson@arm.com MasterID 39711484Snikos.nikoleris@arm.com masterId() 39811051Sandreas.hansson@arm.com { 39911051Sandreas.hansson@arm.com return _masterId; 40011484Snikos.nikoleris@arm.com } 40111051Sandreas.hansson@arm.com 40211051Sandreas.hansson@arm.com /** Accessor function for asid.*/ 40311051Sandreas.hansson@arm.com int 40411051Sandreas.hansson@arm.com getAsid() 40511051Sandreas.hansson@arm.com { 40611051Sandreas.hansson@arm.com assert(privateFlags.isSet(VALID_VADDR)); 40711051Sandreas.hansson@arm.com return _asid; 40811051Sandreas.hansson@arm.com } 40911051Sandreas.hansson@arm.com 41011051Sandreas.hansson@arm.com /** Accessor function for asid.*/ 41111051Sandreas.hansson@arm.com void 41211199Sandreas.hansson@arm.com setAsid(int asid) 41311199Sandreas.hansson@arm.com { 41411199Sandreas.hansson@arm.com _asid = asid; 41511199Sandreas.hansson@arm.com } 41611199Sandreas.hansson@arm.com 41711284Sandreas.hansson@arm.com /** Accessor function for asi.*/ 41811284Sandreas.hansson@arm.com uint8_t 41911284Sandreas.hansson@arm.com getAsi() 42011284Sandreas.hansson@arm.com { 42111051Sandreas.hansson@arm.com assert(privateFlags.isSet(VALID_VADDR)); 42211051Sandreas.hansson@arm.com return _flags & ASI_BITS; 42311051Sandreas.hansson@arm.com } 42411051Sandreas.hansson@arm.com 42511051Sandreas.hansson@arm.com /** Accessor function to check if sc result is valid. */ 42611051Sandreas.hansson@arm.com bool 42711051Sandreas.hansson@arm.com extraDataValid() 42811051Sandreas.hansson@arm.com { 42911051Sandreas.hansson@arm.com return privateFlags.isSet(VALID_EXTRA_DATA); 43011484Snikos.nikoleris@arm.com } 43111051Sandreas.hansson@arm.com 43211051Sandreas.hansson@arm.com /** Accessor function for store conditional return value.*/ 43311051Sandreas.hansson@arm.com uint64_t 43411051Sandreas.hansson@arm.com getExtraData() const 43511051Sandreas.hansson@arm.com { 43611051Sandreas.hansson@arm.com assert(privateFlags.isSet(VALID_EXTRA_DATA)); 43711051Sandreas.hansson@arm.com return _extraData; 43811051Sandreas.hansson@arm.com } 43911051Sandreas.hansson@arm.com 44011051Sandreas.hansson@arm.com /** Accessor function for store conditional return value.*/ 44111051Sandreas.hansson@arm.com void 44211484Snikos.nikoleris@arm.com setExtraData(uint64_t extraData) 44311483Snikos.nikoleris@arm.com { 44411483Snikos.nikoleris@arm.com _extraData = extraData; 44511051Sandreas.hansson@arm.com privateFlags.set(VALID_EXTRA_DATA); 44611051Sandreas.hansson@arm.com } 44711051Sandreas.hansson@arm.com 44811051Sandreas.hansson@arm.com bool 44911051Sandreas.hansson@arm.com hasContextId() const 45011051Sandreas.hansson@arm.com { 45111484Snikos.nikoleris@arm.com return privateFlags.isSet(VALID_CONTEXT_ID); 45211284Sandreas.hansson@arm.com } 45311051Sandreas.hansson@arm.com 45411051Sandreas.hansson@arm.com /** Accessor function for context ID.*/ 45511051Sandreas.hansson@arm.com int 45611484Snikos.nikoleris@arm.com contextId() const 45711051Sandreas.hansson@arm.com { 45811051Sandreas.hansson@arm.com assert(privateFlags.isSet(VALID_CONTEXT_ID)); 45911051Sandreas.hansson@arm.com return _contextId; 46011051Sandreas.hansson@arm.com } 46111051Sandreas.hansson@arm.com 46211051Sandreas.hansson@arm.com /** Accessor function for thread ID. */ 46311051Sandreas.hansson@arm.com int 46411051Sandreas.hansson@arm.com threadId() const 46511051Sandreas.hansson@arm.com { 46611051Sandreas.hansson@arm.com assert(privateFlags.isSet(VALID_THREAD_ID)); 46711051Sandreas.hansson@arm.com return _threadId; 46811051Sandreas.hansson@arm.com } 46911051Sandreas.hansson@arm.com 47011051Sandreas.hansson@arm.com bool 47111051Sandreas.hansson@arm.com hasPC() const 47211051Sandreas.hansson@arm.com { 47311051Sandreas.hansson@arm.com return privateFlags.isSet(VALID_PC); 47411051Sandreas.hansson@arm.com } 47511051Sandreas.hansson@arm.com 47611051Sandreas.hansson@arm.com /** Accessor function for pc.*/ 47711051Sandreas.hansson@arm.com Addr 47811051Sandreas.hansson@arm.com getPC() const 47911051Sandreas.hansson@arm.com { 48011051Sandreas.hansson@arm.com assert(privateFlags.isSet(VALID_PC)); 48111199Sandreas.hansson@arm.com return _pc; 48211199Sandreas.hansson@arm.com } 48311199Sandreas.hansson@arm.com 48411199Sandreas.hansson@arm.com /** Accessor functions for flags. Note that these are for testing 48511199Sandreas.hansson@arm.com only; setting flags should be done via setFlags(). */ 48611051Sandreas.hansson@arm.com bool isUncacheable() const { return _flags.isSet(UNCACHEABLE); } 48711199Sandreas.hansson@arm.com bool isInstFetch() const { return _flags.isSet(INST_FETCH); } 48811051Sandreas.hansson@arm.com bool isPrefetch() const { return _flags.isSet(PREFETCH); } 48911051Sandreas.hansson@arm.com bool isLLSC() const { return _flags.isSet(LLSC); } 49011051Sandreas.hansson@arm.com bool isLocked() const { return _flags.isSet(LOCKED); } 49111051Sandreas.hansson@arm.com bool isSwap() const { return _flags.isSet(MEM_SWAP|MEM_SWAP_COND); } 49211051Sandreas.hansson@arm.com bool isCondSwap() const { return _flags.isSet(MEM_SWAP_COND); } 49311051Sandreas.hansson@arm.com bool isMmappedIpr() const { return _flags.isSet(MMAPPED_IPR); } 49411051Sandreas.hansson@arm.com bool isClearLL() const { return _flags.isSet(CLEAR_LL); } 49511051Sandreas.hansson@arm.com}; 49611051Sandreas.hansson@arm.com 49711051Sandreas.hansson@arm.com#endif // __MEM_REQUEST_HH__ 49811051Sandreas.hansson@arm.com