Index: trunk/include/VBox/VMMDevTesting.h
===================================================================
--- trunk/include/VBox/VMMDevTesting.h	(revision 103252)
+++ trunk/include/VBox/VMMDevTesting.h	(revision 103262)
@@ -128,5 +128,5 @@
 /** Start a new sub-test, sending name (zero terminated string). (RTTestSub) */
 #define VMMDEV_TESTING_CMD_SUB_NEW      UINT32_C(0xcab1e002)
-/** Sub-test is done, sending 32-bit error count for it. (RTTestDone) */
+/** Sub-test is done, sending 32-bit error count for it. (RTTestSubDone) */
 #define VMMDEV_TESTING_CMD_SUB_DONE     UINT32_C(0xcab1e003)
 /** Report a failure, sending reason (zero terminated string). (RTTestFailed) */
@@ -145,4 +145,8 @@
  * DATA port and reading back the result. */
 #define VMMDEV_TESTING_CMD_QUERY_CFG    UINT32_C(0xcab1e009)
+/** Start a new sub-sub-test, sending name (zero terminated string). (RTTestSubSub) */
+#define VMMDEV_TESTING_CMD_SUBSUB_NEW   UINT32_C(0xcab1e00a)
+/** Sub-sub-test is done, sending 32-bit error count for it. (RTTestSubSubDone) */
+#define VMMDEV_TESTING_CMD_SUBSUB_DONE  UINT32_C(0xcab1e00b)
 
 /** The magic part of the command. */
Index: trunk/include/iprt/mangling.h
===================================================================
--- trunk/include/iprt/mangling.h	(revision 103252)
+++ trunk/include/iprt/mangling.h	(revision 103262)
@@ -2537,4 +2537,8 @@
 # define RTTestISubF                                    RT_MANGLER(RTTestISubF)
 # define RTTestISubV                                    RT_MANGLER(RTTestISubV)
+# define RTTestISubSub                                  RT_MANGLER(RTTestISubSub)
+# define RTTestISubSubDone                              RT_MANGLER(RTTestISubSubDone)
+# define RTTestISubSubF                                 RT_MANGLER(RTTestISubSubF)
+# define RTTestISubSubV                                 RT_MANGLER(RTTestISubSubV)
 # define RTTestIValue                                   RT_MANGLER(RTTestIValue)
 # define RTTestIValueF                                  RT_MANGLER(RTTestIValueF)
@@ -2557,4 +2561,9 @@
 # define RTTestSubF                                     RT_MANGLER(RTTestSubF)
 # define RTTestSubV                                     RT_MANGLER(RTTestSubV)
+# define RTTestSubSub                                   RT_MANGLER(RTTestSubSub)
+# define RTTestSubSubDone                               RT_MANGLER(RTTestSubSubDone)
+# define RTTestSubSubErrorCount                         RT_MANGLER(RTTestSubSubErrorCount)
+# define RTTestSubSubF                                  RT_MANGLER(RTTestSubSubF)
+# define RTTestSubSubV                                  RT_MANGLER(RTTestSubSubV)
 # define RTTestSummaryAndDestroy                        RT_MANGLER(RTTestSummaryAndDestroy)
 # define RTTestValue                                    RT_MANGLER(RTTestValue)
Index: trunk/include/iprt/test.h
===================================================================
--- trunk/include/iprt/test.h	(revision 103252)
+++ trunk/include/iprt/test.h	(revision 103262)
@@ -421,8 +421,56 @@
 
 /**
+ * Starts a sub-sub-test.
+ *
+ * This will perform an implicit RTTestSubSubDone() call if that has not been
+ * done since the last RTTestSubSub() call.
+ *
+ * @returns Number of chars printed.
+ * @param   hTest           The test handle. If NIL_RTTEST we'll use the one
+ *                          associated with the calling thread.
+ * @param   pszSubSubTest   The sub-sub-test name.
+ */
+RTR3DECL(int) RTTestSubSub(RTTEST hTest, const char *pszSubSubTest);
+
+/**
+ * Format string version of RTTestSubSub().
+ *
+ * See RTTestSubSub() for details.
+ *
+ * @returns Number of chars printed.
+ * @param   hTest               The test handle. If NIL_RTTEST we'll use the one
+ *                              associated with the calling thread.
+ * @param   pszSubSubTestFmt    The sub-sub-test name format string.
+ * @param   ...                 Arguments.
+ */
+RTR3DECL(int) RTTestSubSubF(RTTEST hTest, const char *pszSubSubTestFmt, ...) RT_IPRT_FORMAT_ATTR(2, 3);
+
+/**
+ * Format string version of RTTestSubSub().
+ *
+ * See RTTestSubSub() for details.
+ *
+ * @returns Number of chars printed.
+ * @param   hTest               The test handle. If NIL_RTTEST we'll use the one
+ *                              associated with the calling thread.
+ * @param   pszSubSubTestFmt    The sub-sub-test name format string.
+ * @param   va                  Arguments.
+ */
+RTR3DECL(int) RTTestSubSubV(RTTEST hTest, const char *pszSubSubTestFmt, va_list va) RT_IPRT_FORMAT_ATTR(2, 0);
+
+/**
+ * Completes a sub-sub-test.
+ *
+ * @returns Number of chars printed, negative numbers are IPRT error codes.
+ * @param   hTest       The test handle. If NIL_RTTEST we'll use the one
+ *                      associated with the calling thread.
+ */
+RTR3DECL(int) RTTestSubSubDone(RTTEST hTest);
+
+/**
  * Prints an extended PASSED message, optional.
  *
- * This does not conclude the sub-test, it could be used to report the passing
- * of a sub-sub-to-the-power-of-N-test.
+ * This does not conclude the (sub-)sub-test, it could be used to report the
+ * passing of a sub-sub-to-the-power-of-N-test.
  *
  * @returns Number of chars printed, negative numbers are IPRT error codes.
@@ -437,6 +485,6 @@
  * Prints an extended PASSED message, optional.
  *
- * This does not conclude the sub-test, it could be used to report the passing
- * of a sub-sub-to-the-power-of-N-test.
+ * This does not conclude the (sub-)sub-test, it could be used to report the
+ * passing of a sub-sub-to-the-power-of-N-test.
  *
  * @returns Number of chars printed, negative numbers are IPRT error codes.
@@ -556,5 +604,6 @@
  * This is typically used for benchmarking but can be used for other purposes
  * like reporting limits of some implementation.  The value gets associated with
- * the current sub test, the name must be unique within the sub test.
+ * the current (sub-)sub-test, the name must be unique within the
+ * (sub-)sub-test.
  *
  * @returns IPRT status code.
@@ -617,5 +666,5 @@
 
 /**
- * Get the error count of the current sub test.
+ * Get the error count of the current sub-test.
  *
  * @returns The error counter, UINT32_MAX if no valid test handle.
@@ -624,4 +673,13 @@
  */
 RTR3DECL(uint32_t) RTTestSubErrorCount(RTTEST hTest);
+
+/**
+ * Get the error count of the current sub-sub-test.
+ *
+ * @returns The error counter, UINT32_MAX if no valid test handle.
+ * @param   hTest       The test handle. If NIL_RTTEST we'll use the one
+ *                      associated with the calling thread.
+ */
+RTR3DECL(uint32_t) RTTestSubSubErrorCount(RTTEST hTest);
 
 /**
@@ -1024,5 +1082,5 @@
 
 /**
- * Completes a sub-test.
+ * Completes a sub-test (and any outstanding sub-sub-test).
  *
  * @returns Number of chars printed.
@@ -1031,8 +1089,48 @@
 
 /**
+ * Starts a sub-sub-test.
+ *
+ * This will perform an implicit RTTestSubSubDone() call if that has not been
+ * done since the last RTTestSubSub call.
+ *
+ * @returns Number of chars printed.
+ * @param   pszSubSubTest   The sub-sub-test name.
+ */
+RTR3DECL(int) RTTestISubSub(const char *pszSubSubTest);
+
+/**
+ * Format string version of RTTestSubSub.
+ *
+ * See RTTestSubSub for details.
+ *
+ * @returns Number of chars printed.
+ * @param   pszSubSubTestFmt    The sub-sub-test name format string.
+ * @param   ...                 Arguments.
+ */
+RTR3DECL(int) RTTestISubSubF(const char *pszSubSubTestFmt, ...) RT_IPRT_FORMAT_ATTR(1, 2);
+
+/**
+ * Format string version of RTTestSubSub.
+ *
+ * See RTTestSubSub for details.
+ *
+ * @returns Number of chars printed.
+ * @param   pszSubSubTestFmt    The sub-sub-test name format string.
+ * @param   va                  Arguments.
+ */
+RTR3DECL(int) RTTestISubSubV(const char *pszSubSubTestFmt, va_list va) RT_IPRT_FORMAT_ATTR(1, 0);
+
+/**
+ * Completes a sub-sub-test.
+ *
+ * @returns Number of chars printed.
+ */
+RTR3DECL(int) RTTestISubSubDone(void);
+
+/**
  * Prints an extended PASSED message, optional.
  *
- * This does not conclude the sub-test, it could be used to report the passing
- * of a sub-sub-to-the-power-of-N-test.
+ * This does not conclude the (sub-)sub-test, it could be used to report the
+ * passing of a sub-sub-to-the-power-of-N-test.
  *
  * @returns IPRT status code.
@@ -1045,6 +1143,6 @@
  * Prints an extended PASSED message, optional.
  *
- * This does not conclude the sub-test, it could be used to report the passing
- * of a sub-sub-to-the-power-of-N-test.
+ * This does not conclude the (sub-)sub-test, it could be used to report the
+ * passing of a sub-sub-to-the-power-of-N-test.
  *
  * @returns IPRT status code.
@@ -1059,5 +1157,6 @@
  * This is typically used for benchmarking but can be used for other purposes
  * like reporting limits of some implementation.  The value gets associated with
- * the current sub test, the name must be unique within the sub test.
+ * the current (sub-)sub-test, the name must be unique within the
+ * (sub-)sub-test.
  *
  * @returns IPRT status code.
