Index: /trunk/include/VBox/vmm/dbgf.h
===================================================================
--- /trunk/include/VBox/vmm/dbgf.h	(revision 60559)
+++ /trunk/include/VBox/vmm/dbgf.h	(revision 60560)
@@ -1244,18 +1244,20 @@
 /** Set if the content of the frame is filled in by DBGFR3StackWalk() and can be used
  * to construct the next frame. */
-# define DBGFSTACKFRAME_FLAGS_ALL_VALID RT_BIT(0)
+# define DBGFSTACKFRAME_FLAGS_ALL_VALID     RT_BIT(0)
 /** This is the last stack frame we can read.
  * This flag is not set if the walk stop because of max dept or recursion. */
-# define DBGFSTACKFRAME_FLAGS_LAST      RT_BIT(1)
+# define DBGFSTACKFRAME_FLAGS_LAST          RT_BIT(1)
 /** This is the last record because we detected a loop. */
-# define DBGFSTACKFRAME_FLAGS_LOOP      RT_BIT(2)
+# define DBGFSTACKFRAME_FLAGS_LOOP          RT_BIT(2)
 /** This is the last record because we reached the maximum depth. */
-# define DBGFSTACKFRAME_FLAGS_MAX_DEPTH RT_BIT(3)
+# define DBGFSTACKFRAME_FLAGS_MAX_DEPTH     RT_BIT(3)
 /** 16-bit frame. */
-# define DBGFSTACKFRAME_FLAGS_16BIT     RT_BIT(4)
+# define DBGFSTACKFRAME_FLAGS_16BIT         RT_BIT(4)
 /** 32-bit frame. */
-# define DBGFSTACKFRAME_FLAGS_32BIT     RT_BIT(5)
+# define DBGFSTACKFRAME_FLAGS_32BIT         RT_BIT(5)
 /** 64-bit frame. */
-# define DBGFSTACKFRAME_FLAGS_64BIT     RT_BIT(6)
+# define DBGFSTACKFRAME_FLAGS_64BIT         RT_BIT(6)
+/** Used Odd/even heuristics for far/near return. */
+# define DBGFSTACKFRAME_FLAGS_USED_ODD_EVEN RT_BIT(7)
 /** @} */
 
Index: /trunk/src/VBox/VMM/VMMR3/DBGFStack.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/DBGFStack.cpp	(revision 60559)
+++ /trunk/src/VBox/VMM/VMMR3/DBGFStack.cpp	(revision 60560)
@@ -88,8 +88,9 @@
     /*
      * Read the raw frame data.
-     */
-    const DBGFADDRESS AddrOldPC = pFrame->AddrPC;
-    const unsigned cbRetAddr = DBGFReturnTypeSize(pFrame->enmReturnType);
-    unsigned cbStackItem;
+     * We double cbRetAddr in case we find we have a far return.
+     */
+    const DBGFADDRESS   AddrOldPC = pFrame->AddrPC;
+    unsigned            cbRetAddr = DBGFReturnTypeSize(pFrame->enmReturnType);
+    unsigned            cbStackItem;
     switch (AddrOldPC.fFlags & DBGFADDRESS_FLAGS_TYPE_MASK)
     {
@@ -130,5 +131,5 @@
         void     *pv;
     } u, uRet, uArgs, uBp;
-    size_t cbRead = cbRetAddr + cbStackItem + sizeof(pFrame->Args);
+    size_t cbRead = cbRetAddr*2 + cbStackItem + sizeof(pFrame->Args);
     u.pv = alloca(cbRead);
     uBp = u;
@@ -185,4 +186,41 @@
         default:    AssertMsgFailedReturn(("cbStackItem=%d\n", cbStackItem), VERR_DBGF_STACK_IPE_1);
     }
+
+    /* Watcom tries to keep the frame pointer odd for far returns. */
+    if (cbStackItem <= 4)
+    {
+        if (pFrame->AddrReturnFrame.off & 1)
+        {
+            pFrame->AddrReturnFrame.off &= ~(RTGCUINTPTR)1;
+            if (pFrame->enmReturnType == DBGFRETURNTYPE_NEAR16)
+            {
+                pFrame->fFlags       |= DBGFSTACKFRAME_FLAGS_USED_ODD_EVEN;
+                pFrame->enmReturnType = DBGFRETURNTYPE_FAR16;
+                cbRetAddr = 4;
+            }
+            else if (pFrame->enmReturnType == DBGFRETURNTYPE_NEAR32)
+            {
+                pFrame->fFlags       |= DBGFSTACKFRAME_FLAGS_USED_ODD_EVEN;
+                pFrame->enmReturnType = DBGFRETURNTYPE_FAR32;
+                cbRetAddr = 8;
+            }
+        }
+        else if (pFrame->fFlags & DBGFSTACKFRAME_FLAGS_USED_ODD_EVEN)
+        {
+            if (pFrame->enmReturnType == DBGFRETURNTYPE_FAR16)
+            {
+                pFrame->enmReturnType = DBGFRETURNTYPE_NEAR16;
+                cbRetAddr = 2;
+            }
+            else if (pFrame->enmReturnType == DBGFRETURNTYPE_NEAR32)
+            {
+                pFrame->enmReturnType = DBGFRETURNTYPE_FAR32;
+                cbRetAddr = 4;
+            }
+            pFrame->fFlags &= ~DBGFSTACKFRAME_FLAGS_USED_ODD_EVEN;
+        }
+        uArgs.pb = u.pb + cbStackItem + cbRetAddr;
+    }
+
     pFrame->AddrReturnFrame.FlatPtr += pFrame->AddrReturnFrame.off - pFrame->AddrFrame.off;
 
@@ -315,6 +353,10 @@
                 case DBGFADDRESS_FLAGS_FAR32: pCur->enmReturnType = DBGFRETURNTYPE_NEAR32; break;
                 case DBGFADDRESS_FLAGS_FAR64: pCur->enmReturnType = DBGFRETURNTYPE_NEAR64; break;
-                case DBGFADDRESS_FLAGS_RING0: pCur->enmReturnType = HC_ARCH_BITS == 64 ? DBGFRETURNTYPE_NEAR64 : DBGFRETURNTYPE_NEAR32; break;
-                default:                      pCur->enmReturnType = DBGFRETURNTYPE_NEAR32; break; /// @todo 64-bit guests
+                case DBGFADDRESS_FLAGS_RING0:
+                    pCur->enmReturnType = HC_ARCH_BITS == 64 ? DBGFRETURNTYPE_NEAR64 : DBGFRETURNTYPE_NEAR32;
+                    break;
+                default:
+                    pCur->enmReturnType = DBGFRETURNTYPE_NEAR32;
+                    break; /// @todo 64-bit guests
             }
 
