|
@@ -47,10 +47,47 @@ static int genregs_get(struct task_struct *target,
|
|
|
offsetof(struct user_regs_struct, LOC) + 4);
|
|
|
|
|
|
REG_O_ZERO(pad);
|
|
|
- REG_O_CHUNK(scratch, callee, ptregs);
|
|
|
+ REG_O_ONE(scratch.bta, &ptregs->bta);
|
|
|
+ REG_O_ONE(scratch.lp_start, &ptregs->lp_start);
|
|
|
+ REG_O_ONE(scratch.lp_end, &ptregs->lp_end);
|
|
|
+ REG_O_ONE(scratch.lp_count, &ptregs->lp_count);
|
|
|
+ REG_O_ONE(scratch.status32, &ptregs->status32);
|
|
|
+ REG_O_ONE(scratch.ret, &ptregs->ret);
|
|
|
+ REG_O_ONE(scratch.blink, &ptregs->blink);
|
|
|
+ REG_O_ONE(scratch.fp, &ptregs->fp);
|
|
|
+ REG_O_ONE(scratch.gp, &ptregs->r26);
|
|
|
+ REG_O_ONE(scratch.r12, &ptregs->r12);
|
|
|
+ REG_O_ONE(scratch.r11, &ptregs->r11);
|
|
|
+ REG_O_ONE(scratch.r10, &ptregs->r10);
|
|
|
+ REG_O_ONE(scratch.r9, &ptregs->r9);
|
|
|
+ REG_O_ONE(scratch.r8, &ptregs->r8);
|
|
|
+ REG_O_ONE(scratch.r7, &ptregs->r7);
|
|
|
+ REG_O_ONE(scratch.r6, &ptregs->r6);
|
|
|
+ REG_O_ONE(scratch.r5, &ptregs->r5);
|
|
|
+ REG_O_ONE(scratch.r4, &ptregs->r4);
|
|
|
+ REG_O_ONE(scratch.r3, &ptregs->r3);
|
|
|
+ REG_O_ONE(scratch.r2, &ptregs->r2);
|
|
|
+ REG_O_ONE(scratch.r1, &ptregs->r1);
|
|
|
+ REG_O_ONE(scratch.r0, &ptregs->r0);
|
|
|
+ REG_O_ONE(scratch.sp, &ptregs->sp);
|
|
|
+
|
|
|
REG_O_ZERO(pad2);
|
|
|
- REG_O_CHUNK(callee, efa, cregs);
|
|
|
- REG_O_CHUNK(efa, stop_pc, &target->thread.fault_address);
|
|
|
+
|
|
|
+ REG_O_ONE(callee.r25, &cregs->r25);
|
|
|
+ REG_O_ONE(callee.r24, &cregs->r24);
|
|
|
+ REG_O_ONE(callee.r23, &cregs->r23);
|
|
|
+ REG_O_ONE(callee.r22, &cregs->r22);
|
|
|
+ REG_O_ONE(callee.r21, &cregs->r21);
|
|
|
+ REG_O_ONE(callee.r20, &cregs->r20);
|
|
|
+ REG_O_ONE(callee.r19, &cregs->r19);
|
|
|
+ REG_O_ONE(callee.r18, &cregs->r18);
|
|
|
+ REG_O_ONE(callee.r17, &cregs->r17);
|
|
|
+ REG_O_ONE(callee.r16, &cregs->r16);
|
|
|
+ REG_O_ONE(callee.r15, &cregs->r15);
|
|
|
+ REG_O_ONE(callee.r14, &cregs->r14);
|
|
|
+ REG_O_ONE(callee.r13, &cregs->r13);
|
|
|
+
|
|
|
+ REG_O_ONE(efa, &target->thread.fault_address);
|
|
|
|
|
|
if (!ret) {
|
|
|
if (in_brkpt_trap(ptregs)) {
|
|
@@ -97,12 +134,51 @@ static int genregs_set(struct task_struct *target,
|
|
|
offsetof(struct user_regs_struct, LOC) + 4);
|
|
|
|
|
|
REG_IGNORE_ONE(pad);
|
|
|
- /* TBD: disallow updates to STATUS32 etc*/
|
|
|
- REG_IN_CHUNK(scratch, pad2, ptregs); /* pt_regs[bta..sp] */
|
|
|
+
|
|
|
+ REG_IN_ONE(scratch.bta, &ptregs->bta);
|
|
|
+ REG_IN_ONE(scratch.lp_start, &ptregs->lp_start);
|
|
|
+ REG_IN_ONE(scratch.lp_end, &ptregs->lp_end);
|
|
|
+ REG_IN_ONE(scratch.lp_count, &ptregs->lp_count);
|
|
|
+
|
|
|
+ REG_IGNORE_ONE(scratch.status32);
|
|
|
+
|
|
|
+ REG_IN_ONE(scratch.ret, &ptregs->ret);
|
|
|
+ REG_IN_ONE(scratch.blink, &ptregs->blink);
|
|
|
+ REG_IN_ONE(scratch.fp, &ptregs->fp);
|
|
|
+ REG_IN_ONE(scratch.gp, &ptregs->r26);
|
|
|
+ REG_IN_ONE(scratch.r12, &ptregs->r12);
|
|
|
+ REG_IN_ONE(scratch.r11, &ptregs->r11);
|
|
|
+ REG_IN_ONE(scratch.r10, &ptregs->r10);
|
|
|
+ REG_IN_ONE(scratch.r9, &ptregs->r9);
|
|
|
+ REG_IN_ONE(scratch.r8, &ptregs->r8);
|
|
|
+ REG_IN_ONE(scratch.r7, &ptregs->r7);
|
|
|
+ REG_IN_ONE(scratch.r6, &ptregs->r6);
|
|
|
+ REG_IN_ONE(scratch.r5, &ptregs->r5);
|
|
|
+ REG_IN_ONE(scratch.r4, &ptregs->r4);
|
|
|
+ REG_IN_ONE(scratch.r3, &ptregs->r3);
|
|
|
+ REG_IN_ONE(scratch.r2, &ptregs->r2);
|
|
|
+ REG_IN_ONE(scratch.r1, &ptregs->r1);
|
|
|
+ REG_IN_ONE(scratch.r0, &ptregs->r0);
|
|
|
+ REG_IN_ONE(scratch.sp, &ptregs->sp);
|
|
|
+
|
|
|
REG_IGNORE_ONE(pad2);
|
|
|
- REG_IN_CHUNK(callee, efa, cregs); /* callee_regs[r25..r13] */
|
|
|
+
|
|
|
+ REG_IN_ONE(callee.r25, &cregs->r25);
|
|
|
+ REG_IN_ONE(callee.r24, &cregs->r24);
|
|
|
+ REG_IN_ONE(callee.r23, &cregs->r23);
|
|
|
+ REG_IN_ONE(callee.r22, &cregs->r22);
|
|
|
+ REG_IN_ONE(callee.r21, &cregs->r21);
|
|
|
+ REG_IN_ONE(callee.r20, &cregs->r20);
|
|
|
+ REG_IN_ONE(callee.r19, &cregs->r19);
|
|
|
+ REG_IN_ONE(callee.r18, &cregs->r18);
|
|
|
+ REG_IN_ONE(callee.r17, &cregs->r17);
|
|
|
+ REG_IN_ONE(callee.r16, &cregs->r16);
|
|
|
+ REG_IN_ONE(callee.r15, &cregs->r15);
|
|
|
+ REG_IN_ONE(callee.r14, &cregs->r14);
|
|
|
+ REG_IN_ONE(callee.r13, &cregs->r13);
|
|
|
+
|
|
|
REG_IGNORE_ONE(efa); /* efa update invalid */
|
|
|
- REG_IGNORE_ONE(stop_pc); /* PC updated via @ret */
|
|
|
+ REG_IGNORE_ONE(stop_pc); /* PC updated via @ret */
|
|
|
|
|
|
return ret;
|
|
|
}
|