Commit c9cf4dbb authored by Frederic Weisbecker's avatar Frederic Weisbecker

x86: Unify dumpstack.h and stacktrace.h

arch/x86/include/asm/stacktrace.h and arch/x86/kernel/dumpstack.h
declare headers of objects that deal with the same topic.
Actually most of the files that include stacktrace.h also include
dumpstack.h

Although dumpstack.h seems more reserved for internals of stack
traces, those are quite often needed to define specialized stack
trace operations. And perf event arch headers are going to need
access to such low level operations anyway. So don't continue to
bother with dumpstack.h as it's not anymore about isolated deep
internals.

v2: fix struct stack_frame definition conflict in sysprof
Signed-off-by: default avatarFrederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Soeren Sandmann <sandmann@daimi.au.dk>
parent 9dda696f
/*
* Copyright (C) 1991, 1992 Linus Torvalds
* Copyright (C) 2000, 2001, 2002 Andi Kleen, SuSE Labs
*/
#ifndef _ASM_X86_STACKTRACE_H #ifndef _ASM_X86_STACKTRACE_H
#define _ASM_X86_STACKTRACE_H #define _ASM_X86_STACKTRACE_H
#include <linux/uaccess.h>
extern int kstack_depth_to_print; extern int kstack_depth_to_print;
struct thread_info; struct thread_info;
...@@ -42,4 +49,49 @@ void dump_trace(struct task_struct *tsk, struct pt_regs *regs, ...@@ -42,4 +49,49 @@ void dump_trace(struct task_struct *tsk, struct pt_regs *regs,
unsigned long *stack, unsigned long bp, unsigned long *stack, unsigned long bp,
const struct stacktrace_ops *ops, void *data); const struct stacktrace_ops *ops, void *data);
#ifdef CONFIG_X86_32
#define STACKSLOTS_PER_LINE 8
#define get_bp(bp) asm("movl %%ebp, %0" : "=r" (bp) :)
#else
#define STACKSLOTS_PER_LINE 4
#define get_bp(bp) asm("movq %%rbp, %0" : "=r" (bp) :)
#endif
extern void
show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
unsigned long *stack, unsigned long bp, char *log_lvl);
extern void
show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
unsigned long *sp, unsigned long bp, char *log_lvl);
extern unsigned int code_bytes;
/* The form of the top of the frame on the stack */
struct stack_frame {
struct stack_frame *next_frame;
unsigned long return_address;
};
struct stack_frame_ia32 {
u32 next_frame;
u32 return_address;
};
static inline unsigned long rewind_frame_pointer(int n)
{
struct stack_frame *frame;
get_bp(frame);
#ifdef CONFIG_FRAME_POINTER
while (n--) {
if (probe_kernel_address(&frame->next_frame, frame))
break;
}
#endif
return (unsigned long)frame;
}
#endif /* _ASM_X86_STACKTRACE_H */ #endif /* _ASM_X86_STACKTRACE_H */
...@@ -1585,8 +1585,6 @@ static const struct stacktrace_ops backtrace_ops = { ...@@ -1585,8 +1585,6 @@ static const struct stacktrace_ops backtrace_ops = {
.walk_stack = print_context_stack_bp, .walk_stack = print_context_stack_bp,
}; };
#include "../dumpstack.h"
static void static void
perf_callchain_kernel(struct pt_regs *regs, struct perf_callchain_entry *entry) perf_callchain_kernel(struct pt_regs *regs, struct perf_callchain_entry *entry)
{ {
......
...@@ -18,7 +18,6 @@ ...@@ -18,7 +18,6 @@
#include <asm/stacktrace.h> #include <asm/stacktrace.h>
#include "dumpstack.h"
int panic_on_unrecovered_nmi; int panic_on_unrecovered_nmi;
int panic_on_io_nmi; int panic_on_io_nmi;
......
/*
* Copyright (C) 1991, 1992 Linus Torvalds
* Copyright (C) 2000, 2001, 2002 Andi Kleen, SuSE Labs
*/
#ifndef DUMPSTACK_H
#define DUMPSTACK_H
#ifdef CONFIG_X86_32
#define STACKSLOTS_PER_LINE 8
#define get_bp(bp) asm("movl %%ebp, %0" : "=r" (bp) :)
#else
#define STACKSLOTS_PER_LINE 4
#define get_bp(bp) asm("movq %%rbp, %0" : "=r" (bp) :)
#endif
#include <linux/uaccess.h>
extern void
show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
unsigned long *stack, unsigned long bp, char *log_lvl);
extern void
show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
unsigned long *sp, unsigned long bp, char *log_lvl);
extern unsigned int code_bytes;
/* The form of the top of the frame on the stack */
struct stack_frame {
struct stack_frame *next_frame;
unsigned long return_address;
};
struct stack_frame_ia32 {
u32 next_frame;
u32 return_address;
};
static inline unsigned long rewind_frame_pointer(int n)
{
struct stack_frame *frame;
get_bp(frame);
#ifdef CONFIG_FRAME_POINTER
while (n--) {
if (probe_kernel_address(&frame->next_frame, frame))
break;
}
#endif
return (unsigned long)frame;
}
#endif /* DUMPSTACK_H */
...@@ -16,8 +16,6 @@ ...@@ -16,8 +16,6 @@
#include <asm/stacktrace.h> #include <asm/stacktrace.h>
#include "dumpstack.h"
void dump_trace(struct task_struct *task, struct pt_regs *regs, void dump_trace(struct task_struct *task, struct pt_regs *regs,
unsigned long *stack, unsigned long bp, unsigned long *stack, unsigned long bp,
......
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
#include <asm/stacktrace.h> #include <asm/stacktrace.h>
#include "dumpstack.h"
#define N_EXCEPTION_STACKS_END \ #define N_EXCEPTION_STACKS_END \
(N_EXCEPTION_STACKS + DEBUG_STKSZ/EXCEPTION_STKSZ - 2) (N_EXCEPTION_STACKS + DEBUG_STKSZ/EXCEPTION_STKSZ - 2)
......
...@@ -96,12 +96,13 @@ EXPORT_SYMBOL_GPL(save_stack_trace_tsk); ...@@ -96,12 +96,13 @@ EXPORT_SYMBOL_GPL(save_stack_trace_tsk);
/* Userspace stacktrace - based on kernel/trace/trace_sysprof.c */ /* Userspace stacktrace - based on kernel/trace/trace_sysprof.c */
struct stack_frame { struct stack_frame_user {
const void __user *next_fp; const void __user *next_fp;
unsigned long ret_addr; unsigned long ret_addr;
}; };
static int copy_stack_frame(const void __user *fp, struct stack_frame *frame) static int
copy_stack_frame(const void __user *fp, struct stack_frame_user *frame)
{ {
int ret; int ret;
...@@ -126,7 +127,7 @@ static inline void __save_stack_trace_user(struct stack_trace *trace) ...@@ -126,7 +127,7 @@ static inline void __save_stack_trace_user(struct stack_trace *trace)
trace->entries[trace->nr_entries++] = regs->ip; trace->entries[trace->nr_entries++] = regs->ip;
while (trace->nr_entries < trace->max_entries) { while (trace->nr_entries < trace->max_entries) {
struct stack_frame frame; struct stack_frame_user frame;
frame.next_fp = NULL; frame.next_fp = NULL;
frame.ret_addr = 0; frame.ret_addr = 0;
......
...@@ -33,12 +33,13 @@ static DEFINE_MUTEX(sample_timer_lock); ...@@ -33,12 +33,13 @@ static DEFINE_MUTEX(sample_timer_lock);
*/ */
static DEFINE_PER_CPU(struct hrtimer, stack_trace_hrtimer); static DEFINE_PER_CPU(struct hrtimer, stack_trace_hrtimer);
struct stack_frame { struct stack_frame_user {
const void __user *next_fp; const void __user *next_fp;
unsigned long return_address; unsigned long return_address;
}; };
static int copy_stack_frame(const void __user *fp, struct stack_frame *frame) static int
copy_stack_frame(const void __user *fp, struct stack_frame_user *frame)
{ {
int ret; int ret;
...@@ -125,7 +126,7 @@ trace_kernel(struct pt_regs *regs, struct trace_array *tr, ...@@ -125,7 +126,7 @@ trace_kernel(struct pt_regs *regs, struct trace_array *tr,
static void timer_notify(struct pt_regs *regs, int cpu) static void timer_notify(struct pt_regs *regs, int cpu)
{ {
struct trace_array_cpu *data; struct trace_array_cpu *data;
struct stack_frame frame; struct stack_frame_user frame;
struct trace_array *tr; struct trace_array *tr;
const void __user *fp; const void __user *fp;
int is_user; int is_user;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment