VirtualBox

Changeset 57158 in vbox


Ignore:
Timestamp:
Aug 3, 2015 1:47:44 PM (10 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
101904
Message:

VMM/GIM: Add support for Hyper-V guest-crash reporting. Better logging for Guest-OS identity MSR.

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/include/VBox/vmm/vm.h

    r56628 r57158  
    11461146        struct GIM s;
    11471147#endif
    1148         uint8_t     padding[256];        /* multiple of 64 */
     1148        uint8_t     padding[320];        /* multiple of 64 */
    11491149    } gim;
    11501150
     
    11711171
    11721172    /** Padding for aligning the cpu array on a page boundary. */
    1173     uint8_t         abAlignment2[94];
     1173    uint8_t         abAlignment2[30];
    11741174
    11751175    /* ---- end small stuff ---- */
  • TabularUnified trunk/src/VBox/VMM/VMMAll/GIMAllHv.cpp

    r56875 r57158  
    7979
    8080/**
     81 * Gets the descriptive OS ID variant as identified via the
     82 * MSR_GIM_HV_GUEST_OS_ID MSR.
     83 *
     84 * @returns The name.
     85 * @param   uGuestOsIdMsr     The MSR_GIM_HV_GUEST_OS_ID MSR.
     86 */
     87static const char *gimHvGetGuestOsIdVariantName(uint64_t uGuestOsIdMsr)
     88{
     89    /* Refer the Hyper-V spec, section 3.6 "Reporting the Guest OS Identity". */
     90    uint32_t uVendor = MSR_GIM_HV_GUEST_OS_ID_VENDOR(uGuestOsIdMsr);
     91    if (uVendor == 1 /* Microsoft */)
     92    {
     93        uint32_t uOsVariant = MSR_GIM_HV_GUEST_OS_ID_OS_VARIANT(uGuestOsIdMsr);
     94        switch (uOsVariant)
     95        {
     96            case 0:  return "Undefined";
     97            case 1:  return "MS-DOS";
     98            case 2:  return "Windows 3.x";
     99            case 3:  return "Windows 9x";
     100            case 4:  return "Windows NT or derivative";
     101            case 5:  return "Windows CE";
     102            default: return "Unknown";
     103        }
     104    }
     105    return "Unknown";
     106}
     107
     108
     109/**
    81110 * MSR read handler for Hyper-V.
    82111 *
     
    151180            *puValue = 0;
    152181            return VINF_SUCCESS;
     182
     183        case MSR_GIM_HV_CRASH_CTL:
     184            *puValue = pHv->uCrashCtl;
     185            return VINF_SUCCESS;
     186
     187        case MSR_GIM_HV_CRASH_P0: *puValue = pHv->uCrashP0;   return VINF_SUCCESS;
     188        case MSR_GIM_HV_CRASH_P1: *puValue = pHv->uCrashP1;   return VINF_SUCCESS;
     189        case MSR_GIM_HV_CRASH_P2: *puValue = pHv->uCrashP2;   return VINF_SUCCESS;
     190        case MSR_GIM_HV_CRASH_P3: *puValue = pHv->uCrashP3;   return VINF_SUCCESS;
     191        case MSR_GIM_HV_CRASH_P4: *puValue = pHv->uCrashP4;   return VINF_SUCCESS;
    153192
    154193        default:
     
    211250                pHv->u64HypercallMsr &= ~MSR_GIM_HV_HYPERCALL_ENABLE_BIT;
    212251            }
     252            else
     253            {
     254                LogRel(("GIM: HyperV: Guest OS reported ID %#RX64\n", uRawValue));
     255                LogRel(("GIM: HyperV: Open-source=%RTbool Vendor=%#x OS=%#x (%s) Major=%u Minor=%u ServicePack=%u Build=%u\n",
     256                        MSR_GIM_HV_GUEST_OS_ID_IS_OPENSOURCE(uRawValue),   MSR_GIM_HV_GUEST_OS_ID_VENDOR(uRawValue),
     257                        MSR_GIM_HV_GUEST_OS_ID_OS_VARIANT(uRawValue),      gimHvGetGuestOsIdVariantName(uRawValue),
     258                        MSR_GIM_HV_GUEST_OS_ID_MAJOR_VERSION(uRawValue),   MSR_GIM_HV_GUEST_OS_ID_MINOR_VERSION(uRawValue),
     259                        MSR_GIM_HV_GUEST_OS_ID_SERVICE_VERSION(uRawValue), MSR_GIM_HV_GUEST_OS_ID_BUILD(uRawValue)));
     260            }
    213261            pHv->u64GuestOsIdMsr = uRawValue;
    214262            return VINF_SUCCESS;
     
    298346            if (MSR_GIM_HV_RESET_IS_SET(uRawValue))
    299347            {
    300                 LogRel(("GIM: HyperV: Reset initiated through MSR.\n"));
     348                LogRel(("GIM: HyperV: Reset initiated through MSR\n"));
    301349                int rc = PDMDevHlpVMReset(pVM->gim.s.pDevInsR3);
    302350                AssertRC(rc);
     
    306354#endif /* IN_RING3 */
    307355        }
     356
     357        case MSR_GIM_HV_CRASH_CTL:
     358        {
     359#ifndef IN_RING3
     360            return VINF_CPUM_R3_MSR_WRITE;
     361#else
     362            if (uRawValue & MSR_GIM_HV_CRASH_CTL_NOTIFY_BIT)
     363            {
     364                LogRel(("GIM: HyperV: Guest indicates a fatal condition! P0=%#RX64 P1=%#RX64 P2=%#RX64 P3=%#RX64 P4=%#RX64\n",
     365                        pHv->uCrashP0, pHv->uCrashP1, pHv->uCrashP2, pHv->uCrashP3, pHv->uCrashP4));
     366            }
     367            return VINF_SUCCESS;
     368#endif
     369        }
     370
     371        case MSR_GIM_HV_CRASH_P0:  pHv->uCrashP0 = uRawValue;  return VINF_SUCCESS;
     372        case MSR_GIM_HV_CRASH_P1:  pHv->uCrashP1 = uRawValue;  return VINF_SUCCESS;
     373        case MSR_GIM_HV_CRASH_P2:  pHv->uCrashP2 = uRawValue;  return VINF_SUCCESS;
     374        case MSR_GIM_HV_CRASH_P3:  pHv->uCrashP3 = uRawValue;  return VINF_SUCCESS;
     375        case MSR_GIM_HV_CRASH_P4:  pHv->uCrashP4 = uRawValue;  return VINF_SUCCESS;
    308376
    309377        case MSR_GIM_HV_TIME_REF_COUNT:     /* Read-only MSRs. */
  • TabularUnified trunk/src/VBox/VMM/VMMR3/GIMHv.cpp

    r56758 r57158  
    117117
    118118        /* Miscellaneous features. */
    119         pHv->uMiscFeat = GIM_HV_MISC_FEAT_TIMER_FREQ;
     119        pHv->uMiscFeat = GIM_HV_MISC_FEAT_TIMER_FREQ
     120                       | GIM_HV_MISC_FEAT_GUEST_CRASH_MSRS;
    120121
    121122        /* Hypervisor recommendations to the guest. */
     
    227228    }
    228229
     230    /*
     231     * Setup non-zero MSRs.
     232     */
     233    if (pHv->uMiscFeat & GIM_HV_MISC_FEAT_GUEST_CRASH_MSRS)
     234        pHv->uCrashCtl = MSR_GIM_HV_CRASH_CTL_NOTIFY_BIT;
     235
    229236    return VINF_SUCCESS;
    230237}
  • TabularUnified trunk/src/VBox/VMM/include/GIMHvInternal.h

    r56694 r57158  
    421421/** @} */
    422422
     423/** @name Hyper-V MSR - Guest crash control (MSR_GIM_HV_CRASH_CTL).
     424 * @{
     425 */
     426/** The Crash Notify bit. */
     427#define MSR_GIM_HV_CRASH_CTL_NOTIFY_BIT           RT_BIT_64(63)
     428/** @} */
     429
     430/** @name Hyper-V MSR - Guest OS ID (MSR_GIM_HV_GUEST_OS_ID).
     431 * @{
     432 */
     433/** An open-source operating system. */
     434#define MSR_GIM_HV_GUEST_OS_ID_IS_OPENSOURCE(a)   RT_BOOL((a) & RT_BIT_64(63))
     435/** Vendor ID. */
     436#define MSR_GIM_HV_GUEST_OS_ID_VENDOR(a)          (((a) >> 48) & 0xfff)
     437/** Guest OS variant, depending on the vendor ID.  */
     438#define MSR_GIM_HV_GUEST_OS_ID_OS_VARIANT(a)      (((a) >> 40) & 0xff)
     439/** Guest OS major version. */
     440#define MSR_GIM_HV_GUEST_OS_ID_MAJOR_VERSION(a)   (((a) >> 32) & 0xff)
     441/** Guest OS minor version. */
     442#define MSR_GIM_HV_GUEST_OS_ID_MINOR_VERSION(a)   (((a) >> 24) & 0xff)
     443/** Guest OS service version (e.g. service pack number in case of Windows). */
     444#define MSR_GIM_HV_GUEST_OS_ID_SERVICE_VERSION(a) (((a) >> 16) & 0xff)
     445/** Guest OS build number. */
     446#define MSR_GIM_HV_GUEST_OS_ID_BUILD(a)           ((a) & 0xffff)
     447/** @} */
     448
    423449/** Hyper-V page size.  */
    424450#define GIM_HV_PAGE_SIZE                          0x1000
     
    483509    /** @} */
    484510
     511    /** @name Guest Crash MSRs.
     512     *  @{
     513     */
     514    /** Guest crash control MSR. */
     515    uint64_t                    uCrashCtl;
     516    /** Guest crash parameter 0 MSR. */
     517    uint64_t                    uCrashP0;
     518    /** Guest crash parameter 1 MSR. */
     519    uint64_t                    uCrashP1;
     520    /** Guest crash parameter 2 MSR. */
     521    uint64_t                    uCrashP2;
     522    /** Guest crash parameter 3 MSR. */
     523    uint64_t                    uCrashP3;
     524    /** Guest crash parameter 4 MSR. */
     525    uint64_t                    uCrashP4;
     526    /** @} */
     527
    485528    /** Per-VM R0 Spinlock for protecting EMT writes to the TSC page. */
    486529    RTSPINLOCK                  hSpinlockR0;
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette