Go to the documentation of this file.
40 #include <linux/kvm.h>
41 #include <sys/ioctl.h>
50 #include "debug/Checkpoint.hh"
51 #include "debug/Drain.hh"
52 #include "debug/Kvm.hh"
53 #include "debug/KvmIO.hh"
54 #include "debug/KvmRun.hh"
55 #include "params/BaseKvmCPU.hh"
60 #define PAGE_SIZE pageSize
69 dataPort(
name() +
".dcache_port", this),
70 instPort(
name() +
".icache_port", this),
71 alwaysSyncTC(params.alwaysSyncTC),
72 threadContextDirty(true),
74 vcpuID(
vm.allocVCPUID()), vcpuFD(-1), vcpuMMapSize(0),
75 _kvmRun(NULL), mmioRing(NULL),
76 pageSize(sysconf(_SC_PAGE_SIZE)),
77 tickEvent([this]{
tick(); },
"BaseKvmCPU tick",
80 perfControlledByTimer(params.usePerfOverflow),
81 hostFactor(params.hostFactor), stats(
this),
85 panic(
"KVM: Failed to determine host page size (%i)\n",
89 thread =
new SimpleThread(
this, 0, params.system, params.mmu,
93 params.workload[0], params.mmu,
98 threadContexts.push_back(tc);
114 fatal(
"KVM: Multithreading not supported");
122 const BaseKvmCPUParams &
p =
123 dynamic_cast<const BaseKvmCPUParams &
>(
params());
142 PROT_READ | PROT_WRITE, MAP_SHARED,
145 panic(
"KVM: Failed to map run data structure\n");
151 if (!
p.useCoalescedMMIO) {
152 inform(
"KVM: Coalesced MMIO disabled by config.\n");
153 }
else if (mmioOffset) {
154 inform(
"KVM: Coalesced IO available\n");
155 mmioRing = (
struct kvm_coalesced_mmio_ring *)(
158 inform(
"KVM: Coalesced not supported by host OS\n");
176 if (cpu->system->isAtomicMode()) {
177 Tick delay = sendAtomic(pkt);
181 if (pendingMMIOPkts.empty() && sendTimingReq(pkt)) {
184 pendingMMIOPkts.push(pkt);
194 DPRINTF(KvmIO,
"KVM: Finished timing request\n");
201 if (!(activeMMIOReqs || pendingMMIOPkts.size())) {
202 DPRINTF(KvmIO,
"KVM: Finished all outstanding timing requests\n");
203 cpu->finishMMIOPending();
211 DPRINTF(KvmIO,
"KVM: Retry for timing request\n");
213 assert(pendingMMIOPkts.size());
218 while (pendingMMIOPkts.size() && sendTimingReq(pendingMMIOPkts.front())) {
219 pendingMMIOPkts.pop();
241 const BaseKvmCPUParams &
p =
242 dynamic_cast<const BaseKvmCPUParams &
>(
params());
252 if (
p.usePerfOverflow) {
265 : statistics::
Group(parent),
266 ADD_STAT(committedInsts, statistics::units::Count::get(),
267 "Number of instructions committed"),
268 ADD_STAT(numVMExits, statistics::units::Count::get(),
269 "total number of KVM exits"),
270 ADD_STAT(numVMHalfEntries, statistics::units::Count::get(),
271 "number of KVM entries to finalize pending operations"),
272 ADD_STAT(numExitSignal, statistics::units::Count::get(),
273 "exits due to signal delivery"),
274 ADD_STAT(numMMIO, statistics::units::Count::get(),
275 "number of VM exits due to memory mapped IO"),
276 ADD_STAT(numCoalescedMMIO, statistics::units::Count::get(),
277 "number of coalesced memory mapped IO requests"),
278 ADD_STAT(numIO, statistics::units::Count::get(),
279 "number of VM exits due to legacy IO"),
280 ADD_STAT(numHalt, statistics::units::Count::get(),
281 "number of VM exits due to wait for interrupt instructions"),
282 ADD_STAT(numInterrupts, statistics::units::Count::get(),
283 "number of interrupts delivered"),
284 ADD_STAT(numHypercalls, statistics::units::Count::get(),
"number of hypercalls")
291 if (debug::Checkpoint) {
292 DPRINTF(Checkpoint,
"KVM: Serializing thread %i:\n", tid);
304 DPRINTF(Checkpoint,
"KVM: Unserialize thread %i:\n", tid);
318 DPRINTF(Drain,
"BaseKvmCPU::drain\n");
362 DPRINTF(Drain,
"KVM CPU is waiting for service completion, "
363 "requesting drain.\n");
368 DPRINTF(Drain,
"KVM CPU is waiting for timing accesses to complete, "
369 "requesting drain.\n");
374 DPRINTF(Drain,
"KVM CPU is waiting for service, requesting drain.\n");
378 panic(
"KVM: Unhandled CPU state in drain()\n");
416 warn(
"kvm CPU: notifyFork failed to close vcpuFD\n");
469 fatal(
"The KVM-based CPUs requires the memory system to be in the "
470 "'noncaching' mode.\n");
495 DPRINTF(
Kvm,
"ActivateContext %d\n", thread_num);
497 assert(thread_num == 0);
514 DPRINTF(
Kvm,
"SuspendContext %d\n", thread_num);
516 assert(thread_num == 0);
567 hack_once(
"Pretending totalOps is equivalent to totalInsts()\n");
574 inform(
"State dumping not implemented.");
595 const uint64_t nextInstEvent(
596 queue.empty() ?
MaxTick : queue.nextTick());
599 const Tick ticksToExecute(
612 if (ticksToExecute > 0)
615 DPRINTF(KvmRun,
"Entering KVM...\n");
623 delay =
kvmRun(ticksToExecute);
642 if (
_kvmRun->exit_reason != KVM_EXIT_INTR) {
659 panic(
"BaseKvmCPU entered tick() in an illegal state (%i)\n",
698 "Trying to run a KVM CPU in a forked child process. "
699 "This is not supported.\n");
700 DPRINTF(KvmRun,
"KVM: Executing for %i ticks\n", ticks);
706 DPRINTF(KvmRun,
"KVM: Delivering IO without full guest entry\n");
737 if (ticks < runTimer->resolution()) {
738 DPRINTF(KvmRun,
"KVM: Adjusting tick count (%i -> %i)\n",
769 const uint64_t hostCyclesExecuted(
getHostCycles() - baseCycles);
770 const uint64_t simCyclesExecuted(hostCyclesExecuted *
hostFactor);
772 ticksExecuted =
runTimer->ticksFromHostCycles(hostCyclesExecuted);
780 "KVM: Executed %i instructions in %i cycles "
781 "(%i ticks, sim cycles: %i).\n",
782 instsExecuted, hostCyclesExecuted, ticksExecuted, simCyclesExecuted);
794 if (
ioctl(KVM_NMI) == -1)
795 panic(
"KVM: Failed to deliver NMI to virtual CPU\n");
802 if (
ioctl(KVM_INTERRUPT, (
void *)&interrupt) == -1)
803 panic(
"KVM: Failed to deliver interrupt to virtual CPU\n");
809 if (
ioctl(KVM_GET_REGS, ®s) == -1)
810 panic(
"KVM: Failed to get guest registers\n");
816 if (
ioctl(KVM_SET_REGS, (
void *)®s) == -1)
817 panic(
"KVM: Failed to set guest registers\n");
823 if (
ioctl(KVM_GET_SREGS, ®s) == -1)
824 panic(
"KVM: Failed to get guest special registers\n");
830 if (
ioctl(KVM_SET_SREGS, (
void *)®s) == -1)
831 panic(
"KVM: Failed to set guest special registers\n");
837 if (
ioctl(KVM_GET_FPU, &state) == -1)
838 panic(
"KVM: Failed to get guest FPU state\n");
844 if (
ioctl(KVM_SET_FPU, (
void *)&state) == -1)
845 panic(
"KVM: Failed to set guest FPU state\n");
852 #ifdef KVM_SET_ONE_REG
853 struct kvm_one_reg
reg;
857 if (
ioctl(KVM_SET_ONE_REG, &
reg) == -1) {
858 panic(
"KVM: Failed to set register (0x%x) value (errno: %i)\n",
862 panic(
"KVM_SET_ONE_REG is unsupported on this platform.\n");
869 #ifdef KVM_GET_ONE_REG
870 struct kvm_one_reg
reg;
874 if (
ioctl(KVM_GET_ONE_REG, &
reg) == -1) {
875 panic(
"KVM: Failed to get register (0x%x) value (errno: %i)\n",
879 panic(
"KVM_GET_ONE_REG is unsupported on this platform.\n");
886 #ifdef KVM_GET_ONE_REG
887 std::ostringstream
ss;
889 ss.setf(std::ios::hex, std::ios::basefield);
890 ss.setf(std::ios::showbase);
891 #define HANDLE_INTTYPE(len) \
892 case KVM_REG_SIZE_U ## len: { \
893 uint ## len ## _t value; \
894 getOneReg(id, &value); \
898 #define HANDLE_ARRAY(len) \
899 case KVM_REG_SIZE_U ## len: { \
900 uint8_t value[len / 8]; \
901 getOneReg(id, value); \
902 ccprintf(ss, "[0x%x", value[0]); \
903 for (int i = 1; i < len / 8; ++i) \
904 ccprintf(ss, ", 0x%x", value[i]); \
908 switch (
id & KVM_REG_SIZE_MASK) {
921 #undef HANDLE_INTTYPE
926 panic(
"KVM_GET_ONE_REG is unsupported on this platform.\n");
957 DPRINTF(KvmRun,
"handleKvmExit (exit_reason: %i)\n",
_kvmRun->exit_reason);
963 switch (
_kvmRun->exit_reason) {
964 case KVM_EXIT_UNKNOWN:
967 case KVM_EXIT_EXCEPTION:
978 case KVM_EXIT_HYPERCALL:
996 DPRINTF(KvmIO,
"KVM: Handling MMIO (w: %u, addr: 0x%x, len: %u)\n",
1010 case KVM_EXIT_IRQ_WINDOW_OPEN:
1013 case KVM_EXIT_FAIL_ENTRY:
1021 case KVM_EXIT_INTERNAL_ERROR:
1022 panic(
"KVM: Internal error (suberror: %u)\n",
1027 panic(
"KVM: Unexpected exit (exit_reason: %u)\n",
_kvmRun->exit_reason);
1034 panic(
"KVM: Unhandled guest IO (dir: %i, size: %i, port: 0x%x, count: %i)\n",
1042 panic(
"KVM: Unhandled hypercall\n");
1048 warn(
"KVM: Unhandled IRQ window.\n");
1057 panic(
"KVM: Unknown error when starting vCPU (hw reason: 0x%llx)\n",
1058 _kvmRun->hw.hardware_exit_reason);
1065 panic(
"KVM: Got exception when starting vCPU "
1066 "(exception: %u, error_code: %u)\n",
1074 panic(
"KVM: Failed to enter virtualized mode (hw reason: 0x%llx)\n",
1075 _kvmRun->fail_entry.hardware_entry_failure_reason);
1084 RequestPtr mmio_req = std::make_shared<Request>(
1095 warn(
"Finalization of MMIO address failed: %s\n", fault->name());
1102 if (mmio_req->isLocalAccess()) {
1115 const Cycles ipr_delay = mmio_req->localAccessor(
tc, pkt);
1131 std::unique_ptr<struct kvm_signal_mask> kvm_mask;
1134 kvm_mask.reset((
struct kvm_signal_mask *)
operator new(
1135 sizeof(
struct kvm_signal_mask) +
sizeof(*
mask)));
1139 assert(
sizeof(*
mask) >= 8);
1141 memcpy(kvm_mask->sigset,
mask, kvm_mask->len);
1144 if (
ioctl(KVM_SET_SIGNAL_MASK, (
void *)kvm_mask.get()) == -1)
1145 panic(
"KVM: Failed to set vCPU signal mask (errno: %i)\n",
1153 panic(
"KVM: CPU ioctl called before initialization\n");
1155 return ::ioctl(
vcpuFD, request, p1);
1164 DPRINTF(KvmIO,
"KVM: Flushing the coalesced MMIO ring buffer\n");
1170 struct kvm_coalesced_mmio &ent(
1173 DPRINTF(KvmIO,
"KVM: Handling coalesced MMIO (addr: 0x%x, len: %u)\n",
1174 ent.phys_addr, ent.len);
1177 ticks +=
doMMIOAccess(ent.phys_addr, ent.data, ent.len,
true);
1203 struct sigaction
sa;
1205 memset(&
sa, 0,
sizeof(
sa));
1207 sa.sa_flags = SA_SIGINFO | SA_RESTART;
1209 panic(
"KVM: Failed to setup vCPU timer signal handler\n");
1212 if (pthread_sigmask(SIG_BLOCK, NULL, &sigset) == -1)
1213 panic(
"KVM: Failed get signal mask\n");
1225 if (pthread_sigmask(SIG_SETMASK, &sigset, NULL) == -1)
1226 panic(
"KVM: Failed mask the KVM control signals\n");
1232 int discardedSignal;
1236 struct timespec timeout;
1238 timeout.tv_nsec = 0;
1241 sigemptyset(&sigset);
1242 sigaddset(&sigset, signum);
1245 discardedSignal = sigtimedwait(&sigset, NULL, &timeout);
1246 }
while (discardedSignal == -1 && errno == EINTR);
1248 if (discardedSignal == signum)
1250 else if (discardedSignal == -1 && errno == EAGAIN)
1253 panic(
"Unexpected return value from sigtimedwait: %i (errno: %i)\n",
1254 discardedSignal, errno);
1260 DPRINTF(
Kvm,
"Attaching cycle counter...\n");
1262 PERF_COUNT_HW_CPU_CYCLES);
1295 DPRINTF(Drain,
"tryDrain: Architecture code is not ready.\n");
1301 "tryDrain: CPU transitioned into the Idle state, drain done\n");
1305 DPRINTF(Drain,
"tryDrain: CPU not ready.\n");
1313 if (
ioctl(KVM_RUN) == -1) {
1315 panic(
"KVM: Failed to start virtual CPU (errno: %i)\n",
1341 PERF_COUNT_HW_INSTRUCTIONS);
Tick curTick()
The universal simulation clock.
gem5::BaseKvmCPU::StatGroup stats
#define fatal(...)
This implements a cprintf based fatal() function.
Status _status
CPU run state.
int createVCPU(long vcpuID)
Create a new vCPU within a VM.
constexpr decltype(nullptr) NoFault
bool switchedOut() const
Determine if the CPU is switched out.
int capCoalescedMMIO() const
Check if coalesced MMIO is supported and which page in the MMAP'ed structure it stores requests in.
#define KVM_KICK_SIGNAL
Signal to use to trigger exits from KVM.
bool perfControlledByTimer
Does the runTimer control the performance counters?
EventQueue * eventQueue() const
@ Halted
Permanently shut down.
void startup() override
startup() is the final initialization call before simulation.
StatGroup(statistics::Group *parent)
DrainState drainState() const
Return the current drain state of an object.
int ioctl(int request, long p1) const
vCPU ioctl interface.
statistics::Scalar numVMHalfEntries
@ RunningServiceCompletion
Service completion in progress.
EventQueue * deviceEventQueue()
Get a pointer to the event queue owning devices.
void kvmInterrupt(const struct kvm_interrupt &interrupt)
Send a normal interrupt to the guest.
void syncThreadContext()
Update a thread context if the KVM state is dirty with respect to the cached thread context.
bool attached() const
Check if a counter is attached.
void drainResume() override
Resume execution after a successful drain.
PerfKvmCounterConfig & pinned(bool val)
Force the group to be on the active all the time (i.e., disallow multiplexing).
@ UNCACHEABLE
The request is to an uncacheable address.
virtual BaseMMU * getMMUPtr()=0
void updateCycleCounters(CPUState state)
base method keeping track of cycle progression
const bool alwaysSyncTC
Be conservative and always synchronize the thread context on KVM entry/exit.
void init() override
init() is called after all C++ SimObjects have been created and all ports are connected.
bool bypassCaches() const
Should caches be bypassed?
void kick() const
Force an exit from KVM.
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Tick flushCoalescedMMIO()
Service MMIO requests in the mmioRing.
virtual ContextID contextId() const =0
virtual Tick handleKvmExitFailEntry()
KVM failed to start the virtualized CPU.
std::string getAndFormatOneReg(uint64_t id) const
Get and format one register for printout.
float hostFactor
Host factor as specified in the configuration.
@ RunningService
Requiring service at the beginning of the next cycle.
void schedule(Event &event, Tick when)
void suspendContext(ThreadID thread_num) override
Notify the CPU that the indicated context is now suspended.
virtual Addr instAddr() const =0
void deallocateContext(ThreadID thread_num)
void setupCounters()
Setup hardware performance counters.
void getOneReg(uint64_t id, void *addr) const
virtual Tick handleKvmExit()
Main kvmRun exit handler, calls the relevant handleKvmExit* depending on exit type.
void setFPUState(const struct kvm_fpu &state)
PerfKvmCounter hwCycles
Guest cycle counter.
void activate() override
Set the status to Active.
void wakeup(ThreadID tid=0) override
bool tryDrain()
Try to drain the CPU if a drain is pending.
@ RunningMMIOPending
Timing MMIO request in flight or stalled.
void recvReqRetry() override
Called by the peer if sendTimingReq was called on this peer (causing recvTimingReq to be called on th...
Tick doMMIOAccess(Addr paddr, void *data, int size, bool write)
Inject a memory mapped IO request into gem5.
The SimpleThread object provides a combination of the ThreadState object and the ThreadContext interf...
void serializeThread(CheckpointOut &cp, ThreadID tid) const override
Serialize a single thread.
void getFPUState(struct kvm_fpu &state) const
Get/Set the guest FPU/vector state.
void notifyFork() override
Notify a child process of a fork.
void verifyMemoryMode() const override
Verify that the system is in a memory mode supported by the CPU.
statistics::Scalar committedInsts
virtual Status status() const =0
constexpr uint64_t mask(unsigned nbits)
Generate a 64-bit mask of 'nbits' 1s, right justified.
void kvmNonMaskableInterrupt()
Send a non-maskable interrupt to the guest.
statistics::Scalar numInterrupts
statistics::Scalar numVMExits
Cycles is a wrapper class for representing cycle counts, i.e.
void detach()
Detach a counter from PerfEvent.
ThreadID numThreads
Number of threads we're actually simulating (<= SMT_MAX_THREADS).
void stop()
Stop counting.
virtual Tick handleKvmExitException()
An unhandled virtualization exception occured.
bool discardPendingSignal(int signum) const
Discard a (potentially) pending signal.
void dataStatic(T *p)
Set the data pointer to the following value that should not be freed.
pthread_t vcpuThread
ID of the vCPU thread.
Tick lastSuspend
Last time suspend was called on this thread.
SimpleThread * thread
A cached copy of a thread's state in the form of a SimpleThread object.
DrainState
Object drain/handover states.
int vcpuFD
KVM vCPU file descriptor.
gem5::BaseCPU::BaseCPUStats baseStats
void enableSignals(pid_t tid, int signal)
Enable signal delivery to a thread on counter overflow.
void startup() override
startup() is the final initialization call before simulation.
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...
virtual void ioctlRun()
Execute the KVM_RUN ioctl.
ThreadContext is the external interface to all thread state for anything outside of the CPU.
virtual std::string name() const
std::shared_ptr< FaultBase > Fault
const Params & params() const
EventFunctionWrapper tickEvent
@ Suspended
Temporarily inactive.
#define ADD_STAT(n,...)
Convenience macro to add a stat to a statistics group.
unsigned int activeMMIOReqs
Number of MMIO requests in flight.
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
void setupSignalHandler()
Setup a signal handler to catch the timer signal used to switch back to the monitor.
ThreadContext * tc
ThreadContext object, provides an interface for external objects to modify this thread's state.
statistics::Scalar numCycles
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...
ProbePointArg< PacketInfo > Packet
Packet probe point.
uint64_t Tick
Tick count type.
virtual bool archIsDrained() const
Is the architecture specific code in a state that prevents draining?
void switchOut() override
Prepare for another CPU to take over execution.
int getVCPUMMapSize() const
Get the size of the MMAPed parameter area used to communicate vCPU parameters between the kernel and ...
std::shared_ptr< Request > RequestPtr
virtual Tick handleKvmExitUnknown()
An unknown architecture dependent error occurred when starting the vCPU.
void tick()
Execute the CPU until the next event in the main event queue or until the guest needs service from ge...
void attach(PerfKvmCounterConfig &config, pid_t tid)
Attach a counter.
void setOneReg(uint64_t id, const void *addr)
Get/Set single register using the KVM_(SET|GET)_ONE_REG API.
void getSpecialRegisters(struct kvm_sregs ®s) const
Status nextIOState() const
Returns next valid state after one or more IO accesses.
PerfKvmCounterConfig & wakeupEvents(uint32_t events)
Set the number of samples that need to be triggered before reporting data as being available on the p...
bool empty() const
Returns true if no events are queued.
virtual void initMemProxies(ThreadContext *tc)=0
Initialise the physical and virtual port proxies and tie them to the data port of the CPU.
void unserializeThread(CheckpointIn &cp, ThreadID tid) override
Unserialize one thread.
const long vcpuID
KVM internal ID of the vCPU.
Counter ctrInsts
Number of instructions executed by the CPU.
@ Drained
Buffers drained, ready for serialization/handover.
std::queue< PacketPtr > pendingMMIOPkts
Pending MMIO packets.
void finishMMIOPending()
Callback from KvmCPUPort to transition the CPU out of RunningMMIOPending when all timing requests hav...
ThreadContext * getContext(int tn) override
Given a thread num get tho thread context for it.
bool recvTimingResp(PacketPtr pkt) override
Receive a timing response from the peer.
virtual Tick handleKvmExitIO()
The guest performed a legacy IO request (out/inp on x86)
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
void setSignalMask(const sigset_t *mask)
Set the signal mask used in kvmRun()
@ Idle
Context not scheduled in KVM.
const std::string & name()
void setRegisters(const struct kvm_regs ®s)
@ Running
Running normally.
virtual Tick kvmRunDrain()
Request the CPU to run until draining completes.
Tick clockEdge(Cycles cycles=Cycles(0)) const
Determine the tick when a cycle begins, by default the current one, but the argument also enables the...
Kvm * kvm
Global KVM interface.
virtual void updateThreadContext()=0
Update the current thread context with the KVM state.
void deschedule(Event &event)
virtual uint64_t getHostCycles() const
Get the value of the hardware cycle counter in the guest.
PerfEvent based timer using the host's CPU cycle counter.
void cpuStartup()
VM CPU initialization code.
void signalDrainDone() const
Signal that an object is drained.
Tick nextCycle() const
Based on the clock of the object, determine the start tick of the first cycle that is at least one cy...
bool FullSystem
The FullSystem variable can be used to determine the current mode of simulation.
PerfKvmCounterConfig & exclude_host(bool val)
Exclude the events from the host (i.e., only include events from the guest system).
ThreadContext * getTC()
Returns the pointer to this SimpleThread's ThreadContext.
statistics::Scalar numExitSignal
virtual Tick handleKvmExitHypercall()
The guest requested a monitor service using a hypercall.
Tick lastActivate
Last time activate was called on this thread.
std::vector< ThreadContext * > threadContexts
virtual void takeOverFrom(BaseCPU *cpu)
Load the state of a CPU from the previous CPU object, invoked on all new CPUs that are about to be sw...
void activateContext(ThreadID thread_num) override
Notify the CPU that the indicated context is now active.
BaseKvmCPU(const BaseKvmCPUParams ¶ms)
void suspend() override
Set the status to Suspended.
EventQueue * curEventQueue()
void startupThread()
Thread-specific initialization.
Timer based on standard POSIX timers.
PerfKvmCounterConfig & exclude_hv(bool val)
Exclude the hyper visor (i.e., only include events from the guest system).
int vcpuMMapSize
Size of MMAPed kvm_run area.
uint64_t read() const
Read the current value of a counter.
double Counter
All counters are of 64-bit values.
Counter totalInsts() const override
Tick submitIO(PacketPtr pkt)
Interface to send Atomic or Timing IO request.
virtual void switchOut()
Prepare for another CPU to take over execution.
virtual void dump() const
Dump the internal state to the terminal.
statistics::Scalar numMMIO
virtual void updateKvmState()=0
Update the KVM state from the current thread context.
uint64_t activeInstPeriod
Currently active instruction count breakpoint.
struct kvm_run * _kvmRun
Pointer to the kvm_run structure used to communicate parameters with KVM.
struct kvm_coalesced_mmio_ring * mmioRing
Coalesced MMIO ring buffer.
std::unique_ptr< BaseKvmTimer > runTimer
Timer used to force execution into the monitor after a specified number of simulation tick equivalent...
PerfKvmCounterConfig & samplePeriod(uint64_t period)
Set the initial sample period (overflow count) of an event.
void setupInstStop()
Setup an instruction break if there is one pending.
std::ostream CheckpointOut
virtual Tick kvmRun(Tick ticks)
Request KVM to run the guest for a given number of ticks.
bool threadContextDirty
Is the gem5 context dirty? Set to true to force an update of the KVM vCPU state upon the next call to...
void getRegisters(struct kvm_regs ®s) const
Get/Set the register state of the guest vCPU.
RequestorID dataRequestorId() const
Reads this CPU's unique data requestor ID.
const long pageSize
Cached page size of the host.
statistics::Scalar numCoalescedMMIO
PerfEvent counter configuration.
Cycles ticksToCycles(Tick t) const
void init() override
init() is called after all C++ SimObjects have been created and all ports are connected.
static const Priority CPU_Tick_Pri
CPU ticks must come after other associated CPU events (such as writebacks).
virtual Tick handleKvmExitIRQWindowOpen()
The guest exited because an interrupt window was requested.
Fault finalizePhysical(const RequestPtr &req, ThreadContext *tc, Mode mode) const
void haltContext(ThreadID thread_num) override
Notify the CPU that the indicated context is now halted.
KVMCpuPort dataPort
Port for data requests.
#define fatal_if(cond,...)
Conditional fatal macro that checks the supplied condition and only causes a fatal error if the condi...
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
statistics::Scalar numHalt
Counter totalOps() const override
static void onKickSignal(int signo, siginfo_t *si, void *data)
Dummy handler for KVM kick signals.
void start()
Start counting.
statistics::Scalar numHypercalls
Status status() const override
void setSpecialRegisters(const struct kvm_sregs ®s)
EventQueue comInstEventQueue
An instruction-based event queue.
void setupInstCounter(uint64_t period=0)
Setup the guest instruction counter.
PerfKvmCounter hwInstructions
Guest instruction counter.
PerfKvmCounterConfig & disabled(bool val)
Don't start the performance counter automatically when attaching it.
@ Draining
Draining buffers pending serialization/handover.
void syncKvmState()
Update the KVM if the thread context is dirty.
bool scheduled() const
Determine if the current event is scheduled.
int16_t ThreadID
Thread index/ID type.
void serialize(CheckpointOut &cp) const override
Serialize an object.
#define panic(...)
This implements a cprintf based panic() function.
DrainState drain() override
Draining is the process of clearing out the states of SimObjects.These are the SimObjects that are pa...
Generated on Tue Sep 7 2021 14:53:43 for gem5 by doxygen 1.8.17