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

Commit 55bea71e authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull s390 fixes from Martin Schwidefsky:
 "A few more s390 patches for 4.9:
   - a fix for an overflow in the dasd driver reported by UBSAN
   - fix a regression and add hotplug memory to the zone movable again
   - add ignore defines for the pkey system calls
   - fix the ouput of the merged stack tracer
   - replace printk with pr_cont in arch/s390 where appropriate
   - remove the arch specific return_address function again
   - ignore reserved channel paths at boot time
   - add a missing hugetlb_bad_size call to the arch backend"

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
  s390/mm: fix zone calculation in arch_add_memory()
  s390/dumpstack: use pr_cont within show_stack and die
  s390/dumpstack: get rid of return_address again
  s390/disassambler: use pr_cont where appropriate
  s390/dumpstack: use pr_cont where appropriate
  s390/dumpstack: restore reliable indicator for call traces
  s390/mm: use hugetlb_bad_size()
  s390/cio: don't register chpids in reserved state
  s390: ignore pkey system calls
  s390/dasd: avoid undefined behaviour
parents 7618c6a1 4a654294
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -12,9 +12,7 @@

#ifndef __ASSEMBLY__

unsigned long return_address(int depth);

#define ftrace_return_address(n) return_address(n)
#define ftrace_return_address(n) __builtin_return_address(n)

void _mcount(void);
void ftrace_caller(void);
+1 −1
Original line number Diff line number Diff line
@@ -192,7 +192,7 @@ struct task_struct;
struct mm_struct;
struct seq_file;

typedef int (*dump_trace_func_t)(void *data, unsigned long address);
typedef int (*dump_trace_func_t)(void *data, unsigned long address, int reliable);
void dump_trace(dump_trace_func_t func, void *data,
		struct task_struct *task, unsigned long sp);

+3 −0
Original line number Diff line number Diff line
@@ -9,6 +9,9 @@
#include <uapi/asm/unistd.h>

#define __IGNORE_time
#define __IGNORE_pkey_mprotect
#define __IGNORE_pkey_alloc
#define __IGNORE_pkey_free

#define __ARCH_WANT_OLD_READDIR
#define __ARCH_WANT_SYS_ALARM
+2 −2
Original line number Diff line number Diff line
@@ -2014,12 +2014,12 @@ void show_code(struct pt_regs *regs)
			*ptr++ = '\t';
		ptr += print_insn(ptr, code + start, addr);
		start += opsize;
		printk("%s", buffer);
		pr_cont("%s", buffer);
		ptr = buffer;
		ptr += sprintf(ptr, "\n          ");
		hops++;
	}
	printk("\n");
	pr_cont("\n");
}

void print_fn_code(unsigned char *code, unsigned long len)
+22 −41
Original line number Diff line number Diff line
@@ -38,10 +38,10 @@ __dump_trace(dump_trace_func_t func, void *data, unsigned long sp,
		if (sp < low || sp > high - sizeof(*sf))
			return sp;
		sf = (struct stack_frame *) sp;
		if (func(data, sf->gprs[8], 0))
			return sp;
		/* Follow the backchain. */
		while (1) {
			if (func(data, sf->gprs[8]))
				return sp;
			low = sp;
			sp = sf->back_chain;
			if (!sp)
@@ -49,6 +49,8 @@ __dump_trace(dump_trace_func_t func, void *data, unsigned long sp,
			if (sp <= low || sp > high - sizeof(*sf))
				return sp;
			sf = (struct stack_frame *) sp;
			if (func(data, sf->gprs[8], 1))
				return sp;
		}
		/* Zero backchain detected, check for interrupt frame. */
		sp = (unsigned long) (sf + 1);
@@ -56,7 +58,7 @@ __dump_trace(dump_trace_func_t func, void *data, unsigned long sp,
			return sp;
		regs = (struct pt_regs *) sp;
		if (!user_mode(regs)) {
			if (func(data, regs->psw.addr))
			if (func(data, regs->psw.addr, 1))
				return sp;
		}
		low = sp;
@@ -85,32 +87,11 @@ void dump_trace(dump_trace_func_t func, void *data, struct task_struct *task,
}
EXPORT_SYMBOL_GPL(dump_trace);

struct return_address_data {
	unsigned long address;
	int depth;
};

static int __return_address(void *data, unsigned long address)
{
	struct return_address_data *rd = data;

	if (rd->depth--)
		return 0;
	rd->address = address;
	return 1;
}

unsigned long return_address(int depth)
{
	struct return_address_data rd = { .depth = depth + 2 };

	dump_trace(__return_address, &rd, NULL, current_stack_pointer());
	return rd.address;
}
EXPORT_SYMBOL_GPL(return_address);

static int show_address(void *data, unsigned long address)
static int show_address(void *data, unsigned long address, int reliable)
{
	if (reliable)
		printk(" [<%016lx>] %pSR \n", address, (void *)address);
	else
		printk("([<%016lx>] %pSR)\n", address, (void *)address);
	return 0;
}
@@ -138,14 +119,14 @@ void show_stack(struct task_struct *task, unsigned long *sp)
		else
			stack = (unsigned long *)task->thread.ksp;
	}
	printk(KERN_DEFAULT "Stack:\n");
	for (i = 0; i < 20; i++) {
		if (((addr_t) stack & (THREAD_SIZE-1)) == 0)
			break;
		if ((i * sizeof(long) % 32) == 0)
			printk("%s       ", i == 0 ? "" : "\n");
		printk("%016lx ", *stack++);
		if (i % 4 == 0)
			printk(KERN_DEFAULT "       ");
		pr_cont("%016lx%c", *stack++, i % 4 == 3 ? '\n' : ' ');
	}
	printk("\n");
	show_trace(task, (unsigned long)sp);
}

@@ -163,13 +144,13 @@ void show_registers(struct pt_regs *regs)
	mode = user_mode(regs) ? "User" : "Krnl";
	printk("%s PSW : %p %p", mode, (void *)regs->psw.mask, (void *)regs->psw.addr);
	if (!user_mode(regs))
		printk(" (%pSR)", (void *)regs->psw.addr);
	printk("\n");
		pr_cont(" (%pSR)", (void *)regs->psw.addr);
	pr_cont("\n");
	printk("           R:%x T:%x IO:%x EX:%x Key:%x M:%x W:%x "
	       "P:%x AS:%x CC:%x PM:%x", psw->r, psw->t, psw->i, psw->e,
	       psw->key, psw->m, psw->w, psw->p, psw->as, psw->cc, psw->pm);
	printk(" RI:%x EA:%x", psw->ri, psw->eaba);
	printk("\n%s GPRS: %016lx %016lx %016lx %016lx\n", mode,
	pr_cont(" RI:%x EA:%x\n", psw->ri, psw->eaba);
	printk("%s GPRS: %016lx %016lx %016lx %016lx\n", mode,
	       regs->gprs[0], regs->gprs[1], regs->gprs[2], regs->gprs[3]);
	printk("           %016lx %016lx %016lx %016lx\n",
	       regs->gprs[4], regs->gprs[5], regs->gprs[6], regs->gprs[7]);
@@ -205,14 +186,14 @@ void die(struct pt_regs *regs, const char *str)
	printk("%s: %04x ilc:%d [#%d] ", str, regs->int_code & 0xffff,
	       regs->int_code >> 17, ++die_counter);
#ifdef CONFIG_PREEMPT
	printk("PREEMPT ");
	pr_cont("PREEMPT ");
#endif
#ifdef CONFIG_SMP
	printk("SMP ");
	pr_cont("SMP ");
#endif
	if (debug_pagealloc_enabled())
		printk("DEBUG_PAGEALLOC");
	printk("\n");
		pr_cont("DEBUG_PAGEALLOC");
	pr_cont("\n");
	notify_die(DIE_OOPS, str, regs, 0, regs->int_code & 0xffff, SIGSEGV);
	print_modules();
	show_regs(regs);
Loading