📄 debug.c
字号:
/*
debug.c
Requires the C Run time libraries to be linked.
980518 Tilakraj Roy Changed Defaukt Debugging to TMMan Internal.
*/
#include "ops/custom_defs.h"
#include "stdio.h"
#include "stdarg.h"
#include "tmmanlib.h"
#include "tm1/mmio.h"
#include "tm1/tmInterrupts.h"
#define constDebugMaxStringSize 0x100
#define constDebugCacheBlockSize (0x40)
#define constDebugCacheAlignSize (constDebugCacheBlockSize*2)
#define DisableInterrupts(x) *((UInt32*)(&x)) = intClearIEN ()
#define RestoreInterrupts(x) intRestoreIEN ( (x) );
typedef struct tagDebugObject
{
/* general debugging */
UInt32 SDRAMBase;
UInt32 SDRAMSize;
UInt32 MMIOBase;
UInt32 DebugBufferSize;
UInt32 LevelBitmap;
UInt32 HalHandle;
UInt32 Type;
DebugControl *Control;
UInt8 pTempStrG[constDebugMaxStringSize]; /* general debugging */
} DebugObject;
void debugTrace ( UInt8* pString );
void debugProcessChar ( UInt8* pszBuffer, UInt32*pdwPosition, UInt8 Value );
void debugProcessDec ( UInt8* pszBuffer, UInt32* pdwPosition, UInt32 Value );
void debugProcessHex ( UInt8* pszBuffer, UInt32* pdwPosition, UInt32 Value );
void debugProcessStr ( UInt8* pszBuffer, UInt32* pdwPosition, UInt8* Value );
/* GLOBAL DATA STRUCTURES */
static DebugObject globalDebugObject;
static DebugObject* Debug = &globalDebugObject;
/* IMPLEMENTATION */
/*
Note that this function uses the HAl and should be called after initializing
the hal
*/
Bool debugInit(
/* platform specific implementation */
debugParameters* Parameters )
{
void* pPBuf;
UInt32 Idx, Dummy;
UInt8* pSDRAM;
DebugControl* Control;
Debug->DebugBufferSize = ((debugParameters*)Parameters)->TraceBufferSize;
Debug->LevelBitmap = ((debugParameters*)Parameters)->LevelBitmap;
Debug->Type = ((debugParameters*)Parameters)->Type;
Debug->SDRAMBase = *(((char*)_MMIO_base) + DRAM_BASE );
Debug->SDRAMSize = *(((char*)_MMIO_base) + DRAM_LIMIT ) - Debug->SDRAMBase ;
switch ( Debug->Type )
{
case constTMManDebugTypeTrace :
/* initialize the persistent trace data structures */
if ( ( pPBuf = (UInt8*)malloc ( Debug->DebugBufferSize + sizeof ( DebugControl ) +
constDebugCacheAlignSize ) ) == 0 ) /* HARDCODED 64 byte alignment */
{
return False;
}
Control =
(DebugControl*)((((UInt32)pPBuf) & 0xffffffc0 ) + constDebugCacheBlockSize);
Control->AllocBase = pPBuf;
Control->Wrapped = 0; /* FIXME */
strcpy ( Control->szMagic, constDebugTMManMagic );
Control->szMagic[0] = 'T';
Control->szMagic[1] = 'i';
Control->szMagic[2] = 'l';
Control->szMagic[3] = 'a';
Control->szMagic[4] = 'k';
Control->szMagic[5] = 'r';
Control->szMagic[6] = 'a';
Control->szMagic[7] = 'j';
/* destroy any occurance of this string in memory */
pSDRAM = (UInt8*)Debug->SDRAMBase;
for ( Idx = 0 ; Idx < Debug->SDRAMSize ;
Idx += constDebugMagicSize, pSDRAM += constDebugMagicSize )
{
if ( strcmp ( pSDRAM, Control->szMagic ) != 0 )
continue;
/* ensure that we are not destroying out own data */
if ( pSDRAM == (UInt8*)&Control->szMagic[0] )
continue;
/* clear the string */
memset ( pSDRAM, 'X' , constDebugMagicSize );
/* make sure that the memory is updated */
COPYBACK (pSDRAM , 1 );
}
Control->BufLen = Debug->DebugBufferSize;
Control->BufPos = 0;
Control->Buffer =
((UInt8*)Control) + sizeof ( DebugControl );
/* write back the buffer control data */
COPYBACK ( Control, 2 );
Debug->Control = Control;
break;
default :
break;
}
return True;
}
Bool debugExit( void )
{
free ( Debug->Control );
return statusSuccess;
}
Bool debugCheckLevel ( UInt32 Level )
{
if( (( Level) & Debug->LevelBitmap) )
{
return True;
}
return False;
}
UInt32 debugLevel ( UInt32 OptionBits )
{
UInt32 TempOptionBits = Debug->LevelBitmap;
Debug->LevelBitmap = OptionBits;
return TempOptionBits;
}
void debugPrintf(
Int8* FormatString,
... )
{
/*PVOID pArgument = &pFormat; */
UInt32 Idx, StrIdx = 0;
UInt8 Char;
UInt32 Items = 0;
UInt32 dwPCSW;
va_list pArgument;
DisableInterrupts( dwPCSW );
va_start ( pArgument, FormatString );
for( Idx = 0 ; FormatString[Idx] ; Idx ++ )
{
/* check if we are overflowing the temp buffer. */
if ( ! ( StrIdx < constDebugMaxStringSize ) )
{
StrIdx--;
break;
}
if( FormatString[Idx] == '%')
{
Items++;
Char = FormatString[++Idx];
switch( Char )
{
case 'd':
debugProcessDec ( Debug->pTempStrG, &StrIdx, va_arg ( pArgument, UInt32 ) );
break;
case 's':
debugProcessStr ( Debug->pTempStrG, &StrIdx, va_arg ( pArgument, UInt32 ) );
break;
case 'c':
debugProcessChar ( Debug->pTempStrG, &StrIdx, va_arg ( pArgument, UInt8 ) );
break;
case 'x':
debugProcessHex ( Debug->pTempStrG, &StrIdx, va_arg ( pArgument, UInt32 ) );
break;
default :
Items--;
Debug->pTempStrG[StrIdx++] = ('%');
Debug->pTempStrG[StrIdx++] = (Char);
break;
}
}
else
{
Debug->pTempStrG[StrIdx++] = FormatString[Idx];
continue;
}
}
Debug->pTempStrG[StrIdx] = 0;
va_end ( pArgument );
switch ( Debug->Type )
{
case constTMManDebugTypeTrace :
debugTrace ( Debug->pTempStrG );
break;
default :
break;
}
RestoreInterrupts(dwPCSW);
}
void debugTrace ( UInt8* szString )
{
UInt32 Current;
UInt32 Length = 0;
UInt32 Idx;
UInt32 dwPCSW;
UInt32 Invalidate, LastInvalidated = 0;
DebugControl *Control = Debug->Control;;
Current = Control->BufPos;
DisableInterrupts(dwPCSW);
for ( Idx = 0; szString[Idx]; Idx++ )
{
Control->Buffer[Control->BufPos] = szString[Idx];
if ( ++Control->BufPos >= Control->BufLen )
{
Control->BufPos = 0;
Control->Wrapped = 1;/* FIXME */
}
}
/* write back the buffer control block - ignoring the magic string */
COPYBACK ( (((UInt8*)Control) + constDebugMagicSize + 1), 1 );
Length = Idx;
for ( Idx = 0 ; Idx < Length ; Idx++ )
{
Invalidate = (UInt32)&Control->Buffer[Current];
if ( ++Current >= Control->BufLen )
{
Current = 0;
}
COPYBACK ( (UInt8*)Invalidate , 1);
}
RestoreInterrupts(dwPCSW);
}
void debugProcessChar ( UInt8* pszBuffer, UInt32* pdwPosition, UInt8 Value )
{
pszBuffer[(*pdwPosition)++] = Value;
}
void debugProcessDec ( UInt8* pszBuffer, UInt32* pdwPosition, UInt32 Value )
{
UInt32 Divisor;
for( Divisor = 1 ; (Value / Divisor) >= 10 ;
Divisor *= 10);
do
{
pszBuffer[(*pdwPosition)++] = (UInt8)( (Value / Divisor) + '0');
Value = (UInt32)(Value % Divisor);
Divisor /= 10;
} while ( Divisor > 0);
}
void debugProcessHex ( UInt8* pszBuffer, UInt32* pdwPosition, UInt32 Value )
{
UInt8 Hex[] = "0123456789ABCDEF";
UInt32 Divisor;
for( Divisor = 1 ; (Value / Divisor) >= 16 ;
Divisor *= 16);
do
{
pszBuffer[(*pdwPosition)++] = (Hex[(Value / Divisor)]);
Value = (UInt32)(Value % Divisor);
Divisor /= 16;
} while ( Divisor > 0);
}
void debugProcessStr ( UInt8* pszBuffer, UInt32* pdwPosition, UInt8* Value )
{
UInt32 BufIdx;
for ( BufIdx = 0 ; Value[BufIdx]; BufIdx++ )
pszBuffer[(*pdwPosition)++] = Value[BufIdx];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -