Commit 18c07d23 authored by Guo Ren's avatar Guo Ren
Browse files

csky: Fixup calltrace panic



The implementation of show_stack will panic with wrong fp:

addr    = *fp++;

because the fp isn't checked properly.

The current implementations of show_stack, wchan and stack_trace
haven't been designed properly, so just deprecate them.

This patch is a reference to riscv's way, all codes are modified from
arm's. The patch is passed with:

 - cat /proc/<pid>/stack
 - cat /proc/<pid>/wchan
 - echo c > /proc/sysrq-trigger

Signed-off-by: default avatarGuo Ren <guoren@linux.alibaba.com>
parent 229a0dde
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -8,6 +8,7 @@ config CSKY
	select ARCH_HAS_SYNC_DMA_FOR_DEVICE
	select ARCH_HAS_SYNC_DMA_FOR_DEVICE
	select ARCH_USE_BUILTIN_BSWAP
	select ARCH_USE_BUILTIN_BSWAP
	select ARCH_USE_QUEUED_RWLOCKS if NR_CPUS>2
	select ARCH_USE_QUEUED_RWLOCKS if NR_CPUS>2
	select ARCH_WANT_FRAME_POINTERS if !CPU_CK610
	select COMMON_CLK
	select COMMON_CLK
	select CLKSRC_MMIO
	select CLKSRC_MMIO
	select CSKY_MPINTC if CPU_CK860
	select CSKY_MPINTC if CPU_CK860
@@ -38,6 +39,7 @@ config CSKY
	select HAVE_ARCH_TRACEHOOK
	select HAVE_ARCH_TRACEHOOK
	select HAVE_ARCH_AUDITSYSCALL
	select HAVE_ARCH_AUDITSYSCALL
	select HAVE_COPY_THREAD_TLS
	select HAVE_COPY_THREAD_TLS
	select HAVE_DEBUG_BUGVERBOSE
	select HAVE_DYNAMIC_FTRACE
	select HAVE_DYNAMIC_FTRACE
	select HAVE_DYNAMIC_FTRACE_WITH_REGS
	select HAVE_DYNAMIC_FTRACE_WITH_REGS
	select HAVE_FUNCTION_TRACER
	select HAVE_FUNCTION_TRACER
+1 −1
Original line number Original line Diff line number Diff line
@@ -47,7 +47,7 @@ ifeq ($(CSKYABI),abiv2)
KBUILD_CFLAGS += -mno-stack-size
KBUILD_CFLAGS += -mno-stack-size
endif
endif


ifdef CONFIG_STACKTRACE
ifdef CONFIG_FRAME_POINTER
KBUILD_CFLAGS += -mbacktrace
KBUILD_CFLAGS += -mbacktrace
endif
endif


+10 −0
Original line number Original line Diff line number Diff line
@@ -58,6 +58,16 @@ static inline unsigned long kernel_stack_pointer(struct pt_regs *regs)
	return regs->usp;
	return regs->usp;
}
}


static inline unsigned long frame_pointer(struct pt_regs *regs)
{
	return regs->regs[4];
}
static inline void frame_pointer_set(struct pt_regs *regs,
				     unsigned long val)
{
	regs->regs[4] = val;
}

extern int regs_query_register_offset(const char *name);
extern int regs_query_register_offset(const char *name);
extern unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs,
extern unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs,
						unsigned int n);
						unsigned int n);
+6 −0
Original line number Original line Diff line number Diff line
@@ -40,6 +40,12 @@ struct thread_info {
#define thread_saved_fp(tsk) \
#define thread_saved_fp(tsk) \
	((unsigned long)(((struct switch_stack *)(tsk->thread.ksp))->r8))
	((unsigned long)(((struct switch_stack *)(tsk->thread.ksp))->r8))


#define thread_saved_sp(tsk) \
	((unsigned long)(tsk->thread.ksp))

#define thread_saved_lr(tsk) \
	((unsigned long)(((struct switch_stack *)(tsk->thread.ksp))->r15))

static inline struct thread_info *current_thread_info(void)
static inline struct thread_info *current_thread_info(void)
{
{
	unsigned long sp;
	unsigned long sp;
+1 −1
Original line number Original line Diff line number Diff line
@@ -3,7 +3,7 @@ extra-y := head.o vmlinux.lds


obj-y += entry.o atomic.o signal.o traps.o irq.o time.o vdso.o
obj-y += entry.o atomic.o signal.o traps.o irq.o time.o vdso.o
obj-y += power.o syscall.o syscall_table.o setup.o
obj-y += power.o syscall.o syscall_table.o setup.o
obj-y += process.o cpu-probe.o ptrace.o dumpstack.o
obj-y += process.o cpu-probe.o ptrace.o stacktrace.o
obj-y += probes/
obj-y += probes/


obj-$(CONFIG_MODULES)			+= module.o
obj-$(CONFIG_MODULES)			+= module.o
Loading