Skip to content

Commit 5cb0080

Browse files
Kefeng Wangpalmer-dabbelt
authored andcommitted
riscv: Enable ARCH_STACKWALK
Convert to ARCH_STACKWALK to reduce duplicated code in stack trace. Signed-off-by: Kefeng Wang <[email protected]> Signed-off-by: Palmer Dabbelt <[email protected]>
1 parent 9dd9706 commit 5cb0080

File tree

3 files changed

+11
-40
lines changed

3 files changed

+11
-40
lines changed

arch/riscv/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ config RISCV
1414
def_bool y
1515
select ARCH_CLOCKSOURCE_INIT
1616
select ARCH_SUPPORTS_ATOMIC_RMW
17+
select ARCH_STACKWALK
1718
select ARCH_HAS_BINFMT_FLAT
1819
select ARCH_HAS_DEBUG_VM_PGTABLE
1920
select ARCH_HAS_DEBUG_VIRTUAL if MMU

arch/riscv/kernel/head.S

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,6 @@ setup_trap_vector:
177177

178178
END(_start)
179179

180-
__INIT
181180
ENTRY(_start_kernel)
182181
/* Mask all interrupts */
183182
csrw CSR_IE, zero

arch/riscv/kernel/stacktrace.c

Lines changed: 10 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ register unsigned long sp_in_global __asm__("sp");
1919
#ifdef CONFIG_FRAME_POINTER
2020

2121
void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs,
22-
bool (*fn)(unsigned long, void *), void *arg)
22+
bool (*fn)(void *, unsigned long), void *arg)
2323
{
2424
unsigned long fp, sp, pc;
2525

@@ -43,7 +43,7 @@ void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs,
4343
unsigned long low, high;
4444
struct stackframe *frame;
4545

46-
if (unlikely(!__kernel_text_address(pc) || fn(arg, pc)))
46+
if (unlikely(!__kernel_text_address(pc) || !fn(arg, pc)))
4747
break;
4848

4949
/* Validate frame pointer */
@@ -85,20 +85,20 @@ void notrace walk_stackframe(struct task_struct *task,
8585

8686
ksp = (unsigned long *)sp;
8787
while (!kstack_end(ksp)) {
88-
if (__kernel_text_address(pc) && unlikely(fn(arg, pc)))
88+
if (__kernel_text_address(pc) && unlikely(!fn(arg, pc)))
8989
break;
9090
pc = (*ksp++) - 0x4;
9191
}
9292
}
9393

9494
#endif /* CONFIG_FRAME_POINTER */
9595

96-
static bool print_trace_address(unsigned long pc, void *arg)
96+
static bool print_trace_address(void *arg, unsigned long pc)
9797
{
9898
const char *loglvl = arg;
9999

100100
print_ip_sym(loglvl, pc);
101-
return false;
101+
return true;
102102
}
103103

104104
void show_stack(struct task_struct *task, unsigned long *sp, const char *loglvl)
@@ -112,9 +112,9 @@ static bool save_wchan(void *arg, unsigned long pc)
112112
if (!in_sched_functions(pc)) {
113113
unsigned long *p = arg;
114114
*p = pc;
115-
return true;
115+
return false;
116116
}
117-
return false;
117+
return true;
118118
}
119119

120120
unsigned long get_wchan(struct task_struct *task)
@@ -128,39 +128,10 @@ unsigned long get_wchan(struct task_struct *task)
128128

129129
#ifdef CONFIG_STACKTRACE
130130

131-
static bool __save_trace(unsigned long pc, void *arg, bool nosched)
132-
{
133-
struct stack_trace *trace = arg;
134-
135-
if (unlikely(nosched && in_sched_functions(pc)))
136-
return false;
137-
if (unlikely(trace->skip > 0)) {
138-
trace->skip--;
139-
return false;
140-
}
141-
142-
trace->entries[trace->nr_entries++] = pc;
143-
return (trace->nr_entries >= trace->max_entries);
144-
}
145-
146-
static bool save_trace(void *arg, unsigned long pc)
147-
{
148-
return __save_trace(pc, arg, false);
149-
}
150-
151-
/*
152-
* Save stack-backtrace addresses into a stack_trace buffer.
153-
*/
154-
void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
155-
{
156-
walk_stackframe(tsk, NULL, save_trace, trace);
157-
}
158-
EXPORT_SYMBOL_GPL(save_stack_trace_tsk);
159-
160-
void save_stack_trace(struct stack_trace *trace)
131+
void arch_stack_walk(stack_trace_consume_fn consume_entry, void *cookie,
132+
struct task_struct *task, struct pt_regs *regs)
161133
{
162-
save_stack_trace_tsk(NULL, trace);
134+
walk_stackframe(task, regs, consume_entry, cookie);
163135
}
164-
EXPORT_SYMBOL_GPL(save_stack_trace);
165136

166137
#endif /* CONFIG_STACKTRACE */

0 commit comments

Comments
 (0)