1 #include <exec/types.h>
2 #include <exec/execbase.h>
3 #include <exec/memory.h>
4 #include <utility/tagitem.h>
5 #include <asm/mpc5200b.h>
6 #include <proto/kernel.h>
8 #include "exec_intern.h"
13 #include <aros/libcall.h>
14 #include <aros/debug.h>
16 BOOL
PrepareContext(struct Task
*task
, APTR entryPoint
, APTR fallBack
,
17 const struct TagItem
*tagList
, struct ExecBase
*SysBase
)
21 IPTR
*sp
=(IPTR
*)((IPTR
)task
->tc_SPReg
& 0xfffffff0);
27 switch(tagList
->ti_Tag
)
30 tagList
= (const struct TagItem
*)tagList
->ti_Data
;
34 tagList
+= tagList
->ti_Data
;
41 #define HANDLEARG(x) \
42 case TASKTAG_ARG ## x: \
43 args[x - 1] = (IPTR)tagList->ti_Data; \
44 if (x > numargs) numargs = x; \
59 if (tagList
) tagList
++;
62 if (!(task
->tc_Flags
& TF_ETASK
) )
65 /* Get the memory for CPU context. Alloc it with MEMF_CLEAR flag */
66 task
->tc_UnionETask
.tc_ETask
->et_RegFrame
= KrnCreateContext();
68 D(bug("[exec] PrepareContext: et_RegFrame = %012p\n", task
->tc_UnionETask
.tc_ETask
->et_RegFrame
));
70 if (!(ctx
= (context_t
*)task
->tc_UnionETask
.tc_ETask
->et_RegFrame
))
79 ctx
->cpu
.gpr
[10] = args
[7];
81 ctx
->cpu
.gpr
[9] = args
[6];
83 ctx
->cpu
.gpr
[8] = args
[5];
85 ctx
->cpu
.gpr
[7] = args
[4];
87 ctx
->cpu
.gpr
[6] = args
[3];
89 ctx
->cpu
.gpr
[5] = args
[2];
91 ctx
->cpu
.gpr
[4] = args
[1];
93 ctx
->cpu
.gpr
[3] = args
[0];
98 /* Push fallBack address */
99 ctx
->cpu
.lr
= fallBack
;
101 * Task will be started upon interrupt resume. Push entrypoint into SRR0
102 * and the MSR register into SRR1. Enable FPU at the beginning
104 ctx
->cpu
.srr0
= (IPTR
)entryPoint
;
105 ctx
->cpu
.srr1
= MSR_PR
| MSR_EE
| MSR_ME
| MSR_IS
| MSR_DS
;
106 ctx
->cpu
.srr1
|= MSR_FP
;
107 ctx
->cpu
.gpr
[1] = sp
;
114 D(bug("[exec] New context:\n[exec] SRR0=%08x, SRR1=%08x\n",ctx
->cpu
.srr0
, ctx
->cpu
.srr1
));
115 D(bug("[exec] GPR00=%08x GPR01=%08x GPR02=%08x GPR03=%08x\n",
116 ctx
->cpu
.gpr
[0],ctx
->cpu
.gpr
[1],ctx
->cpu
.gpr
[2],ctx
->cpu
.gpr
[3]));
117 D(bug("[exec] GPR04=%08x GPR05=%08x GPR06=%08x GPR07=%08x\n",
118 ctx
->cpu
.gpr
[4],ctx
->cpu
.gpr
[5],ctx
->cpu
.gpr
[6],ctx
->cpu
.gpr
[7]));
119 D(bug("[exec] GPR08=%08x GPR09=%08x GPR10=%08x GPR11=%08x\n",
120 ctx
->cpu
.gpr
[8],ctx
->cpu
.gpr
[9],ctx
->cpu
.gpr
[10],ctx
->cpu
.gpr
[11]));
121 D(bug("[exec] GPR12=%08x GPR13=%08x GPR14=%08x GPR15=%08x\n",
122 ctx
->cpu
.gpr
[12],ctx
->cpu
.gpr
[13],ctx
->cpu
.gpr
[14],ctx
->cpu
.gpr
[15]));
124 D(bug("[exec] GPR16=%08x GPR17=%08x GPR18=%08x GPR19=%08x\n",
125 ctx
->cpu
.gpr
[16],ctx
->cpu
.gpr
[17],ctx
->cpu
.gpr
[18],ctx
->cpu
.gpr
[19]));
126 D(bug("[exec] GPR20=%08x GPR21=%08x GPR22=%08x GPR23=%08x\n",
127 ctx
->cpu
.gpr
[20],ctx
->cpu
.gpr
[21],ctx
->cpu
.gpr
[22],ctx
->cpu
.gpr
[23]));
128 D(bug("[exec] GPR24=%08x GPR25=%08x GPR26=%08x GPR27=%08x\n",
129 ctx
->cpu
.gpr
[24],ctx
->cpu
.gpr
[25],ctx
->cpu
.gpr
[26],ctx
->cpu
.gpr
[27]));
130 D(bug("[exec] GPR28=%08x GPR29=%08x GPR30=%08x GPR31=%08x\n",
131 ctx
->cpu
.gpr
[28],ctx
->cpu
.gpr
[29],ctx
->cpu
.gpr
[30],ctx
->cpu
.gpr
[31]));