#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 );
}