gem5 v24.0.0.0
Loading...
Searching...
No Matches
base.hh
Go to the documentation of this file.
1/*
2 * Copyright (c) 2012, 2021 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 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions are
16 * met: redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer;
18 * redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution;
21 * neither the name of the copyright holders nor the names of its
22 * contributors may be used to endorse or promote products derived from
23 * this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 */
37
38#ifndef __CPU_KVM_BASE_HH__
39#define __CPU_KVM_BASE_HH__
40
41#include <pthread.h>
42
43#include <csignal>
44#include <memory>
45#include <queue>
46
47#include "base/statistics.hh"
48#include "cpu/kvm/perfevent.hh"
49#include "cpu/kvm/timer.hh"
50#include "cpu/kvm/vm.hh"
51#include "cpu/base.hh"
52#include "cpu/simple_thread.hh"
53#include "sim/faults.hh"
54
56#define KVM_KICK_SIGNAL SIGRTMIN
57
58struct kvm_coalesced_mmio_ring;
59struct kvm_fpu;
60struct kvm_interrupt;
61struct kvm_regs;
62struct kvm_run;
63struct kvm_sregs;
64
65namespace gem5
66{
67
68// forward declarations
69class ThreadContext;
70struct BaseKvmCPUParams;
71
87class BaseKvmCPU : public BaseCPU
88{
89 public:
90 BaseKvmCPU(const BaseKvmCPUParams &params);
91 virtual ~BaseKvmCPU();
92
93 void init() override;
94 void startup() override;
95
96 void serializeThread(CheckpointOut &cp, ThreadID tid) const override;
97 void unserializeThread(CheckpointIn &cp, ThreadID tid) override;
98
99 DrainState drain() override;
100 void drainResume() override;
101 void notifyFork() override;
102
103 void switchOut() override;
104 void takeOverFrom(BaseCPU *cpu) override;
105
106 void verifyMemoryMode() const override;
107
108 Port &getDataPort() override { return dataPort; }
109 Port &getInstPort() override { return instPort; }
110
111 void wakeup(ThreadID tid = 0) override;
112 void activateContext(ThreadID thread_num) override;
113 void suspendContext(ThreadID thread_num) override;
114 void deallocateContext(ThreadID thread_num);
115 void haltContext(ThreadID thread_num) override;
116
117 long getVCpuID() const { return vcpuID; }
118 ThreadContext *getContext(int tn) override;
119
120 Counter totalInsts() const override;
121 Counter totalOps() const override;
122
127 void finishMMIOPending();
128
130 virtual void dump() const;
131
138 void kick() const { pthread_kill(vcpuThread, KVM_KICK_SIGNAL); }
139
154
159
161
162 protected:
238
241
246 void tick();
247
261 virtual uint64_t getHostCycles() const;
262
270 virtual void stutterPC(PCStateBase &pc) const = 0;
271
298 virtual Tick kvmRun(Tick ticks);
299
311 virtual Tick kvmRunDrain();
312
317 struct kvm_run *getKvmRunState() { return _kvmRun; };
318
327 uint8_t *getGuestData(uint64_t offset) const {
328 return (uint8_t *)_kvmRun + offset;
329 };
330
341
352 void kvmInterrupt(const struct kvm_interrupt &interrupt);
353
366 void getRegisters(struct kvm_regs &regs) const;
367 void setRegisters(const struct kvm_regs &regs);
368 void getSpecialRegisters(struct kvm_sregs &regs) const;
369 void setSpecialRegisters(const struct kvm_sregs &regs);
376 void getFPUState(struct kvm_fpu &state) const;
377 void setFPUState(const struct kvm_fpu &state);
386 void setOneReg(uint64_t id, const void *addr);
387 void setOneReg(uint64_t id, uint64_t value) { setOneReg(id, &value); }
388 void setOneReg(uint64_t id, uint32_t value) { setOneReg(id, &value); }
389 void getOneReg(uint64_t id, void *addr) const;
390 uint64_t getOneRegU64(uint64_t id) const {
391 uint64_t value;
392 getOneReg(id, &value);
393 return value;
394 }
395 uint32_t getOneRegU32(uint64_t id) const {
396 uint32_t value;
397 getOneReg(id, &value);
398 return value;
399 }
410 std::string getAndFormatOneReg(uint64_t id) const;
411
421 virtual void updateKvmState() = 0;
422
431 virtual void updateThreadContext() = 0;
432
437 void syncThreadContext();
438
448
452 void syncKvmState();
462 virtual Tick handleKvmExit();
463
469 virtual Tick handleKvmExitIO();
470
477
488
501 virtual Tick handleKvmExitUnknown();
502
513
541 virtual bool archIsDrained() const { return true; }
542
552 Tick doMMIOAccess(Addr paddr, void *data, int size, bool write);
553
567 void setSignalMask(const sigset_t *mask);
583 int ioctl(int request, long p1) const;
584 int ioctl(int request, void *p1) const {
585 return ioctl(request, (long)p1);
586 }
587 int ioctl(int request) const {
588 return ioctl(request, 0L);
589 }
593 virtual void ioctlRun();
594
599 class KVMCpuPort : public RequestPort
600 {
601
602 public:
603 KVMCpuPort(const std::string &_name, BaseKvmCPU *_cpu)
604 : RequestPort(_name), cpu(_cpu), activeMMIOReqs(0)
605 { }
612
614 Status nextIOState() const;
615
616 protected:
619
621 std::queue<PacketPtr> pendingMMIOPkts;
622
624 unsigned int activeMMIOReqs;
625
626 bool recvTimingResp(PacketPtr pkt) override;
627
628 void recvReqRetry() override;
629
630 };
631
634
637
642 const bool alwaysSyncTC;
643
649
655
658
660 long vcpuID;
661
663 pthread_t vcpuThread;
664
665 private:
674
679 void setupSignalHandler();
680
687 bool discardPendingSignal(int signum) const;
688
702 void restartEqThread();
703
705 bool tryDrain();
706
719 struct kvm_run *_kvmRun;
724 struct kvm_coalesced_mmio_ring *mmioRing;
726 const long pageSize;
727
729
740 void setupInstStop();
741
744 void setupCounters();
745
756 void setupInstCounter(uint64_t period = 0);
757
760
769 std::unique_ptr<PerfKvmCounter> hwCycles;
770
782 std::unique_ptr<PerfKvmCounter> hwInstructions;
783
800 std::unique_ptr<BaseKvmTimer> runTimer;
801
804
805 public:
806 /* @{ */
820 /* @} */
821
824};
825
826} // namespace gem5
827
828#endif
const char data[]
KVM memory port.
Definition base.hh:600
KVMCpuPort(const std::string &_name, BaseKvmCPU *_cpu)
Definition base.hh:603
std::queue< PacketPtr > pendingMMIOPkts
Pending MMIO packets.
Definition base.hh:621
Status nextIOState() const
Returns next valid state after one or more IO accesses.
Definition base.cc:184
BaseKvmCPU * cpu
KVM cpu pointer for finishMMIOPending() callback.
Definition base.hh:618
Tick submitIO(PacketPtr pkt)
Interface to send Atomic or Timing IO request.
Definition base.cc:191
void recvReqRetry() override
Called by the peer if sendTimingReq was called on this peer (causing recvTimingReq to be called on th...
Definition base.cc:226
bool recvTimingResp(PacketPtr pkt) override
Receive a timing response from the peer.
Definition base.cc:209
unsigned int activeMMIOReqs
Number of MMIO requests in flight.
Definition base.hh:624
Base class for KVM based CPU models.
Definition base.hh:88
virtual void dump() const
Dump the internal state to the terminal.
Definition base.cc:596
int vcpuFD
KVM vCPU file descriptor.
Definition base.hh:708
void finishMMIOPending()
Callback from KvmCPUPort to transition the CPU out of RunningMMIOPending when all timing requests hav...
Definition base.cc:242
Status _status
CPU run state.
Definition base.hh:240
uint64_t activeInstPeriod
Currently active instruction count breakpoint.
Definition base.hh:759
virtual void updateKvmState()=0
Update the KVM state from the current thread context.
struct kvm_coalesced_mmio_ring * mmioRing
Coalesced MMIO ring buffer.
Definition base.hh:724
virtual Tick handleKvmExitHypercall()
The guest requested a monitor service using a hypercall.
Definition base.cc:1075
long vcpuID
KVM internal ID of the vCPU.
Definition base.hh:660
void drainResume() override
Resume execution after a successful drain.
Definition base.cc:399
void getSpecialRegisters(struct kvm_sregs &regs) const
Definition base.cc:856
virtual void updateThreadContext()=0
Update the current thread context with the KVM state.
uint8_t * getGuestData(uint64_t offset) const
Retrieve a pointer to guest data stored at the end of the kvm_run structure.
Definition base.hh:327
void takeOverFrom(BaseCPU *cpu) override
Load the state of a CPU from the previous CPU object, invoked on all new CPUs that are about to be sw...
Definition base.cc:468
virtual uint64_t getHostCycles() const
Get the value of the hardware cycle counter in the guest.
Definition base.cc:712
Counter totalInsts() const override
Definition base.cc:583
void getOneReg(uint64_t id, void *addr) const
Definition base.cc:902
void init() override
init() is called after all C++ SimObjects have been created and all ports are connected.
Definition base.cc:128
const bool alwaysSyncTC
Be conservative and always synchronize the thread context on KVM entry/exit.
Definition base.hh:642
void suspendContext(ThreadID thread_num) override
Notify the CPU that the indicated context is now suspended.
Definition base.cc:536
struct kvm_run * getKvmRunState()
Get a pointer to the kvm_run structure containing all the input and output parameters from kvmRun().
Definition base.hh:317
virtual Tick handleKvmExitIRQWindowOpen()
The guest exited because an interrupt window was requested.
Definition base.cc:1081
uint64_t getOneRegU64(uint64_t id) const
Definition base.hh:390
void setSignalMask(const sigset_t *mask)
Set the signal mask used in kvmRun()
Definition base.cc:1166
void notifyFork() override
Notify a child process of a fork.
Definition base.cc:429
int vcpuMMapSize
Size of MMAPed kvm_run area.
Definition base.hh:710
void syncKvmState()
Update the KVM if the thread context is dirty.
Definition base.cc:978
bool tryDrain()
Try to drain the CPU if a drain is pending.
Definition base.cc:1333
void setRegisters(const struct kvm_regs &regs)
Definition base.cc:849
BaseKvmCPU(const BaseKvmCPUParams &params)
Definition base.cc:65
virtual Tick handleKvmExitException()
An unhandled virtualization exception occured.
Definition base.cc:1097
KVMCpuPort instPort
Unused dummy port for the instruction interface.
Definition base.hh:636
void kick() const
Force an exit from KVM.
Definition base.hh:138
@ Running
Running normally.
Definition base.hh:205
@ Idle
Context not scheduled in KVM.
Definition base.hh:199
@ RunningMMIOPending
Timing MMIO request in flight or stalled.
Definition base.hh:227
@ RunningService
Requiring service at the beginning of the next cycle.
Definition base.hh:219
@ RunningServiceCompletion
Service completion in progress.
Definition base.hh:236
void deallocateContext(ThreadID thread_num)
Definition base.cc:559
void getRegisters(struct kvm_regs &regs) const
Get/Set the register state of the guest vCPU.
Definition base.cc:842
void setupSignalHandler()
Setup a signal handler to catch the timer signal used to switch back to the monitor.
Definition base.cc:1239
void setOneReg(uint64_t id, uint64_t value)
Definition base.hh:387
void setSpecialRegisters(const struct kvm_sregs &regs)
Definition base.cc:863
ThreadContext * getContext(int tn) override
Given a thread num get tho thread context for it.
Definition base.cc:574
bool usePerf
True if using perf; False otherwise.
Definition base.hh:657
virtual Tick handleKvmExitIO()
The guest performed a legacy IO request (out/inp on x86)
Definition base.cc:1067
std::string getAndFormatOneReg(uint64_t id) const
Get and format one register for printout.
Definition base.cc:919
gem5::BaseKvmCPU::StatGroup stats
virtual Tick handleKvmExit()
Main kvmRun exit handler, calls the relevant handleKvmExit* depending on exit type.
Definition base.cc:990
void syncThreadContext()
Update a thread context if the KVM state is dirty with respect to the cached thread context.
Definition base.cc:966
void unserializeThread(CheckpointIn &cp, ThreadID tid) override
Unserialize one thread.
Definition base.cc:317
uint32_t getOneRegU32(uint64_t id) const
Definition base.hh:395
DrainState drain() override
Draining is the process of clearing out the states of SimObjects.These are the SimObjects that are pa...
Definition base.cc:328
Tick doMMIOAccess(Addr paddr, void *data, int size, bool write)
Inject a memory mapped IO request into gem5.
Definition base.cc:1114
void wakeup(ThreadID tid=0) override
Definition base.cc:499
void startup() override
startup() is the final initialization call before simulation.
Definition base.cc:137
Counter totalOps() const override
Definition base.cc:589
Tick flushCoalescedMMIO()
Service MMIO requests in the mmioRing.
Definition base.cc:1197
std::unique_ptr< PerfKvmCounter > hwInstructions
Guest instruction counter.
Definition base.hh:782
EventFunctionWrapper tickEvent
Definition base.hh:728
long getVCpuID() const
Definition base.hh:117
bool perfControlledByTimer
Does the runTimer control the performance counters?
Definition base.hh:791
virtual Tick kvmRun(Tick ticks)
Request KVM to run the guest for a given number of ticks.
Definition base.cc:720
void setupInstStop()
Setup an instruction break if there is one pending.
Definition base.cc:1365
KvmVM * vm
Definition base.hh:160
bool discardPendingSignal(int signum) const
Discard a (potentially) pending signal.
Definition base.cc:1268
void setOneReg(uint64_t id, uint32_t value)
Definition base.hh:388
virtual Tick kvmRunDrain()
Request the CPU to run until draining completes.
Definition base.cc:698
virtual Tick handleKvmExitFailEntry()
KVM failed to start the virtualized CPU.
Definition base.cc:1106
void switchOut() override
Prepare for another CPU to take over execution.
Definition base.cc:454
void restartEqThread()
Thread-specific initialization.
Definition base.cc:252
void setupCounters()
Setup hardware performance counters.
Definition base.cc:1296
void serializeThread(CheckpointOut &cp, ThreadID tid) const override
Serialize a single thread.
Definition base.cc:304
void setupInstCounter(uint64_t period=0)
Setup the guest instruction counter.
Definition base.cc:1377
virtual ~BaseKvmCPU()
Definition base.cc:120
void activateContext(ThreadID thread_num) override
Notify the CPU that the indicated context is now active.
Definition base.cc:517
void tick()
Execute the CPU until the next event in the main event queue or until the guest needs service from ge...
Definition base.cc:602
virtual bool archIsDrained() const
Is the architecture specific code in a state that prevents draining?
Definition base.hh:541
struct kvm_run * _kvmRun
Pointer to the kvm_run structure used to communicate parameters with KVM.
Definition base.hh:719
std::unique_ptr< PerfKvmCounter > hwCycles
Guest cycle counter.
Definition base.hh:769
void setOneReg(uint64_t id, const void *addr)
Get/Set single register using the KVM_(SET|GET)_ONE_REG API.
Definition base.cc:885
std::unique_ptr< BaseKvmTimer > runTimer
Timer used to force execution into the monitor after a specified number of simulation tick equivalent...
Definition base.hh:800
KVMCpuPort dataPort
Port for data requests.
Definition base.hh:633
SimpleThread * thread
A cached copy of a thread's state in the form of a SimpleThread object.
Definition base.hh:153
void setFPUState(const struct kvm_fpu &state)
Definition base.cc:877
virtual Tick handleKvmExitUnknown()
An unknown architecture dependent error occurred when starting the vCPU.
Definition base.cc:1089
void getFPUState(struct kvm_fpu &state) const
Get/Set the guest FPU/vector state.
Definition base.cc:870
void haltContext(ThreadID thread_num) override
Notify the CPU that the indicated context is now halted.
Definition base.cc:566
bool kvmStateDirty
Is the KVM state dirty? Set to true to force an update of the KVM vCPU state upon the next call to kv...
Definition base.hh:654
EventQueue * deviceEventQueue()
Get a pointer to the event queue owning devices.
Definition base.hh:447
void verifyMemoryMode() const override
Verify that the system is in a memory mode supported by the CPU.
Definition base.cc:490
bool threadContextDirty
Is the gem5 context dirty? Set to true to force an update of the KVM vCPU state upon the next call to...
Definition base.hh:648
const long pageSize
Cached page size of the host.
Definition base.hh:726
pthread_t vcpuThread
ID of the vCPU thread.
Definition base.hh:663
Counter ctrInsts
Number of instructions executed by the CPU.
Definition base.hh:823
float hostFactor
Host factor as specified in the configuration.
Definition base.hh:803
Port & getInstPort() override
Purely virtual method that returns a reference to the instruction port.
Definition base.hh:109
Port & getDataPort() override
Purely virtual method that returns a reference to the data port.
Definition base.hh:108
ThreadContext * tc
ThreadContext object, provides an interface for external objects to modify this thread's state.
Definition base.hh:158
virtual void ioctlRun()
Execute the KVM_RUN ioctl.
Definition base.cc:1355
virtual void stutterPC(PCStateBase &pc) const =0
Modify a PCStatePtr's value so that its next PC is the current PC.
Queue of events sorted in time order.
Definition eventq.hh:616
KVM VM container.
Definition vm.hh:302
const std::string _name
Definition named.hh:41
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
Definition packet.hh:295
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
The SimpleThread object provides a combination of the ThreadState object and the ThreadContext interf...
ThreadContext is the external interface to all thread state for anything outside of the CPU.
Statistics container.
Definition group.hh:93
This is a simple scalar statistic, like a counter.
#define KVM_KICK_SIGNAL
Signal to use to trigger exits from KVM.
Definition base.hh:56
void kvmInterrupt(const struct kvm_interrupt &interrupt)
Send a normal interrupt to the guest.
Definition base.cc:834
void kvmNonMaskableInterrupt()
Send a non-maskable interrupt to the guest.
Definition base.cc:826
int ioctl(int request, long p1) const
vCPU ioctl interface.
Definition base.cc:1188
int ioctl(int request, void *p1) const
Definition base.hh:584
int ioctl(int request) const
Definition base.hh:587
DrainState
Object drain/handover states.
Definition drain.hh:75
EventQueue * eventQueue() const
Definition eventq.hh:1003
const Params & params() const
atomic_var_t state
Definition helpers.cc:211
Bitfield< 3, 0 > mask
Definition pcstate.hh:63
Bitfield< 23, 0 > offset
Definition types.hh:144
Bitfield< 4 > pc
Bitfield< 3 > addr
Definition types.hh:84
Bitfield< 7, 0 > L
Definition int.hh:62
double Counter
All counters are of 64-bit values.
Definition types.hh:46
Copyright (c) 2024 - Pranith Kumar Copyright (c) 2020 Inria All rights reserved.
Definition binary32.hh:36
int16_t ThreadID
Thread index/ID type.
Definition types.hh:235
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
uint64_t Tick
Tick count type.
Definition types.hh:58
Declaration of Statistics objects.
statistics::Scalar numExitSignal
Definition base.hh:812
StatGroup(statistics::Group *parent)
Definition base.cc:281
statistics::Scalar numIO
Definition base.hh:815
statistics::Scalar numHypercalls
Definition base.hh:818
statistics::Scalar numHalt
Definition base.hh:816
statistics::Scalar numVMHalfEntries
Definition base.hh:811
statistics::Scalar numMMIO
Definition base.hh:813
statistics::Scalar numCoalescedMMIO
Definition base.hh:814
statistics::Scalar numInterrupts
Definition base.hh:817
statistics::Scalar numVMExits
Definition base.hh:810

Generated on Tue Jun 18 2024 16:24:02 for gem5 by doxygen 1.11.0