summaryrefslogtreecommitdiff
path: root/src/mem/request.hh
blob: 2db7b7779ae805d068ff9feee05ce4ec4bed8b25 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
/*
 * Copyright (c) 2002-2005 The Regents of The University of Michigan
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met: redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer;
 * redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution;
 * neither the name of the copyright holders nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

/**
 * @file Decleration of a request, the overall memory request consisting of
 the parts of the request that are persistent throughout the transaction.
 */

#ifndef __MEM_REQUEST_HH__
#define __MEM_REQUEST_HH__

#include "arch/isa_traits.hh"

class Request;

typedef Request* RequestPtr;

/** The request is a Load locked/store conditional. */
const unsigned LOCKED		= 0x001;
/** The virtual address is also the physical address. */
const unsigned PHYSICAL		= 0x002;
/** The request is an ALPHA VPTE pal access (hw_ld). */
const unsigned VPTE		= 0x004;
/** Use the alternate mode bits in ALPHA. */
const unsigned ALTMODE		= 0x008;
/** The request is to an uncacheable address. */
const unsigned UNCACHEABLE	= 0x010;
/** The request should not cause a page fault. */
const unsigned NO_FAULT         = 0x020;
/** The request should be prefetched into the exclusive state. */
const unsigned PF_EXCLUSIVE	= 0x100;
/** The request should be marked as LRU. */
const unsigned EVICT_NEXT	= 0x200;
/** The request should ignore unaligned access faults */
const unsigned NO_ALIGN_FAULT   = 0x400;

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:
    /** The physical address of the request. */
    Addr paddr;
    /** Wether or not paddr is valid (has been written yet). */
    bool validPaddr;

    /** The size of the request. */
    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. */
    uint32_t flags;

//Accsesors for non-cpu request fields
  public:
    /** Accesor for paddr. */
    Addr getPaddr();
    /** Accesor for paddr. */
    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. */
    int asid;
    /** Wether or not the asid is valid. */
    bool validAsid;

    /** The return value of store conditional. */
    uint64_t scResult;
    /** Wether or not the sc result is valid. */
    bool validScResult;

    /** The cpu number for statistics. */
    int cpuNum;
    /** Wether or not the cpu number is valid. */
    bool validCpuNum;

    /** The requesting  thread id. */
    int  threadNum;
    /** Wether or not the thread id is valid. */
    bool validThreadNum;

    /** program counter of initiating access; for tracing/debugging */
    Addr pc;
    /** Wether or not the pc is valid. */
    bool validPC;

//Accessor Functions for cpu request fields
  public:
    /** Accesor function to determine if this is a cpu request or not.*/
    bool isCpuRequest();

    /** Accesor function for vaddr.*/
    Addr getVaddr();
    /** Accesor function for vaddr.*/
    void setVaddr(Addr _vaddr);

    /** Accesor function for asid.*/
    int getAsid();
    /** Accesor function for asid.*/
    void setAsid(int _asid);

    /** Accesor function for store conditional return value.*/
    uint64_t getScResult();
    /** Accesor function for store conditional return value.*/
    void setScResult(uint64_t _scResult);

    /** Accesor function for cpu number.*/
    int getCpuNum();
    /** Accesor function for cpu number.*/
    void setCpuNum(int _cpuNum);

    /** Accesor function for thread number.*/
    int getThreadNum();
    /** Accesor function for thread number.*/
    void setThreadNum(int _threadNum);

    /** Accesor function for pc.*/
    Addr getPC();
    /** Accesor function for pc.*/
    void setPC(Addr _pc);

};

#endif // __MEM_REQUEST_HH__