Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a32cf397 authored by Andi Kleen's avatar Andi Kleen Committed by Andi Kleen
Browse files

[PATCH] i386: Get ebp from unwinder state when continuing fallback backtrace



Cc: jbeulich@novell.com
Signed-off-by: default avatarAndi Kleen <ak@suse.de>
parent 950fee84
Loading
Loading
Loading
Loading
+14 −8
Original line number Diff line number Diff line
@@ -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;
@@ -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)
@@ -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) : );
@@ -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;
+3 −0
Original line number Diff line number Diff line
@@ -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))

@@ -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)
{