Index: /trunk/src/VBox/ValidationKit/testmanager/batch/virtual_test_sheriff.py
===================================================================
--- /trunk/src/VBox/ValidationKit/testmanager/batch/virtual_test_sheriff.py	(revision 61947)
+++ /trunk/src/VBox/ValidationKit/testmanager/batch/virtual_test_sheriff.py	(revision 61948)
@@ -416,7 +416,8 @@
     ktReason_Guru_VERR_VMX_INVALID_GUEST_STATE         = ( 'Guru Meditations',  'VERR_VMX_INVALID_GUEST_STATE' );
     ktReason_Guru_VINF_EM_TRIPLE_FAULT                 = ( 'Guru Meditations',  'VINF_EM_TRIPLE_FAULT' );
+    ktReason_Host_HostMemoryLow                        = ( 'Host',              'HostMemoryLow' );
     ktReason_Host_Reboot_OSX_Watchdog_Timeout          = ( 'Host Reboot',       'OSX Watchdog Timeout' );
-    ktReason_TestBox_VERR_NO_MEMORY                    = ( 'TestBox',           'VERR_NO_MEMORY' );
     ktReason_Networking_Nonexistent_host_nic           = ( 'Networking',        'Nonexistent host networking interface' );
+    ktReason_OSInstall_GRUB_hang                       = ( 'O/S Install',       'GRUB hang' );
     ktReason_Panic_MP_BIOS_IO_APIC                     = ( 'Panic',             'MP-BIOS/IO-APIC' );
     ktReason_XPCOM_Exit_Minus_11                       = ( 'API / (XP)COM',     'exit -11' );
@@ -660,6 +661,6 @@
         ( False, ktReason_XPCOM_NS_ERROR_CALL_FAILED,
           'Exception: 0x800706be (Call to remote object failed (NS_ERROR_CALL_FAILED))' ),
-        ( True,  ktReason_TestBox_VERR_NO_MEMORY,                   'HostMemoryLow' ),
-        ( True,  ktReason_TestBox_VERR_NO_MEMORY,                   'Failed to procure handy pages; rc=VERR_NO_MEMORY' ),
+        ( True,  ktReason_Host_HostMemoryLow,                       'HostMemoryLow' ),
+        ( True,  ktReason_Host_HostMemoryLow,                       'Failed to procure handy pages; rc=VERR_NO_MEMORY' ),
     ];
 
@@ -669,4 +670,6 @@
         ( True,  ktReason_Panic_MP_BIOS_IO_APIC,
           "..MP-BIOS bug: 8254 timer not connected to IO-APIC\n\n" ),
+        ( True,  ktReason_OSInstall_GRUB_hang,
+          "-----\nGRUB Loading stage2..\n\n\n\n" ),
     ];
 
@@ -856,6 +859,4 @@
                 return self.caseClosed(oCaseFile);
 
-
-
             # Look for heap corruption without visible hang.
             if   sMainLog.find('*** glibc detected *** /') > 0 \
@@ -864,4 +865,9 @@
                 return self.caseClosed(oCaseFile);
 
+            # Out of memory w/ timeout.
+            if sMainLog.find('sErrId=HostMemoryLow') > 0:
+                oCaseFile.noteReason(self.ktReason_Host_HostMemoryLow);
+                return self.caseClosed(oCaseFile);
+
         #
         # Go thru each failed result.
@@ -872,15 +878,21 @@
             if oFailedResult.sName == 'Installing VirtualBox':
                 self.vprint('TODO: Installation failure');
+
             elif oFailedResult.sName == 'Uninstalling VirtualBox':
                 self.vprint('TODO: Uninstallation failure');
+
             elif self.isResultFromVMRun(oFailedResult, sResultLog):
                 self.investigateVMResult(oCaseFile, oFailedResult, sResultLog);
+
             elif sResultLog.find('Exception: 0x800706be (Call to remote object failed (NS_ERROR_CALL_FAILED))') > 0:
                 oCaseFile.noteReasonForId(self.ktReason_XPCOM_NS_ERROR_CALL_FAILED, oFailedResult.idTestResult);
+
             elif sResultLog.find('The machine is not mutable (state is ') > 0:
                 self.vprint('Ignoring "machine not mutable" error as it is probably due to an earlier problem');
                 oCaseFile.noteReasonForId(self.ktHarmless, oFailedResult.idTestResult);
+
             elif sResultLog.find('** error: no action was specified') > 0:
                 oCaseFile.noteReasonForId(self.ktReason_Ignore_Buggy_Test_Driver, oFailedResult.idTestResult);
+
             else:
                 self.vprint(u'TODO: Cannot place idTestResult=%u - %s' % (oFailedResult.idTestResult, oFailedResult.sName,));
@@ -928,17 +940,22 @@
                 self.dprint(u'investigateBadTestBox is taking over %s.' % (oCaseFile.sLongName,));
                 fRc = self.investigateBadTestBox(oCaseFile);
+
             elif oCaseFile.isVBoxUnitTest():
                 self.dprint(u'investigateVBoxUnitTest is taking over %s.' % (oCaseFile.sLongName,));
                 fRc = self.investigateVBoxUnitTest(oCaseFile);
+
             elif oCaseFile.isVBoxInstallTest():
                 self.dprint(u'investigateVBoxVMTest is taking over %s.' % (oCaseFile.sLongName,));
                 fRc = self.investigateVBoxVMTest(oCaseFile, fSingleVM = True);
+
             elif oCaseFile.isVBoxSmokeTest():
                 self.dprint(u'investigateVBoxVMTest is taking over %s.' % (oCaseFile.sLongName,));
                 fRc = self.investigateVBoxVMTest(oCaseFile, fSingleVM = False);
+
             else:
                 self.vprint(u'reasoningFailures: Unable to classify test set: %s' % (oCaseFile.sLongName,));
                 fRc = False;
             cGot += fRc is True;
+
         self.vprint(u'reasoningFailures: Got %u out of %u' % (cGot, len(aoTestSets), ));
         return 0;
