Changeset 61575 in vbox for trunk/src/VBox/VMM/VMMR3
- Timestamp:
- Jun 8, 2016 12:43:19 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR3/APIC.cpp
r61566 r61575 412 412 { 413 413 NOREF(pszArgs); 414 PVMCPU pVCpu = VMMGetCpu(pVM); AssertFatalMsg(pVCpu, ("Invalid EMT thread. pVCpu=%p\n", pVCpu)); 414 PVMCPU pVCpu = VMMGetCpu(pVM); 415 if (!pVCpu) 416 pVCpu = &pVM->aCpus[0]; 417 415 418 PCAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu); 416 419 PCXAPICPAGE pXApicPage = VMCPU_TO_CXAPICPAGE(pVCpu); … … 512 515 pHlp->pfnPrintf(pHlp, " Timer Mode = %#x (%s)\n", pXApicPage->lvt_timer.u.u2TimerMode, 513 516 apicGetTimerModeName((XAPICTIMERMODE)pXApicPage->lvt_timer.u.u2TimerMode)); 514 pHlp->pfnPrintf(pHlp, "\n");515 517 } 516 518 … … 526 528 { 527 529 NOREF(pszArgs); 528 PVMCPU pVCpu = VMMGetCpu(pVM); AssertFatalMsg(pVCpu, ("Invalid EMT thread. pVCpu=%p\n", pVCpu)); 530 PVMCPU pVCpu = VMMGetCpu(pVM); 531 if (!pVCpu) 532 pVCpu = &pVM->aCpus[0]; 533 529 534 PCXAPICPAGE pXApicPage = VMCPU_TO_CXAPICPAGE(pVCpu); 530 535 531 apicR3InfoLvtTimer(pVCpu, pHlp); 536 /* 537 * Delivery modes available in the LVT entries. They're different (more reserved stuff) from the 538 * ICR delivery modes and hence we don't use apicGetDeliveryMode but mostly because we want small, 539 * fixed-length strings to fit our formatting needs here. 540 */ 541 static const char * const s_apszLvtDeliveryModes[] = 542 { 543 "Fixed ", 544 "Rsvd ", 545 "SMI ", 546 "Rsvd ", 547 "NMI ", 548 "INIT ", 549 "Rsvd ", 550 "ExtINT" 551 }; 552 /* Delivery Status. */ 553 static const char * const s_apszLvtDeliveryStatus[] = 554 { 555 "Idle", 556 "Pend" 557 }; 558 const char *pszNotApplicable = ""; 559 560 pHlp->pfnPrintf(pHlp, "APIC Local Vector Table (LVT):\n"); 561 pHlp->pfnPrintf(pHlp, "lvt timermode mask trigger rirr polarity dlvr_st dlvr_mode vector\n"); 562 /* Timer. */ 563 { 564 /* Timer modes. */ 565 static const char * const s_apszLvtTimerModes[] = 566 { 567 "One-shot ", 568 "Periodic ", 569 "TSC-dline" 570 }; 571 const uint32_t uLvtTimer = pXApicPage->lvt_timer.all.u32LvtTimer; 572 const XAPICTIMERMODE enmTimerMode = XAPIC_LVT_GET_TIMER_MODE(uLvtTimer); 573 const char *pszTimerMode = s_apszLvtTimerModes[enmTimerMode]; 574 const uint8_t uMask = XAPIC_LVT_IS_MASKED(uLvtTimer); 575 const uint8_t uDeliveryStatus = uLvtTimer & XAPIC_LVT_DELIVERY_STATUS; 576 const char *pszDeliveryStatus = s_apszLvtDeliveryStatus[uDeliveryStatus]; 577 const uint8_t uVector = XAPIC_LVT_GET_VECTOR(uLvtTimer); 578 579 pHlp->pfnPrintf(pHlp, "%-7s %9s %u %5s %1s %8s %4s %6s %u (%#x)\n", 580 "Timer", 581 pszTimerMode, 582 uMask, 583 pszNotApplicable, /* TriggerMode */ 584 pszNotApplicable, /* Remote IRR */ 585 pszNotApplicable, /* Polarity */ 586 pszDeliveryStatus, 587 pszNotApplicable, /* Delivery Mode */ 588 uVector, 589 uVector); 590 } 532 591 533 592 #if XAPIC_HARDWARE_VERSION == XAPIC_HARDWARE_VERSION_P4 534 uint32_t const uLvtThermal = pXApicPage->lvt_thermal.all.u32LvtThermal; 535 pHlp->pfnPrintf(pHlp, "LVT Thermal = %#RX32)\n", uLvtThermal); 536 pHlp->pfnPrintf(pHlp, " Vector = %u (%#x)\n", pXApicPage->lvt_thermal.u.u8Vector, 537 pXApicPage->lvt_thermal.u.u8Vector); 538 pHlp->pfnPrintf(pHlp, " Delivery Mode = %#x (%s)\n", pXApicPage->lvt_thermal.u.u3DeliveryMode, 539 apicGetDeliveryModeName((XAPICDELIVERYMODE)pXApicPage->lvt_thermal.u.u3DeliveryMode)); 540 pHlp->pfnPrintf(pHlp, " Delivery status = %u\n", pXApicPage->lvt_thermal.u.u1DeliveryStatus); 541 pHlp->pfnPrintf(pHlp, " Masked = %RTbool\n", XAPIC_LVT_IS_MASKED(uLvtThermal)); 542 pHlp->pfnPrintf(pHlp, "\n"); 593 /* Thermal sensor. */ 594 { 595 uint32_t const uLvtThermal = pXApicPage->lvt_thermal.all.u32LvtThermal; 596 const uint8_t uMask = XAPIC_LVT_IS_MASKED(uLvtThermal); 597 const uint8_t uDeliveryStatus = uLvtThermal & XAPIC_LVT_DELIVERY_STATUS; 598 const char *pszDeliveryStatus = s_apszLvtDeliveryStatus[uDeliveryStatus]; 599 const XAPICDELIVERYMODE enmDeliveryMode = XAPIC_LVT_GET_DELIVERY_MODE(uLvtThermal); 600 const char *pszDeliveryMode = s_apszLvtDeliveryModes[enmDeliveryMode]; 601 const uint8_t uVector = XAPIC_LVT_GET_VECTOR(uLvtThermal); 602 603 pHlp->pfnPrintf(pHlp, "%-7s %9s %u %5s %1s %8s %4s %6s %u (%#x)\n", 604 "Thermal", 605 pszNotApplicable, /* Timer mode */ 606 uMask, 607 pszNotApplicable, /* TriggerMode */ 608 pszNotApplicable, /* Remote IRR */ 609 pszNotApplicable, /* Polarity */ 610 pszDeliveryStatus, 611 pszDeliveryMode, 612 uVector, 613 uVector); 614 } 543 615 #endif 544 616 545 uint32_t const uLvtPerf = pXApicPage->lvt_perf.all.u32LvtPerf; 546 pHlp->pfnPrintf(pHlp, "LVT Perf = %#RX32\n", uLvtPerf); 547 pHlp->pfnPrintf(pHlp, " Vector = %u (%#x)\n", pXApicPage->lvt_perf.u.u8Vector, pXApicPage->lvt_perf.u.u8Vector); 548 pHlp->pfnPrintf(pHlp, " Delivery Mode = %#x (%s)\n", pXApicPage->lvt_perf.u.u3DeliveryMode, 549 apicGetDeliveryModeName((XAPICDELIVERYMODE)pXApicPage->lvt_perf.u.u3DeliveryMode)); 550 pHlp->pfnPrintf(pHlp, " Delivery status = %u\n", pXApicPage->lvt_perf.u.u1DeliveryStatus); 551 pHlp->pfnPrintf(pHlp, " Masked = %RTbool\n", XAPIC_LVT_IS_MASKED(uLvtPerf)); 552 pHlp->pfnPrintf(pHlp, "\n"); 553 554 uint32_t const uLvtLint0 = pXApicPage->lvt_lint0.all.u32LvtLint0; 555 pHlp->pfnPrintf(pHlp, "LVT LINT0 = %#RX32\n", uLvtLint0); 556 pHlp->pfnPrintf(pHlp, " Vector = %u (%#x)\n", pXApicPage->lvt_lint0.u.u8Vector, pXApicPage->lvt_lint0.u.u8Vector); 557 pHlp->pfnPrintf(pHlp, " Delivery Mode = %#x (%s)\n", pXApicPage->lvt_lint0.u.u3DeliveryMode, 558 apicGetDeliveryModeName((XAPICDELIVERYMODE)pXApicPage->lvt_lint0.u.u3DeliveryMode)); 559 pHlp->pfnPrintf(pHlp, " Delivery status = %u\n", pXApicPage->lvt_lint0.u.u1DeliveryStatus); 560 pHlp->pfnPrintf(pHlp, " Pin polarity = %u\n", pXApicPage->lvt_lint0.u.u1IntrPolarity); 561 pHlp->pfnPrintf(pHlp, " Remote IRR = %u\n", pXApicPage->lvt_lint0.u.u1RemoteIrr); 562 pHlp->pfnPrintf(pHlp, " Trigger Mode = %u (%s)\n", pXApicPage->lvt_lint0.u.u1TriggerMode, 563 apicGetTriggerModeName((XAPICTRIGGERMODE)pXApicPage->lvt_lint0.u.u1TriggerMode)); 564 pHlp->pfnPrintf(pHlp, " Masked = %RTbool\n", XAPIC_LVT_IS_MASKED(uLvtLint0)); 565 pHlp->pfnPrintf(pHlp, "\n"); 566 567 uint32_t const uLvtLint1 = pXApicPage->lvt_lint1.all.u32LvtLint1; 568 pHlp->pfnPrintf(pHlp, "LVT LINT1 = %#RX32\n", uLvtLint1); 569 pHlp->pfnPrintf(pHlp, " Vector = %u (%#x)\n", pXApicPage->lvt_lint1.u.u8Vector, pXApicPage->lvt_lint1.u.u8Vector); 570 pHlp->pfnPrintf(pHlp, " Delivery Mode = %#x (%s)\n", pXApicPage->lvt_lint1.u.u3DeliveryMode, 571 apicGetDeliveryModeName((XAPICDELIVERYMODE)pXApicPage->lvt_lint1.u.u3DeliveryMode)); 572 pHlp->pfnPrintf(pHlp, " Delivery status = %u\n", pXApicPage->lvt_lint1.u.u1DeliveryStatus); 573 pHlp->pfnPrintf(pHlp, " Pin polarity = %u\n", pXApicPage->lvt_lint1.u.u1IntrPolarity); 574 pHlp->pfnPrintf(pHlp, " Remote IRR = %u\n", pXApicPage->lvt_lint1.u.u1RemoteIrr); 575 pHlp->pfnPrintf(pHlp, " Trigger Mode = %u (%s)\n", pXApicPage->lvt_lint1.u.u1TriggerMode, 576 apicGetTriggerModeName((XAPICTRIGGERMODE)pXApicPage->lvt_lint1.u.u1TriggerMode)); 577 pHlp->pfnPrintf(pHlp, " Masked = %RTbool\n", XAPIC_LVT_IS_MASKED(uLvtLint1)); 578 pHlp->pfnPrintf(pHlp, "\n"); 579 580 uint32_t const uLvtError = pXApicPage->lvt_error.all.u32LvtError; 581 pHlp->pfnPrintf(pHlp, "LVT Error = %#RX32\n", uLvtError); 582 pHlp->pfnPrintf(pHlp, " Vector = %u (%#x)\n", pXApicPage->lvt_error.u.u8Vector, pXApicPage->lvt_error.u.u8Vector); 583 pHlp->pfnPrintf(pHlp, " Delivery status = %u\n", pXApicPage->lvt_error.u.u1DeliveryStatus); 584 pHlp->pfnPrintf(pHlp, " Masked = %RTbool\n", XAPIC_LVT_IS_MASKED(uLvtError)); 585 pHlp->pfnPrintf(pHlp, "\n"); 617 /* Performance Monitor Counters. */ 618 { 619 uint32_t const uLvtPerf = pXApicPage->lvt_thermal.all.u32LvtThermal; 620 const uint8_t uMask = XAPIC_LVT_IS_MASKED(uLvtPerf); 621 const uint8_t uDeliveryStatus = uLvtPerf & XAPIC_LVT_DELIVERY_STATUS; 622 const char *pszDeliveryStatus = s_apszLvtDeliveryStatus[uDeliveryStatus]; 623 const XAPICDELIVERYMODE enmDeliveryMode = XAPIC_LVT_GET_DELIVERY_MODE(uLvtPerf); 624 const char *pszDeliveryMode = s_apszLvtDeliveryModes[enmDeliveryMode]; 625 const uint8_t uVector = XAPIC_LVT_GET_VECTOR(uLvtPerf); 626 627 pHlp->pfnPrintf(pHlp, "%-7s %9s %u %5s %1s %8s %4s %6s %u (%#x)\n", 628 "Perf", 629 pszNotApplicable, /* Timer mode */ 630 uMask, 631 pszNotApplicable, /* TriggerMode */ 632 pszNotApplicable, /* Remote IRR */ 633 pszNotApplicable, /* Polarity */ 634 pszDeliveryStatus, 635 pszDeliveryMode, 636 uVector, 637 uVector); 638 } 639 640 /* LINT0, LINT1. */ 641 { 642 /* LINTx name. */ 643 static const char * const s_apszLvtLint[] = 644 { 645 "LINT0", 646 "LINT1" 647 }; 648 /* Trigger mode. */ 649 static const char * const s_apszLvtTriggerModes[] = 650 { 651 "Edge ", 652 "Level" 653 }; 654 /* Polarity. */ 655 static const char * const s_apszLvtPolarity[] = 656 { 657 "ActiveHi", 658 "ActiveLo" 659 }; 660 661 uint32_t aLvtLint[2]; 662 aLvtLint[0] = pXApicPage->lvt_lint0.all.u32LvtLint0; 663 aLvtLint[1] = pXApicPage->lvt_lint1.all.u32LvtLint1; 664 for (size_t i = 0; i < RT_ELEMENTS(aLvtLint); i++) 665 { 666 uint32_t const uLvtLint = aLvtLint[i]; 667 const char *pszLint = s_apszLvtLint[i]; 668 const uint8_t uMask = XAPIC_LVT_IS_MASKED(uLvtLint); 669 const XAPICTRIGGERMODE enmTriggerMode = XAPIC_LVT_GET_TRIGGER_MODE(uLvtLint); 670 const char *pszTriggerMode = s_apszLvtTriggerModes[enmTriggerMode]; 671 const uint8_t uRemoteIrr = XAPIC_LVT_GET_REMOTE_IRR(uLvtLint); 672 const uint8_t uPolarity = XAPIC_LVT_GET_POLARITY(uLvtLint); 673 const char *pszPolarity = s_apszLvtPolarity[uPolarity]; 674 const uint8_t uDeliveryStatus = uLvtLint & XAPIC_LVT_DELIVERY_STATUS; 675 const char *pszDeliveryStatus = s_apszLvtDeliveryStatus[uDeliveryStatus]; 676 const XAPICDELIVERYMODE enmDeliveryMode = XAPIC_LVT_GET_DELIVERY_MODE(uLvtLint); 677 const char *pszDeliveryMode = s_apszLvtDeliveryModes[enmDeliveryMode]; 678 const uint8_t uVector = XAPIC_LVT_GET_VECTOR(uLvtLint); 679 680 pHlp->pfnPrintf(pHlp, "%-7s %9s %u %5s %u %8s %4s %6s %u (%#x)\n", 681 pszLint, 682 pszNotApplicable, /* Timer mode */ 683 uMask, 684 pszTriggerMode, 685 uRemoteIrr, 686 pszPolarity, 687 pszDeliveryStatus, 688 pszDeliveryMode, 689 uVector, 690 uVector); 691 } 692 } 693 694 /* Error. */ 695 { 696 uint32_t const uLvtError = pXApicPage->lvt_thermal.all.u32LvtThermal; 697 const uint8_t uMask = XAPIC_LVT_IS_MASKED(uLvtError); 698 const uint8_t uDeliveryStatus = uLvtError & XAPIC_LVT_DELIVERY_STATUS; 699 const char *pszDeliveryStatus = s_apszLvtDeliveryStatus[uDeliveryStatus]; 700 const XAPICDELIVERYMODE enmDeliveryMode = XAPIC_LVT_GET_DELIVERY_MODE(uLvtError); 701 const char *pszDeliveryMode = s_apszLvtDeliveryModes[enmDeliveryMode]; 702 const uint8_t uVector = XAPIC_LVT_GET_VECTOR(uLvtError); 703 704 pHlp->pfnPrintf(pHlp, "%-7s %9s %u %5s %1s %8s %4s %6s %u (%#x)\n", 705 "Error", 706 pszNotApplicable, /* Timer mode */ 707 uMask, 708 pszNotApplicable, /* TriggerMode */ 709 pszNotApplicable, /* Remote IRR */ 710 pszNotApplicable, /* Polarity */ 711 pszDeliveryStatus, 712 pszDeliveryMode, 713 uVector, 714 uVector); 715 } 586 716 } 587 717 … … 597 727 { 598 728 NOREF(pszArgs); 599 PVMCPU pVCpu = VMMGetCpu(pVM); AssertFatalMsg(pVCpu, ("Invalid EMT thread. pVCpu=%p\n", pVCpu)); 729 PVMCPU pVCpu = VMMGetCpu(pVM); 730 if (!pVCpu) 731 pVCpu = &pVM->aCpus[0]; 732 600 733 PCXAPICPAGE pXApicPage = VMCPU_TO_CXAPICPAGE(pVCpu); 601 734 PCAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu); … … 607 740 pHlp->pfnPrintf(pHlp, " Timer shift = %#x\n", apicGetTimerShift(pXApicPage)); 608 741 pHlp->pfnPrintf(pHlp, " Timer initial TS = %#RU64\n", pApicCpu->u64TimerInitial); 609 pHlp->pfnPrintf(pHlp, "\n");610 611 742 apicR3InfoLvtTimer(pVCpu, pHlp); 612 743 } … … 1638 1769 * not just used during live debugging via the VM debugger. 1639 1770 */ 1640 rc = DBGFR3InfoRegisterInternalEx(pVM, "apic", "Dumps APIC basic information.", apicR3Info, DBGFINFO_FLAGS_ RUN_ON_EMT);1641 rc |= DBGFR3InfoRegisterInternalEx(pVM, "apiclvt", "Dumps APIC LVT information.", apicR3InfoLvt, DBGFINFO_FLAGS_ RUN_ON_EMT);1642 rc |= DBGFR3InfoRegisterInternalEx(pVM, "apictimer", "Dumps APIC timer information.", apicR3InfoTimer, DBGFINFO_FLAGS_ RUN_ON_EMT);1771 rc = DBGFR3InfoRegisterInternalEx(pVM, "apic", "Dumps APIC basic information.", apicR3Info, DBGFINFO_FLAGS_ALL_EMTS); 1772 rc |= DBGFR3InfoRegisterInternalEx(pVM, "apiclvt", "Dumps APIC LVT information.", apicR3InfoLvt, DBGFINFO_FLAGS_ALL_EMTS); 1773 rc |= DBGFR3InfoRegisterInternalEx(pVM, "apictimer", "Dumps APIC timer information.", apicR3InfoTimer, DBGFINFO_FLAGS_ALL_EMTS); 1643 1774 AssertRCReturn(rc, rc); 1644 1775
Note:
See TracChangeset
for help on using the changeset viewer.