2 Copyright © 2010-2012, The AROS Development Team. All rights reserved.
5 Desc: PowerPC CPU context parsing routines.
11 #include <exec/rawfmt.h>
12 #include <proto/exec.h>
16 #include "exec_intern.h"
17 #include "exec_util.h"
19 static const char *gpr_fmt
= "MSR=%08lx IP=%08lx CR =%08lx XER=%08lx\n"
20 "CTR=%08lx LR=%08lx DSISR=%08lx DAR=%08lx\n"
21 "R0 =%08lx R1=%08lx R2 =%08lx R3 =%08lx\n"
22 "R4 =%08lx R5=%08lx R6 =%08lx R7 =%08lx\n"
23 "R8 =%08lx R9=%08lx R10=%08lx R11=%08lx\n" \
26 static const char *gp2_fmt
= " R13=%08lx R14=%08lx R15=%08lx\n"
27 "R16=%08lx R17=%08lx R18=%08lx R19=%08lx\n"
28 "R20=%08lx R21=%08lx R22=%08lx R23=%08lx\n"
29 "R24=%08lx R25=%08lx R26=%08lx R27=%08lx\n"
30 "R28=%08lx R29=%08lx R30=%08lx R31=%08lx";
32 char *FormatCPUContext(char *buffer
, struct ExceptionContext
*ctx
, struct ExecBase
*SysBase
)
34 VOID_FUNC dest
= buffer
? RAWFMTFUNC_STRING
: RAWFMTFUNC_SERIAL
;
37 buf
= NewRawDoFmt(gpr_fmt
, dest
, buffer
,
38 ctx
->msr
, ctx
->ip
, ctx
->cr
, ctx
->xer
,
39 ctx
->ctr
, ctx
->lr
, ctx
->dsisr
, ctx
->dar
,
40 ctx
->gpr
[0] , ctx
->gpr
[1], ctx
->gpr
[2] , ctx
->gpr
[3],
41 ctx
->gpr
[4] , ctx
->gpr
[5], ctx
->gpr
[6] , ctx
->gpr
[7],
42 ctx
->gpr
[8] , ctx
->gpr
[9], ctx
->gpr
[10], ctx
->gpr
[11],
44 if (ctx
->Flags
& ECF_FULL_GPRS
)
46 buf
= NewRawDoFmt(gp2_fmt
, dest
, buf
- 1,
47 ctx
->gpr
[13], ctx
->gpr
[14], ctx
->gpr
[15],
48 ctx
->gpr
[16], ctx
->gpr
[17], ctx
->gpr
[18], ctx
->gpr
[19],
49 ctx
->gpr
[20], ctx
->gpr
[21], ctx
->gpr
[22], ctx
->gpr
[23],
50 ctx
->gpr
[24], ctx
->gpr
[25], ctx
->gpr
[26], ctx
->gpr
[27],
51 ctx
->gpr
[28], ctx
->gpr
[29], ctx
->gpr
[30], ctx
->gpr
[31]);
57 /* Unwind a single stack frame. CPU-dependent. */
58 APTR
UnwindFrame(APTR fp
, APTR
*caller
)
62 sp
= sp
[0]; /* Go to previous frame first */
64 *caller
= sp
[1]; /* Caller address is stored in *caller's* frame */