VirtualBox

Changeset 86180 in vbox


Ignore:
Timestamp:
Sep 20, 2020 9:33:40 AM (4 years ago)
Author:
vboxsync
Message:

Debugger/DBGCRemoteKd: Implement support for the DEBUG_IO packets to send strings to the remotes console

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Debugger/DBGCRemoteKd.cpp

    r86167 r86180  
    631631/** Maximum state change type (exclusive). */
    632632#define KD_PACKET_STATE_CHANGE_MAX                  UINT32_C(0x00003033)
     633/** @} */
     634
     635
     636/**
     637 * Debug I/O payload.
     638 */
     639typedef struct KDPACKETDEBUGIO
     640{
     641    /** Debug I/O payload type (KD_PACKET_DEBUG_IO_STRING). */
     642    uint32_t                    u32Type;
     643    /** The processor level. */
     644    uint16_t                    u16CpuLvl;
     645    /** The processor ID generating this packet. */
     646    uint16_t                    idCpu;
     647    /** Type dependent data. */
     648    union
     649    {
     650        /** Debug string sent. */
     651        struct
     652        {
     653            /* Length of the string following in bytes. */
     654            uint32_t            cbStr;
     655            /** Some padding it looks like. */
     656            uint32_t            u32Pad;
     657        } Str;
     658    } u;
     659} KDPACKETDEBUGIO;
     660AssertCompileSize(KDPACKETDEBUGIO, 16);
     661/** Pointer to a Debug I/O payload. */
     662typedef KDPACKETDEBUGIO *PKDPACKETDEBUGIO;
     663/** Pointer to a const Debug I/O payload. */
     664typedef const KDPACKETDEBUGIO *PCKDPACKETDEBUGIO;
     665
     666
     667/** @name Debug I/O types.
     668 * @{ */
     669/** Debug string output (usually DbgPrint() and friends). */
     670#define KD_PACKET_DEBUG_IO_STRING                   UINT32_C(0x00003230)
    633671/** @} */
    634672
     
    20852123
    20862124/**
     2125 * Sends a Debug I/O string packet.
     2126 *
     2127 * @returns VBox status code.
     2128 * @param   pThis               The KD context data.
     2129 * @param   idCpu               The CPU ID generating this packet.
     2130 * @param   pachChars           The characters to send (ASCII).
     2131 * @param   cbChars             Number of characters to send.
     2132 */
     2133static int dbgcKdCtxDebugIoStrSend(PKDCTX pThis, VMCPUID idCpu, const char *pachChars, size_t cbChars)
     2134{
     2135    KDPACKETDEBUGIO DebugIo;
     2136    RT_ZERO(DebugIo);
     2137
     2138    /* Fix your damn log strings if this exceeds 4GB... */
     2139    if (cbChars != (uint32_t)cbChars)
     2140        return VERR_BUFFER_OVERFLOW;
     2141
     2142    DebugIo.u32Type     = KD_PACKET_DEBUG_IO_STRING;
     2143    DebugIo.u16CpuLvl   = 0x6;
     2144    DebugIo.idCpu       = (uint16_t)idCpu;
     2145    DebugIo.u.Str.cbStr = (uint32_t)cbChars;
     2146
     2147    RTSGSEG aRespSegs[2];
     2148
     2149    aRespSegs[0].pvSeg = &DebugIo;
     2150    aRespSegs[0].cbSeg = sizeof(DebugIo);
     2151    aRespSegs[1].pvSeg = (void *)pachChars;
     2152    aRespSegs[1].cbSeg = cbChars;
     2153
     2154    return dbgcKdCtxPktSendSg(pThis, KD_PACKET_HDR_SIGNATURE_DATA, KD_PACKET_HDR_SUB_TYPE_DEBUG_IO,
     2155                              &aRespSegs[0], RT_ELEMENTS(aRespSegs), true /*fAck*/);
     2156}
     2157
     2158
     2159/**
    20872160 * Sends a state change event packet.
    20882161 *
    20892162 * @returns VBox status code.
    2090  * @param   pThis   The KD context data.
    2091  * @param   enmType The event type.
     2163 * @param   pThis               The KD context data.
     2164 * @param   enmType             The event type.
    20922165 */
    20932166static int dbgcKdCtxStateChangeSend(PKDCTX pThis, DBGFEVENTTYPE enmType)
     
    23632436    else if (DBGFR3IsHalted(pThis->Dbgc.pUVM, VMCPUID_ALL))
    23642437        rc = DBGFR3Resume(pThis->Dbgc.pUVM, VMCPUID_ALL);
     2438
     2439    pThis->Dbgc.CmdHlp.pfnPrintf(&pThis->Dbgc.CmdHlp, NULL, "TestTestTest\n");
    23652440
    23662441    return rc;
     
    30383113     * Process the event.
    30393114     */
    3040     //PDBGC pDbgc = &pThis->Dbgc;
     3115    PDBGC pDbgc = &pThis->Dbgc;
    30413116    pThis->Dbgc.pszScratch = &pThis->Dbgc.achInput[0];
    30423117    pThis->Dbgc.iArg       = 0;
    30433118    int rc = VINF_SUCCESS;
     3119    VMCPUID idCpuOld = pDbgc->idCpu;
     3120    pDbgc->idCpu = pEvent->idCpu;
    30443121    switch (pEvent->enmType)
    30453122    {
     
    30563133         * The second part is events which can occur at any time.
    30573134         */
    3058 #if 0
    30593135        case DBGFEVENT_FATAL_ERROR:
    30603136        {
     
    30653141            break;
    30663142        }
    3067 #endif
    30683143
    30693144        case DBGFEVENT_BREAKPOINT:
     
    30713146        case DBGFEVENT_BREAKPOINT_MMIO:
    30723147        case DBGFEVENT_BREAKPOINT_HYPER:
     3148        {
     3149            rc = dbgcBpExec(pDbgc, pEvent->u.Bp.iBp);
     3150            switch (rc)
     3151            {
     3152                case VERR_DBGC_BP_NOT_FOUND:
     3153                    rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event: Unknown breakpoint %u! (%s)\n",
     3154                                                 pEvent->u.Bp.iBp, dbgcGetEventCtx(pEvent->enmCtx));
     3155                    break;
     3156
     3157                case VINF_DBGC_BP_NO_COMMAND:
     3158                    rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event: Breakpoint %u! (%s)\n",
     3159                                                 pEvent->u.Bp.iBp, dbgcGetEventCtx(pEvent->enmCtx));
     3160                    break;
     3161
     3162                case VINF_BUFFER_OVERFLOW:
     3163                    rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event: Breakpoint %u! Command too long to execute! (%s)\n",
     3164                                                 pEvent->u.Bp.iBp, dbgcGetEventCtx(pEvent->enmCtx));
     3165                    break;
     3166
     3167                default:
     3168                    break;
     3169            }
     3170            if (RT_SUCCESS(rc) && DBGFR3IsHalted(pDbgc->pUVM, VMCPUID_ALL))
     3171            {
     3172                rc = pDbgc->CmdHlp.pfnExec(&pDbgc->CmdHlp, "r");
     3173
     3174                /* Set the resume flag to ignore the breakpoint when resuming execution. */
     3175                if (   RT_SUCCESS(rc)
     3176                    && pEvent->enmType == DBGFEVENT_BREAKPOINT)
     3177                    rc = pDbgc->CmdHlp.pfnExec(&pDbgc->CmdHlp, "r eflags.rf = 1");
     3178            }
     3179
     3180            rc = dbgcKdCtxStateChangeSend(pThis, pEvent->enmType);
     3181            break;
     3182        }
     3183
    30733184        case DBGFEVENT_STEPPED:
    30743185        case DBGFEVENT_STEPPED_HYPER:
     
    30783189        }
    30793190
    3080 #if 0
    30813191        case DBGFEVENT_ASSERTION_HYPER:
    30823192        {
     
    31213231            break;
    31223232        }
    3123 #endif
    31243233
    31253234        case DBGFEVENT_POWERING_OFF:
     
    31313240        }
    31323241
    3133 #if 0
    31343242        default:
    31353243        {
     
    31903298            break;
    31913299        }
    3192 #else
    3193         default:
    3194             rc = VERR_NOT_IMPLEMENTED;
    3195             break;
    3196 #endif
    3197     }
    3198 
     3300    }
     3301
     3302    pDbgc->idCpu = idCpuOld;
    31993303    return rc;
    32003304}
     
    32303334    LogFlowFunc(("rc=%Rrc\n", rc));
    32313335    return rc;
     3336}
     3337
     3338
     3339/**
     3340 * @copydoc DBGC::pfnOutput
     3341 */
     3342static DECLCALLBACK(int) dbgcKdOutput(void *pvUser, const char *pachChars, size_t cbChars)
     3343{
     3344    PKDCTX pThis = (PKDCTX)pvUser;
     3345
     3346    return dbgcKdCtxDebugIoStrSend(pThis, pThis->Dbgc.idCpu, pachChars, cbChars);
    32323347}
    32333348
     
    33393454     */
    33403455    pThis->Dbgc.pBack            = pBack;
    3341     /*pThis->Dbgc.pfnOutput        = dbgcOutputGdb;*/
     3456    pThis->Dbgc.pfnOutput        = dbgcKdOutput;
    33423457    pThis->Dbgc.pvOutputUser     = pThis;
    33433458    pThis->Dbgc.pVM              = NULL;
Note: See TracChangeset for help on using the changeset viewer.

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