ARCv2: entry: rearrange pt_regs slightly
authorVineet Gupta <vgupta@kernel.org>
Fri, 22 May 2020 23:24:53 +0000 (16:24 -0700)
committerVineet Gupta <vgupta@kernel.org>
Fri, 18 Aug 2023 17:30:47 +0000 (10:30 -0700)
Instead of r26,fp,sp,r12,r30 order as fp,r30,r12,r26,sp

 - keeps SP at well known position (right abive hardware autosave)
 - r26,r12 saved specifically for ARCv2 (and not in ARCv3) kept
   closer for easy ifdef'ry later

Signed-off-by: Vineet Gupta <vgupta@kernel.org>
arch/arc/include/asm/entry-arcv2.h
arch/arc/include/asm/ptrace.h
arch/arc/kernel/asm-offsets.c

index a030eae..4d13320 100644 (file)
  */
 .macro __SAVE_REGFILE_SOFT
 
-       ST2     gp, fp, PT_r26          ; gp (r26), fp (r27)
-
-       st      r12, [sp, PT_r12]
+       st      fp,  [sp, PT_fp]        ; r27
        st      r30, [sp, PT_r30]
+       st      r12, [sp, PT_r12]
+       st      r26, [sp, PT_r26]       ; gp
 
        ; Saving pt_regs->sp correctly requires some extra work due to the way
        ; Auto stack switch works
 /*------------------------------------------------------------------------*/
 .macro __RESTORE_REGFILE_SOFT
 
-       LD2     gp, fp, PT_r26          ; gp (r26), fp (r27)
-
-       ld      r12, [sp, PT_r12]
+       ld      fp,  [sp, PT_fp]
        ld      r30, [sp, PT_r30]
+       ld      r12, [sp, PT_r12]
+       ld      r26, [sp, PT_r26]
 
        ; Restore SP (into AUX_USER_SP) only if returning to U mode
        ;  - for K mode, it will be implicitly restored as stack is unwound
index 2bf8ea9..3a054b6 100644 (file)
@@ -77,11 +77,10 @@ struct pt_regs {
 
        unsigned long bta;      /* erbta */
 
-       unsigned long r26;      /* gp */
        unsigned long fp;
-       unsigned long sp;       /* user/kernel sp depending on where we came from  */
-
-       unsigned long r12, r30;
+       unsigned long r30;
+       unsigned long r12;
+       unsigned long r26;      /* gp */
 
 #ifdef CONFIG_ARC_HAS_ACCL_REGS
        unsigned long r58, r59; /* ACCL/ACCH used by FPU / DSP MPY */
@@ -90,6 +89,8 @@ struct pt_regs {
        unsigned long DSP_CTRL;
 #endif
 
+       unsigned long sp;       /* user/kernel sp depending on entry  */
+
        /*------- Below list auto saved by h/w -----------*/
        unsigned long r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11;
 
index e466889..478768c 100644 (file)
@@ -62,11 +62,9 @@ int main(void)
        DEFINE(PT_r26, offsetof(struct pt_regs, r26));
        DEFINE(PT_ret, offsetof(struct pt_regs, ret));
        DEFINE(PT_blink, offsetof(struct pt_regs, blink));
+       OFFSET(PT_fp, pt_regs, fp);
        DEFINE(PT_lpe, offsetof(struct pt_regs, lp_end));
        DEFINE(PT_lpc, offsetof(struct pt_regs, lp_count));
-       DEFINE(SZ_CALLEE_REGS, sizeof(struct callee_regs));
-       DEFINE(SZ_PT_REGS, sizeof(struct pt_regs));
-
 #ifdef CONFIG_ISA_ARCV2
        OFFSET(PT_r12, pt_regs, r12);
        OFFSET(PT_r30, pt_regs, r30);
@@ -79,5 +77,8 @@ int main(void)
        OFFSET(PT_DSP_CTRL, pt_regs, DSP_CTRL);
 #endif
 
+       DEFINE(SZ_CALLEE_REGS, sizeof(struct callee_regs));
+       DEFINE(SZ_PT_REGS, sizeof(struct pt_regs));
+
        return 0;
 }