base.cc revision 9986
1/* 2 * Copyright (c) 2012 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 * Authors: Andreas Sandberg 38 */ 39 40#include <linux/kvm.h> 41#include <sys/ioctl.h> 42#include <sys/mman.h> 43#include <unistd.h> 44 45#include <cerrno> 46#include <csignal> 47#include <ostream> 48 49#include "arch/mmapped_ipr.hh" 50#include "arch/utility.hh" 51#include "cpu/kvm/base.hh" 52#include "debug/Checkpoint.hh" 53#include "debug/Drain.hh" 54#include "debug/Kvm.hh" 55#include "debug/KvmIO.hh" 56#include "debug/KvmRun.hh" 57#include "params/BaseKvmCPU.hh" 58#include "sim/process.hh" 59#include "sim/system.hh" 60 61#include <signal.h> 62 63/* Used by some KVM macros */ 64#define PAGE_SIZE pageSize 65 66volatile bool timerOverflowed = false; 67 68BaseKvmCPU::BaseKvmCPU(BaseKvmCPUParams *params) 69 : BaseCPU(params), 70 vm(*params->kvmVM), 71 _status(Idle), 72 dataPort(name() + ".dcache_port", this), 73 instPort(name() + ".icache_port", this), 74 threadContextDirty(true), 75 kvmStateDirty(false), 76 vcpuID(vm.allocVCPUID()), vcpuFD(-1), vcpuMMapSize(0), 77 _kvmRun(NULL), mmioRing(NULL), 78 pageSize(sysconf(_SC_PAGE_SIZE)), 79 tickEvent(*this), 80 activeInstPeriod(0), 81 perfControlledByTimer(params->usePerfOverflow), 82 hostFactor(params->hostFactor), 83 drainManager(NULL), 84 ctrInsts(0) 85{ 86 if (pageSize == -1) 87 panic("KVM: Failed to determine host page size (%i)\n", 88 errno); 89 90 thread = new SimpleThread(this, 0, params->system, 91 params->itb, params->dtb, params->isa[0]); 92 thread->setStatus(ThreadContext::Halted); 93 tc = thread->getTC(); 94 threadContexts.push_back(tc); 95 96 setupCounters(); 97 98 if (params->usePerfOverflow) 99 runTimer.reset(new PerfKvmTimer(hwCycles, 100 KVM_TIMER_SIGNAL, 101 params->hostFactor, 102 params->hostFreq)); 103 else 104 runTimer.reset(new PosixKvmTimer(KVM_TIMER_SIGNAL, CLOCK_MONOTONIC, 105 params->hostFactor, 106 params->hostFreq)); 107} 108 109BaseKvmCPU::~BaseKvmCPU() 110{ 111 if (_kvmRun) 112 munmap(_kvmRun, vcpuMMapSize); 113 close(vcpuFD); 114} 115 116void 117BaseKvmCPU::init() 118{ 119 BaseCPU::init(); 120 121 if (numThreads != 1) 122 fatal("KVM: Multithreading not supported"); 123 124 tc->initMemProxies(tc); 125 126 // initialize CPU, including PC 127 if (FullSystem && !switchedOut()) 128 TheISA::initCPU(tc, tc->contextId()); 129 130 mmio_req.setThreadContext(tc->contextId(), 0); 131} 132 133void 134BaseKvmCPU::startup() 135{ 136 const BaseKvmCPUParams * const p( 137 dynamic_cast<const BaseKvmCPUParams *>(params())); 138 139 Kvm &kvm(vm.kvm); 140 141 BaseCPU::startup(); 142 143 assert(vcpuFD == -1); 144 145 // Tell the VM that a CPU is about to start. 146 vm.cpuStartup(); 147 148 // We can't initialize KVM CPUs in BaseKvmCPU::init() since we are 149 // not guaranteed that the parent KVM VM has initialized at that 150 // point. Initialize virtual CPUs here instead. 151 vcpuFD = vm.createVCPU(vcpuID); 152 153 // Setup signal handlers. This has to be done after the vCPU is 154 // created since it manipulates the vCPU signal mask. 155 setupSignalHandler(); 156 157 // Map the KVM run structure */ 158 vcpuMMapSize = kvm.getVCPUMMapSize(); 159 _kvmRun = (struct kvm_run *)mmap(0, vcpuMMapSize, 160 PROT_READ | PROT_WRITE, MAP_SHARED, 161 vcpuFD, 0); 162 if (_kvmRun == MAP_FAILED) 163 panic("KVM: Failed to map run data structure\n"); 164 165 // Setup a pointer to the MMIO ring buffer if coalesced MMIO is 166 // available. The offset into the KVM's communication page is 167 // provided by the coalesced MMIO capability. 168 int mmioOffset(kvm.capCoalescedMMIO()); 169 if (!p->useCoalescedMMIO) { 170 inform("KVM: Coalesced MMIO disabled by config.\n"); 171 } else if (mmioOffset) { 172 inform("KVM: Coalesced IO available\n"); 173 mmioRing = (struct kvm_coalesced_mmio_ring *)( 174 (char *)_kvmRun + (mmioOffset * pageSize)); 175 } else { 176 inform("KVM: Coalesced not supported by host OS\n"); 177 } 178 179 thread->startup(); 180} 181 182void 183BaseKvmCPU::regStats() 184{ 185 using namespace Stats; 186 187 BaseCPU::regStats(); 188 189 numInsts 190 .name(name() + ".committedInsts") 191 .desc("Number of instructions committed") 192 ; 193 194 numVMExits 195 .name(name() + ".numVMExits") 196 .desc("total number of KVM exits") 197 ; 198 199 numVMHalfEntries 200 .name(name() + ".numVMHalfEntries") 201 .desc("number of KVM entries to finalize pending operations") 202 ; 203 204 numExitSignal 205 .name(name() + ".numExitSignal") 206 .desc("exits due to signal delivery") 207 ; 208 209 numMMIO 210 .name(name() + ".numMMIO") 211 .desc("number of VM exits due to memory mapped IO") 212 ; 213 214 numCoalescedMMIO 215 .name(name() + ".numCoalescedMMIO") 216 .desc("number of coalesced memory mapped IO requests") 217 ; 218 219 numIO 220 .name(name() + ".numIO") 221 .desc("number of VM exits due to legacy IO") 222 ; 223 224 numHalt 225 .name(name() + ".numHalt") 226 .desc("number of VM exits due to wait for interrupt instructions") 227 ; 228 229 numInterrupts 230 .name(name() + ".numInterrupts") 231 .desc("number of interrupts delivered") 232 ; 233 234 numHypercalls 235 .name(name() + ".numHypercalls") 236 .desc("number of hypercalls") 237 ; 238} 239 240void 241BaseKvmCPU::serializeThread(std::ostream &os, ThreadID tid) 242{ 243 if (DTRACE(Checkpoint)) { 244 DPRINTF(Checkpoint, "KVM: Serializing thread %i:\n", tid); 245 dump(); 246 } 247 248 assert(tid == 0); 249 assert(_status == Idle); 250 thread->serialize(os); 251} 252 253void 254BaseKvmCPU::unserializeThread(Checkpoint *cp, const std::string §ion, 255 ThreadID tid) 256{ 257 DPRINTF(Checkpoint, "KVM: Unserialize thread %i:\n", tid); 258 259 assert(tid == 0); 260 assert(_status == Idle); 261 thread->unserialize(cp, section); 262 threadContextDirty = true; 263} 264 265unsigned int 266BaseKvmCPU::drain(DrainManager *dm) 267{ 268 if (switchedOut()) 269 return 0; 270 271 DPRINTF(Drain, "BaseKvmCPU::drain\n"); 272 switch (_status) { 273 case Running: 274 // The base KVM code is normally ready when it is in the 275 // Running state, but the architecture specific code might be 276 // of a different opinion. This may happen when the CPU been 277 // notified of an event that hasn't been accepted by the vCPU 278 // yet. 279 if (!archIsDrained()) { 280 drainManager = dm; 281 return 1; 282 } 283 284 // The state of the CPU is consistent, so we don't need to do 285 // anything special to drain it. We simply de-schedule the 286 // tick event and enter the Idle state to prevent nasty things 287 // like MMIOs from happening. 288 if (tickEvent.scheduled()) 289 deschedule(tickEvent); 290 _status = Idle; 291 292 /** FALLTHROUGH */ 293 case Idle: 294 // Idle, no need to drain 295 assert(!tickEvent.scheduled()); 296 297 // Sync the thread context here since we'll need it when we 298 // switch CPUs or checkpoint the CPU. 299 syncThreadContext(); 300 301 return 0; 302 303 case RunningServiceCompletion: 304 // The CPU has just requested a service that was handled in 305 // the RunningService state, but the results have still not 306 // been reported to the CPU. Now, we /could/ probably just 307 // update the register state ourselves instead of letting KVM 308 // handle it, but that would be tricky. Instead, we enter KVM 309 // and let it do its stuff. 310 drainManager = dm; 311 312 DPRINTF(Drain, "KVM CPU is waiting for service completion, " 313 "requesting drain.\n"); 314 return 1; 315 316 case RunningService: 317 // We need to drain since the CPU is waiting for service (e.g., MMIOs) 318 drainManager = dm; 319 320 DPRINTF(Drain, "KVM CPU is waiting for service, requesting drain.\n"); 321 return 1; 322 323 default: 324 panic("KVM: Unhandled CPU state in drain()\n"); 325 return 0; 326 } 327} 328 329void 330BaseKvmCPU::drainResume() 331{ 332 assert(!tickEvent.scheduled()); 333 334 // We might have been switched out. In that case, we don't need to 335 // do anything. 336 if (switchedOut()) 337 return; 338 339 DPRINTF(Kvm, "drainResume\n"); 340 verifyMemoryMode(); 341 342 // The tick event is de-scheduled as a part of the draining 343 // process. Re-schedule it if the thread context is active. 344 if (tc->status() == ThreadContext::Active) { 345 schedule(tickEvent, nextCycle()); 346 _status = Running; 347 } else { 348 _status = Idle; 349 } 350} 351 352void 353BaseKvmCPU::switchOut() 354{ 355 DPRINTF(Kvm, "switchOut\n"); 356 357 BaseCPU::switchOut(); 358 359 // We should have drained prior to executing a switchOut, which 360 // means that the tick event shouldn't be scheduled and the CPU is 361 // idle. 362 assert(!tickEvent.scheduled()); 363 assert(_status == Idle); 364} 365 366void 367BaseKvmCPU::takeOverFrom(BaseCPU *cpu) 368{ 369 DPRINTF(Kvm, "takeOverFrom\n"); 370 371 BaseCPU::takeOverFrom(cpu); 372 373 // We should have drained prior to executing a switchOut, which 374 // means that the tick event shouldn't be scheduled and the CPU is 375 // idle. 376 assert(!tickEvent.scheduled()); 377 assert(_status == Idle); 378 assert(threadContexts.size() == 1); 379 380 // Force an update of the KVM state here instead of flagging the 381 // TC as dirty. This is not ideal from a performance point of 382 // view, but it makes debugging easier as it allows meaningful KVM 383 // state to be dumped before and after a takeover. 384 updateKvmState(); 385 threadContextDirty = false; 386} 387 388void 389BaseKvmCPU::verifyMemoryMode() const 390{ 391 if (!(system->isAtomicMode() && system->bypassCaches())) { 392 fatal("The KVM-based CPUs requires the memory system to be in the " 393 "'atomic_noncaching' mode.\n"); 394 } 395} 396 397void 398BaseKvmCPU::wakeup() 399{ 400 DPRINTF(Kvm, "wakeup()\n"); 401 402 if (thread->status() != ThreadContext::Suspended) 403 return; 404 405 thread->activate(); 406} 407 408void 409BaseKvmCPU::activateContext(ThreadID thread_num, Cycles delay) 410{ 411 DPRINTF(Kvm, "ActivateContext %d (%d cycles)\n", thread_num, delay); 412 413 assert(thread_num == 0); 414 assert(thread); 415 416 assert(_status == Idle); 417 assert(!tickEvent.scheduled()); 418 419 numCycles += ticksToCycles(thread->lastActivate - thread->lastSuspend); 420 421 schedule(tickEvent, clockEdge(delay)); 422 _status = Running; 423} 424 425 426void 427BaseKvmCPU::suspendContext(ThreadID thread_num) 428{ 429 DPRINTF(Kvm, "SuspendContext %d\n", thread_num); 430 431 assert(thread_num == 0); 432 assert(thread); 433 434 if (_status == Idle) 435 return; 436 437 assert(_status == Running); 438 439 // The tick event may no be scheduled if the quest has requested 440 // the monitor to wait for interrupts. The normal CPU models can 441 // get their tick events descheduled by quiesce instructions, but 442 // that can't happen here. 443 if (tickEvent.scheduled()) 444 deschedule(tickEvent); 445 446 _status = Idle; 447} 448 449void 450BaseKvmCPU::deallocateContext(ThreadID thread_num) 451{ 452 // for now, these are equivalent 453 suspendContext(thread_num); 454} 455 456void 457BaseKvmCPU::haltContext(ThreadID thread_num) 458{ 459 // for now, these are equivalent 460 suspendContext(thread_num); 461} 462 463ThreadContext * 464BaseKvmCPU::getContext(int tn) 465{ 466 assert(tn == 0); 467 syncThreadContext(); 468 return tc; 469} 470 471 472Counter 473BaseKvmCPU::totalInsts() const 474{ 475 return ctrInsts; 476} 477 478Counter 479BaseKvmCPU::totalOps() const 480{ 481 hack_once("Pretending totalOps is equivalent to totalInsts()\n"); 482 return ctrInsts; 483} 484 485void 486BaseKvmCPU::dump() 487{ 488 inform("State dumping not implemented."); 489} 490 491void 492BaseKvmCPU::tick() 493{ 494 Tick delay(0); 495 assert(_status != Idle); 496 497 switch (_status) { 498 case RunningService: 499 // handleKvmExit() will determine the next state of the CPU 500 delay = handleKvmExit(); 501 502 if (tryDrain()) 503 _status = Idle; 504 break; 505 506 case RunningServiceCompletion: 507 case Running: { 508 EventQueue *q = curEventQueue(); 509 Tick ticksToExecute(q->nextTick() - curTick()); 510 511 // We might need to update the KVM state. 512 syncKvmState(); 513 514 // Setup any pending instruction count breakpoints using 515 // PerfEvent. 516 setupInstStop(); 517 518 DPRINTF(KvmRun, "Entering KVM...\n"); 519 if (drainManager) { 520 // Force an immediate exit from KVM after completing 521 // pending operations. The architecture-specific code 522 // takes care to run until it is in a state where it can 523 // safely be drained. 524 delay = kvmRunDrain(); 525 } else { 526 delay = kvmRun(ticksToExecute); 527 } 528 529 // Entering into KVM implies that we'll have to reload the thread 530 // context from KVM if we want to access it. Flag the KVM state as 531 // dirty with respect to the cached thread context. 532 kvmStateDirty = true; 533 534 // Enter into the RunningService state unless the 535 // simulation was stopped by a timer. 536 if (_kvmRun->exit_reason != KVM_EXIT_INTR) { 537 _status = RunningService; 538 } else { 539 ++numExitSignal; 540 _status = Running; 541 } 542 543 // Service any pending instruction events. The vCPU should 544 // have exited in time for the event using the instruction 545 // counter configured by setupInstStop(). 546 comInstEventQueue[0]->serviceEvents(ctrInsts); 547 system->instEventQueue.serviceEvents(system->totalNumInsts); 548 549 if (tryDrain()) 550 _status = Idle; 551 } break; 552 553 default: 554 panic("BaseKvmCPU entered tick() in an illegal state (%i)\n", 555 _status); 556 } 557 558 // Schedule a new tick if we are still running 559 if (_status != Idle) 560 schedule(tickEvent, clockEdge(ticksToCycles(delay))); 561} 562 563Tick 564BaseKvmCPU::kvmRunDrain() 565{ 566 // By default, the only thing we need to drain is a pending IO 567 // operation which assumes that we are in the 568 // RunningServiceCompletion state. 569 assert(_status == RunningServiceCompletion); 570 571 // Deliver the data from the pending IO operation and immediately 572 // exit. 573 return kvmRun(0); 574} 575 576uint64_t 577BaseKvmCPU::getHostCycles() const 578{ 579 return hwCycles.read(); 580} 581 582Tick 583BaseKvmCPU::kvmRun(Tick ticks) 584{ 585 Tick ticksExecuted; 586 DPRINTF(KvmRun, "KVM: Executing for %i ticks\n", ticks); 587 timerOverflowed = false; 588 589 if (ticks == 0) { 590 // Settings ticks == 0 is a special case which causes an entry 591 // into KVM that finishes pending operations (e.g., IO) and 592 // then immediately exits. 593 DPRINTF(KvmRun, "KVM: Delivering IO without full guest entry\n"); 594 595 ++numVMHalfEntries; 596 597 // This signal is always masked while we are executing in gem5 598 // and gets unmasked temporarily as soon as we enter into 599 // KVM. See setSignalMask() and setupSignalHandler(). 600 raise(KVM_TIMER_SIGNAL); 601 602 // Enter into KVM. KVM will check for signals after completing 603 // pending operations (IO). Since the KVM_TIMER_SIGNAL is 604 // pending, this forces an immediate exit into gem5 again. We 605 // don't bother to setup timers since this shouldn't actually 606 // execute any code in the guest. 607 ioctlRun(); 608 609 // We always execute at least one cycle to prevent the 610 // BaseKvmCPU::tick() to be rescheduled on the same tick 611 // twice. 612 ticksExecuted = clockPeriod(); 613 } else { 614 if (ticks < runTimer->resolution()) { 615 DPRINTF(KvmRun, "KVM: Adjusting tick count (%i -> %i)\n", 616 ticks, runTimer->resolution()); 617 ticks = runTimer->resolution(); 618 } 619 620 // Get hardware statistics after synchronizing contexts. The KVM 621 // state update might affect guest cycle counters. 622 uint64_t baseCycles(getHostCycles()); 623 uint64_t baseInstrs(hwInstructions.read()); 624 625 // Arm the run timer and start the cycle timer if it isn't 626 // controlled by the overflow timer. Starting/stopping the cycle 627 // timer automatically starts the other perf timers as they are in 628 // the same counter group. 629 runTimer->arm(ticks); 630 if (!perfControlledByTimer) 631 hwCycles.start(); 632 633 ioctlRun(); 634 635 runTimer->disarm(); 636 if (!perfControlledByTimer) 637 hwCycles.stop(); 638 639 // The timer signal may have been delivered after we exited 640 // from KVM. It will be pending in that case since it is 641 // masked when we aren't executing in KVM. Discard it to make 642 // sure we don't deliver it immediately next time we try to 643 // enter into KVM. 644 discardPendingSignal(KVM_TIMER_SIGNAL); 645 discardPendingSignal(KVM_INST_SIGNAL); 646 647 const uint64_t hostCyclesExecuted(getHostCycles() - baseCycles); 648 const uint64_t simCyclesExecuted(hostCyclesExecuted * hostFactor); 649 const uint64_t instsExecuted(hwInstructions.read() - baseInstrs); 650 ticksExecuted = runTimer->ticksFromHostCycles(hostCyclesExecuted); 651 652 if (ticksExecuted < ticks && 653 timerOverflowed && 654 _kvmRun->exit_reason == KVM_EXIT_INTR) { 655 // TODO: We should probably do something clever here... 656 warn("KVM: Early timer event, requested %i ticks but got %i ticks.\n", 657 ticks, ticksExecuted); 658 } 659 660 /* Update statistics */ 661 numCycles += simCyclesExecuted;; 662 numInsts += instsExecuted; 663 ctrInsts += instsExecuted; 664 system->totalNumInsts += instsExecuted; 665 666 DPRINTF(KvmRun, 667 "KVM: Executed %i instructions in %i cycles " 668 "(%i ticks, sim cycles: %i).\n", 669 instsExecuted, hostCyclesExecuted, ticksExecuted, simCyclesExecuted); 670 } 671 672 ++numVMExits; 673 674 return ticksExecuted + flushCoalescedMMIO(); 675} 676 677void 678BaseKvmCPU::kvmNonMaskableInterrupt() 679{ 680 ++numInterrupts; 681 if (ioctl(KVM_NMI) == -1) 682 panic("KVM: Failed to deliver NMI to virtual CPU\n"); 683} 684 685void 686BaseKvmCPU::kvmInterrupt(const struct kvm_interrupt &interrupt) 687{ 688 ++numInterrupts; 689 if (ioctl(KVM_INTERRUPT, (void *)&interrupt) == -1) 690 panic("KVM: Failed to deliver interrupt to virtual CPU\n"); 691} 692 693void 694BaseKvmCPU::getRegisters(struct kvm_regs ®s) const 695{ 696 if (ioctl(KVM_GET_REGS, ®s) == -1) 697 panic("KVM: Failed to get guest registers\n"); 698} 699 700void 701BaseKvmCPU::setRegisters(const struct kvm_regs ®s) 702{ 703 if (ioctl(KVM_SET_REGS, (void *)®s) == -1) 704 panic("KVM: Failed to set guest registers\n"); 705} 706 707void 708BaseKvmCPU::getSpecialRegisters(struct kvm_sregs ®s) const 709{ 710 if (ioctl(KVM_GET_SREGS, ®s) == -1) 711 panic("KVM: Failed to get guest special registers\n"); 712} 713 714void 715BaseKvmCPU::setSpecialRegisters(const struct kvm_sregs ®s) 716{ 717 if (ioctl(KVM_SET_SREGS, (void *)®s) == -1) 718 panic("KVM: Failed to set guest special registers\n"); 719} 720 721void 722BaseKvmCPU::getFPUState(struct kvm_fpu &state) const 723{ 724 if (ioctl(KVM_GET_FPU, &state) == -1) 725 panic("KVM: Failed to get guest FPU state\n"); 726} 727 728void 729BaseKvmCPU::setFPUState(const struct kvm_fpu &state) 730{ 731 if (ioctl(KVM_SET_FPU, (void *)&state) == -1) 732 panic("KVM: Failed to set guest FPU state\n"); 733} 734 735 736void 737BaseKvmCPU::setOneReg(uint64_t id, const void *addr) 738{ 739#ifdef KVM_SET_ONE_REG 740 struct kvm_one_reg reg; 741 reg.id = id; 742 reg.addr = (uint64_t)addr; 743 744 if (ioctl(KVM_SET_ONE_REG, ®) == -1) { 745 panic("KVM: Failed to set register (0x%x) value (errno: %i)\n", 746 id, errno); 747 } 748#else 749 panic("KVM_SET_ONE_REG is unsupported on this platform.\n"); 750#endif 751} 752 753void 754BaseKvmCPU::getOneReg(uint64_t id, void *addr) const 755{ 756#ifdef KVM_GET_ONE_REG 757 struct kvm_one_reg reg; 758 reg.id = id; 759 reg.addr = (uint64_t)addr; 760 761 if (ioctl(KVM_GET_ONE_REG, ®) == -1) { 762 panic("KVM: Failed to get register (0x%x) value (errno: %i)\n", 763 id, errno); 764 } 765#else 766 panic("KVM_GET_ONE_REG is unsupported on this platform.\n"); 767#endif 768} 769 770std::string 771BaseKvmCPU::getAndFormatOneReg(uint64_t id) const 772{ 773#ifdef KVM_GET_ONE_REG 774 std::ostringstream ss; 775 776 ss.setf(std::ios::hex, std::ios::basefield); 777 ss.setf(std::ios::showbase); 778#define HANDLE_INTTYPE(len) \ 779 case KVM_REG_SIZE_U ## len: { \ 780 uint ## len ## _t value; \ 781 getOneReg(id, &value); \ 782 ss << value; \ 783 } break 784 785#define HANDLE_ARRAY(len) \ 786 case KVM_REG_SIZE_U ## len: { \ 787 uint8_t value[len / 8]; \ 788 getOneReg(id, value); \ 789 ss << "[" << value[0]; \ 790 for (int i = 1; i < len / 8; ++i) \ 791 ss << ", " << value[i]; \ 792 ss << "]"; \ 793 } break 794 795 switch (id & KVM_REG_SIZE_MASK) { 796 HANDLE_INTTYPE(8); 797 HANDLE_INTTYPE(16); 798 HANDLE_INTTYPE(32); 799 HANDLE_INTTYPE(64); 800 HANDLE_ARRAY(128); 801 HANDLE_ARRAY(256); 802 HANDLE_ARRAY(512); 803 HANDLE_ARRAY(1024); 804 default: 805 ss << "??"; 806 } 807 808#undef HANDLE_INTTYPE 809#undef HANDLE_ARRAY 810 811 return ss.str(); 812#else 813 panic("KVM_GET_ONE_REG is unsupported on this platform.\n"); 814#endif 815} 816 817void 818BaseKvmCPU::syncThreadContext() 819{ 820 if (!kvmStateDirty) 821 return; 822 823 assert(!threadContextDirty); 824 825 updateThreadContext(); 826 kvmStateDirty = false; 827} 828 829void 830BaseKvmCPU::syncKvmState() 831{ 832 if (!threadContextDirty) 833 return; 834 835 assert(!kvmStateDirty); 836 837 updateKvmState(); 838 threadContextDirty = false; 839} 840 841Tick 842BaseKvmCPU::handleKvmExit() 843{ 844 DPRINTF(KvmRun, "handleKvmExit (exit_reason: %i)\n", _kvmRun->exit_reason); 845 assert(_status == RunningService); 846 847 // Switch into the running state by default. Individual handlers 848 // can override this. 849 _status = Running; 850 switch (_kvmRun->exit_reason) { 851 case KVM_EXIT_UNKNOWN: 852 return handleKvmExitUnknown(); 853 854 case KVM_EXIT_EXCEPTION: 855 return handleKvmExitException(); 856 857 case KVM_EXIT_IO: 858 _status = RunningServiceCompletion; 859 ++numIO; 860 return handleKvmExitIO(); 861 862 case KVM_EXIT_HYPERCALL: 863 ++numHypercalls; 864 return handleKvmExitHypercall(); 865 866 case KVM_EXIT_HLT: 867 /* The guest has halted and is waiting for interrupts */ 868 DPRINTF(Kvm, "handleKvmExitHalt\n"); 869 ++numHalt; 870 871 // Suspend the thread until the next interrupt arrives 872 thread->suspend(); 873 874 // This is actually ignored since the thread is suspended. 875 return 0; 876 877 case KVM_EXIT_MMIO: 878 _status = RunningServiceCompletion; 879 /* Service memory mapped IO requests */ 880 DPRINTF(KvmIO, "KVM: Handling MMIO (w: %u, addr: 0x%x, len: %u)\n", 881 _kvmRun->mmio.is_write, 882 _kvmRun->mmio.phys_addr, _kvmRun->mmio.len); 883 884 ++numMMIO; 885 return doMMIOAccess(_kvmRun->mmio.phys_addr, _kvmRun->mmio.data, 886 _kvmRun->mmio.len, _kvmRun->mmio.is_write); 887 888 case KVM_EXIT_IRQ_WINDOW_OPEN: 889 return handleKvmExitIRQWindowOpen(); 890 891 case KVM_EXIT_FAIL_ENTRY: 892 return handleKvmExitFailEntry(); 893 894 case KVM_EXIT_INTR: 895 /* KVM was interrupted by a signal, restart it in the next 896 * tick. */ 897 return 0; 898 899 case KVM_EXIT_INTERNAL_ERROR: 900 panic("KVM: Internal error (suberror: %u)\n", 901 _kvmRun->internal.suberror); 902 903 default: 904 dump(); 905 panic("KVM: Unexpected exit (exit_reason: %u)\n", _kvmRun->exit_reason); 906 } 907} 908 909Tick 910BaseKvmCPU::handleKvmExitIO() 911{ 912 panic("KVM: Unhandled guest IO (dir: %i, size: %i, port: 0x%x, count: %i)\n", 913 _kvmRun->io.direction, _kvmRun->io.size, 914 _kvmRun->io.port, _kvmRun->io.count); 915} 916 917Tick 918BaseKvmCPU::handleKvmExitHypercall() 919{ 920 panic("KVM: Unhandled hypercall\n"); 921} 922 923Tick 924BaseKvmCPU::handleKvmExitIRQWindowOpen() 925{ 926 warn("KVM: Unhandled IRQ window.\n"); 927 return 0; 928} 929 930 931Tick 932BaseKvmCPU::handleKvmExitUnknown() 933{ 934 dump(); 935 panic("KVM: Unknown error when starting vCPU (hw reason: 0x%llx)\n", 936 _kvmRun->hw.hardware_exit_reason); 937} 938 939Tick 940BaseKvmCPU::handleKvmExitException() 941{ 942 dump(); 943 panic("KVM: Got exception when starting vCPU " 944 "(exception: %u, error_code: %u)\n", 945 _kvmRun->ex.exception, _kvmRun->ex.error_code); 946} 947 948Tick 949BaseKvmCPU::handleKvmExitFailEntry() 950{ 951 dump(); 952 panic("KVM: Failed to enter virtualized mode (hw reason: 0x%llx)\n", 953 _kvmRun->fail_entry.hardware_entry_failure_reason); 954} 955 956Tick 957BaseKvmCPU::doMMIOAccess(Addr paddr, void *data, int size, bool write) 958{ 959 ThreadContext *tc(thread->getTC()); 960 syncThreadContext(); 961 962 mmio_req.setPhys(paddr, size, Request::UNCACHEABLE, dataMasterId()); 963 // Some architectures do need to massage physical addresses a bit 964 // before they are inserted into the memory system. This enables 965 // APIC accesses on x86 and m5ops where supported through a MMIO 966 // interface. 967 BaseTLB::Mode tlb_mode(write ? BaseTLB::Write : BaseTLB::Read); 968 Fault fault(tc->getDTBPtr()->finalizePhysical(&mmio_req, tc, tlb_mode)); 969 if (fault != NoFault) 970 warn("Finalization of MMIO address failed: %s\n", fault->name()); 971 972 973 const MemCmd cmd(write ? MemCmd::WriteReq : MemCmd::ReadReq); 974 Packet pkt(&mmio_req, cmd); 975 pkt.dataStatic(data); 976 977 if (mmio_req.isMmappedIpr()) { 978 const Cycles ipr_delay(write ? 979 TheISA::handleIprWrite(tc, &pkt) : 980 TheISA::handleIprRead(tc, &pkt)); 981 return clockPeriod() * ipr_delay; 982 } else { 983 return dataPort.sendAtomic(&pkt); 984 } 985} 986 987void 988BaseKvmCPU::setSignalMask(const sigset_t *mask) 989{ 990 std::unique_ptr<struct kvm_signal_mask> kvm_mask; 991 992 if (mask) { 993 kvm_mask.reset((struct kvm_signal_mask *)operator new( 994 sizeof(struct kvm_signal_mask) + sizeof(*mask))); 995 // The kernel and the user-space headers have different ideas 996 // about the size of sigset_t. This seems like a massive hack, 997 // but is actually what qemu does. 998 assert(sizeof(*mask) >= 8); 999 kvm_mask->len = 8; 1000 memcpy(kvm_mask->sigset, mask, kvm_mask->len); 1001 } 1002 1003 if (ioctl(KVM_SET_SIGNAL_MASK, (void *)kvm_mask.get()) == -1) 1004 panic("KVM: Failed to set vCPU signal mask (errno: %i)\n", 1005 errno); 1006} 1007 1008int 1009BaseKvmCPU::ioctl(int request, long p1) const 1010{ 1011 if (vcpuFD == -1) 1012 panic("KVM: CPU ioctl called before initialization\n"); 1013 1014 return ::ioctl(vcpuFD, request, p1); 1015} 1016 1017Tick 1018BaseKvmCPU::flushCoalescedMMIO() 1019{ 1020 if (!mmioRing) 1021 return 0; 1022 1023 DPRINTF(KvmIO, "KVM: Flushing the coalesced MMIO ring buffer\n"); 1024 1025 // TODO: We might need to do synchronization when we start to 1026 // support multiple CPUs 1027 Tick ticks(0); 1028 while (mmioRing->first != mmioRing->last) { 1029 struct kvm_coalesced_mmio &ent( 1030 mmioRing->coalesced_mmio[mmioRing->first]); 1031 1032 DPRINTF(KvmIO, "KVM: Handling coalesced MMIO (addr: 0x%x, len: %u)\n", 1033 ent.phys_addr, ent.len); 1034 1035 ++numCoalescedMMIO; 1036 ticks += doMMIOAccess(ent.phys_addr, ent.data, ent.len, true); 1037 1038 mmioRing->first = (mmioRing->first + 1) % KVM_COALESCED_MMIO_MAX; 1039 } 1040 1041 return ticks; 1042} 1043 1044/** 1045 * Cycle timer overflow when running in KVM. Forces the KVM syscall to 1046 * exit with EINTR and allows us to run the event queue. 1047 */ 1048static void 1049onTimerOverflow(int signo, siginfo_t *si, void *data) 1050{ 1051 timerOverflowed = true; 1052} 1053 1054/** 1055 * Instruction counter overflow when running in KVM. Forces the KVM 1056 * syscall to exit with EINTR and allows us to handle instruction 1057 * count events. 1058 */ 1059static void 1060onInstEvent(int signo, siginfo_t *si, void *data) 1061{ 1062} 1063 1064void 1065BaseKvmCPU::setupSignalHandler() 1066{ 1067 struct sigaction sa; 1068 1069 memset(&sa, 0, sizeof(sa)); 1070 sa.sa_sigaction = onTimerOverflow; 1071 sa.sa_flags = SA_SIGINFO | SA_RESTART; 1072 if (sigaction(KVM_TIMER_SIGNAL, &sa, NULL) == -1) 1073 panic("KVM: Failed to setup vCPU timer signal handler\n"); 1074 1075 memset(&sa, 0, sizeof(sa)); 1076 sa.sa_sigaction = onInstEvent; 1077 sa.sa_flags = SA_SIGINFO | SA_RESTART; 1078 if (sigaction(KVM_INST_SIGNAL, &sa, NULL) == -1) 1079 panic("KVM: Failed to setup vCPU instruction signal handler\n"); 1080 1081 sigset_t sigset; 1082 if (sigprocmask(SIG_BLOCK, NULL, &sigset) == -1) 1083 panic("KVM: Failed get signal mask\n"); 1084 1085 // Request KVM to setup the same signal mask as we're currently 1086 // running with. We'll sometimes need to mask the KVM_TIMER_SIGNAL 1087 // to cause immediate exits from KVM after servicing IO 1088 // requests. See kvmRun(). 1089 setSignalMask(&sigset); 1090 1091 // Mask our control signals so they aren't delivered unless we're 1092 // actually executing inside KVM. 1093 sigaddset(&sigset, KVM_TIMER_SIGNAL); 1094 sigaddset(&sigset, KVM_INST_SIGNAL); 1095 if (sigprocmask(SIG_SETMASK, &sigset, NULL) == -1) 1096 panic("KVM: Failed mask the KVM control signals\n"); 1097} 1098 1099bool 1100BaseKvmCPU::discardPendingSignal(int signum) const 1101{ 1102 int discardedSignal; 1103 1104 // Setting the timeout to zero causes sigtimedwait to return 1105 // immediately. 1106 struct timespec timeout; 1107 timeout.tv_sec = 0; 1108 timeout.tv_nsec = 0; 1109 1110 sigset_t sigset; 1111 sigemptyset(&sigset); 1112 sigaddset(&sigset, signum); 1113 1114 do { 1115 discardedSignal = sigtimedwait(&sigset, NULL, &timeout); 1116 } while (discardedSignal == -1 && errno == EINTR); 1117 1118 if (discardedSignal == signum) 1119 return true; 1120 else if (discardedSignal == -1 && errno == EAGAIN) 1121 return false; 1122 else 1123 panic("Unexpected return value from sigtimedwait: %i (errno: %i)\n", 1124 discardedSignal, errno); 1125} 1126 1127void 1128BaseKvmCPU::setupCounters() 1129{ 1130 DPRINTF(Kvm, "Attaching cycle counter...\n"); 1131 PerfKvmCounterConfig cfgCycles(PERF_TYPE_HARDWARE, 1132 PERF_COUNT_HW_CPU_CYCLES); 1133 cfgCycles.disabled(true) 1134 .pinned(true); 1135 1136 // Try to exclude the host. We set both exclude_hv and 1137 // exclude_host since different architectures use slightly 1138 // different APIs in the kernel. 1139 cfgCycles.exclude_hv(true) 1140 .exclude_host(true); 1141 1142 if (perfControlledByTimer) { 1143 // We need to configure the cycles counter to send overflows 1144 // since we are going to use it to trigger timer signals that 1145 // trap back into m5 from KVM. In practice, this means that we 1146 // need to set some non-zero sample period that gets 1147 // overridden when the timer is armed. 1148 cfgCycles.wakeupEvents(1) 1149 .samplePeriod(42); 1150 } 1151 1152 hwCycles.attach(cfgCycles, 1153 0); // TID (0 => currentThread) 1154 1155 setupInstCounter(); 1156} 1157 1158bool 1159BaseKvmCPU::tryDrain() 1160{ 1161 if (!drainManager) 1162 return false; 1163 1164 if (!archIsDrained()) { 1165 DPRINTF(Drain, "tryDrain: Architecture code is not ready.\n"); 1166 return false; 1167 } 1168 1169 if (_status == Idle || _status == Running) { 1170 DPRINTF(Drain, 1171 "tryDrain: CPU transitioned into the Idle state, drain done\n"); 1172 drainManager->signalDrainDone(); 1173 drainManager = NULL; 1174 return true; 1175 } else { 1176 DPRINTF(Drain, "tryDrain: CPU not ready.\n"); 1177 return false; 1178 } 1179} 1180 1181void 1182BaseKvmCPU::ioctlRun() 1183{ 1184 if (ioctl(KVM_RUN) == -1) { 1185 if (errno != EINTR) 1186 panic("KVM: Failed to start virtual CPU (errno: %i)\n", 1187 errno); 1188 } 1189} 1190 1191void 1192BaseKvmCPU::setupInstStop() 1193{ 1194 if (comInstEventQueue[0]->empty()) { 1195 setupInstCounter(0); 1196 } else { 1197 const uint64_t next(comInstEventQueue[0]->nextTick()); 1198 1199 assert(next > ctrInsts); 1200 setupInstCounter(next - ctrInsts); 1201 } 1202} 1203 1204void 1205BaseKvmCPU::setupInstCounter(uint64_t period) 1206{ 1207 // No need to do anything if we aren't attaching for the first 1208 // time or the period isn't changing. 1209 if (period == activeInstPeriod && hwInstructions.attached()) 1210 return; 1211 1212 PerfKvmCounterConfig cfgInstructions(PERF_TYPE_HARDWARE, 1213 PERF_COUNT_HW_INSTRUCTIONS); 1214 1215 // Try to exclude the host. We set both exclude_hv and 1216 // exclude_host since different architectures use slightly 1217 // different APIs in the kernel. 1218 cfgInstructions.exclude_hv(true) 1219 .exclude_host(true); 1220 1221 if (period) { 1222 // Setup a sampling counter if that has been requested. 1223 cfgInstructions.wakeupEvents(1) 1224 .samplePeriod(period); 1225 } 1226 1227 // We need to detach and re-attach the counter to reliably change 1228 // sampling settings. See PerfKvmCounter::period() for details. 1229 if (hwInstructions.attached()) 1230 hwInstructions.detach(); 1231 assert(hwCycles.attached()); 1232 hwInstructions.attach(cfgInstructions, 1233 0, // TID (0 => currentThread) 1234 hwCycles); 1235 1236 if (period) 1237 hwInstructions.enableSignals(KVM_INST_SIGNAL); 1238 1239 activeInstPeriod = period; 1240} 1241