gem5 v24.0.0.0
Loading...
Searching...
No Matches
system.hh
Go to the documentation of this file.
1/*
2 * Copyright (c) 2012, 2014, 2018 ARM Limited
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated
11 * unmodified and in its entirety in all distributions of the software,
12 * modified or unmodified, in source code or in binary form.
13 *
14 * Copyright (c) 2002-2005 The Regents of The University of Michigan
15 * Copyright (c) 2011 Regents of the University of California
16 * All rights reserved.
17 *
18 * Redistribution and use in source and binary forms, with or without
19 * modification, are permitted provided that the following conditions are
20 * met: redistributions of source code must retain the above copyright
21 * notice, this list of conditions and the following disclaimer;
22 * redistributions in binary form must reproduce the above copyright
23 * notice, this list of conditions and the following disclaimer in the
24 * documentation and/or other materials provided with the distribution;
25 * neither the name of the copyright holders nor the names of its
26 * contributors may be used to endorse or promote products derived from
27 * this software without specific prior written permission.
28 *
29 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
30 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
31 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
32 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
33 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
34 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
35 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
36 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
37 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
38 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
39 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
40 */
41
42#ifndef __SYSTEM_HH__
43#define __SYSTEM_HH__
44
45#include <set>
46#include <string>
47#include <unordered_map>
48#include <utility>
49#include <vector>
50
52#include "base/loader/symtab.hh"
53#include "base/statistics.hh"
54#include "cpu/pc_event.hh"
55#include "enums/MemoryMode.hh"
56#include "mem/mem_requestor.hh"
57#include "mem/physical.hh"
58#include "mem/port.hh"
59#include "mem/port_proxy.hh"
60#include "params/System.hh"
61#include "sim/futex_map.hh"
62#include "sim/redirect_path.hh"
63#include "sim/se_signal.hh"
64#include "sim/sim_object.hh"
65#include "sim/workload.hh"
66
67namespace gem5
68{
69
70class BaseRemoteGDB;
71class KvmVM;
72class ThreadContext;
73
74class System : public SimObject, public PCEventScope
75{
76 private:
77
83 class SystemPort : public RequestPort
84 {
85 public:
86
90 SystemPort(const std::string &_name)
92 { }
93
94 bool
96 {
97 panic("SystemPort does not receive timing!");
98 }
99
100 void
101 recvReqRetry() override
102 {
103 panic("SystemPort does not expect retry!");
104 }
105 };
106
109
110 // Map of memory address ranges for devices with their own backing stores
111 std::unordered_map<RequestorID, std::vector<memory::AbstractMemory *>>
113
114 public:
115
117 {
118 private:
119 struct Thread
120 {
122 bool active = false;
123 Event *resumeEvent = nullptr;
124
125 void resume();
126 std::string name() const;
127 void quiesce() const;
128 };
129
131
132 Thread &
134 {
135 assert(id < size());
136 return threads[id];
137 }
138
139 const Thread &
141 {
142 assert(id < size());
143 return threads[id];
144 }
145
146 void insert(ThreadContext *tc);
147 void replace(ThreadContext *tc, ContextID id);
148
149 friend class System;
150
151 public:
153 {
154 private:
156 int pos;
157
158 friend class Threads;
159
160 const_iterator(const Threads &_threads, int _pos) :
161 threads(&_threads), pos(_pos)
162 {}
163
164 public:
165 using iterator_category = std::forward_iterator_tag;
167 using difference_type = int;
168 using pointer = const value_type *;
169 using reference = const value_type &;
170
173 {
174 pos++;
175 return *this;
176 }
177
180 {
181 return const_iterator(*threads, pos++);
182 }
183
186
187 bool
188 operator == (const const_iterator &other) const
189 {
190 return threads == other.threads && pos == other.pos;
191 }
192
193 bool
194 operator != (const const_iterator &other) const
195 {
196 return !(*this == other);
197 }
198 };
199
201
204 {
205 return thread(id).context;
206 }
207
208 void markActive(ContextID id) { thread(id).active = true; }
209
210 int size() const { return threads.size(); }
211 bool empty() const { return threads.empty(); }
212 int numRunning() const;
213 int
214 numActive() const
215 {
216 int count = 0;
217 for (auto &thread: threads) {
218 if (thread.active)
219 count++;
220 }
221 return count;
222 }
223
224 void quiesce(ContextID id);
225 void quiesceTick(ContextID id, Tick when);
226
227 const_iterator begin() const { return const_iterator(*this, 0); }
228 const_iterator end() const { return const_iterator(*this, size()); }
229 };
230
240
244 Port &getPort(const std::string &if_name,
245 PortID idx=InvalidPortID) override;
246
257 bool
259 {
260 return memoryMode == enums::atomic ||
261 memoryMode == enums::atomic_noncaching;
262 }
263
270 bool isTimingMode() const { return memoryMode == enums::timing; }
271
278 bool
280 {
281 return memoryMode == enums::atomic_noncaching;
282 }
293 enums::MemoryMode getMemoryMode() const { return memoryMode; }
294
302 void setMemoryMode(enums::MemoryMode mode);
309
311
312 const bool multiThread;
313
315
316 bool schedule(PCEvent *event) override;
317 bool remove(PCEvent *event) override;
318
319 uint64_t init_param;
320
324
326 Workload *workload = nullptr;
327
328 public:
333 KvmVM *getKvmVM() const { return kvmVM; }
334
339 void setKvmVM(KvmVM *const vm) { kvmVM = vm; }
340
343 const memory::PhysicalMemory& getPhysMem() const { return physmem; }
344
346 Addr memSize() const;
347
355 bool isMemAddr(Addr addr) const;
356
362 void addDeviceMemory(RequestorID requestorId,
363 memory::AbstractMemory *deviceMemory);
364
370 bool isDeviceMemAddr(const PacketPtr& pkt) const;
371
376
377 /*
378 * Return the list of address ranges backed by a shadowed ROM.
379 *
380 * @return List of address ranges backed by a shadowed ROM
381 */
383
387 ByteOrder
389 {
390 return workload->byteOrder();
391 }
392
397
398 protected:
399
400 KvmVM *kvmVM = nullptr;
401
403
405
406 enums::MemoryMode memoryMode;
407
409
410 uint64_t workItemsBegin = 0;
411 uint64_t workItemsEnd = 0;
412 uint32_t numWorkIds;
413
420
422
423 protected:
427 std::string stripSystemName(const std::string& requestor_name) const;
428
429 public:
430
464 RequestorID getRequestorId(const SimObject* requestor,
465 std::string subrequestor={});
466
475 RequestorID getGlobalRequestorId(const std::string& requestor_name);
476
480 std::string getRequestorName(RequestorID requestor_id);
481
486 RequestorID lookupRequestorId(const SimObject* obj) const;
487
492 RequestorID lookupRequestorId(const std::string& name) const;
493
496
497 protected:
499 RequestorID _getRequestorId(const SimObject* requestor,
500 const std::string& requestor_name);
501
506 std::string leafRequestorName(const SimObject* requestor,
507 const std::string& subrequestor);
508
509 public:
510
511 void regStats() override;
516 uint64_t
518 {
519 return ++workItemsBegin;
520 }
521
526 uint64_t
528 {
529 return ++workItemsEnd;
530 }
531
537 int
539 {
541 return threads.numActive();
542 }
543
544 void
545 workItemBegin(uint32_t tid, uint32_t workid)
546 {
547 std::pair<uint32_t, uint32_t> p(tid, workid);
549 }
550
551 void workItemEnd(uint32_t tid, uint32_t workid);
552
553 /* Returns whether we successfully trapped into GDB. */
554 bool trapToGdb(GDBSignal signal, ContextID ctx_id) const;
555
556 protected:
562
563 public:
565
566 System(const Params &p);
567 ~System();
568
573 const AddrRange &m5opRange() const { return _m5opRange; }
574
575 public:
576
578 void replaceThreadContext(ThreadContext *tc, ContextID context_id);
579
580 void serialize(CheckpointOut &cp) const override;
581 void unserialize(CheckpointIn &cp) override;
582
583 public:
584 std::map<std::pair<uint32_t, uint32_t>, Tick> lastWorkItemStarted;
585 std::map<uint32_t, statistics::Histogram*> workItemStats;
586
588 //
589 // STATIC GLOBAL SYSTEM LIST
590 //
592
595
596 static void printSystems();
597
599
600 static const int maxPID = 32768;
601
603 std::set<int> PIDs;
604
605 // By convention, all signals are owned by the receiving process. The
606 // receiver will delete the signal upon reception.
608
609 // Used by syscall-emulation mode. This member contains paths which need
610 // to be redirected to the faux-filesystem (a duplicate filesystem
611 // intended to replace certain files on the host filesystem).
613};
614
615void printSystems();
616
617} // namespace gem5
618
619#endif // __SYSTEM_HH__
The AddrRange class encapsulates an address range, and supports a number of tests to check if two ran...
Definition addr_range.hh:82
FutexMap class holds a map of all futexes used in the system.
Definition futex_map.hh:110
KVM VM container.
Definition vm.hh:302
const std::string _name
Definition named.hh:41
virtual std::string name() const
Definition named.hh:47
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
Definition packet.hh:295
This object is a proxy for a port or other object which implements the functional response protocol,...
Definition port_proxy.hh:87
Ports are used to interface objects to each other.
Definition port.hh:62
A RequestPort is a specialisation of a Port, which implements the default protocol for the three diff...
Definition port.hh:136
Abstract superclass for simulation objects.
SimObjectParams Params
Private class for the system port which is only used as a requestor for debug access and for non-stru...
Definition system.hh:84
void recvReqRetry() override
Called by the peer if sendTimingReq was called on this peer (causing recvTimingReq to be called on th...
Definition system.hh:101
bool recvTimingResp(PacketPtr pkt) override
Receive a timing response from the peer.
Definition system.hh:95
SystemPort(const std::string &_name)
Create a system port with a name and an owner.
Definition system.hh:90
bool operator==(const const_iterator &other) const
Definition system.hh:188
std::forward_iterator_tag iterator_category
Definition system.hh:165
const_iterator(const Threads &_threads, int _pos)
Definition system.hh:160
bool operator!=(const const_iterator &other) const
Definition system.hh:194
const Thread & thread(ContextID id) const
Definition system.hh:140
int numActive() const
Definition system.hh:214
const_iterator end() const
Definition system.hh:228
void quiesceTick(ContextID id, Tick when)
Definition system.cc:154
void markActive(ContextID id)
Definition system.hh:208
const_iterator begin() const
Definition system.hh:227
void quiesce(ContextID id)
Definition system.cc:145
int size() const
Definition system.hh:210
Thread & thread(ContextID id)
Definition system.hh:133
bool empty() const
Definition system.hh:211
int numRunning() const
Definition system.cc:131
void insert(ThreadContext *tc)
Definition system.cc:93
std::vector< Thread > threads
Definition system.hh:130
ThreadContext * operator[](ContextID id) const
Definition system.hh:203
void replace(ThreadContext *tc, ContextID id)
Definition system.cc:108
ThreadContext * findFree()
Definition system.cc:121
uint64_t workItemsBegin
Definition system.hh:410
KvmVM * getKvmVM() const
Get a pointer to the Kernel Virtual Machine (KVM) SimObject, if present.
Definition system.hh:333
ThermalModel * getThermalModel() const
The thermal model used for this system (if any).
Definition system.hh:396
void setKvmVM(KvmVM *const vm)
Set the pointer to the Kernel Virtual Machine (KVM) SimObject.
Definition system.hh:339
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition system.cc:328
RequestorID lookupRequestorId(const SimObject *obj) const
Looks up the RequestorID for a given SimObject returns an invalid RequestorID (invldRequestorId) if n...
Definition system.cc:432
int markWorkItem(int index)
Called by pseudo_inst to mark the cpus actively executing work items.
Definition system.hh:538
bool remove(PCEvent *event) override
Definition system.cc:258
memory::PhysicalMemory & getPhysMem()
Get a pointer to access the physical memory of the system.
Definition system.hh:342
bool isAtomicMode() const
Is the system in atomic mode?
Definition system.hh:258
uint32_t numWorkIds
Definition system.hh:412
RequestorID _getRequestorId(const SimObject *requestor, const std::string &requestor_name)
helper function for getRequestorId
Definition system.cc:482
static int numSystemsRunning
Definition system.hh:594
void registerThreadContext(ThreadContext *tc)
Definition system.cc:237
enums::MemoryMode memoryMode
Definition system.hh:406
bool isTimingMode() const
Is the system in timing mode?
Definition system.hh:270
uint64_t incWorkItemsEnd()
Called by pseudo_inst to track the number of work items completed by this system.
Definition system.hh:527
std::string leafRequestorName(const SimObject *requestor, const std::string &subrequestor)
Helper function for constructing the full (sub)requestor name by providing the root requestor and the...
Definition system.cc:513
AddrRangeList getShadowRomRanges() const
Definition system.hh:382
std::set< int > PIDs
Process set to track which PIDs have already been allocated.
Definition system.hh:603
void addDeviceMemory(RequestorID requestorId, memory::AbstractMemory *deviceMemory)
Add a physical memory range for a device.
Definition system.cc:294
Addr memSize() const
Amount of physical memory that exists.
Definition system.cc:282
std::unordered_map< RequestorID, std::vector< memory::AbstractMemory * > > deviceMemMap
Definition system.hh:112
std::string getRequestorName(RequestorID requestor_id)
Get the name of an object for a given request id.
Definition system.cc:526
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Definition system.cc:344
bool isMemAddr(Addr addr) const
Check if a physical address is within a range of a memory that is part of the global address map.
Definition system.cc:288
RequestorID getRequestorId(const SimObject *requestor, std::string subrequestor={})
Request an id used to create a request object in the system.
Definition system.cc:475
uint64_t incWorkItemsBegin()
Called by pseudo_inst to track the number of work items started by this system.
Definition system.hh:517
bool schedule(PCEvent *event) override
Definition system.cc:248
SystemPort _systemPort
Definition system.hh:108
const AddrRange & m5opRange() const
Range used by memory-mapped m5 pseudo-ops if enabled.
Definition system.hh:573
KvmVM * kvmVM
Definition system.hh:400
static const int maxPID
Definition system.hh:600
std::list< BasicSignal > signalList
Definition system.hh:607
bool isDeviceMemAddr(const PacketPtr &pkt) const
Similar to isMemAddr but for devices.
Definition system.cc:301
System(const Params &p)
Definition system.cc:167
RequestorID maxRequestors()
Get the number of requestors registered in the system.
Definition system.hh:495
std::map< std::pair< uint32_t, uint32_t >, Tick > lastWorkItemStarted
Definition system.hh:584
FutexMap futexMap
Definition system.hh:598
memory::PhysicalMemory physmem
Definition system.hh:402
static void printSystems()
Definition system.cc:400
enums::MemoryMode getMemoryMode() const
Get the memory mode of the system.
Definition system.hh:293
bool bypassCaches() const
Should caches be bypassed?
Definition system.hh:279
std::map< uint32_t, statistics::Histogram * > workItemStats
Definition system.hh:585
std::string stripSystemName(const std::string &requestor_name) const
Strips off the system name from a requestor name.
Definition system.cc:422
void setMemoryMode(enums::MemoryMode mode)
Change the memory mode of the system.
Definition system.cc:230
void workItemEnd(uint32_t tid, uint32_t workid)
Definition system.cc:377
Workload * workload
OS kernel.
Definition system.hh:326
std::vector< RedirectPath * > redirectPaths
Definition system.hh:612
uint64_t init_param
Definition system.hh:319
PortProxy physProxy
Port to physical memory used for writing object files into ram at boot.
Definition system.hh:323
Addr cacheLineSize() const
Get the cache line size of the system.
Definition system.hh:308
const Addr _cacheLineSize
Definition system.hh:408
Port & getPort(const std::string &if_name, PortID idx=InvalidPortID) override
Additional function to return the Port of a memory object.
Definition system.cc:223
RequestPort & getSystemPort()
Get a reference to the system port that can be used by non-structural simulation objects like process...
Definition system.hh:239
const bool multiThread
Definition system.hh:312
ThermalModel * thermalModel
Definition system.hh:421
ByteOrder getGuestByteOrder() const
Get the guest byte order.
Definition system.hh:388
void regStats() override
Callback to set stat parameters.
Definition system.cc:361
RequestorID getGlobalRequestorId(const std::string &requestor_name)
Registers a GLOBAL RequestorID, which is a RequestorID not related to any particular SimObject; since...
Definition system.cc:469
memory::AbstractMemory * getDeviceMemory(const PacketPtr &pkt) const
Return a pointer to the device memory.
Definition system.cc:311
PARAMS(System)
std::list< PCEvent * > liveEvents
Definition system.hh:107
const memory::PhysicalMemory & getPhysMem() const
Definition system.hh:343
void workItemBegin(uint32_t tid, uint32_t workid)
Definition system.hh:545
uint64_t workItemsEnd
Definition system.hh:411
std::vector< RequestorInfo > requestors
This array is a per-system list of all devices capable of issuing a memory system request and an asso...
Definition system.hh:419
static std::vector< System * > systemList
Definition system.hh:593
bool trapToGdb(GDBSignal signal, ContextID ctx_id) const
Definition system.cc:394
AddrRangeList ShadowRomRanges
Definition system.hh:404
void replaceThreadContext(ThreadContext *tc, ContextID context_id)
Definition system.cc:268
Threads threads
Definition system.hh:310
const AddrRange _m5opRange
Range for memory-mapped m5 pseudo ops.
Definition system.hh:561
ThreadContext is the external interface to all thread state for anything outside of the CPU.
virtual ByteOrder byteOrder() const =0
An abstract memory represents a contiguous block of physical memory, with an associated address range...
The physical memory encapsulates all memories in the system and provides basic functionality for acce...
Definition physical.hh:137
STL list class.
Definition stl.hh:51
STL pair class.
Definition stl.hh:58
STL vector class.
Definition stl.hh:37
void schedule(Event &event, Tick when)
Definition eventq.hh:1012
#define panic(...)
This implements a cprintf based panic() function.
Definition logging.hh:188
Port Object Declaration.
RequestorInfo declaration.
Bitfield< 4, 0 > mode
Definition misc_types.hh:74
Bitfield< 33 > id
Bitfield< 0 > vm
Bitfield< 10, 5 > event
Bitfield< 30, 0 > index
Bitfield< 0 > p
Bitfield< 3 > addr
Definition types.hh:84
Copyright (c) 2024 - Pranith Kumar Copyright (c) 2020 Inria All rights reserved.
Definition binary32.hh:36
const PortID InvalidPortID
Definition types.hh:246
void printSystems()
Definition system.cc:416
Tick curTick()
The universal simulation clock.
Definition cur_tick.hh:46
std::ostream CheckpointOut
Definition serialize.hh:66
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition types.hh:147
int16_t PortID
Port index/ID type, and a symbolic name for an invalid port id.
Definition types.hh:245
uint64_t Tick
Tick count type.
Definition types.hh:58
uint16_t RequestorID
Definition request.hh:95
int ContextID
Globally unique thread context ID.
Definition types.hh:239
PortProxy Object Declaration.
Declaration of Statistics objects.
std::string name() const
Definition system.cc:78
ThreadContext * context
Definition system.hh:121

Generated on Tue Jun 18 2024 16:23:57 for gem5 by doxygen 1.11.0