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

Commit 8354e26a authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

Merge "arm64: traps: Don't print stack or raw PC/LR values in backtraces"

parents 1bbd19b3 1c95d27e
Loading
Loading
Loading
Loading
+3 −5
Original line number Diff line number Diff line
@@ -254,11 +254,9 @@ void __show_regs(struct pt_regs *regs)
	}

	show_regs_print_info(KERN_DEFAULT);
	print_symbol("PC is at %s\n", instruction_pointer(regs));
	print_symbol("LR is at %s\n", lr);
	printk("pc : [<%016llx>] lr : [<%016llx>] pstate: %08llx\n",
	       regs->pc, lr, regs->pstate);
	printk("sp : %016llx\n", sp);
	print_symbol("pc : %s\n", regs->pc);
	print_symbol("lr : %s\n", lr);
	printk("sp : %016llx pstate : %08llx\n", sp, regs->pstate);

	i = top_reg;

+3 −62
Original line number Diff line number Diff line
@@ -60,55 +60,9 @@ static const char *handler[]= {

int show_unhandled_signals = 0;

/*
 * Dump out the contents of some kernel memory nicely...
 */
static void dump_mem(const char *lvl, const char *str, unsigned long bottom,
		     unsigned long top)
{
	unsigned long first;
	mm_segment_t fs;
	int i;

	/*
	 * We need to switch to kernel mode so that we can use __get_user
	 * to safely read from kernel space.
	 */
	fs = get_fs();
	set_fs(KERNEL_DS);

	printk("%s%s(0x%016lx to 0x%016lx)\n", lvl, str, bottom, top);

	for (first = bottom & ~31; first < top; first += 32) {
		unsigned long p;
		char str[sizeof(" 12345678") * 8 + 1];

		memset(str, ' ', sizeof(str));
		str[sizeof(str) - 1] = '\0';

		for (p = first, i = 0; i < (32 / 8)
					&& p < top; i++, p += 8) {
			if (p >= bottom && p < top) {
				unsigned long val;

				if (__get_user(val, (unsigned long *)p) == 0)
					sprintf(str + i * 17, " %016lx", val);
				else
					sprintf(str + i * 17, " ????????????????");
			}
		}
		printk("%s%04lx:%s\n", lvl, first & 0xffff, str);
	}

	set_fs(fs);
}

static void dump_backtrace_entry(unsigned long where)
{
	/*
	 * Note that 'where' can have a physical address, but it's not handled.
	 */
	print_ip_sym(where);
	printk(" %pS\n", (void *)where);
}

static void __dump_instr(const char *lvl, struct pt_regs *regs)
@@ -173,10 +127,7 @@ void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)

	skip = !!regs;
	printk("Call trace:\n");
	while (1) {
		unsigned long stack;
		int ret;

	do {
		/* skip until specified stack frame */
		if (!skip) {
			dump_backtrace_entry(frame.pc);
@@ -191,17 +142,7 @@ void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)
			 */
			dump_backtrace_entry(regs->pc);
		}
		ret = unwind_frame(tsk, &frame);
		if (ret < 0)
			break;
		if (in_entry_text(frame.pc)) {
			stack = frame.fp - offsetof(struct pt_regs, stackframe);

			if (on_accessible_stack(tsk, stack))
				dump_mem("", "Exception stack", stack,
					 stack + sizeof(struct pt_regs));
		}
	}
	} while (!unwind_frame(tsk, &frame));

	put_task_stack(tsk);
}