mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
353 lines
7.6 KiB
353 lines
7.6 KiB
#define TARGET_PPC
|
|
#include <platform.h>
|
|
#include <imagehlp.h>
|
|
#include <crash.h>
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include "dumpexam.h"
|
|
|
|
|
|
#define GetContext(p,c) GetContextPPC(p,c)
|
|
#define MAX_STACK_FRAMES 100
|
|
#define SAVE_EBP(f) f.Reserved[0]
|
|
#define TRAP_TSS(f) f.Reserved[1]
|
|
#define TRAP_EDITED(f) f.Reserved[1]
|
|
#define SAVE_TRAP(f) f.Reserved[2]
|
|
|
|
|
|
extern FILE *FileOut;
|
|
|
|
VOID
|
|
PrintRegisters(
|
|
ULONG Processor,
|
|
PCONTEXT Context
|
|
);
|
|
|
|
|
|
|
|
static
|
|
DWORD
|
|
GetStackTrace(
|
|
PDUMP_HEADER DmpHeader,
|
|
ULONG Processor,
|
|
LPSTACKFRAME Frames,
|
|
ULONG MaxFrames,
|
|
PCONTEXT Context
|
|
)
|
|
{
|
|
BOOL rVal;
|
|
STACKFRAME StackFrame;
|
|
DWORD FrameCnt;
|
|
|
|
|
|
FrameCnt = 0;
|
|
ZeroMemory( &StackFrame, sizeof(STACKFRAME) );
|
|
|
|
do {
|
|
rVal = StackWalk(
|
|
IMAGE_FILE_MACHINE_POWERPC,
|
|
(HANDLE)DmpHeader,
|
|
(HANDLE)Processor,
|
|
&StackFrame,
|
|
Context,
|
|
SwReadMemory,
|
|
SwFunctionTableAccess,
|
|
SwGetModuleBase,
|
|
NULL
|
|
);
|
|
if (rVal) {
|
|
CopyMemory(
|
|
&Frames[FrameCnt],
|
|
&StackFrame,
|
|
sizeof(STACKFRAME)
|
|
);
|
|
FrameCnt += 1;
|
|
}
|
|
} while( rVal && FrameCnt < MaxFrames );
|
|
|
|
return FrameCnt;
|
|
}
|
|
|
|
static
|
|
VOID
|
|
PrintStackTrace(
|
|
PDUMP_HEADER DmpHeader,
|
|
ULONG Processor,
|
|
LPSTACKFRAME StackFrames,
|
|
ULONG FrameCnt
|
|
)
|
|
{
|
|
PFPO_DATA pFpoData;
|
|
PIMAGEHLP_SYMBOL Symbol;
|
|
ULONG i;
|
|
ULONG Displacement;
|
|
CHAR SymBuf[512];
|
|
|
|
|
|
PrintHeading( "Stack Trace" );
|
|
fprintf( FileOut, "Callee-SP Arguments to Callee Call Site\n");
|
|
|
|
for (i=0; i<FrameCnt; i++) {
|
|
|
|
if (SymGetSymFromAddr( DmpHeader, StackFrames[i].AddrPC.Offset, &Displacement, sym )) {
|
|
strcpy( SymBuf, sym->Name );
|
|
} else {
|
|
sprintf( SymBuf, "0x%08x", StackFrames[i].AddrPC.Offset );
|
|
}
|
|
|
|
fprintf(
|
|
FileOut,
|
|
"%08lx %08lx : %08lx %08lx %08lx %08lx %s",
|
|
StackFrames[i].AddrFrame.Offset,
|
|
StackFrames[i].AddrReturn.Offset,
|
|
StackFrames[i].Params[0],
|
|
StackFrames[i].Params[1],
|
|
StackFrames[i].Params[2],
|
|
StackFrames[i].Params[3],
|
|
SymBuf
|
|
);
|
|
|
|
if (Displacement) {
|
|
fprintf( FileOut, "+0x%x", Displacement );
|
|
}
|
|
|
|
fprintf( FileOut, "\n" );
|
|
}
|
|
|
|
fprintf( FileOut, "\n" );
|
|
|
|
}
|
|
|
|
VOID
|
|
PrintStackTracePPC(
|
|
PDUMP_HEADER DmpHeader,
|
|
ULONG Processor
|
|
)
|
|
{
|
|
PFPO_DATA pFpoData;
|
|
CONTEXT Context;
|
|
STACKFRAME StackFrames[MAX_STACK_FRAMES];
|
|
ULONG FrameCnt;
|
|
ULONG i;
|
|
CHAR buf[32];
|
|
|
|
|
|
GetContext( Processor, &Context );
|
|
|
|
FrameCnt = GetStackTrace(
|
|
DmpHeader,
|
|
Processor,
|
|
StackFrames,
|
|
MAX_STACK_FRAMES,
|
|
&Context
|
|
);
|
|
|
|
PrintStackTrace(
|
|
DmpHeader,
|
|
Processor,
|
|
StackFrames,
|
|
FrameCnt
|
|
);
|
|
}
|
|
|
|
VOID
|
|
BugCheckHeuristicsPPC(
|
|
PDUMP_HEADER DmpHeader,
|
|
ULONG Processor
|
|
)
|
|
{
|
|
CHAR buf[32];
|
|
CONTEXT Context;
|
|
|
|
|
|
if (DmpHeader->BugCheckCode == KMODE_EXCEPTION_NOT_HANDLED) {
|
|
PrintHeading(
|
|
"Dump Analysis Heuristics for Bugcode %s",
|
|
GetBugText(DmpHeader->BugCheckCode)
|
|
);
|
|
fprintf(
|
|
FileOut,
|
|
"Exception Code: 0x%08x\n",
|
|
DmpHeader->BugCheckParameter1
|
|
);
|
|
fprintf(
|
|
FileOut,
|
|
"Address of Exception: 0x%08x\n",
|
|
DmpHeader->BugCheckParameter2
|
|
);
|
|
fprintf(
|
|
FileOut,
|
|
"Parameter #0: 0x%08x\n",
|
|
DmpHeader->BugCheckParameter3
|
|
);
|
|
fprintf(
|
|
FileOut,
|
|
"Parameter #1: 0x%08x\n\n",
|
|
DmpHeader->BugCheckParameter4
|
|
);
|
|
}
|
|
|
|
if (DmpHeader->BugCheckCode == IRQL_NOT_LESS_OR_EQUAL) {
|
|
PrintHeading(
|
|
"Dump Analysis Heuristics for Bugcode %s",
|
|
GetBugText(DmpHeader->BugCheckCode)
|
|
);
|
|
fprintf(
|
|
FileOut,
|
|
"Invalid Address Referenced: 0x%08x\n",
|
|
DmpHeader->BugCheckParameter1
|
|
);
|
|
fprintf(
|
|
FileOut,
|
|
"IRQL: %d\n",
|
|
DmpHeader->BugCheckParameter2
|
|
);
|
|
fprintf(
|
|
FileOut,
|
|
"Access Type: %s\n",
|
|
DmpHeader->BugCheckParameter3 ? "Read" : "Write"
|
|
);
|
|
fprintf(
|
|
FileOut,
|
|
"Code Address: 0x%08x\n\n",
|
|
DmpHeader->BugCheckParameter4
|
|
);
|
|
sprintf( buf, "%08x", DmpHeader->BugCheckParameter1 );
|
|
GetContext( Processor, &Context );
|
|
DoExtension( "pool", buf, Processor, (DWORD)GetRegisterValue( &Context, REG_IP ) );
|
|
}
|
|
}
|
|
|
|
ULONGLONG
|
|
GetRegisterValuePPC(
|
|
PCONTEXT Context,
|
|
ULONG Register
|
|
)
|
|
{
|
|
ULONGLONG Value = 0;
|
|
|
|
switch( Register ) {
|
|
case REG_IP:
|
|
Value = Context->Iar;
|
|
break;
|
|
|
|
case REG_FP:
|
|
Value = Context->Gpr1;
|
|
break;
|
|
|
|
case REG_SP:
|
|
Value = Context->Gpr1;
|
|
break;
|
|
}
|
|
|
|
return (LONG)Value;
|
|
}
|
|
|
|
|
|
VOID
|
|
GetContextPPC(
|
|
ULONG Processor,
|
|
PVOID Context
|
|
)
|
|
{
|
|
DmpGetContext( Processor, Context );
|
|
}
|
|
|
|
|
|
static
|
|
VOID
|
|
PrintRegisters(
|
|
ULONG Processor,
|
|
PCONTEXT Context
|
|
)
|
|
{
|
|
PrintHeading( "Register Dump For Processor #%d", Processor );
|
|
|
|
fprintf(
|
|
FileOut,
|
|
" r0=%08x r1=%08x r2=%08x r3=%08x r4=%08x r5=%08x\n",
|
|
Context->Gpr0,
|
|
Context->Gpr1,
|
|
Context->Gpr2,
|
|
Context->Gpr3,
|
|
Context->Gpr4,
|
|
Context->Gpr5
|
|
);
|
|
|
|
fprintf(
|
|
FileOut,
|
|
" r6=%08x r7=%08x r8=%08x r9=%08x r10=%08x r11=%08x\n",
|
|
Context->Gpr6,
|
|
Context->Gpr7,
|
|
Context->Gpr8,
|
|
Context->Gpr9,
|
|
Context->Gpr10,
|
|
Context->Gpr11
|
|
);
|
|
|
|
fprintf(
|
|
FileOut,
|
|
"r12=%08x r13=%08x r14=%08x r15=%08x r16=%08x r17=%08x\n",
|
|
Context->Gpr12,
|
|
Context->Gpr13,
|
|
Context->Gpr14,
|
|
Context->Gpr15,
|
|
Context->Gpr16,
|
|
Context->Gpr17
|
|
);
|
|
|
|
fprintf(
|
|
FileOut,
|
|
"r18=%08x r19=%08x r20=%08x r21=%08x r22=%08x r23=%08x\n",
|
|
Context->Gpr18,
|
|
Context->Gpr19,
|
|
Context->Gpr20,
|
|
Context->Gpr21,
|
|
Context->Gpr22,
|
|
Context->Gpr23
|
|
);
|
|
|
|
fprintf(
|
|
FileOut,
|
|
"r24=%08x r25=%08x r26=%08x r27=%08x r28=%08x r29=%08x\n",
|
|
Context->Gpr24,
|
|
Context->Gpr25,
|
|
Context->Gpr26,
|
|
Context->Gpr27,
|
|
Context->Gpr28,
|
|
Context->Gpr29
|
|
);
|
|
|
|
fprintf(
|
|
FileOut,
|
|
"r30=%08x r31=%08x cr=%08x xer=%08x msr=%08x iar=%08x\n",
|
|
Context->Gpr30,
|
|
Context->Gpr31,
|
|
Context->Cr,
|
|
Context->Xer,
|
|
Context->Msr,
|
|
Context->Iar
|
|
);
|
|
|
|
fprintf(
|
|
FileOut,
|
|
" lr=%08x ctr=%08x\n",
|
|
Context->Lr,
|
|
Context->Ctr
|
|
);
|
|
|
|
fprintf( FileOut, "\n" );
|
|
}
|
|
|
|
VOID
|
|
PrintRegistersPPC(
|
|
ULONG Processor
|
|
)
|
|
{
|
|
CONTEXT Context;
|
|
|
|
|
|
GetContext( Processor, &Context );
|
|
PrintRegisters( Processor, &Context );
|
|
}
|