powerpc: add a define for the switch frame size and regs offset
authorNicholas Piggin <npiggin@gmail.com>
Sun, 27 Nov 2022 12:49:36 +0000 (22:49 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 2 Dec 2022 06:54:08 +0000 (17:54 +1100)
This is open-coded in process.c, ppc32 uses a different define with the
same value, and the C definition is name differently which makes it an
extra indirection to grep for.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20221127124942.1665522-12-npiggin@gmail.com
arch/powerpc/include/asm/ptrace.h
arch/powerpc/kernel/asm-offsets.c
arch/powerpc/kernel/entry_32.S
arch/powerpc/kernel/process.c

index 705ce26ae887d9ffe963f609d3b7ea8c1aa111b9..412ef0749775232da6fdf16f2934f2978b6fbe6d 100644 (file)
@@ -97,8 +97,6 @@ struct pt_regs
 #endif
 
 
-#define STACK_FRAME_WITH_PT_REGS (STACK_FRAME_OVERHEAD + sizeof(struct pt_regs))
-
 // Always displays as "REGS" in memory dumps
 #ifdef CONFIG_CPU_BIG_ENDIAN
 #define STACK_FRAME_REGS_MARKER        ASM_CONST(0x52454753)
@@ -125,6 +123,8 @@ struct pt_regs
 #define STACK_USER_INT_FRAME_SIZE      (sizeof(struct pt_regs) + STACK_FRAME_OVERHEAD)
 #define STACK_INT_FRAME_REGS   STACK_FRAME_OVERHEAD
 #define STACK_INT_FRAME_MARKER (STACK_FRAME_OVERHEAD - 16)
+#define STACK_SWITCH_FRAME_SIZE        (sizeof(struct pt_regs) + STACK_FRAME_OVERHEAD)
+#define STACK_SWITCH_FRAME_REGS        STACK_FRAME_OVERHEAD
 
 #ifdef CONFIG_PPC64_ELF_ABI_V2
 #define STACK_FRAME_MIN_SIZE   32
@@ -146,6 +146,8 @@ struct pt_regs
 #define STACK_INT_FRAME_REGS   STACK_FRAME_OVERHEAD
 #define STACK_INT_FRAME_MARKER (STACK_FRAME_OVERHEAD - 8)
 #define STACK_FRAME_MIN_SIZE   STACK_FRAME_OVERHEAD
+#define STACK_SWITCH_FRAME_SIZE        (sizeof(struct pt_regs) + STACK_FRAME_OVERHEAD)
+#define STACK_SWITCH_FRAME_REGS        STACK_FRAME_OVERHEAD
 
 /* Size of stack frame allocated when calling signal handler. */
 #define __SIGNAL_FRAMESIZE     64
index 68905c9f7c21ca2fc72cea9cadb0321eed484f1a..d24a59a98c0c9e88e66814b143a7b8d1fafe4b11 100644 (file)
@@ -260,7 +260,7 @@ int main(void)
 
        /* Interrupt register frame */
        DEFINE(INT_FRAME_SIZE, STACK_INT_FRAME_SIZE);
-       DEFINE(SWITCH_FRAME_SIZE, STACK_FRAME_WITH_PT_REGS);
+       DEFINE(SWITCH_FRAME_SIZE, STACK_SWITCH_FRAME_SIZE);
        STACK_PT_REGS_OFFSET(GPR0, gpr[0]);
        STACK_PT_REGS_OFFSET(GPR1, gpr[1]);
        STACK_PT_REGS_OFFSET(GPR2, gpr[2]);
index 2f61b7d3677c1552306f0b9a8b07637c6b0084f5..6e99ec10be89bb61fc7410ede3e3befdd2c41129 100644 (file)
@@ -215,9 +215,9 @@ ret_from_kernel_thread:
  * in arch/ppc/kernel/process.c
  */
 _GLOBAL(_switch)
-       stwu    r1,-INT_FRAME_SIZE(r1)
+       stwu    r1,-SWITCH_FRAME_SIZE(r1)
        mflr    r0
-       stw     r0,INT_FRAME_SIZE+4(r1)
+       stw     r0,SWITCH_FRAME_SIZE+4(r1)
        /* r3-r12 are caller saved -- Cort */
        SAVE_NVGPRS(r1)
        stw     r0,_NIP(r1)     /* Return to switch caller */
@@ -248,7 +248,7 @@ _GLOBAL(_switch)
 
        lwz     r4,_NIP(r1)     /* Return to _switch caller in new task */
        mtlr    r4
-       addi    r1,r1,INT_FRAME_SIZE
+       addi    r1,r1,SWITCH_FRAME_SIZE
        blr
 
        .globl  fast_exception_return
index 010a5ee746aefe7ca8f21d901bbc3708505d1dde..0cb5296c6c41e87f62b924c57721bb67304a0e2b 100644 (file)
@@ -1808,10 +1808,10 @@ int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
         * do some house keeping and then return from the fork or clone
         * system call, using the stack frame created above.
         */
-       sp -= sizeof(struct pt_regs);
-       kregs = (struct pt_regs *) sp;
-       sp -= STACK_FRAME_OVERHEAD;
+       sp -= STACK_SWITCH_FRAME_SIZE;
+       kregs = (struct pt_regs *)(sp + STACK_SWITCH_FRAME_REGS);
        p->thread.ksp = sp;
+
 #ifdef CONFIG_HAVE_HW_BREAKPOINT
        for (i = 0; i < nr_wp_slots(); i++)
                p->thread.ptrace_bps[i] = NULL;
@@ -2261,8 +2261,12 @@ void __no_sanitize_address show_stack(struct task_struct *tsk,
                /*
                 * See if this is an exception frame.
                 * We look for the "regs" marker in the current frame.
+                *
+                * STACK_SWITCH_FRAME_SIZE being the smallest frame that
+                * could hold a pt_regs, if that does not fit then it can't
+                * have regs.
                 */
-               if (validate_sp(sp, tsk, STACK_FRAME_WITH_PT_REGS)
+               if (validate_sp(sp, tsk, STACK_SWITCH_FRAME_SIZE)
                    && stack[STACK_INT_FRAME_MARKER_LONGS] == STACK_FRAME_REGS_MARKER) {
                        struct pt_regs *regs = (struct pt_regs *)
                                (sp + STACK_INT_FRAME_REGS);