Index: /trunk/include/VBox/vmm/dbgf.h
===================================================================
--- /trunk/include/VBox/vmm/dbgf.h	(revision 35605)
+++ /trunk/include/VBox/vmm/dbgf.h	(revision 35606)
@@ -1404,4 +1404,8 @@
 typedef DBGFREGENTRY const *PCDBGFREGENTRY;
 
+/** Used with DBGFR3Reg* to indicate the hypervisor register set instead of the
+ *  guest. */
+#define DBGFREG_HYPER_VMCPUID       UINT32_C(0x01000000)
+
 VMMR3DECL(int) DBGFR3RegCpuQueryU8(  PVM pVM, VMCPUID idCpu, DBGFREG enmReg, uint8_t     *pu8);
 VMMR3DECL(int) DBGFR3RegCpuQueryU16( PVM pVM, VMCPUID idCpu, DBGFREG enmReg, uint16_t    *pu16);
@@ -1411,4 +1415,5 @@
 VMMR3DECL(int) DBGFR3RegCpuQueryLrd( PVM pVM, VMCPUID idCpu, DBGFREG enmReg, long double *plrd);
 VMMR3DECL(int) DBGFR3RegCpuQueryXdtr(PVM pVM, VMCPUID idCpu, DBGFREG enmReg, uint64_t *pu64Base, uint16_t *pu16Limit);
+#if 0
 VMMR3DECL(int) DBGFR3RegCpuQueryBatch(PVM pVM,VMCPUID idCpu, PDBGFREGENTRY paRegs, size_t cRegs);
 VMMR3DECL(int) DBGFR3RegCpuQueryAll( PVM pVM, VMCPUID idCpu, PDBGFREGENTRY paRegs, size_t cRegs);
@@ -1421,9 +1426,10 @@
 VMMR3DECL(int) DBGFR3RegCpuSetLrd(   PVM pVM, VMCPUID idCpu, DBGFREG enmReg, long double lrd);
 VMMR3DECL(int) DBGFR3RegCpuSetBatch( PVM pVM, VMCPUID idCpu, PCDBGFREGENTRY paRegs, size_t cRegs);
+#endif
 
 VMMR3DECL(const char *) DBGFR3RegCpuName(PVM pVM, DBGFREG enmReg, DBGFREGVALTYPE enmType);
 
 VMMR3_INT_DECL(int) DBGFR3RegRegisterCpu(PVM pVM, PVMCPU pVCpu, PCDBGFREGDESC paRegisters, bool fGuestRegs);
-VMMR3DECL(int) DBGFR3RegRegisterDevice(PVM pVM, PCDBGFREGDESC paRegisters, PPDMDEVINS pDevIns, const char *pszPrefix, uint32_t iInstance);
+VMMR3DECL(int)      DBGFR3RegRegisterDevice(PVM pVM, PCDBGFREGDESC paRegisters, PPDMDEVINS pDevIns, const char *pszPrefix, uint32_t iInstance);
 
 /**
@@ -1455,6 +1461,4 @@
 VMMR3DECL(int) DBGFR3RegNmQueryAllCount(PVM pVM, size_t *pcRegs);
 VMMR3DECL(int) DBGFR3RegNmQueryAll( PVM pVM,                   PDBGFREGENTRYNM paRegs, size_t cRegs);
-VMMR3DECL(int) DBGFR3RegNmPrintf(   PVM pVM, VMCPUID idDefCpu, char *pszBuf, size_t cbBuf, const char *pszFormat, ...);
-VMMR3DECL(int) DBGFR3RegNmPrintfV(  PVM pVM, VMCPUID idDefCpu, char *pszBuf, size_t cbBuf, const char *pszFormat, va_list va);
 
 VMMR3DECL(int) DBGFR3RegNmSetU8(    PVM pVM, VMCPUID idDefCpu, const char *pszReg, uint8_t     u8);
@@ -1467,4 +1471,7 @@
 
 /** @todo add enumeration methods.  */
+
+VMMR3DECL(int) DBGFR3RegPrintf( PVM pVM, VMCPUID idDefCpu, char *pszBuf, size_t cbBuf, const char *pszFormat, ...);
+VMMR3DECL(int) DBGFR3RegPrintfV(PVM pVM, VMCPUID idDefCpu, char *pszBuf, size_t cbBuf, const char *pszFormat, va_list va);
 
 
Index: /trunk/src/VBox/VMM/VMMR3/DBGFReg.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/DBGFReg.cpp	(revision 35605)
+++ /trunk/src/VBox/VMM/VMMR3/DBGFReg.cpp	(revision 35606)
@@ -178,4 +178,6 @@
     /** The target CPU. */
     VMCPUID     idCpu;
+    /** Set if we're looking at guest registers. */
+    bool        fGuestRegs;
     /** The output buffer. */
     char       *pszBuf;
@@ -784,7 +786,10 @@
  * @param   enmReg              The register to query.
  * @param   enmType             The desired return type.
+ * @param   fGuestRegs          Query guest CPU registers if set (true),
+ *                              hypervisor CPU registers if clear (false).
  * @param   pValue              Where to return the register value.
  */
-static DECLCALLBACK(int) dbgfR3RegCpuQueryWorker(PVM pVM, VMCPUID idCpu, DBGFREG enmReg, DBGFREGVALTYPE enmType, PDBGFREGVAL pValue)
+static DECLCALLBACK(int) dbgfR3RegCpuQueryWorkerOnCpu(PVM pVM, VMCPUID idCpu, DBGFREG enmReg, DBGFREGVALTYPE enmType,
+                                                      bool fGuestRegs, PDBGFREGVAL pValue)
 {
     int rc = VINF_SUCCESS;
@@ -794,5 +799,7 @@
      * Look up the register set of the specified CPU.
      */
-    PDBGFREGSET pSet = pVM->aCpus[idCpu].dbgf.s.pGuestRegSet;
+    PDBGFREGSET pSet = fGuestRegs
+                     ? pVM->aCpus[idCpu].dbgf.s.pGuestRegSet
+                     : pVM->aCpus[idCpu].dbgf.s.pHyperRegSet;
     if (RT_LIKELY(pSet))
     {
@@ -830,37 +837,7 @@
 
 /**
- * Queries a 8-bit CPU register value.
- *
- * @retval  VINF_SUCCESS
- * @retval  VERR_INVALID_VM_HANDLE
- * @retval  VERR_INVALID_CPU_ID
- * @retval  VERR_DBGF_REGISTER_NOT_FOUND
- * @retval  VERR_DBGF_UNSUPPORTED_CAST
- * @retval  VINF_DBGF_TRUNCATED_REGISTER
- *
- * @param   pVM                 The VM handle.
- * @param   idCpu               The target CPU ID.
- * @param   enmReg              The register that's being queried.
- * @param   pu8                 Where to store the register value.
- */
-VMMR3DECL(int) DBGFR3RegCpuQueryU8(PVM pVM, VMCPUID idCpu, DBGFREG enmReg, uint8_t *pu8)
-{
-    VM_ASSERT_VALID_EXT_RETURN(pVM, VERR_INVALID_VM_HANDLE);
-    AssertReturn(idCpu < pVM->cCpus, VERR_INVALID_CPU_ID);
-
-    DBGFREGVAL Value;
-    int rc = VMR3ReqCallWait(pVM, idCpu, (PFNRT)dbgfR3RegCpuQueryWorker, 5, pVM, idCpu, enmReg, DBGFREGVALTYPE_U8, &Value);
-    if (RT_SUCCESS(rc))
-        *pu8 = Value.u8;
-    else
-        *pu8 = 0;
-
-    return rc;
-}
-
-
-/**
- * Queries a 16-bit CPU register value.
- *
+ * Internal worker for the CPU register query functions.
+ *
+ * @returns VBox status code.
  * @retval  VINF_SUCCESS
  * @retval  VERR_INVALID_VM_HANDLE
@@ -872,20 +849,48 @@
  *
  * @param   pVM                 The VM handle.
- * @param   idCpu               The target CPU ID.
+ * @param   idCpu               The virtual CPU ID.  Can be OR'ed with
+ *                              DBGFREG_HYPER_VMCPUID.
+ * @param   enmReg              The register to query.
+ * @param   enmType             The desired return type.
+ * @param   pValue              Where to return the register value.
+ */
+static int dbgfR3RegCpuQueryWorker(PVM pVM, VMCPUID idCpu, DBGFREG enmReg, DBGFREGVALTYPE enmType, PDBGFREGVAL pValue)
+{
+    VM_ASSERT_VALID_EXT_RETURN(pVM, VERR_INVALID_VM_HANDLE);
+    AssertMsgReturn(enmReg >= DBGFREG_AL && enmReg <= DBGFREG_END, ("%d\n", enmReg), VERR_INVALID_PARAMETER);
+
+    bool const fGuestRegs = idCpu & DBGFREG_HYPER_VMCPUID;
+    idCpu &= ~DBGFREG_HYPER_VMCPUID;
+    AssertReturn(idCpu < pVM->cCpus, VERR_INVALID_CPU_ID);
+
+    return VMR3ReqCallWait(pVM, idCpu, (PFNRT)dbgfR3RegCpuQueryWorkerOnCpu, 6,
+                           pVM, idCpu, enmReg, enmType, fGuestRegs, pValue);
+}
+
+
+/**
+ * Queries a 8-bit CPU register value.
+ *
+ * @retval  VINF_SUCCESS
+ * @retval  VERR_INVALID_VM_HANDLE
+ * @retval  VERR_INVALID_CPU_ID
+ * @retval  VERR_DBGF_REGISTER_NOT_FOUND
+ * @retval  VERR_DBGF_UNSUPPORTED_CAST
+ * @retval  VINF_DBGF_TRUNCATED_REGISTER
+ *
+ * @param   pVM                 The VM handle.
+ * @param   idCpu               The target CPU ID. Can be OR'ed with
+ *                              DBGFREG_HYPER_VMCPUID.
  * @param   enmReg              The register that's being queried.
- * @param   pu16                Where to store the register value.
- */
-VMMR3DECL(int) DBGFR3RegCpuQueryU16(PVM pVM, VMCPUID idCpu, DBGFREG enmReg, uint16_t *pu16)
-{
-    VM_ASSERT_VALID_EXT_RETURN(pVM, VERR_INVALID_VM_HANDLE);
-    AssertReturn(idCpu < pVM->cCpus, VERR_INVALID_CPU_ID);
-
+ * @param   pu8                 Where to store the register value.
+ */
+VMMR3DECL(int) DBGFR3RegCpuQueryU8(PVM pVM, VMCPUID idCpu, DBGFREG enmReg, uint8_t *pu8)
+{
     DBGFREGVAL Value;
-    int rc = VMR3ReqCallWait(pVM, idCpu, (PFNRT)dbgfR3RegCpuQueryWorker, 5, pVM, idCpu, enmReg, DBGFREGVALTYPE_U16, &Value);
+    int rc = dbgfR3RegCpuQueryWorker(pVM, idCpu, enmReg, DBGFREGVALTYPE_U8, &Value);
     if (RT_SUCCESS(rc))
-        *pu16 = Value.u16;
+        *pu8 = Value.u8;
     else
-        *pu16 = 0;
-
+        *pu8 = 0;
     return rc;
 }
@@ -893,5 +898,5 @@
 
 /**
- * Queries a 32-bit CPU register value.
+ * Queries a 16-bit CPU register value.
  *
  * @retval  VINF_SUCCESS
@@ -904,20 +909,17 @@
  *
  * @param   pVM                 The VM handle.
- * @param   idCpu               The target CPU ID.
+ * @param   idCpu               The target CPU ID.  Can be OR'ed with
+ *                              DBGFREG_HYPER_VMCPUID.
  * @param   enmReg              The register that's being queried.
- * @param   pu32                Where to store the register value.
- */
-VMMR3DECL(int) DBGFR3RegCpuQueryU32(PVM pVM, VMCPUID idCpu, DBGFREG enmReg, uint32_t *pu32)
-{
-    VM_ASSERT_VALID_EXT_RETURN(pVM, VERR_INVALID_VM_HANDLE);
-    AssertReturn(idCpu < pVM->cCpus, VERR_INVALID_CPU_ID);
-
+ * @param   pu16                Where to store the register value.
+ */
+VMMR3DECL(int) DBGFR3RegCpuQueryU16(PVM pVM, VMCPUID idCpu, DBGFREG enmReg, uint16_t *pu16)
+{
     DBGFREGVAL Value;
-    int rc = VMR3ReqCallWait(pVM, idCpu, (PFNRT)dbgfR3RegCpuQueryWorker, 5, pVM, idCpu, enmReg, DBGFREGVALTYPE_U32, &Value);
+    int rc = dbgfR3RegCpuQueryWorker(pVM, idCpu, enmReg, DBGFREGVALTYPE_U16, &Value);
     if (RT_SUCCESS(rc))
-        *pu32 = Value.u32;
+        *pu16 = Value.u16;
     else
-        *pu32 = 0;
-
+        *pu16 = 0;
     return rc;
 }
@@ -925,5 +927,5 @@
 
 /**
- * Queries a 64-bit CPU register value.
+ * Queries a 32-bit CPU register value.
  *
  * @retval  VINF_SUCCESS
@@ -936,5 +938,35 @@
  *
  * @param   pVM                 The VM handle.
- * @param   idCpu               The target CPU ID.
+ * @param   idCpu               The target CPU ID.  Can be OR'ed with
+ *                              DBGFREG_HYPER_VMCPUID.
+ * @param   enmReg              The register that's being queried.
+ * @param   pu32                Where to store the register value.
+ */
+VMMR3DECL(int) DBGFR3RegCpuQueryU32(PVM pVM, VMCPUID idCpu, DBGFREG enmReg, uint32_t *pu32)
+{
+    DBGFREGVAL Value;
+    int rc = dbgfR3RegCpuQueryWorker(pVM, idCpu, enmReg, DBGFREGVALTYPE_U32, &Value);
+    if (RT_SUCCESS(rc))
+        *pu32 = Value.u32;
+    else
+        *pu32 = 0;
+    return rc;
+}
+
+
+/**
+ * Queries a 64-bit CPU register value.
+ *
+ * @retval  VINF_SUCCESS
+ * @retval  VERR_INVALID_VM_HANDLE
+ * @retval  VERR_INVALID_CPU_ID
+ * @retval  VERR_DBGF_REGISTER_NOT_FOUND
+ * @retval  VERR_DBGF_UNSUPPORTED_CAST
+ * @retval  VINF_DBGF_TRUNCATED_REGISTER
+ * @retval  VINF_DBGF_ZERO_EXTENDED_REGISTER
+ *
+ * @param   pVM                 The VM handle.
+ * @param   idCpu               The target CPU ID.  Can be OR'ed with
+ *                              DBGFREG_HYPER_VMCPUID.
  * @param   enmReg              The register that's being queried.
  * @param   pu64                Where to store the register value.
@@ -942,17 +974,14 @@
 VMMR3DECL(int) DBGFR3RegCpuQueryU64(PVM pVM, VMCPUID idCpu, DBGFREG enmReg, uint64_t *pu64)
 {
-    VM_ASSERT_VALID_EXT_RETURN(pVM, VERR_INVALID_VM_HANDLE);
-    AssertReturn(idCpu < pVM->cCpus, VERR_INVALID_CPU_ID);
-
     DBGFREGVAL Value;
-    int rc = VMR3ReqCallWait(pVM, idCpu, (PFNRT)dbgfR3RegCpuQueryWorker, 5, pVM, idCpu, enmReg, DBGFREGVALTYPE_U64, &Value);
+    int rc = dbgfR3RegCpuQueryWorker(pVM, idCpu, enmReg, DBGFREGVALTYPE_U64, &Value);
     if (RT_SUCCESS(rc))
         *pu64 = Value.u64;
     else
         *pu64 = 0;
-
     return rc;
 }
 
+#if 0 /* rewrite / remove */
 
 /**
@@ -1043,5 +1072,6 @@
  *
  * @param   pVM                 The VM handle.
- * @param   idCpu               The target CPU ID.
+ * @param   idCpu               The target CPU ID.  Can be OR'ed with
+ *                              DBGFREG_HYPER_VMCPUID.
  * @param   paRegs              Pointer to an array of @a cRegs elements.  On
  *                              input the enmReg members indicates which
@@ -1078,5 +1108,6 @@
  *
  * @param   pVM                 The VM handle.
- * @param   idCpu               The target CPU ID.
+ * @param   idCpu               The target CPU ID.  Can be OR'ed with
+ *                              DBGFREG_HYPER_VMCPUID.
  * @param   paRegs              Pointer to an array of @a cRegs elements.
  *                              These will be filled with the CPU register
@@ -1114,5 +1145,5 @@
 }
 
-
+#endif /* rewrite or remove? */
 
 /**
@@ -1193,6 +1224,8 @@
  * @param   idDefCpu            The default CPU ID set.
  * @param   pszReg              The register name.
- */
-static PCDBGFREGLOOKUP dbgfR3RegResolve(PVM pVM, VMCPUID idDefCpu, const char *pszReg)
+ * @param   fGuestRegs          Default to guest CPU registers if set, the
+ *                              hypervisor CPU registers if clear.
+ */
+static PCDBGFREGLOOKUP dbgfR3RegResolve(PVM pVM, VMCPUID idDefCpu, const char *pszReg, bool fGuestRegs)
 {
     DBGF_REG_DB_LOCK_READ(pVM);
@@ -1213,5 +1246,5 @@
         {
             /* Prefix it with the specified CPU set. */
-            size_t cchCpuSet = RTStrPrintf(szName, sizeof(szName), "cpu%u.", idDefCpu);
+            size_t cchCpuSet = RTStrPrintf(szName, sizeof(szName), fGuestRegs ? "cpu%u." : "hypercpu%u.", idDefCpu);
             dbgfR3RegCopyToLower(pszReg, RTSTR_MAX, &szName[cchCpuSet], sizeof(szName) - cchCpuSet);
             pLookupRec = (PCDBGFREGLOOKUP)RTStrSpaceGet(&pVM->dbgf.s.RegSpace, szName);
@@ -1345,5 +1378,5 @@
  * @param   pVM                 The VM handle.
  * @param   idDefCpu            The virtual CPU ID for the default CPU register
- *                              set.
+ *                              set.  Can be OR'ed with DBGFREG_HYPER_VMCPUID.
  * @param   pszReg              The register to query.
  * @param   enmType             The desired return type.
@@ -1359,5 +1392,5 @@
      */
     VM_ASSERT_VALID_EXT_RETURN(pVM, VERR_INVALID_VM_HANDLE);
-    AssertReturn(idDefCpu < pVM->cCpus || idDefCpu == VMCPUID_ANY, VERR_INVALID_CPU_ID);
+    AssertReturn((idDefCpu & ~DBGFREG_HYPER_VMCPUID) < pVM->cCpus || idDefCpu == VMCPUID_ANY, VERR_INVALID_CPU_ID);
     AssertPtrReturn(pszReg, VERR_INVALID_POINTER);
 
@@ -1368,9 +1401,12 @@
      * Resolve the register and call the getter on the relevant CPU.
      */
-    PCDBGFREGLOOKUP pLookupRec = dbgfR3RegResolve(pVM, idDefCpu, pszReg);
+    bool const fGuestRegs = !(idDefCpu & DBGFREG_HYPER_VMCPUID) && idDefCpu != VMCPUID_ANY;
+    PCDBGFREGLOOKUP pLookupRec = dbgfR3RegResolve(pVM, idDefCpu, pszReg, fGuestRegs);
     if (pLookupRec)
     {
         if (pLookupRec->pSet->enmType == DBGFREGSETTYPE_CPU)
             idDefCpu = pLookupRec->pSet->uUserArg.pVCpu->idCpu;
+        else if (idDefCpu != VMCPUID_ANY)
+            idDefCpu &= ~DBGFREG_HYPER_VMCPUID;
         return VMR3ReqCallWait(pVM, idDefCpu, (PFNRT)dbgfR3RegNmQueryWorkerOnCpu, 5, pVM, pLookupRec, enmType, pValue, penmType);
     }
@@ -1389,5 +1425,6 @@
  * @param   pVM                 The VM handle.
  * @param   idDefCpu            The default target CPU ID, VMCPUID_ANY if not
- *                              applicable.
+ *                              applicable. Can be OR'ed with
+ *                              DBGFREG_HYPER_VMCPUID.
  * @param   pszReg              The register that's being queried.  Except for
  *                              CPU registers, this must be on the form
@@ -1414,5 +1451,6 @@
  * @param   pVM                 The VM handle.
  * @param   idDefCpu            The default target CPU ID, VMCPUID_ANY if not
- *                              applicable.
+ *                              applicable. Can be OR'ed with
+ *                              DBGFREG_HYPER_VMCPUID.
  * @param   pszReg              The register that's being queried.  Except for
  *                              CPU registers, this must be on the form
@@ -1445,5 +1483,6 @@
  * @param   pVM                 The VM handle.
  * @param   idDefCpu            The default target CPU ID, VMCPUID_ANY if not
- *                              applicable.
+ *                              applicable.  Can be OR'ed with
+ *                              DBGFREG_HYPER_VMCPUID.
  * @param   pszReg              The register that's being queried.  Except for
  *                              CPU registers, this must be on the form
@@ -1476,5 +1515,6 @@
  * @param   pVM                 The VM handle.
  * @param   idDefCpu            The default target CPU ID, VMCPUID_ANY if not
- *                              applicable.
+ *                              applicable.  Can be OR'ed with
+ *                              DBGFREG_HYPER_VMCPUID.
  * @param   pszReg              The register that's being queried.  Except for
  *                              CPU registers, this must be on the form
@@ -1507,5 +1547,6 @@
  * @param   pVM                 The VM handle.
  * @param   idDefCpu            The default target CPU ID, VMCPUID_ANY if not
- *                              applicable.
+ *                              applicable.  Can be OR'ed with
+ *                              DBGFREG_HYPER_VMCPUID.
  * @param   pszReg              The register that's being queried.  Except for
  *                              CPU registers, this must be on the form
@@ -1538,5 +1579,6 @@
  * @param   pVM                 The VM handle.
  * @param   idDefCpu            The default target CPU ID, VMCPUID_ANY if not
- *                              applicable.
+ *                              applicable.  Can be OR'ed with
+ *                              DBGFREG_HYPER_VMCPUID.
  * @param   pszReg              The register that's being queried.  Except for
  *                              CPU registers, this must be on the form
@@ -1570,5 +1612,6 @@
  * @param   pVM                 The VM handle.
  * @param   idDefCpu            The default target CPU ID, VMCPUID_ANY if not
- *                              applicable.
+ *                              applicable.  Can be OR'ed with
+ *                              DBGFREG_HYPER_VMCPUID.
  * @param   pszReg              The register that's being queried.  Except for
  *                              CPU registers, this must be on the form
@@ -1602,5 +1645,6 @@
  * @param   pVM                 The VM handle.
  * @param   idDefCpu            The default target CPU ID, VMCPUID_ANY if not
- *                              applicable.
+ *                              applicable.  Can be OR'ed with
+ *                              DBGFREG_HYPER_VMCPUID.
  * @param   pszReg              The register that's being queried.  Except for
  *                              CPU registers, this must be on the form
@@ -2083,5 +2127,5 @@
      * The end and length of the register.
      */
-    const char *pszEnd = strchr(&pachReg[3], '}');
+    const char *pszEnd = strchr(pachReg, '}');
     AssertMsgReturn(pszEnd, ("Missing closing curly bracket: '%s'\n", pszFormat), 0);
     size_t const cchReg = pszEnd - pachReg;
@@ -2105,5 +2149,5 @@
         {
             /* Prefix it with the specified CPU set. */
-            size_t cchCpuSet = RTStrPrintf(szName, sizeof(szName), "cpu%u.", pThis->idCpu);
+            size_t cchCpuSet = RTStrPrintf(szName, sizeof(szName), pThis->fGuestRegs ? "cpu%u." : "hypercpu%u.", pThis->idCpu);
             dbgfR3RegCopyToLower(pachReg, cchReg, &szName[cchCpuSet], sizeof(szName) - cchCpuSet);
             pLookupRec = (PCDBGFREGLOOKUP)RTStrSpaceGet(&pThis->pVM->dbgf.s.RegSpace, szName);
@@ -2206,5 +2250,5 @@
  * @param   va                  Other format arguments.
  */
-VMMR3DECL(int) DBGFR3RegNmPrintfV(PVM pVM, VMCPUID idCpu, char *pszBuf, size_t cbBuf, const char *pszFormat, va_list va)
+VMMR3DECL(int) DBGFR3RegPrintfV(PVM pVM, VMCPUID idCpu, char *pszBuf, size_t cbBuf, const char *pszFormat, va_list va)
 {
     AssertPtrReturn(pszBuf, VERR_INVALID_POINTER);
@@ -2213,5 +2257,5 @@
 
     VM_ASSERT_VALID_EXT_RETURN(pVM, VERR_INVALID_VM_HANDLE);
-    AssertReturn(idCpu < pVM->cCpus || idCpu == VMCPUID_ANY, VERR_INVALID_CPU_ID);
+    AssertReturn((idCpu & ~DBGFREG_HYPER_VMCPUID) < pVM->cCpus || idCpu == VMCPUID_ANY, VERR_INVALID_CPU_ID);
     AssertPtrReturn(pszFormat, VERR_INVALID_POINTER);
 
@@ -2222,5 +2266,6 @@
     DBGFR3REGNMPRINTFARGS Args;
     Args.pVM        = pVM;
-    Args.idCpu      = idCpu;
+    Args.idCpu      = idCpu != VMCPUID_ANY ? idCpu & ~DBGFREG_HYPER_VMCPUID : idCpu;
+    Args.fGuestRegs = idCpu != VMCPUID_ANY && !(idCpu & DBGFREG_HYPER_VMCPUID);
     Args.pszBuf     = pszBuf;
     Args.pszFormat  = pszFormat;
@@ -2229,5 +2274,5 @@
     Args.cchLeftBuf = cbBuf - 1;
     Args.rc         = VINF_SUCCESS;
-    int rc = VMR3ReqCallWait(pVM, idCpu, (PFNRT)dbgfR3RegNmPrintfWorkerOnCpu, 1, &Args);
+    int rc = VMR3ReqCallWait(pVM, Args.idCpu, (PFNRT)dbgfR3RegNmPrintfWorkerOnCpu, 1, &Args);
     va_end(Args.va);
     return rc;
@@ -2253,9 +2298,9 @@
  * @param   ...                 Other format arguments.
  */
-VMMR3DECL(int) DBGFR3RegNmPrintf(PVM pVM, VMCPUID idCpu, char *pszBuf, size_t cbBuf, const char *pszFormat, ...)
+VMMR3DECL(int) DBGFR3RegPrintf(PVM pVM, VMCPUID idCpu, char *pszBuf, size_t cbBuf, const char *pszFormat, ...)
 {
     va_list va;
     va_start(va, pszFormat);
-    int rc = DBGFR3RegNmPrintfV(pVM, idCpu, pszBuf, cbBuf, pszFormat, va);
+    int rc = DBGFR3RegPrintfV(pVM, idCpu, pszBuf, cbBuf, pszFormat, va);
     va_end(va);
     return rc;
