📄 dbgioctls.c
字号:
else
{
if (CFGBlock.EndAddress > CFGBlock.StartAddress)
{
//at least one block free for the current Trace block
if (CFGBlock.EndAddress + _TRACEBUFFERBLOCKSIZE_ ==
CFGBlock.StartAddress + CFGBlock.TraceBufferSize)
{
*pbuffer =(char*) CFGBlock.EndAddress;
CFGBlock.EndAddress += _TRACEBUFFERBLOCKSIZE_;
if (CFGBlock.TraceMode == FILL_ONCE)
{
return TRUE; // full after store this block
}
else
{ //WRAP AROUND
return FALSE;
}
}
else
{
if (CFGBlock.EndAddress >=
CFGBlock.StartAddress + CFGBlock.TraceBufferSize)
{// WRAP AROUND occur
if (CFGBlock.TraceMode == FILL_ONCE)
{
return TRUE;/*buffer already full stop trace*/
}
*pbuffer =(char*) CFGBlock.StartAddress;
CFGBlock.StartAddress += _TRACEBUFFERBLOCKSIZE_;
CFGBlock.EndAddress = CFGBlock.StartAddress;
return FALSE;
}
else
{
*pbuffer =(char*) CFGBlock.EndAddress;
CFGBlock.EndAddress += _TRACEBUFFERBLOCKSIZE_;
}
}
}
else
{// has wrapped around // Startaddress == EndAddress
if (CFGBlock.EndAddress ==
(int) CFGBlock.pTraceBuffer + CFGBlock.TraceBufferSize)
{// WRAP AROUND occur
*pbuffer =(char*) CFGBlock.pTraceBuffer;
CFGBlock.StartAddress = (int)CFGBlock.pTraceBuffer+
_TRACEBUFFERBLOCKSIZE_;
CFGBlock.EndAddress = CFGBlock.StartAddress;
if (CFGBlock.TraceMode == FILL_ONCE)
return TRUE; // full after store this block
}
else
{
*pbuffer =(char*) CFGBlock.EndAddress;
CFGBlock.StartAddress += _TRACEBUFFERBLOCKSIZE_;
CFGBlock.EndAddress = CFGBlock.StartAddress;
}
}
return FALSE;
}
}
/*-------------------------------------------------------------------------
* Function: IsUserModeCapture
*-------------------------------------------------------------------------
* Description: Determine if trace block contains user mode code
*-------------------------------------------------------------------------
* Return: BOOL (TRUE = buffer contains usermode code)
*-------------------------------------------------------------------------
*/
static BOOL IsUserModeCapture( BYTE* pTrcBuf )
{
register BYTE * p;
register DWORD Address;
for ( p = &pTrcBuf[256]; p > pTrcBuf; p-- )
{
switch (*p & 0xF0)
{
case 0x90: // indirect branch
case 0xD0: // indirect branch with chkpt
p -= 4;
Address = (p[0] << 24) | ( p[1] << 16 ) | (p[2] << 8) | p[3];
if ( Address < 0x80000000)
{ // user mode ?
return TRUE;
}
break;
}
}
return FALSE;
}
/*-------------------------------------------------------------------------
* Function: XSCBwrHandleTraceBufferException
*-------------------------------------------------------------------------
* Description: Exception handler for the trace buffer full exception
*-------------------------------------------------------------------------
*/
void XSCBwrHandleTraceBufferException (void)
{
char* pBuffer;
static BYTE NewBuffer[_TRACEBUFFERBLOCKSIZE_];
// temporary stoage for new buffer
//
XSCBwrSaveTrace(&NewBuffer[4]);
// check if usermode code is in this capture
//
if ( IsUserModeCapture(&NewBuffer[4]) )
{
trace_admin_multi(&pBuffer);
memcpy( pBuffer, NewBuffer, _TRACEBUFFERBLOCKSIZE_);
}
}
/*-------------------------------------------------------------------------
* Function: XSCBwrExecutionTraceOn
*-------------------------------------------------------------------------
* Description: enable trace buffer recording
*-------------------------------------------------------------------------
*/
void XSCBwrExecutionTraceOn(DWORD TID)
{
if (CFGBlock.TraceMode==TRACE_OFF)
return;
RETAILMSG(1,(TEXT(">>>>>>>>>> TRACE ON\n")));
CurrentTaskID = TID;
XSCBwrEnableTrace();
}
/*-------------------------------------------------------------------------
* Function: XSCBwrExecutionTraceOff
*-------------------------------------------------------------------------
* Description: disable trace buffer recording
*-------------------------------------------------------------------------
*/
void XSCBwrExecutionTraceOff(DWORD ID)
{
XSCBwrDisableTrace();
if (CFGBlock.TraceMode==TRACE_OFF)
return;
RETAILMSG(1,(TEXT(">>>>>>>>>> TRACE OFF\n")));
}
static BOOL GetTraceConfigIoctl(DWORD dwIoControlCode,
LPVOID lpInBuf, DWORD nInBufSize,
LPVOID lpOutBuf, DWORD nOutBufSize,
LPDWORD lpBytesReturned)
{
BOOL retval = FALSE;
// check output buffer
//
if ( (lpOutBuf == NULL) || (nOutBufSize < sizeof(DWORD) ) )
{
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return(retval);
}
*(DWORD *)lpOutBuf = (DWORD)&CFGBlock;
// Set the return value
retval = TRUE;
*lpBytesReturned = 4;
return(retval);
}
/*-------------------------------------------------------------------------
* Function: TraceControlIoctl
*-------------------------------------------------------------------------
* Description: Process trace commands from the XScale Browser
*-------------------------------------------------------------------------
* Pre/Side/Post: prototype matches OEMIoControl
*-------------------------------------------------------------------------
*/
static BOOL TraceControlIoctl(DWORD dwIoControlCode,
LPVOID lpInBuf, DWORD nInBufSize,
LPVOID lpOutBuf, DWORD nOutBufSize,
LPDWORD lpBytesReturned)
{
// Set the default return value
BOOL retval = FALSE;
if ( (lpInBuf == NULL) || (nInBufSize < 9) || (lpBytesReturned == NULL) )
{
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return(retval);
}
switch ( ((char *)lpInBuf)[8] )
{
case 0: // diable trace
CFGBlock.TraceMode = TRACE_OFF;
NKSetDataAbortHandler( pfOSDataAbortHandler );
//RETAILMSG(1, (TEXT("XSCDBG:Trace disable\n")));
break;
case 1: // enable trace
NKSetDataAbortHandler( XSCBwrTraceDataAbortHandler );
CFGBlock.TraceMode = WRAP_AROUND;
//RETAILMSG(1, (TEXT("XSCDBG:Trace enable\n")));
break;
case 2: // clear trace;
memset( (LPVOID)CFGBlock.pTraceBuffer, 0, CFGBlock.TraceBufferSize);
CFGBlock.StartAddress = CFGBlock.pTraceBuffer;
CFGBlock.EndAddress = CFGBlock.pTraceBuffer;
//RETAILMSG(1, (TEXT("XSCDBG:Trace clear\n")));
break;
}
retval = TRUE;
*lpBytesReturned = 0;
return retval;
}
/*-------------------------------------------------------------------------
* Function: ReadTraceIoctl
*-------------------------------------------------------------------------
* Description: Process trace read command from the XScale Browser
*-------------------------------------------------------------------------
* Pre/Side/Post: prototype matches OEMIoControl
*-------------------------------------------------------------------------
*/
static BOOL ReadTraceIoctl(DWORD dwIoControlCode,
LPVOID lpInBuf, DWORD nInBufSize,
LPVOID lpOutBuf, DWORD nOutBufSize,
LPDWORD lpBytesReturned)
{
// Set the default return value
BOOL retval = FALSE;
if ( (lpBytesReturned == NULL) )
{
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return(retval);
}
// check output buffer
//
if ( (lpOutBuf == NULL) || (nOutBufSize < 264 ) )
{
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return(retval);
}
// copy trace buffer into user buffer
//
XSCBwrSaveTrace(lpOutBuf);
*lpBytesReturned = 264;
retval = TRUE;
return(retval);
}
/*-------------------------------------------------------------------------
* Function: XSCBwrIoControl
*-------------------------------------------------------------------------
* Description: Entry point for all debug extension IOCTLS
* This function is called from OEMIoControl on every
* browser IOCTL
*-------------------------------------------------------------------------
* Pre/Side/Post: prototype matches OEMIoControl
*-------------------------------------------------------------------------
*/
BOOL XSCBwrIoControl(DWORD dwIoControlCode,
LPVOID lpInBuf, DWORD nInBufSize,
LPVOID lpOutBuf, DWORD nOutBufSize,
LPDWORD lpBytesReturned)
{
BOOL retval;
switch ( dwIoControlCode )
{
case IOCTL_XSDBG_READCOPROCESSOR:
retval = ReadCoProcessorIoctl( dwIoControlCode, lpInBuf, nInBufSize,
lpOutBuf, nOutBufSize, lpBytesReturned);
break;
case IOCTL_XSDBG_WRITECOPROCESSOR:
retval = WriteCoProcessorIoctl( dwIoControlCode, lpInBuf, nInBufSize,
lpOutBuf, nOutBufSize, lpBytesReturned);
break;
case IOCTL_XSDBG_SETTASK:
retval = SetTaskIoctl( dwIoControlCode, lpInBuf, nInBufSize,
lpOutBuf, nOutBufSize, lpBytesReturned);
break;
case IOCTL_XSDBG_QUERYCTXREGS:
retval = QueryContextRegistersIoctl( dwIoControlCode,
lpInBuf, nInBufSize,
lpOutBuf, nOutBufSize,
lpBytesReturned);
break;
case IOCTL_XSDBG_READCTXREGS:
retval = ReadContextRegisterIoctl( dwIoControlCode,
lpInBuf, nInBufSize,
lpOutBuf, nOutBufSize,
lpBytesReturned);
break;
case IOCTL_XSDBG_WRITECTXREGS:
retval = WriteContextRegisterIoctl( dwIoControlCode,
lpInBuf, nInBufSize,
lpOutBuf, nOutBufSize,
lpBytesReturned);
break;
case IOCTL_XSDBG_TRACECONTROL:
retval = TraceControlIoctl(dwIoControlCode,
lpInBuf, nInBufSize,
lpOutBuf, nOutBufSize,
lpBytesReturned);
break;
case IOCTL_XSDBG_READTRACE:
retval = ReadTraceIoctl( dwIoControlCode, lpInBuf, nInBufSize,
lpOutBuf, nOutBufSize,
lpBytesReturned);
break;
case IOCTL_XSDBG_READKMEM:
retval = ReadKMemIoctl( dwIoControlCode, lpInBuf, nInBufSize,
lpOutBuf, nOutBufSize,
lpBytesReturned);
break;
case IOCTL_XSDBG_GETTRACECONFIG:
retval = GetTraceConfigIoctl( dwIoControlCode, lpInBuf, nInBufSize,
lpOutBuf, nOutBufSize,
lpBytesReturned);
break;
case IOCTL_XSDBG_GETVERSION:
retval = GetVersionIoctl( dwIoControlCode, lpInBuf, nInBufSize,
lpOutBuf, nOutBufSize,
lpBytesReturned);
break;
default:
SetLastError(ERROR_NOT_SUPPORTED);
break;
}
return retval;
}
#endif //#ifdef USING_XSCALEBROWSER
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -