Loading arch/i386/kernel/traps.c +14 −8 Original line number Diff line number Diff line Loading @@ -171,7 +171,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, unsigned long *stack, struct stacktrace_ops *ops, void *data) { unsigned long ebp; unsigned long ebp = 0; if (!task) task = current; Loading Loading @@ -199,6 +199,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, stack = (void *)UNW_SP(&info); if (!stack) return; ebp = UNW_FP(&info); } else ops->warning(data, "Full inexact backtrace again:\n"); } else if (call_trace >= 1) Loading @@ -207,13 +208,16 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, ops->warning(data, "Full inexact backtrace again:\n"); } else ops->warning(data, "Inexact backtrace:\n"); } else if (!stack) { } if (!stack) { unsigned long dummy; stack = &dummy; if (task && task != current) stack = (unsigned long *)task->thread.esp; } #ifdef CONFIG_FRAME_POINTER if (!ebp) { if (task == current) { /* Grab ebp right from our regs */ asm ("movl %%ebp, %0" : "=r" (ebp) : ); Loading @@ -221,6 +225,8 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, /* ebp is the last reg pushed by switch_to */ ebp = *(unsigned long *) task->thread.esp; } } #endif while (1) { struct thread_info *context; Loading include/asm-i386/unwind.h +3 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,8 @@ struct unwind_frame_info #define FRAME_LINK_OFFSET 0 #define STACK_BOTTOM(tsk) STACK_LIMIT((tsk)->thread.esp0) #define STACK_TOP(tsk) ((tsk)->thread.esp0) #else #define UNW_FP(frame) ((void)(frame), 0) #endif #define STACK_LIMIT(ptr) (((ptr) - 1) & ~(THREAD_SIZE - 1)) Loading Loading @@ -88,6 +90,7 @@ static inline int arch_unw_user_mode(const struct unwind_frame_info *info) #define UNW_PC(frame) ((void)(frame), 0) #define UNW_SP(frame) ((void)(frame), 0) #define UNW_FP(frame) ((void)(frame), 0) static inline int arch_unw_user_mode(const void *info) { Loading Loading
arch/i386/kernel/traps.c +14 −8 Original line number Diff line number Diff line Loading @@ -171,7 +171,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, unsigned long *stack, struct stacktrace_ops *ops, void *data) { unsigned long ebp; unsigned long ebp = 0; if (!task) task = current; Loading Loading @@ -199,6 +199,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, stack = (void *)UNW_SP(&info); if (!stack) return; ebp = UNW_FP(&info); } else ops->warning(data, "Full inexact backtrace again:\n"); } else if (call_trace >= 1) Loading @@ -207,13 +208,16 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, ops->warning(data, "Full inexact backtrace again:\n"); } else ops->warning(data, "Inexact backtrace:\n"); } else if (!stack) { } if (!stack) { unsigned long dummy; stack = &dummy; if (task && task != current) stack = (unsigned long *)task->thread.esp; } #ifdef CONFIG_FRAME_POINTER if (!ebp) { if (task == current) { /* Grab ebp right from our regs */ asm ("movl %%ebp, %0" : "=r" (ebp) : ); Loading @@ -221,6 +225,8 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, /* ebp is the last reg pushed by switch_to */ ebp = *(unsigned long *) task->thread.esp; } } #endif while (1) { struct thread_info *context; Loading
include/asm-i386/unwind.h +3 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,8 @@ struct unwind_frame_info #define FRAME_LINK_OFFSET 0 #define STACK_BOTTOM(tsk) STACK_LIMIT((tsk)->thread.esp0) #define STACK_TOP(tsk) ((tsk)->thread.esp0) #else #define UNW_FP(frame) ((void)(frame), 0) #endif #define STACK_LIMIT(ptr) (((ptr) - 1) & ~(THREAD_SIZE - 1)) Loading Loading @@ -88,6 +90,7 @@ static inline int arch_unw_user_mode(const struct unwind_frame_info *info) #define UNW_PC(frame) ((void)(frame), 0) #define UNW_SP(frame) ((void)(frame), 0) #define UNW_FP(frame) ((void)(frame), 0) static inline int arch_unw_user_mode(const void *info) { Loading