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

Commit cb256aa6 authored by David S. Miller's avatar David S. Miller
Browse files

sparc64: Use kstack_valid() in die_if_kernel().



This gets rid of a local function (is_kernel_stack()) which tries to
do the same thing, yet poorly in that it doesn't handle IRQ stacks
properly.

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent bdd32ce9
Loading
Loading
Loading
Loading
+3 −23
Original line number Diff line number Diff line
@@ -2202,27 +2202,6 @@ void dump_stack(void)

EXPORT_SYMBOL(dump_stack);

static inline int is_kernel_stack(struct task_struct *task,
				  struct reg_window *rw)
{
	unsigned long rw_addr = (unsigned long) rw;
	unsigned long thread_base, thread_end;

	if (rw_addr < PAGE_OFFSET) {
		if (task != &init_task)
			return 0;
	}

	thread_base = (unsigned long) task_stack_page(task);
	thread_end = thread_base + sizeof(union thread_union);
	if (rw_addr >= thread_base &&
	    rw_addr < thread_end &&
	    !(rw_addr & 0x7UL))
		return 1;

	return 0;
}

static inline struct reg_window *kernel_stack_up(struct reg_window *rw)
{
	unsigned long fp = rw->ins[6];
@@ -2251,6 +2230,7 @@ void die_if_kernel(char *str, struct pt_regs *regs)
	show_regs(regs);
	add_taint(TAINT_DIE);
	if (regs->tstate & TSTATE_PRIV) {
		struct thread_info *tp = current_thread_info();
		struct reg_window *rw = (struct reg_window *)
			(regs->u_regs[UREG_FP] + STACK_BIAS);

@@ -2259,7 +2239,7 @@ void die_if_kernel(char *str, struct pt_regs *regs)
		 */
		while (rw &&
		       count++ < 30 &&
		       is_kernel_stack(current, rw)) {
		       kstack_valid(tp, (unsigned long) rw)) {
			printk("Caller[%016lx]: %pS\n", rw->ins[7],
			       (void *) rw->ins[7]);