arm64: unwind: remove sp from struct stackframe
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Sun, 23 Jul 2017 08:05:38 +0000 (09:05 +0100)
committerMark Rutland <mark.rutland@arm.com>
Wed, 9 Aug 2017 13:10:29 +0000 (14:10 +0100)
The unwind code sets the sp member of struct stackframe to
'frame pointer + 0x10' unconditionally, without regard for whether
doing so produces a legal value. So let's simply remove it now that
we have stopped using it anyway.

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: James Morse <james.morse@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
arch/arm64/include/asm/stacktrace.h
arch/arm64/kernel/perf_callchain.c
arch/arm64/kernel/process.c
arch/arm64/kernel/return_address.c
arch/arm64/kernel/stacktrace.c
arch/arm64/kernel/time.c
arch/arm64/kernel/traps.c

index 5b6eafc..3bebab3 100644 (file)
@@ -20,7 +20,6 @@ struct task_struct;
 
 struct stackframe {
        unsigned long fp;
-       unsigned long sp;
        unsigned long pc;
 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
        unsigned int graph;
index 713ca82..bcafd7d 100644 (file)
@@ -162,7 +162,6 @@ void perf_callchain_kernel(struct perf_callchain_entry_ctx *entry,
        }
 
        frame.fp = regs->regs[29];
-       frame.sp = regs->sp;
        frame.pc = regs->pc;
 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
        frame.graph = current->curr_ret_stack;
index 659ae80..85b953d 100644 (file)
@@ -382,15 +382,12 @@ unsigned long get_wchan(struct task_struct *p)
                return 0;
 
        frame.fp = thread_saved_fp(p);
-       frame.sp = thread_saved_sp(p);
        frame.pc = thread_saved_pc(p);
 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
        frame.graph = p->curr_ret_stack;
 #endif
        do {
-               if (frame.sp < stack_page ||
-                   frame.sp >= stack_page + THREAD_SIZE ||
-                   unwind_frame(p, &frame))
+               if (unwind_frame(p, &frame))
                        goto out;
                if (!in_sched_functions(frame.pc)) {
                        ret = frame.pc;
index 12a87f2..933adbc 100644 (file)
@@ -42,7 +42,6 @@ void *return_address(unsigned int level)
        data.addr = NULL;
 
        frame.fp = (unsigned long)__builtin_frame_address(0);
-       frame.sp = current_stack_pointer;
        frame.pc = (unsigned long)return_address; /* dummy */
 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
        frame.graph = current->curr_ret_stack;
index 81d9262..35588ca 100644 (file)
@@ -58,7 +58,6 @@ int notrace unwind_frame(struct task_struct *tsk, struct stackframe *frame)
            !on_task_stack(tsk, fp))
                return -EINVAL;
 
-       frame->sp = fp + 0x10;
        frame->fp = READ_ONCE_NOCHECK(*(unsigned long *)(fp));
        frame->pc = READ_ONCE_NOCHECK(*(unsigned long *)(fp + 8));
 
@@ -136,7 +135,6 @@ void save_stack_trace_regs(struct pt_regs *regs, struct stack_trace *trace)
        data.no_sched_functions = 0;
 
        frame.fp = regs->regs[29];
-       frame.sp = regs->sp;
        frame.pc = regs->pc;
 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
        frame.graph = current->curr_ret_stack;
@@ -161,12 +159,10 @@ void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
        if (tsk != current) {
                data.no_sched_functions = 1;
                frame.fp = thread_saved_fp(tsk);
-               frame.sp = thread_saved_sp(tsk);
                frame.pc = thread_saved_pc(tsk);
        } else {
                data.no_sched_functions = 0;
                frame.fp = (unsigned long)__builtin_frame_address(0);
-               frame.sp = current_stack_pointer;
                frame.pc = (unsigned long)save_stack_trace_tsk;
        }
 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
index da33c90..a439128 100644 (file)
@@ -50,7 +50,6 @@ unsigned long profile_pc(struct pt_regs *regs)
                return regs->pc;
 
        frame.fp = regs->regs[29];
-       frame.sp = regs->sp;
        frame.pc = regs->pc;
 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
        frame.graph = -1; /* no task info */
index 075c29a..c2a81bf 100644 (file)
@@ -155,14 +155,12 @@ void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)
 
        if (tsk == current) {
                frame.fp = (unsigned long)__builtin_frame_address(0);
-               frame.sp = current_stack_pointer;
                frame.pc = (unsigned long)dump_backtrace;
        } else {
                /*
                 * task blocked in __switch_to
                 */
                frame.fp = thread_saved_fp(tsk);
-               frame.sp = thread_saved_sp(tsk);
                frame.pc = thread_saved_pc(tsk);
        }
 #ifdef CONFIG_FUNCTION_GRAPH_TRACER