Commit 93a4fa62 authored by Qing Zhang's avatar Qing Zhang Committed by Huacai Chen
Browse files

LoongArch: Add STACKTRACE support



1. Use common arch_stack_walk() infrastructure to avoid duplicated code
   and avoid taking care of the stack storage and filtering.
2. Add sched_ra (means sched return address) and sched_cfa (means sched
   call frame address) to thread_info, and store them in switch_to().
3. Add __get_wchan() implementation.

Now we can print the process stack and wait channel by cat /proc/*/stack
and /proc/*/wchan.

Signed-off-by: default avatarQing Zhang <zhangqing@loongson.cn>
Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
parent 49aef111
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ config LOONGARCH
	select ARCH_MIGHT_HAVE_PC_PARPORT
	select ARCH_MIGHT_HAVE_PC_SERIO
	select ARCH_SPARSEMEM_ENABLE
	select ARCH_STACKWALK
	select ARCH_SUPPORTS_ACPI
	select ARCH_SUPPORTS_ATOMIC_RMW
	select ARCH_SUPPORTS_HUGETLBFS
@@ -151,6 +152,10 @@ config LOCKDEP_SUPPORT
	bool
	default y

config STACKTRACE_SUPPORT
	bool
	default y

# MACH_LOONGSON32 and MACH_LOONGSON64 are delibrately carried over from the
# MIPS Loongson code, to preserve Loongson-specific code paths in drivers that
# are shared between architectures, and specifically expecting the symbols.
+9 −0
Original line number Diff line number Diff line
@@ -101,6 +101,10 @@ struct thread_struct {
	unsigned long reg23, reg24, reg25, reg26; /* s0-s3 */
	unsigned long reg27, reg28, reg29, reg30, reg31; /* s4-s8 */

	/* __schedule() return address / call frame address */
	unsigned long sched_ra;
	unsigned long sched_cfa;

	/* CSR registers */
	unsigned long csr_prmd;
	unsigned long csr_crmd;
@@ -129,6 +133,9 @@ struct thread_struct {
	struct loongarch_fpu fpu FPU_ALIGN;
};

#define thread_saved_ra(tsk)	(tsk->thread.sched_ra)
#define thread_saved_fp(tsk)	(tsk->thread.sched_cfa)

#define INIT_THREAD  {						\
	/*							\
	 * Main processor registers				\
@@ -145,6 +152,8 @@ struct thread_struct {
	.reg29			= 0,				\
	.reg30			= 0,				\
	.reg31			= 0,				\
	.sched_ra		= 0,				\
	.sched_cfa		= 0,				\
	.csr_crmd		= 0,				\
	.csr_prmd		= 0,				\
	.csr_euen		= 0,				\
+9 −5
Original line number Diff line number Diff line
@@ -15,12 +15,15 @@ struct task_struct;
 * @prev:	The task previously executed.
 * @next:	The task to begin executing.
 * @next_ti:	task_thread_info(next).
 * @sched_ra:	__schedule return address.
 * @sched_cfa:	__schedule call frame address.
 *
 * This function is used whilst scheduling to save the context of prev & load
 * the context of next. Returns prev.
 */
extern asmlinkage struct task_struct *__switch_to(struct task_struct *prev,
			struct task_struct *next, struct thread_info *next_ti);
			struct task_struct *next, struct thread_info *next_ti,
			void *sched_ra, void *sched_cfa);

/*
 * For newly created kernel threads switch_to() will return to
@@ -31,7 +34,8 @@ extern asmlinkage struct task_struct *__switch_to(struct task_struct *prev,
#define switch_to(prev, next, last)						\
do {										\
	lose_fpu_inatomic(1, prev);						\
	(last) = __switch_to(prev, next, task_thread_info(next));	\
	(last) = __switch_to(prev, next, task_thread_info(next),		\
		 __builtin_return_address(0), __builtin_frame_address(0));	\
} while (0)

#endif /* _ASM_SWITCH_TO_H */
+1 −0
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@ obj-$(CONFIG_EFI) += efi.o
obj-$(CONFIG_CPU_HAS_FPU)	+= fpu.o

obj-$(CONFIG_MODULES)		+= module.o module-sections.o
obj-$(CONFIG_STACKTRACE)	+= stacktrace.o

obj-$(CONFIG_PROC_FS)		+= proc.o

+2 −0
Original line number Diff line number Diff line
@@ -103,6 +103,8 @@ void output_thread_defines(void)
	OFFSET(THREAD_REG29, task_struct, thread.reg29);
	OFFSET(THREAD_REG30, task_struct, thread.reg30);
	OFFSET(THREAD_REG31, task_struct, thread.reg31);
	OFFSET(THREAD_SCHED_RA, task_struct, thread.sched_ra);
	OFFSET(THREAD_SCHED_CFA, task_struct, thread.sched_cfa);
	OFFSET(THREAD_CSRCRMD, task_struct,
	       thread.csr_crmd);
	OFFSET(THREAD_CSRPRMD, task_struct,
Loading