ARC: pt_regs update #2: Remove unused gutter at start of pt_regs
authorVineet Gupta <vgupta@synopsys.com>
Tue, 28 May 2013 04:13:17 +0000 (09:43 +0530)
committerVineet Gupta <vgupta@synopsys.com>
Sat, 22 Jun 2013 13:53:22 +0000 (19:23 +0530)
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
arch/arc/include/asm/entry.h
arch/arc/include/asm/ptrace.h
arch/arc/include/uapi/asm/ptrace.h
arch/arc/kernel/ptrace.c

index 2b274fa..5ff7b8d 100644 (file)
        st.a    r9, [sp, -4]
        lr      r9, [erbta]
        st.a    r9, [sp, -4]
-
-       /* move up by 1 word to "create" pt_regs->"stack_place_holder" */
-       sub sp, sp, 4
 .endm
 
 /*--------------------------------------------------------------
  * by hardware and that is not good.
  *-------------------------------------------------------------*/
 .macro RESTORE_ALL_SYS
-
-       add sp, sp, 4       /* hop over unused "pt_regs->stack_place_holder" */
-
        ld.ab   r9, [sp, 4]
        sr      r9, [erbta]
        ld.ab   r9, [sp, 4]
        st.a    r9, [sp, -4]
        lr      r9, [bta_l1]
        st.a    r9, [sp, -4]
-
-       /* move up by 1 word to "create" pt_regs->"stack_place_holder" */
-       sub sp, sp, 4
 .endm
 
 .macro SAVE_ALL_INT2
        st.a    r9, [sp, -4]
        lr      r9, [bta_l2]
        st.a    r9, [sp, -4]
-
-       /* move up by 1 word to "create" pt_regs->"stack_place_holder" */
-       sub sp, sp, 4
 .endm
 
 /*--------------------------------------------------------------
  *-------------------------------------------------------------*/
 
 .macro RESTORE_ALL_INT1
-       add sp, sp, 4       /* hop over unused "pt_regs->stack_place_holder" */
-
        ld.ab   r9, [sp, 4] /* Actual reg file */
        sr      r9, [bta_l1]
        ld.ab   r9, [sp, 4]
 .endm
 
 .macro RESTORE_ALL_INT2
-       add sp, sp, 4       /* hop over unused "pt_regs->stack_place_holder" */
-
        ld.ab   r9, [sp, 4]
        sr      r9, [bta_l2]
        ld.ab   r9, [sp, 4]
index f82a3a2..7491bb7 100644 (file)
 /* THE pt_regs: Defines how regs are saved during entry into kernel */
 
 struct pt_regs {
-       /*
-        * 1 word gutter after reg-file has been saved
-        * Technically not needed, Since SP always points to a "full" location
-        * (vs. "empty"). But pt_regs is shared with tools....
-        */
-       long res;
 
        /* Real registers */
        long bta;       /* bta_l1, bta_l2, erbta */
index 30333ce..e0e8403 100644 (file)
  *
  * This is to decouple pt_regs from user-space ABI, to be able to change it
  * w/o affecting the ABI.
- * Although the layout (initial padding) is similar to pt_regs to have some
- * optimizations when copying pt_regs to/from user_regs_struct.
+ *
+ * The intermediate pad,pad2 are relics of initial layout based on pt_regs
+ * for optimizations when copying pt_regs to/from user_regs_struct.
+ * We no longer need them, but can't be changed as they are part of ABI now.
  *
  * Also, sigcontext only care about the scratch regs as that is what we really
- * save/restore for signal handling.
+ * save/restore for signal handling. However gdb also uses the same struct
+ * hence callee regs need to be in there too.
 */
 struct user_regs_struct {
 
+       long pad;
        struct {
-               long pad;
                long bta, lp_start, lp_end, lp_count;
                long status32, ret, blink, fp, gp;
                long r12, r11, r10, r9, r8, r7, r6, r5, r4, r3, r2, r1, r0;
index c6a81c5..6e467e3 100644 (file)
@@ -40,6 +40,13 @@ static int genregs_get(struct task_struct *target,
                        offsetof(struct user_regs_struct, LOC), \
                        offsetof(struct user_regs_struct, LOC) + 4);
 
+#define REG_O_ZERO(LOC)                \
+       if (!ret)               \
+               ret = user_regset_copyout_zero(&pos, &count, &kbuf, &ubuf, \
+                       offsetof(struct user_regs_struct, LOC), \
+                       offsetof(struct user_regs_struct, LOC) + 4);
+
+       REG_O_ZERO(pad);
        REG_O_CHUNK(scratch, callee, ptregs);
        REG_O_CHUNK(callee, efa, cregs);
        REG_O_CHUNK(efa, stop_pc, &target->thread.fault_address);
@@ -88,6 +95,7 @@ static int genregs_set(struct task_struct *target,
                        offsetof(struct user_regs_struct, LOC), \
                        offsetof(struct user_regs_struct, LOC) + 4);
 
+       REG_IGNORE_ONE(pad);
        /* TBD: disallow updates to STATUS32, orig_r8 etc*/
        REG_IN_CHUNK(scratch, callee, ptregs);  /* pt_regs[bta..orig_r8] */
        REG_IN_CHUNK(callee, efa, cregs);       /* callee_regs[r25..r13] */