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