diff options
Diffstat (limited to 'arch/s390/kernel')
| -rw-r--r-- | arch/s390/kernel/Makefile | 17 | ||||
| -rw-r--r-- | arch/s390/kernel/asm-offsets.c | 1 | ||||
| -rw-r--r-- | arch/s390/kernel/compat_linux.c | 86 | ||||
| -rw-r--r-- | arch/s390/kernel/compat_linux.h | 5 | ||||
| -rw-r--r-- | arch/s390/kernel/compat_signal.c | 2 | ||||
| -rw-r--r-- | arch/s390/kernel/compat_wrapper.S | 64 | ||||
| -rw-r--r-- | arch/s390/kernel/dis.c | 9 | ||||
| -rw-r--r-- | arch/s390/kernel/dumpstack.c | 212 | ||||
| -rw-r--r-- | arch/s390/kernel/entry.S | 39 | ||||
| -rw-r--r-- | arch/s390/kernel/entry.h | 1 | ||||
| -rw-r--r-- | arch/s390/kernel/entry64.S | 43 | ||||
| -rw-r--r-- | arch/s390/kernel/irq.c | 2 | ||||
| -rw-r--r-- | arch/s390/kernel/machine_kexec.c | 30 | ||||
| -rw-r--r-- | arch/s390/kernel/process.c | 32 | ||||
| -rw-r--r-- | arch/s390/kernel/setup.c | 9 | ||||
| -rw-r--r-- | arch/s390/kernel/smp.c | 18 | ||||
| -rw-r--r-- | arch/s390/kernel/suspend.c | 31 | ||||
| -rw-r--r-- | arch/s390/kernel/swsusp_asm64.S | 29 | ||||
| -rw-r--r-- | arch/s390/kernel/sys_s390.c | 14 | ||||
| -rw-r--r-- | arch/s390/kernel/syscalls.S | 18 | ||||
| -rw-r--r-- | arch/s390/kernel/traps.c | 250 | ||||
| -rw-r--r-- | arch/s390/kernel/vtime.c | 5 | 
22 files changed, 399 insertions, 518 deletions
diff --git a/arch/s390/kernel/Makefile b/arch/s390/kernel/Makefile index 2ac311ef5c9..1386fcaf4ef 100644 --- a/arch/s390/kernel/Makefile +++ b/arch/s390/kernel/Makefile @@ -14,16 +14,25 @@ endif  CFLAGS_smp.o	:= -Wno-nonnull  # +# Disable tailcall optimizations for stack / callchain walking functions +# since this might generate broken code when accessing register 15 and +# passing its content to other functions. +# +CFLAGS_stacktrace.o	+= -fno-optimize-sibling-calls +CFLAGS_dumpstack.o	+= -fno-optimize-sibling-calls + +#  # Pass UTS_MACHINE for user_regset definition  #  CFLAGS_ptrace.o		+= -DUTS_MACHINE='"$(UTS_MACHINE)"'  CFLAGS_sysinfo.o += -Iinclude/math-emu -Iarch/s390/math-emu -w -obj-y	:=  bitmap.o traps.o time.o process.o base.o early.o setup.o vtime.o \ -	    processor.o sys_s390.o ptrace.o signal.o cpcmd.o ebcdic.o nmi.o \ -	    debug.o irq.o ipl.o dis.o diag.o mem_detect.o sclp.o vdso.o \ -	    sysinfo.o jump_label.o lgr.o os_info.o machine_kexec.o pgm_check.o +obj-y	:= bitmap.o traps.o time.o process.o base.o early.o setup.o vtime.o +obj-y	+= processor.o sys_s390.o ptrace.o signal.o cpcmd.o ebcdic.o nmi.o +obj-y	+= debug.o irq.o ipl.o dis.o diag.o mem_detect.o sclp.o vdso.o +obj-y	+= sysinfo.o jump_label.o lgr.o os_info.o machine_kexec.o pgm_check.o +obj-y	+= dumpstack.o  obj-y	+= $(if $(CONFIG_64BIT),entry64.o,entry.o)  obj-y	+= $(if $(CONFIG_64BIT),reipl64.o,reipl.o) diff --git a/arch/s390/kernel/asm-offsets.c b/arch/s390/kernel/asm-offsets.c index fface87056e..7a82f9f7010 100644 --- a/arch/s390/kernel/asm-offsets.c +++ b/arch/s390/kernel/asm-offsets.c @@ -35,6 +35,7 @@ int main(void)  	DEFINE(__TI_task, offsetof(struct thread_info, task));  	DEFINE(__TI_domain, offsetof(struct thread_info, exec_domain));  	DEFINE(__TI_flags, offsetof(struct thread_info, flags)); +	DEFINE(__TI_sysc_table, offsetof(struct thread_info, sys_call_table));  	DEFINE(__TI_cpu, offsetof(struct thread_info, cpu));  	DEFINE(__TI_precount, offsetof(struct thread_info, preempt_count));  	DEFINE(__TI_user_timer, offsetof(struct thread_info, user_timer)); diff --git a/arch/s390/kernel/compat_linux.c b/arch/s390/kernel/compat_linux.c index 19f26de27fa..8b6e4f5288a 100644 --- a/arch/s390/kernel/compat_linux.c +++ b/arch/s390/kernel/compat_linux.c @@ -288,51 +288,13 @@ asmlinkage long sys32_getegid16(void)  	return high2lowgid(from_kgid_munged(current_user_ns(), current_egid()));  } -/* - * sys32_ipc() is the de-multiplexer for the SysV IPC calls in 32bit emulation. - * - * This is really horribly ugly. - */  #ifdef CONFIG_SYSVIPC -asmlinkage long sys32_ipc(u32 call, int first, int second, int third, u32 ptr) +COMPAT_SYSCALL_DEFINE5(s390_ipc, uint, call, int, first, unsigned long, second, +		unsigned long, third, compat_uptr_t, ptr)  {  	if (call >> 16)		/* hack for backward compatibility */  		return -EINVAL; -	switch (call) { -	case SEMTIMEDOP: -		return compat_sys_semtimedop(first, compat_ptr(ptr), -					     second, compat_ptr(third)); -	case SEMOP: -		/* struct sembuf is the same on 32 and 64bit :)) */ -		return sys_semtimedop(first, compat_ptr(ptr), -				      second, NULL); -	case SEMGET: -		return sys_semget(first, second, third); -	case SEMCTL: -		return compat_sys_semctl(first, second, third, -					 compat_ptr(ptr)); -	case MSGSND: -		return compat_sys_msgsnd(first, second, third, -					 compat_ptr(ptr)); -	case MSGRCV: -		return compat_sys_msgrcv(first, second, 0, third, -					 0, compat_ptr(ptr)); -	case MSGGET: -		return sys_msgget((key_t) first, second); -	case MSGCTL: -		return compat_sys_msgctl(first, second, compat_ptr(ptr)); -	case SHMAT: -		return compat_sys_shmat(first, second, third, -					0, compat_ptr(ptr)); -	case SHMDT: -		return sys_shmdt(compat_ptr(ptr)); -	case SHMGET: -		return sys_shmget(first, (unsigned)second, third); -	case SHMCTL: -		return compat_sys_shmctl(first, second, compat_ptr(ptr)); -	} - -	return -ENOSYS; +	return compat_sys_ipc(call, first, second, third, ptr, third);  }  #endif @@ -373,48 +335,6 @@ asmlinkage compat_ssize_t sys32_readahead(int fd, u32 offhi, u32 offlo, s32 coun  	return sys_readahead(fd, ((loff_t)AA(offhi) << 32) | AA(offlo), count);  } -asmlinkage long sys32_sendfile(int out_fd, int in_fd, compat_off_t __user *offset, size_t count) -{ -	mm_segment_t old_fs = get_fs(); -	int ret; -	off_t of; -	 -	if (offset && get_user(of, offset)) -		return -EFAULT; -		 -	set_fs(KERNEL_DS); -	ret = sys_sendfile(out_fd, in_fd, -			   offset ? (off_t __force __user *) &of : NULL, count); -	set_fs(old_fs); -	 -	if (offset && put_user(of, offset)) -		return -EFAULT; -		 -	return ret; -} - -asmlinkage long sys32_sendfile64(int out_fd, int in_fd, -				compat_loff_t __user *offset, s32 count) -{ -	mm_segment_t old_fs = get_fs(); -	int ret; -	loff_t lof; -	 -	if (offset && get_user(lof, offset)) -		return -EFAULT; -		 -	set_fs(KERNEL_DS); -	ret = sys_sendfile64(out_fd, in_fd, -			     offset ? (loff_t __force __user *) &lof : NULL, -			     count); -	set_fs(old_fs); -	 -	if (offset && put_user(lof, offset)) -		return -EFAULT; -		 -	return ret; -} -  struct stat64_emu31 {  	unsigned long long  st_dev;  	unsigned int    __pad1; diff --git a/arch/s390/kernel/compat_linux.h b/arch/s390/kernel/compat_linux.h index 00d92a5a6f6..976518c0592 100644 --- a/arch/s390/kernel/compat_linux.h +++ b/arch/s390/kernel/compat_linux.h @@ -94,7 +94,6 @@ long sys32_getuid16(void);  long sys32_geteuid16(void);  long sys32_getgid16(void);  long sys32_getegid16(void); -long sys32_ipc(u32 call, int first, int second, int third, u32 ptr);  long sys32_truncate64(const char __user * path, unsigned long high,  		      unsigned long low);  long sys32_ftruncate64(unsigned int fd, unsigned long high, unsigned long low); @@ -106,10 +105,6 @@ long sys32_pread64(unsigned int fd, char __user *ubuf, size_t count,  long sys32_pwrite64(unsigned int fd, const char __user *ubuf,  		    size_t count, u32 poshi, u32 poslo);  compat_ssize_t sys32_readahead(int fd, u32 offhi, u32 offlo, s32 count); -long sys32_sendfile(int out_fd, int in_fd, compat_off_t __user *offset, -		    size_t count); -long sys32_sendfile64(int out_fd, int in_fd, compat_loff_t __user *offset, -		      s32 count);  long sys32_stat64(const char __user * filename, struct stat64_emu31 __user * statbuf);  long sys32_lstat64(const char __user * filename,  		   struct stat64_emu31 __user * statbuf); diff --git a/arch/s390/kernel/compat_signal.c b/arch/s390/kernel/compat_signal.c index 6de049fbe62..c439ac9ced0 100644 --- a/arch/s390/kernel/compat_signal.c +++ b/arch/s390/kernel/compat_signal.c @@ -362,6 +362,7 @@ static int setup_frame32(int sig, struct k_sigaction *ka,  		/* set extra registers only for synchronous signals */  		regs->gprs[4] = regs->int_code & 127;  		regs->gprs[5] = regs->int_parm_long; +		regs->gprs[6] = task_thread_info(current)->last_break;  	}  	/* Place signal number on stack to allow backtrace from handler.  */ @@ -421,6 +422,7 @@ static int setup_rt_frame32(int sig, struct k_sigaction *ka, siginfo_t *info,  	regs->gprs[2] = map_signal(sig);  	regs->gprs[3] = (__force __u64) &frame->info;  	regs->gprs[4] = (__force __u64) &frame->uc; +	regs->gprs[5] = task_thread_info(current)->last_break;  	return 0;  give_sigsegv: diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S index 3c98c4dc5ac..17644c8e10e 100644 --- a/arch/s390/kernel/compat_wrapper.S +++ b/arch/s390/kernel/compat_wrapper.S @@ -258,11 +258,6 @@ ENTRY(sys32_mmap2_wrapper)  	llgtr	%r2,%r2			# struct mmap_arg_struct_emu31 *  	jg	sys32_mmap2			# branch to system call -ENTRY(compat_sys_getrusage_wrapper) -	lgfr	%r2,%r2			# int -	llgtr	%r3,%r3			# struct rusage_emu31 * -	jg	compat_sys_getrusage	# branch to system call -  ENTRY(compat_sys_gettimeofday_wrapper)  	llgtr	%r2,%r2			# struct timeval_emu31 *  	llgtr	%r3,%r3			# struct timezone * @@ -393,14 +388,6 @@ ENTRY(compat_sys_sysinfo_wrapper)  	llgtr	%r2,%r2			# struct sysinfo_emu31 *  	jg	compat_sys_sysinfo	# branch to system call -ENTRY(sys32_ipc_wrapper) -	llgfr	%r2,%r2			# uint -	lgfr	%r3,%r3			# int -	lgfr	%r4,%r4			# int -	lgfr	%r5,%r5			# int -	llgfr	%r6,%r6			# u32 -	jg	sys32_ipc		# branch to system call -  ENTRY(sys32_fsync_wrapper)  	llgfr	%r2,%r2			# unsigned int  	jg	sys_fsync		# branch to system call @@ -666,13 +653,6 @@ ENTRY(sys32_capset_wrapper)  	llgtr	%r3,%r3			# const cap_user_data_t  	jg	sys_capset		# branch to system call -ENTRY(sys32_sendfile_wrapper) -	lgfr	%r2,%r2			# int -	lgfr	%r3,%r3			# int -	llgtr	%r4,%r4			# __kernel_off_emu31_t * -	llgfr	%r5,%r5			# size_t -	jg	sys32_sendfile		# branch to system call -  #sys32_vfork_wrapper			# done in vfork_glue  ENTRY(sys32_truncate64_wrapper) @@ -938,13 +918,6 @@ ENTRY(sys_epoll_wait_wrapper)  	lgfr	%r5,%r5			# int  	jg	sys_epoll_wait		# branch to system call -ENTRY(sys32_lookup_dcookie_wrapper) -	sllg	%r2,%r2,32		# get high word of 64bit dcookie -	or	%r2,%r3			# get low word of 64bit dcookie -	llgtr	%r3,%r4			# char * -	llgfr	%r4,%r5			# size_t -	jg	sys_lookup_dcookie -  ENTRY(sys32_fadvise64_wrapper)  	lgfr	%r2,%r2			# int  	sllg	%r3,%r3,32		# get high word of 64bit loff_t @@ -1264,29 +1237,12 @@ ENTRY(sys_tee_wrapper)  	llgfr	%r5,%r5			# unsigned int  	jg	sys_tee -ENTRY(compat_sys_vmsplice_wrapper) -	lgfr	%r2,%r2			# int -	llgtr	%r3,%r3			# compat_iovec * -	llgfr	%r4,%r4			# unsigned int -	llgfr	%r5,%r5			# unsigned int -	jg	compat_sys_vmsplice -  ENTRY(sys_getcpu_wrapper)  	llgtr	%r2,%r2			# unsigned *  	llgtr	%r3,%r3			# unsigned *  	llgtr	%r4,%r4			# struct getcpu_cache *  	jg	sys_getcpu -ENTRY(compat_sys_epoll_pwait_wrapper) -	lgfr	%r2,%r2			# int -	llgtr	%r3,%r3			# struct compat_epoll_event * -	lgfr	%r4,%r4			# int -	lgfr	%r5,%r5			# int -	llgtr	%r6,%r6			# compat_sigset_t * -	llgf	%r0,164(%r15)		# compat_size_t -	stg	%r0,160(%r15) -	jg	compat_sys_epoll_pwait -  ENTRY(compat_sys_utimes_wrapper)  	llgtr	%r2,%r2			# char *  	llgtr	%r3,%r3			# struct compat_timeval * @@ -1299,12 +1255,6 @@ ENTRY(compat_sys_utimensat_wrapper)  	lgfr	%r5,%r5			# int  	jg	compat_sys_utimensat -ENTRY(compat_sys_signalfd_wrapper) -	lgfr	%r2,%r2			# int -	llgtr	%r3,%r3			# compat_sigset_t * -	llgfr	%r4,%r4			# compat_size_t -	jg	compat_sys_signalfd -  ENTRY(sys_eventfd_wrapper)  	llgfr	%r2,%r2			# unsigned int  	jg	sys_eventfd @@ -1323,13 +1273,6 @@ ENTRY(sys_timerfd_create_wrapper)  	lgfr	%r3,%r3			# int  	jg	sys_timerfd_create -ENTRY(compat_sys_signalfd4_wrapper) -	lgfr	%r2,%r2			# int -	llgtr	%r3,%r3			# compat_sigset_t * -	llgfr	%r4,%r4			# compat_size_t -	lgfr	%r5,%r5			# int -	jg	compat_sys_signalfd4 -  ENTRY(sys_eventfd2_wrapper)  	llgfr	%r2,%r2			# unsigned int  	lgfr	%r3,%r3			# int @@ -1361,13 +1304,6 @@ ENTRY(sys32_readahead_wrapper)  	lgfr	%r5,%r5			# s32  	jg	sys32_readahead		# branch to system call -ENTRY(sys32_sendfile64_wrapper) -	lgfr	%r2,%r2			# int -	lgfr	%r3,%r3			# int -	llgtr	%r4,%r4			# compat_loff_t * -	lgfr	%r5,%r5			# s32 -	jg	sys32_sendfile64	# branch to system call -  ENTRY(sys_tkill_wrapper)  	lgfr	%r2,%r2			# pid_t  	lgfr	%r3,%r3			# int diff --git a/arch/s390/kernel/dis.c b/arch/s390/kernel/dis.c index 3ad5e954016..7f4a4a8c847 100644 --- a/arch/s390/kernel/dis.c +++ b/arch/s390/kernel/dis.c @@ -1696,14 +1696,15 @@ static struct insn *find_insn(unsigned char *code)   * insn_to_mnemonic - decode an s390 instruction   * @instruction: instruction to decode   * @buf: buffer to fill with mnemonic + * @len: length of buffer   *   * Decode the instruction at @instruction and store the corresponding - * mnemonic into @buf. + * mnemonic into @buf of length @len.   * @buf is left unchanged if the instruction could not be decoded.   * Returns:   *  %0 on success, %-ENOENT if the instruction was not found.   */ -int insn_to_mnemonic(unsigned char *instruction, char buf[8]) +int insn_to_mnemonic(unsigned char *instruction, char *buf, unsigned int len)  {  	struct insn *insn; @@ -1711,10 +1712,10 @@ int insn_to_mnemonic(unsigned char *instruction, char buf[8])  	if (!insn)  		return -ENOENT;  	if (insn->name[0] == '\0') -		snprintf(buf, 8, "%s", +		snprintf(buf, len, "%s",  			 long_insn_name[(int) insn->name[1]]);  	else -		snprintf(buf, 8, "%.5s", insn->name); +		snprintf(buf, len, "%.5s", insn->name);  	return 0;  }  EXPORT_SYMBOL_GPL(insn_to_mnemonic); diff --git a/arch/s390/kernel/dumpstack.c b/arch/s390/kernel/dumpstack.c new file mode 100644 index 00000000000..29829747725 --- /dev/null +++ b/arch/s390/kernel/dumpstack.c @@ -0,0 +1,212 @@ +/* + * Stack dumping functions + * + *  Copyright IBM Corp. 1999, 2013 + */ + +#include <linux/kallsyms.h> +#include <linux/hardirq.h> +#include <linux/kprobes.h> +#include <linux/utsname.h> +#include <linux/export.h> +#include <linux/kdebug.h> +#include <linux/ptrace.h> +#include <linux/module.h> +#include <linux/sched.h> +#include <asm/processor.h> +#include <asm/debug.h> +#include <asm/ipl.h> + +#ifndef CONFIG_64BIT +#define LONG "%08lx " +#define FOURLONG "%08lx %08lx %08lx %08lx\n" +static int kstack_depth_to_print = 12; +#else /* CONFIG_64BIT */ +#define LONG "%016lx " +#define FOURLONG "%016lx %016lx %016lx %016lx\n" +static int kstack_depth_to_print = 20; +#endif /* CONFIG_64BIT */ + +/* + * For show_trace we have tree different stack to consider: + *   - the panic stack which is used if the kernel stack has overflown + *   - the asynchronous interrupt stack (cpu related) + *   - the synchronous kernel stack (process related) + * The stack trace can start at any of the three stack and can potentially + * touch all of them. The order is: panic stack, async stack, sync stack. + */ +static unsigned long +__show_trace(unsigned long sp, unsigned long low, unsigned long high) +{ +	struct stack_frame *sf; +	struct pt_regs *regs; + +	while (1) { +		sp = sp & PSW_ADDR_INSN; +		if (sp < low || sp > high - sizeof(*sf)) +			return sp; +		sf = (struct stack_frame *) sp; +		printk("([<%016lx>] ", sf->gprs[8] & PSW_ADDR_INSN); +		print_symbol("%s)\n", sf->gprs[8] & PSW_ADDR_INSN); +		/* Follow the backchain. */ +		while (1) { +			low = sp; +			sp = sf->back_chain & PSW_ADDR_INSN; +			if (!sp) +				break; +			if (sp <= low || sp > high - sizeof(*sf)) +				return sp; +			sf = (struct stack_frame *) sp; +			printk(" [<%016lx>] ", sf->gprs[8] & PSW_ADDR_INSN); +			print_symbol("%s\n", sf->gprs[8] & PSW_ADDR_INSN); +		} +		/* Zero backchain detected, check for interrupt frame. */ +		sp = (unsigned long) (sf + 1); +		if (sp <= low || sp > high - sizeof(*regs)) +			return sp; +		regs = (struct pt_regs *) sp; +		printk(" [<%016lx>] ", regs->psw.addr & PSW_ADDR_INSN); +		print_symbol("%s\n", regs->psw.addr & PSW_ADDR_INSN); +		low = sp; +		sp = regs->gprs[15]; +	} +} + +static void show_trace(struct task_struct *task, unsigned long *stack) +{ +	register unsigned long __r15 asm ("15"); +	unsigned long sp; + +	sp = (unsigned long) stack; +	if (!sp) +		sp = task ? task->thread.ksp : __r15; +	printk("Call Trace:\n"); +#ifdef CONFIG_CHECK_STACK +	sp = __show_trace(sp, S390_lowcore.panic_stack - 4096, +			  S390_lowcore.panic_stack); +#endif +	sp = __show_trace(sp, S390_lowcore.async_stack - ASYNC_SIZE, +			  S390_lowcore.async_stack); +	if (task) +		__show_trace(sp, (unsigned long) task_stack_page(task), +			     (unsigned long) task_stack_page(task) + THREAD_SIZE); +	else +		__show_trace(sp, S390_lowcore.thread_info, +			     S390_lowcore.thread_info + THREAD_SIZE); +	if (!task) +		task = current; +	debug_show_held_locks(task); +} + +void show_stack(struct task_struct *task, unsigned long *sp) +{ +	register unsigned long *__r15 asm ("15"); +	unsigned long *stack; +	int i; + +	if (!sp) +		stack = task ? (unsigned long *) task->thread.ksp : __r15; +	else +		stack = sp; + +	for (i = 0; i < kstack_depth_to_print; i++) { +		if (((addr_t) stack & (THREAD_SIZE-1)) == 0) +			break; +		if ((i * sizeof(long) % 32) == 0) +			printk("%s       ", i == 0 ? "" : "\n"); +		printk(LONG, *stack++); +	} +	printk("\n"); +	show_trace(task, sp); +} + +static void show_last_breaking_event(struct pt_regs *regs) +{ +#ifdef CONFIG_64BIT +	printk("Last Breaking-Event-Address:\n"); +	printk(" [<%016lx>] ", regs->args[0] & PSW_ADDR_INSN); +	print_symbol("%s\n", regs->args[0] & PSW_ADDR_INSN); +#endif +} + +static inline int mask_bits(struct pt_regs *regs, unsigned long bits) +{ +	return (regs->psw.mask & bits) / ((~bits + 1) & bits); +} + +void show_registers(struct pt_regs *regs) +{ +	char *mode; + +	mode = user_mode(regs) ? "User" : "Krnl"; +	printk("%s PSW : %p %p", +	       mode, (void *) regs->psw.mask, +	       (void *) regs->psw.addr); +	print_symbol(" (%s)\n", regs->psw.addr & PSW_ADDR_INSN); +	printk("           R:%x T:%x IO:%x EX:%x Key:%x M:%x W:%x " +	       "P:%x AS:%x CC:%x PM:%x", mask_bits(regs, PSW_MASK_PER), +	       mask_bits(regs, PSW_MASK_DAT), mask_bits(regs, PSW_MASK_IO), +	       mask_bits(regs, PSW_MASK_EXT), mask_bits(regs, PSW_MASK_KEY), +	       mask_bits(regs, PSW_MASK_MCHECK), mask_bits(regs, PSW_MASK_WAIT), +	       mask_bits(regs, PSW_MASK_PSTATE), mask_bits(regs, PSW_MASK_ASC), +	       mask_bits(regs, PSW_MASK_CC), mask_bits(regs, PSW_MASK_PM)); +#ifdef CONFIG_64BIT +	printk(" EA:%x", mask_bits(regs, PSW_MASK_EA | PSW_MASK_BA)); +#endif +	printk("\n%s GPRS: " FOURLONG, mode, +	       regs->gprs[0], regs->gprs[1], regs->gprs[2], regs->gprs[3]); +	printk("           " FOURLONG, +	       regs->gprs[4], regs->gprs[5], regs->gprs[6], regs->gprs[7]); +	printk("           " FOURLONG, +	       regs->gprs[8], regs->gprs[9], regs->gprs[10], regs->gprs[11]); +	printk("           " FOURLONG, +	       regs->gprs[12], regs->gprs[13], regs->gprs[14], regs->gprs[15]); +	show_code(regs); +} + +void show_regs(struct pt_regs *regs) +{ +	show_regs_print_info(KERN_DEFAULT); +	show_registers(regs); +	/* Show stack backtrace if pt_regs is from kernel mode */ +	if (!user_mode(regs)) +		show_trace(NULL, (unsigned long *) regs->gprs[15]); +	show_last_breaking_event(regs); +} + +static DEFINE_SPINLOCK(die_lock); + +void die(struct pt_regs *regs, const char *str) +{ +	static int die_counter; + +	oops_enter(); +	lgr_info_log(); +	debug_stop_all(); +	console_verbose(); +	spin_lock_irq(&die_lock); +	bust_spinlocks(1); +	printk("%s: %04x [#%d] ", str, regs->int_code & 0xffff, ++die_counter); +#ifdef CONFIG_PREEMPT +	printk("PREEMPT "); +#endif +#ifdef CONFIG_SMP +	printk("SMP "); +#endif +#ifdef CONFIG_DEBUG_PAGEALLOC +	printk("DEBUG_PAGEALLOC"); +#endif +	printk("\n"); +	notify_die(DIE_OOPS, str, regs, 0, regs->int_code & 0xffff, SIGSEGV); +	print_modules(); +	show_regs(regs); +	bust_spinlocks(0); +	add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE); +	spin_unlock_irq(&die_lock); +	if (in_interrupt()) +		panic("Fatal exception in interrupt"); +	if (panic_on_oops) +		panic("Fatal exception: panic_on_oops"); +	oops_exit(); +	do_exit(SIGSEGV); +} diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S index 94feff7d613..4d5e6f8a797 100644 --- a/arch/s390/kernel/entry.S +++ b/arch/s390/kernel/entry.S @@ -45,6 +45,7 @@ _TIF_TRACE    = (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | _TIF_SECCOMP | \  STACK_SHIFT = PAGE_SHIFT + THREAD_ORDER  STACK_SIZE  = 1 << STACK_SHIFT +STACK_INIT  = STACK_SIZE - STACK_FRAME_OVERHEAD - __PT_SIZE  #define BASED(name) name-system_call(%r13) @@ -97,10 +98,10 @@ STACK_SIZE  = 1 << STACK_SHIFT  	sra	%r14,\shift  	jnz	1f  	CHECK_STACK 1<<\shift,\savearea +	ahi	%r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE)  	j	2f  1:	l	%r15,\stack		# load target stack -2:	ahi	%r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE) -	la	%r11,STACK_FRAME_OVERHEAD(%r15) +2:	la	%r11,STACK_FRAME_OVERHEAD(%r15)  	.endm  	.macro	ADD64 high,low,timer @@ -150,7 +151,7 @@ ENTRY(__switch_to)  	l	%r4,__THREAD_info(%r2)		# get thread_info of prev  	l	%r5,__THREAD_info(%r3)		# get thread_info of next  	lr	%r15,%r5 -	ahi	%r15,STACK_SIZE			# end of kernel stack of next +	ahi	%r15,STACK_INIT			# end of kernel stack of next  	st	%r3,__LC_CURRENT		# store task struct of next  	st	%r5,__LC_THREAD_INFO		# store thread info of next  	st	%r15,__LC_KERNEL_STACK		# store end of kernel stack @@ -178,7 +179,6 @@ sysc_stm:  	l	%r13,__LC_SVC_NEW_PSW+4  sysc_per:  	l	%r15,__LC_KERNEL_STACK -	ahi	%r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE)  	la	%r11,STACK_FRAME_OVERHEAD(%r15)	# pointer to pt_regs  sysc_vtime:  	UPDATE_VTIME %r8,%r9,__LC_SYNC_ENTER_TIMER @@ -188,6 +188,7 @@ sysc_vtime:  	mvc	__PT_INT_CODE(4,%r11),__LC_SVC_ILC  sysc_do_svc:  	oi	__TI_flags+3(%r12),_TIF_SYSCALL +	l	%r10,__TI_sysc_table(%r12)	# 31 bit system call table  	lh	%r8,__PT_INT_CODE+2(%r11)  	sla	%r8,2				# shift and test for svc0  	jnz	sysc_nr_ok @@ -198,7 +199,6 @@ sysc_do_svc:  	lr	%r8,%r1  	sla	%r8,2  sysc_nr_ok: -	l	%r10,BASED(.Lsys_call_table)	# 31 bit system call table  	xc	__SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15)  	st	%r2,__PT_ORIG_GPR2(%r11)  	st	%r7,STACK_FRAME_OVERHEAD(%r15) @@ -359,11 +359,11 @@ ENTRY(pgm_check_handler)  	tm	__LC_PGM_ILC+3,0x80	# check for per exception  	jnz	pgm_svcper		# -> single stepped svc  0:	CHECK_STACK STACK_SIZE,__LC_SAVE_AREA_SYNC +	ahi	%r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE)  	j	2f  1:	UPDATE_VTIME %r14,%r15,__LC_SYNC_ENTER_TIMER  	l	%r15,__LC_KERNEL_STACK -2:	ahi	%r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE) -	la	%r11,STACK_FRAME_OVERHEAD(%r15) +2:	la	%r11,STACK_FRAME_OVERHEAD(%r15)  	stm	%r0,%r7,__PT_R0(%r11)  	mvc	__PT_R8(32,%r11),__LC_SAVE_AREA_SYNC  	stm	%r8,%r9,__PT_PSW(%r11) @@ -485,7 +485,6 @@ io_work:  #  io_work_user:  	l	%r1,__LC_KERNEL_STACK -	ahi	%r1,-(STACK_FRAME_OVERHEAD + __PT_SIZE)  	mvc	STACK_FRAME_OVERHEAD(__PT_SIZE,%r1),0(%r11)  	xc	__SF_BACKCHAIN(4,%r1),__SF_BACKCHAIN(%r1)  	la	%r11,STACK_FRAME_OVERHEAD(%r1) @@ -646,7 +645,6 @@ mcck_skip:  	tm	__PT_PSW+1(%r11),0x01	# returning to user ?  	jno	mcck_return  	l	%r1,__LC_KERNEL_STACK	# switch to kernel stack -	ahi	%r1,-(STACK_FRAME_OVERHEAD + __PT_SIZE)  	mvc	STACK_FRAME_OVERHEAD(__PT_SIZE,%r1),0(%r11)  	xc	__SF_BACKCHAIN(4,%r1),__SF_BACKCHAIN(%r1)  	la	%r11,STACK_FRAME_OVERHEAD(%r15) @@ -674,6 +672,7 @@ mcck_panic:  	sra	%r14,PAGE_SHIFT  	jz	0f  	l	%r15,__LC_PANIC_STACK +	j	mcck_skip  0:	ahi	%r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE)  	j	mcck_skip @@ -714,12 +713,10 @@ ENTRY(restart_int_handler)   */  stack_overflow:  	l	%r15,__LC_PANIC_STACK	# change to panic stack -	ahi	%r15,-__PT_SIZE		# create pt_regs -	stm	%r0,%r7,__PT_R0(%r15) -	stm	%r8,%r9,__PT_PSW(%r15) +	la	%r11,STACK_FRAME_OVERHEAD(%r15) +	stm	%r0,%r7,__PT_R0(%r11) +	stm	%r8,%r9,__PT_PSW(%r11)  	mvc	__PT_R8(32,%r11),0(%r14) -	lr	%r15,%r11 -	ahi	%r15,-STACK_FRAME_OVERHEAD  	l	%r1,BASED(1f)  	xc	__SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15)  	lr	%r2,%r11		# pass pointer to pt_regs @@ -799,15 +796,14 @@ cleanup_system_call:  	mvc	__LC_LAST_UPDATE_TIMER(8),__LC_SYNC_ENTER_TIMER  	# set up saved register 11  	l	%r15,__LC_KERNEL_STACK -	ahi	%r15,-__PT_SIZE -	st	%r15,12(%r11)		# r11 pt_regs pointer +	la	%r9,STACK_FRAME_OVERHEAD(%r15) +	st	%r9,12(%r11)		# r11 pt_regs pointer  	# fill pt_regs -	mvc	__PT_R8(32,%r15),__LC_SAVE_AREA_SYNC -	stm	%r0,%r7,__PT_R0(%r15) -	mvc	__PT_PSW(8,%r15),__LC_SVC_OLD_PSW -	mvc	__PT_INT_CODE(4,%r15),__LC_SVC_ILC +	mvc	__PT_R8(32,%r9),__LC_SAVE_AREA_SYNC +	stm	%r0,%r7,__PT_R0(%r9) +	mvc	__PT_PSW(8,%r9),__LC_SVC_OLD_PSW +	mvc	__PT_INT_CODE(4,%r9),__LC_SVC_ILC  	# setup saved register 15 -	ahi	%r15,-STACK_FRAME_OVERHEAD  	st	%r15,28(%r11)		# r15 stack pointer  	# set new psw address and exit  	l	%r9,BASED(cleanup_table+4)	# sysc_do_svc + 0x80000000 @@ -910,7 +906,6 @@ cleanup_idle_wait:  .Ltrace_enter:		.long	do_syscall_trace_enter  .Ltrace_exit:		.long	do_syscall_trace_exit  .Lschedule_tail:	.long	schedule_tail -.Lsys_call_table:	.long	sys_call_table  .Lsysc_per:		.long	sysc_per + 0x80000000  #ifdef CONFIG_TRACE_IRQFLAGS  .Lhardirqs_on:		.long	trace_hardirqs_on_caller diff --git a/arch/s390/kernel/entry.h b/arch/s390/kernel/entry.h index c3a736a3ed4..aa0ab02e959 100644 --- a/arch/s390/kernel/entry.h +++ b/arch/s390/kernel/entry.h @@ -7,6 +7,7 @@  #include <asm/cputime.h>  extern void *restart_stack; +extern unsigned long suspend_zero_pages;  void system_call(void);  void pgm_check_handler(void); diff --git a/arch/s390/kernel/entry64.S b/arch/s390/kernel/entry64.S index 2e6d60c55f9..4c17eece707 100644 --- a/arch/s390/kernel/entry64.S +++ b/arch/s390/kernel/entry64.S @@ -39,6 +39,7 @@ __PT_R15     =	__PT_GPRS + 120  STACK_SHIFT = PAGE_SHIFT + THREAD_ORDER  STACK_SIZE  = 1 << STACK_SHIFT +STACK_INIT = STACK_SIZE - STACK_FRAME_OVERHEAD - __PT_SIZE  _TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \  		 _TIF_MCCK_PENDING | _TIF_PER_TRAP ) @@ -124,10 +125,10 @@ _TIF_EXIT_SIE = (_TIF_SIGPENDING | _TIF_NEED_RESCHED | _TIF_MCCK_PENDING)  	srag	%r14,%r14,\shift  	jnz	1f  	CHECK_STACK 1<<\shift,\savearea +	aghi	%r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE)  	j	2f  1:	lg	%r15,\stack		# load target stack -2:	aghi	%r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE) -	la	%r11,STACK_FRAME_OVERHEAD(%r15) +2:	la	%r11,STACK_FRAME_OVERHEAD(%r15)  	.endm  	.macro UPDATE_VTIME scratch,enter_timer @@ -177,7 +178,7 @@ ENTRY(__switch_to)  	lg	%r4,__THREAD_info(%r2)		# get thread_info of prev  	lg	%r5,__THREAD_info(%r3)		# get thread_info of next  	lgr	%r15,%r5 -	aghi	%r15,STACK_SIZE			# end of kernel stack of next +	aghi	%r15,STACK_INIT			# end of kernel stack of next  	stg	%r3,__LC_CURRENT		# store task struct of next  	stg	%r5,__LC_THREAD_INFO		# store thread info of next  	stg	%r15,__LC_KERNEL_STACK		# store end of kernel stack @@ -203,10 +204,8 @@ sysc_stmg:  	stmg	%r8,%r15,__LC_SAVE_AREA_SYNC  	lg	%r10,__LC_LAST_BREAK  	lg	%r12,__LC_THREAD_INFO -	larl	%r13,system_call  sysc_per:  	lg	%r15,__LC_KERNEL_STACK -	aghi	%r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE)  	la	%r11,STACK_FRAME_OVERHEAD(%r15)	# pointer to pt_regs  sysc_vtime:  	UPDATE_VTIME %r13,__LC_SYNC_ENTER_TIMER @@ -217,6 +216,7 @@ sysc_vtime:  	mvc	__PT_INT_CODE(4,%r11),__LC_SVC_ILC  sysc_do_svc:  	oi	__TI_flags+7(%r12),_TIF_SYSCALL +	lg	%r10,__TI_sysc_table(%r12)	# address of system call table  	llgh	%r8,__PT_INT_CODE+2(%r11)  	slag	%r8,%r8,2			# shift and test for svc 0  	jnz	sysc_nr_ok @@ -227,13 +227,6 @@ sysc_do_svc:  	sth	%r1,__PT_INT_CODE+2(%r11)  	slag	%r8,%r1,2  sysc_nr_ok: -	larl	%r10,sys_call_table		# 64 bit system call table -#ifdef CONFIG_COMPAT -	tm	__TI_flags+5(%r12),(_TIF_31BIT>>16) -	jno	sysc_noemu -	larl	%r10,sys_call_table_emu		# 31 bit system call table -sysc_noemu: -#endif  	xc	__SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)  	stg	%r2,__PT_ORIG_GPR2(%r11)  	stg	%r7,STACK_FRAME_OVERHEAD(%r15) @@ -389,6 +382,7 @@ ENTRY(pgm_check_handler)  	tm	__LC_PGM_ILC+3,0x80	# check for per exception  	jnz	pgm_svcper		# -> single stepped svc  0:	CHECK_STACK STACK_SIZE,__LC_SAVE_AREA_SYNC +	aghi	%r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE)  	j	2f  1:	UPDATE_VTIME %r14,__LC_SYNC_ENTER_TIMER  	LAST_BREAK %r14 @@ -398,8 +392,7 @@ ENTRY(pgm_check_handler)  	tm	__LC_PGM_ILC+2,0x02	# check for transaction abort  	jz	2f  	mvc	__THREAD_trap_tdb(256,%r14),0(%r13) -2:	aghi	%r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE) -	la	%r11,STACK_FRAME_OVERHEAD(%r15) +2:	la	%r11,STACK_FRAME_OVERHEAD(%r15)  	stmg	%r0,%r7,__PT_R0(%r11)  	mvc	__PT_R8(64,%r11),__LC_SAVE_AREA_SYNC  	stmg	%r8,%r9,__PT_PSW(%r11) @@ -526,7 +519,6 @@ io_work:  #  io_work_user:  	lg	%r1,__LC_KERNEL_STACK -	aghi	%r1,-(STACK_FRAME_OVERHEAD + __PT_SIZE)  	mvc	STACK_FRAME_OVERHEAD(__PT_SIZE,%r1),0(%r11)  	xc	__SF_BACKCHAIN(8,%r1),__SF_BACKCHAIN(%r1)  	la	%r11,STACK_FRAME_OVERHEAD(%r1) @@ -688,7 +680,6 @@ mcck_skip:  	tm	__PT_PSW+1(%r11),0x01	# returning to user ?  	jno	mcck_return  	lg	%r1,__LC_KERNEL_STACK	# switch to kernel stack -	aghi	%r1,-(STACK_FRAME_OVERHEAD + __PT_SIZE)  	mvc	STACK_FRAME_OVERHEAD(__PT_SIZE,%r1),0(%r11)  	xc	__SF_BACKCHAIN(8,%r1),__SF_BACKCHAIN(%r1)  	la	%r11,STACK_FRAME_OVERHEAD(%r1) @@ -755,14 +746,12 @@ ENTRY(restart_int_handler)   * Setup a pt_regs so that show_trace can provide a good call trace.   */  stack_overflow: -	lg	%r11,__LC_PANIC_STACK	# change to panic stack -	aghi	%r11,-__PT_SIZE		# create pt_regs +	lg	%r15,__LC_PANIC_STACK	# change to panic stack +	la	%r11,STACK_FRAME_OVERHEAD(%r15)  	stmg	%r0,%r7,__PT_R0(%r11)  	stmg	%r8,%r9,__PT_PSW(%r11)  	mvc	__PT_R8(64,%r11),0(%r14)  	stg	%r10,__PT_ORIG_GPR2(%r11) # store last break to orig_gpr2 -	lgr	%r15,%r11 -	aghi	%r15,-STACK_FRAME_OVERHEAD  	xc	__SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)  	lgr	%r2,%r11		# pass pointer to pt_regs  	jg	kernel_stack_overflow @@ -846,15 +835,14 @@ cleanup_system_call:  	mvc	__TI_last_break(8,%r12),16(%r11)  0:	# set up saved register r11  	lg	%r15,__LC_KERNEL_STACK -	aghi	%r15,-__PT_SIZE -	stg	%r15,24(%r11)		# r11 pt_regs pointer +	la	%r9,STACK_FRAME_OVERHEAD(%r15) +	stg	%r9,24(%r11)		# r11 pt_regs pointer  	# fill pt_regs -	mvc	__PT_R8(64,%r15),__LC_SAVE_AREA_SYNC -	stmg	%r0,%r7,__PT_R0(%r15) -	mvc	__PT_PSW(16,%r15),__LC_SVC_OLD_PSW -	mvc	__PT_INT_CODE(4,%r15),__LC_SVC_ILC +	mvc	__PT_R8(64,%r9),__LC_SAVE_AREA_SYNC +	stmg	%r0,%r7,__PT_R0(%r9) +	mvc	__PT_PSW(16,%r9),__LC_SVC_OLD_PSW +	mvc	__PT_INT_CODE(4,%r9),__LC_SVC_ILC  	# setup saved register r15 -	aghi	%r15,-STACK_FRAME_OVERHEAD  	stg	%r15,56(%r11)		# r15 stack pointer  	# set new psw address and exit  	larl	%r9,sysc_do_svc @@ -1011,6 +999,7 @@ sys_call_table:  #ifdef CONFIG_COMPAT  #define SYSCALL(esa,esame,emu)	.long emu +	.globl	sys_call_table_emu  sys_call_table_emu:  #include "syscalls.S"  #undef SYSCALL diff --git a/arch/s390/kernel/irq.c b/arch/s390/kernel/irq.c index 1630f439cd2..4f5ef62934a 100644 --- a/arch/s390/kernel/irq.c +++ b/arch/s390/kernel/irq.c @@ -33,7 +33,7 @@ struct irq_class {  };  /* - * The list of "main" irq classes on s390. This is the list of interrrupts + * The list of "main" irq classes on s390. This is the list of interrupts   * that appear both in /proc/stat ("intr" line) and /proc/interrupts.   * Historically only external and I/O interrupts have been part of /proc/stat.   * We can't add the split external and I/O sub classes since the first field diff --git a/arch/s390/kernel/machine_kexec.c b/arch/s390/kernel/machine_kexec.c index b3de2770001..ac2178161ec 100644 --- a/arch/s390/kernel/machine_kexec.c +++ b/arch/s390/kernel/machine_kexec.c @@ -13,6 +13,7 @@  #include <linux/reboot.h>  #include <linux/ftrace.h>  #include <linux/debug_locks.h> +#include <linux/suspend.h>  #include <asm/cio.h>  #include <asm/setup.h>  #include <asm/pgtable.h> @@ -67,6 +68,35 @@ void setup_regs(void)  	memcpy((void *) SAVE_AREA_BASE, (void *) sa, sizeof(struct save_area));  } +/* + * PM notifier callback for kdump + */ +static int machine_kdump_pm_cb(struct notifier_block *nb, unsigned long action, +			       void *ptr) +{ +	switch (action) { +	case PM_SUSPEND_PREPARE: +	case PM_HIBERNATION_PREPARE: +		if (crashk_res.start) +			crash_map_reserved_pages(); +		break; +	case PM_POST_SUSPEND: +	case PM_POST_HIBERNATION: +		if (crashk_res.start) +			crash_unmap_reserved_pages(); +		break; +	default: +		return NOTIFY_DONE; +	} +	return NOTIFY_OK; +} + +static int __init machine_kdump_pm_init(void) +{ +	pm_notifier(machine_kdump_pm_cb, 0); +	return 0; +} +arch_initcall(machine_kdump_pm_init);  #endif  /* diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c index 536d64579d9..2bc3eddae34 100644 --- a/arch/s390/kernel/process.c +++ b/arch/s390/kernel/process.c @@ -61,18 +61,8 @@ unsigned long thread_saved_pc(struct task_struct *tsk)  	return sf->gprs[8];  } -/* - * The idle loop on a S390... - */ -static void default_idle(void) +void arch_cpu_idle(void)  { -	if (cpu_is_offline(smp_processor_id())) -		cpu_die(); -	local_irq_disable(); -	if (need_resched()) { -		local_irq_enable(); -		return; -	}  	local_mcck_disable();  	if (test_thread_flag(TIF_MCCK_PENDING)) {  		local_mcck_enable(); @@ -83,19 +73,15 @@ static void default_idle(void)  	vtime_stop_cpu();  } -void cpu_idle(void) +void arch_cpu_idle_exit(void)  { -	for (;;) { -		tick_nohz_idle_enter(); -		rcu_idle_enter(); -		while (!need_resched() && !test_thread_flag(TIF_MCCK_PENDING)) -			default_idle(); -		rcu_idle_exit(); -		tick_nohz_idle_exit(); -		if (test_thread_flag(TIF_MCCK_PENDING)) -			s390_handle_mcck(); -		schedule_preempt_disabled(); -	} +	if (test_thread_flag(TIF_MCCK_PENDING)) +		s390_handle_mcck(); +} + +void arch_cpu_idle_dead(void) +{ +	cpu_die();  }  extern void __kprobes kernel_thread_starter(void); diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index 29268859d8e..0f419c5765c 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c @@ -377,11 +377,14 @@ static void __init setup_lowcore(void)  		PSW_MASK_DAT | PSW_MASK_MCHECK;  	lc->io_new_psw.addr = PSW_ADDR_AMODE | (unsigned long) io_int_handler;  	lc->clock_comparator = -1ULL; -	lc->kernel_stack = ((unsigned long) &init_thread_union) + THREAD_SIZE; +	lc->kernel_stack = ((unsigned long) &init_thread_union) +		+ THREAD_SIZE - STACK_FRAME_OVERHEAD - sizeof(struct pt_regs);  	lc->async_stack = (unsigned long) -		__alloc_bootmem(ASYNC_SIZE, ASYNC_SIZE, 0) + ASYNC_SIZE; +		__alloc_bootmem(ASYNC_SIZE, ASYNC_SIZE, 0) +		+ ASYNC_SIZE - STACK_FRAME_OVERHEAD - sizeof(struct pt_regs);  	lc->panic_stack = (unsigned long) -		__alloc_bootmem(PAGE_SIZE, PAGE_SIZE, 0) + PAGE_SIZE; +		__alloc_bootmem(PAGE_SIZE, PAGE_SIZE, 0) +		+ PAGE_SIZE - STACK_FRAME_OVERHEAD - sizeof(struct pt_regs);  	lc->current_task = (unsigned long) init_thread_union.thread_info.task;  	lc->thread_info = (unsigned long) &init_thread_union;  	lc->machine_flags = S390_lowcore.machine_flags; diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index 549c9d173c0..8074cb4b7cb 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c @@ -181,8 +181,10 @@ static int __cpuinit pcpu_alloc_lowcore(struct pcpu *pcpu, int cpu)  	lc = pcpu->lowcore;  	memcpy(lc, &S390_lowcore, 512);  	memset((char *) lc + 512, 0, sizeof(*lc) - 512); -	lc->async_stack = pcpu->async_stack + ASYNC_SIZE; -	lc->panic_stack = pcpu->panic_stack + PAGE_SIZE; +	lc->async_stack = pcpu->async_stack + ASYNC_SIZE +		- STACK_FRAME_OVERHEAD - sizeof(struct pt_regs); +	lc->panic_stack = pcpu->panic_stack + PAGE_SIZE +		- STACK_FRAME_OVERHEAD - sizeof(struct pt_regs);  	lc->cpu_nr = cpu;  #ifndef CONFIG_64BIT  	if (MACHINE_HAS_IEEE) { @@ -253,7 +255,8 @@ static void pcpu_attach_task(struct pcpu *pcpu, struct task_struct *tsk)  	struct _lowcore *lc = pcpu->lowcore;  	struct thread_info *ti = task_thread_info(tsk); -	lc->kernel_stack = (unsigned long) task_stack_page(tsk) + THREAD_SIZE; +	lc->kernel_stack = (unsigned long) task_stack_page(tsk) +		+ THREAD_SIZE - STACK_FRAME_OVERHEAD - sizeof(struct pt_regs);  	lc->thread_info = (unsigned long) task_thread_info(tsk);  	lc->current_task = (unsigned long) tsk;  	lc->user_timer = ti->user_timer; @@ -711,8 +714,7 @@ static void __cpuinit smp_start_secondary(void *cpuvoid)  	set_cpu_online(smp_processor_id(), true);  	inc_irq_stat(CPU_RST);  	local_irq_enable(); -	/* cpu_idle will call schedule for us */ -	cpu_idle(); +	cpu_startup_entry(CPUHP_ONLINE);  }  /* Upping and downing of CPUs */ @@ -810,8 +812,10 @@ void __init smp_prepare_boot_cpu(void)  	pcpu->state = CPU_STATE_CONFIGURED;  	pcpu->address = boot_cpu_address;  	pcpu->lowcore = (struct _lowcore *)(unsigned long) store_prefix(); -	pcpu->async_stack = S390_lowcore.async_stack - ASYNC_SIZE; -	pcpu->panic_stack = S390_lowcore.panic_stack - PAGE_SIZE; +	pcpu->async_stack = S390_lowcore.async_stack - ASYNC_SIZE +		+ STACK_FRAME_OVERHEAD + sizeof(struct pt_regs); +	pcpu->panic_stack = S390_lowcore.panic_stack - PAGE_SIZE +		+ STACK_FRAME_OVERHEAD + sizeof(struct pt_regs);  	S390_lowcore.percpu_offset = __per_cpu_offset[0];  	smp_cpu_set_polarization(0, POLARIZATION_UNKNOWN);  	set_cpu_present(0, true); diff --git a/arch/s390/kernel/suspend.c b/arch/s390/kernel/suspend.c index aa1494d0e38..c479d2f9605 100644 --- a/arch/s390/kernel/suspend.c +++ b/arch/s390/kernel/suspend.c @@ -41,6 +41,7 @@ struct page_key_data {  static struct page_key_data *page_key_data;  static struct page_key_data *page_key_rp, *page_key_wp;  static unsigned long page_key_rx, page_key_wx; +unsigned long suspend_zero_pages;  /*   * For each page in the hibernation image one additional byte is @@ -149,6 +150,36 @@ int pfn_is_nosave(unsigned long pfn)  	return 0;  } +/* + * PM notifier callback for suspend + */ +static int suspend_pm_cb(struct notifier_block *nb, unsigned long action, +			 void *ptr) +{ +	switch (action) { +	case PM_SUSPEND_PREPARE: +	case PM_HIBERNATION_PREPARE: +		suspend_zero_pages = __get_free_pages(GFP_KERNEL, LC_ORDER); +		if (!suspend_zero_pages) +			return NOTIFY_BAD; +		break; +	case PM_POST_SUSPEND: +	case PM_POST_HIBERNATION: +		free_pages(suspend_zero_pages, LC_ORDER); +		break; +	default: +		return NOTIFY_DONE; +	} +	return NOTIFY_OK; +} + +static int __init suspend_pm_init(void) +{ +	pm_notifier(suspend_pm_cb, 0); +	return 0; +} +arch_initcall(suspend_pm_init); +  void save_processor_state(void)  {  	/* swsusp_arch_suspend() actually saves all cpu register contents. diff --git a/arch/s390/kernel/swsusp_asm64.S b/arch/s390/kernel/swsusp_asm64.S index d4ca4e0617b..c487be4cfc8 100644 --- a/arch/s390/kernel/swsusp_asm64.S +++ b/arch/s390/kernel/swsusp_asm64.S @@ -36,8 +36,8 @@ ENTRY(swsusp_arch_suspend)  	/* Store prefix register on stack */  	stpx	__SF_EMPTY(%r15) -	/* Save prefix register contents for lowcore */ -	llgf	%r4,__SF_EMPTY(%r15) +	/* Save prefix register contents for lowcore copy */ +	llgf	%r10,__SF_EMPTY(%r15)  	/* Get pointer to save area */  	lghi	%r1,0x1000 @@ -91,7 +91,18 @@ ENTRY(swsusp_arch_suspend)  	xc	__SF_EMPTY(4,%r15),__SF_EMPTY(%r15)  	spx	__SF_EMPTY(%r15) +	/* Save absolute zero pages */ +	larl	%r2,suspend_zero_pages +	lg	%r2,0(%r2) +	lghi	%r4,0 +	lghi	%r3,2*PAGE_SIZE +	lghi	%r5,2*PAGE_SIZE +1:	mvcle	%r2,%r4,0 +	jo	1b + +	/* Copy lowcore to absolute zero lowcore */  	lghi	%r2,0 +	lgr	%r4,%r10  	lghi	%r3,2*PAGE_SIZE  	lghi	%r5,2*PAGE_SIZE  1:	mvcle	%r2,%r4,0 @@ -248,8 +259,20 @@ restore_registers:  	/* Load old stack */  	lg	%r15,0x2f8(%r13) +	/* Save prefix register */ +	mvc __SF_EMPTY(4,%r15),0x318(%r13) + +	/* Restore absolute zero pages */ +	lghi	%r2,0 +	larl	%r4,suspend_zero_pages +	lg	%r4,0(%r4) +	lghi	%r3,2*PAGE_SIZE +	lghi	%r5,2*PAGE_SIZE +1:	mvcle	%r2,%r4,0 +	jo	1b +  	/* Restore prefix register */ -	spx	0x318(%r13) +	spx	__SF_EMPTY(%r15)  	/* Activate DAT */  	stosm	__SF_EMPTY(%r15),0x04 diff --git a/arch/s390/kernel/sys_s390.c b/arch/s390/kernel/sys_s390.c index d0964d22adb..23eb222c165 100644 --- a/arch/s390/kernel/sys_s390.c +++ b/arch/s390/kernel/sys_s390.c @@ -132,19 +132,9 @@ SYSCALL_DEFINE1(s390_fadvise64_64, struct fadvise64_64_args __user *, args)   * to   *   %r2: fd, %r3: mode, %r4/%r5: offset, 96(%r15)-103(%r15): len   */ -SYSCALL_DEFINE(s390_fallocate)(int fd, int mode, loff_t offset, -			       u32 len_high, u32 len_low) +SYSCALL_DEFINE5(s390_fallocate, int, fd, int, mode, loff_t, offset, +			       u32, len_high, u32, len_low)  {  	return sys_fallocate(fd, mode, offset, ((u64)len_high << 32) | len_low);  } -#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS -asmlinkage long SyS_s390_fallocate(long fd, long mode, loff_t offset, -				   long len_high, long len_low) -{ -	return SYSC_s390_fallocate((int) fd, (int) mode, offset, -				   (u32) len_high, (u32) len_low); -} -SYSCALL_ALIAS(sys_s390_fallocate, SyS_s390_fallocate); -#endif -  #endif diff --git a/arch/s390/kernel/syscalls.S b/arch/s390/kernel/syscalls.S index 630b935d128..d2baabed714 100644 --- a/arch/s390/kernel/syscalls.S +++ b/arch/s390/kernel/syscalls.S @@ -85,7 +85,7 @@ SYSCALL(sys_sigpending,sys_sigpending,compat_sys_sigpending_wrapper)  SYSCALL(sys_sethostname,sys_sethostname,sys32_sethostname_wrapper)  SYSCALL(sys_setrlimit,sys_setrlimit,compat_sys_setrlimit_wrapper)	/* 75 */  SYSCALL(sys_old_getrlimit,sys_getrlimit,compat_sys_old_getrlimit_wrapper) -SYSCALL(sys_getrusage,sys_getrusage,compat_sys_getrusage_wrapper) +SYSCALL(sys_getrusage,sys_getrusage,compat_sys_getrusage)  SYSCALL(sys_gettimeofday,sys_gettimeofday,compat_sys_gettimeofday_wrapper)  SYSCALL(sys_settimeofday,sys_settimeofday,compat_sys_settimeofday_wrapper)  SYSCALL(sys_getgroups16,sys_ni_syscall,sys32_getgroups16_wrapper)	/* 80 old getgroups16 syscall */ @@ -118,14 +118,14 @@ SYSCALL(sys_newstat,sys_newstat,compat_sys_newstat_wrapper)  SYSCALL(sys_newlstat,sys_newlstat,compat_sys_newlstat_wrapper)  SYSCALL(sys_newfstat,sys_newfstat,compat_sys_newfstat_wrapper)  NI_SYSCALL							/* old uname syscall */ -SYSCALL(sys_lookup_dcookie,sys_lookup_dcookie,sys32_lookup_dcookie_wrapper)	/* 110 */ +SYSCALL(sys_lookup_dcookie,sys_lookup_dcookie,compat_sys_lookup_dcookie)	/* 110 */  SYSCALL(sys_vhangup,sys_vhangup,sys_vhangup)  NI_SYSCALL							/* old "idle" system call */  NI_SYSCALL							/* vm86old for i386 */  SYSCALL(sys_wait4,sys_wait4,compat_sys_wait4)  SYSCALL(sys_swapoff,sys_swapoff,sys32_swapoff_wrapper)		/* 115 */  SYSCALL(sys_sysinfo,sys_sysinfo,compat_sys_sysinfo_wrapper) -SYSCALL(sys_s390_ipc,sys_s390_ipc,sys32_ipc_wrapper) +SYSCALL(sys_s390_ipc,sys_s390_ipc,compat_sys_s390_ipc)  SYSCALL(sys_fsync,sys_fsync,sys32_fsync_wrapper)  SYSCALL(sys_sigreturn,sys_sigreturn,sys32_sigreturn)  SYSCALL(sys_clone,sys_clone,sys_clone_wrapper)			/* 120 */ @@ -195,7 +195,7 @@ SYSCALL(sys_getcwd,sys_getcwd,sys32_getcwd_wrapper)  SYSCALL(sys_capget,sys_capget,sys32_capget_wrapper)  SYSCALL(sys_capset,sys_capset,sys32_capset_wrapper)		/* 185 */  SYSCALL(sys_sigaltstack,sys_sigaltstack,compat_sys_sigaltstack) -SYSCALL(sys_sendfile,sys_sendfile64,sys32_sendfile_wrapper) +SYSCALL(sys_sendfile,sys_sendfile64,compat_sys_sendfile)  NI_SYSCALL							/* streams1 */  NI_SYSCALL							/* streams2 */  SYSCALL(sys_vfork,sys_vfork,sys_vfork)				/* 190 */ @@ -231,7 +231,7 @@ SYSCALL(sys_madvise,sys_madvise,sys32_madvise_wrapper)  SYSCALL(sys_getdents64,sys_getdents64,sys32_getdents64_wrapper)	/* 220 */  SYSCALL(sys_fcntl64,sys_ni_syscall,compat_sys_fcntl64_wrapper)  SYSCALL(sys_readahead,sys_readahead,sys32_readahead_wrapper) -SYSCALL(sys_sendfile64,sys_ni_syscall,sys32_sendfile64_wrapper) +SYSCALL(sys_sendfile64,sys_ni_syscall,compat_sys_sendfile64)  SYSCALL(sys_setxattr,sys_setxattr,sys32_setxattr_wrapper)  SYSCALL(sys_lsetxattr,sys_lsetxattr,sys32_lsetxattr_wrapper)	/* 225 */  SYSCALL(sys_fsetxattr,sys_fsetxattr,sys32_fsetxattr_wrapper) @@ -317,20 +317,20 @@ SYSCALL(sys_get_robust_list,sys_get_robust_list,compat_sys_get_robust_list)  SYSCALL(sys_splice,sys_splice,sys_splice_wrapper)  SYSCALL(sys_sync_file_range,sys_sync_file_range,sys_sync_file_range_wrapper)  SYSCALL(sys_tee,sys_tee,sys_tee_wrapper) -SYSCALL(sys_vmsplice,sys_vmsplice,compat_sys_vmsplice_wrapper) +SYSCALL(sys_vmsplice,sys_vmsplice,compat_sys_vmsplice)  NI_SYSCALL							/* 310 sys_move_pages */  SYSCALL(sys_getcpu,sys_getcpu,sys_getcpu_wrapper) -SYSCALL(sys_epoll_pwait,sys_epoll_pwait,compat_sys_epoll_pwait_wrapper) +SYSCALL(sys_epoll_pwait,sys_epoll_pwait,compat_sys_epoll_pwait)  SYSCALL(sys_utimes,sys_utimes,compat_sys_utimes_wrapper)  SYSCALL(sys_s390_fallocate,sys_fallocate,sys_fallocate_wrapper)  SYSCALL(sys_utimensat,sys_utimensat,compat_sys_utimensat_wrapper)	/* 315 */ -SYSCALL(sys_signalfd,sys_signalfd,compat_sys_signalfd_wrapper) +SYSCALL(sys_signalfd,sys_signalfd,compat_sys_signalfd)  NI_SYSCALL						/* 317 old sys_timer_fd */  SYSCALL(sys_eventfd,sys_eventfd,sys_eventfd_wrapper)  SYSCALL(sys_timerfd_create,sys_timerfd_create,sys_timerfd_create_wrapper)  SYSCALL(sys_timerfd_settime,sys_timerfd_settime,compat_sys_timerfd_settime) /* 320 */  SYSCALL(sys_timerfd_gettime,sys_timerfd_gettime,compat_sys_timerfd_gettime) -SYSCALL(sys_signalfd4,sys_signalfd4,compat_sys_signalfd4_wrapper) +SYSCALL(sys_signalfd4,sys_signalfd4,compat_sys_signalfd4)  SYSCALL(sys_eventfd2,sys_eventfd2,sys_eventfd2_wrapper)  SYSCALL(sys_inotify_init1,sys_inotify_init1,sys_inotify_init1_wrapper)  SYSCALL(sys_pipe2,sys_pipe2,sys_pipe2_wrapper) /* 325 */ diff --git a/arch/s390/kernel/traps.c b/arch/s390/kernel/traps.c index 13dd63fba36..c5762324d9e 100644 --- a/arch/s390/kernel/traps.c +++ b/arch/s390/kernel/traps.c @@ -12,49 +12,16 @@   * 'Traps.c' handles hardware traps and faults after we have saved some   * state in 'asm.s'.   */ -#include <linux/sched.h> -#include <linux/kernel.h> -#include <linux/string.h> -#include <linux/errno.h> +#include <linux/kprobes.h> +#include <linux/kdebug.h> +#include <linux/module.h>  #include <linux/ptrace.h> -#include <linux/timer.h> +#include <linux/sched.h>  #include <linux/mm.h> -#include <linux/smp.h> -#include <linux/init.h> -#include <linux/interrupt.h> -#include <linux/seq_file.h> -#include <linux/delay.h> -#include <linux/module.h> -#include <linux/kdebug.h> -#include <linux/kallsyms.h> -#include <linux/reboot.h> -#include <linux/kprobes.h> -#include <linux/bug.h> -#include <linux/utsname.h> -#include <asm/uaccess.h> -#include <asm/io.h> -#include <linux/atomic.h> -#include <asm/mathemu.h> -#include <asm/cpcmd.h> -#include <asm/lowcore.h> -#include <asm/debug.h> -#include <asm/ipl.h>  #include "entry.h"  int show_unhandled_signals = 1; -#define stack_pointer ({ void **sp; asm("la %0,0(15)" : "=&d" (sp)); sp; }) - -#ifndef CONFIG_64BIT -#define LONG "%08lx " -#define FOURLONG "%08lx %08lx %08lx %08lx\n" -static int kstack_depth_to_print = 12; -#else /* CONFIG_64BIT */ -#define LONG "%016lx " -#define FOURLONG "%016lx %016lx %016lx %016lx\n" -static int kstack_depth_to_print = 20; -#endif /* CONFIG_64BIT */ -  static inline void __user *get_trap_ip(struct pt_regs *regs)  {  #ifdef CONFIG_64BIT @@ -72,215 +39,6 @@ static inline void __user *get_trap_ip(struct pt_regs *regs)  #endif  } -/* - * For show_trace we have tree different stack to consider: - *   - the panic stack which is used if the kernel stack has overflown - *   - the asynchronous interrupt stack (cpu related) - *   - the synchronous kernel stack (process related) - * The stack trace can start at any of the three stack and can potentially - * touch all of them. The order is: panic stack, async stack, sync stack. - */ -static unsigned long -__show_trace(unsigned long sp, unsigned long low, unsigned long high) -{ -	struct stack_frame *sf; -	struct pt_regs *regs; - -	while (1) { -		sp = sp & PSW_ADDR_INSN; -		if (sp < low || sp > high - sizeof(*sf)) -			return sp; -		sf = (struct stack_frame *) sp; -		printk("([<%016lx>] ", sf->gprs[8] & PSW_ADDR_INSN); -		print_symbol("%s)\n", sf->gprs[8] & PSW_ADDR_INSN); -		/* Follow the backchain. */ -		while (1) { -			low = sp; -			sp = sf->back_chain & PSW_ADDR_INSN; -			if (!sp) -				break; -			if (sp <= low || sp > high - sizeof(*sf)) -				return sp; -			sf = (struct stack_frame *) sp; -			printk(" [<%016lx>] ", sf->gprs[8] & PSW_ADDR_INSN); -			print_symbol("%s\n", sf->gprs[8] & PSW_ADDR_INSN); -		} -		/* Zero backchain detected, check for interrupt frame. */ -		sp = (unsigned long) (sf + 1); -		if (sp <= low || sp > high - sizeof(*regs)) -			return sp; -		regs = (struct pt_regs *) sp; -		printk(" [<%016lx>] ", regs->psw.addr & PSW_ADDR_INSN); -		print_symbol("%s\n", regs->psw.addr & PSW_ADDR_INSN); -		low = sp; -		sp = regs->gprs[15]; -	} -} - -static void show_trace(struct task_struct *task, unsigned long *stack) -{ -	register unsigned long __r15 asm ("15"); -	unsigned long sp; - -	sp = (unsigned long) stack; -	if (!sp) -		sp = task ? task->thread.ksp : __r15; -	printk("Call Trace:\n"); -#ifdef CONFIG_CHECK_STACK -	sp = __show_trace(sp, S390_lowcore.panic_stack - 4096, -			  S390_lowcore.panic_stack); -#endif -	sp = __show_trace(sp, S390_lowcore.async_stack - ASYNC_SIZE, -			  S390_lowcore.async_stack); -	if (task) -		__show_trace(sp, (unsigned long) task_stack_page(task), -			     (unsigned long) task_stack_page(task) + THREAD_SIZE); -	else -		__show_trace(sp, S390_lowcore.thread_info, -			     S390_lowcore.thread_info + THREAD_SIZE); -	if (!task) -		task = current; -	debug_show_held_locks(task); -} - -void show_stack(struct task_struct *task, unsigned long *sp) -{ -	register unsigned long * __r15 asm ("15"); -	unsigned long *stack; -	int i; - -	if (!sp) -		stack = task ? (unsigned long *) task->thread.ksp : __r15; -	else -		stack = sp; - -	for (i = 0; i < kstack_depth_to_print; i++) { -		if (((addr_t) stack & (THREAD_SIZE-1)) == 0) -			break; -		if ((i * sizeof(long) % 32) == 0) -			printk("%s       ", i == 0 ? "" : "\n"); -		printk(LONG, *stack++); -	} -	printk("\n"); -	show_trace(task, sp); -} - -static void show_last_breaking_event(struct pt_regs *regs) -{ -#ifdef CONFIG_64BIT -	printk("Last Breaking-Event-Address:\n"); -	printk(" [<%016lx>] ", regs->args[0] & PSW_ADDR_INSN); -	print_symbol("%s\n", regs->args[0] & PSW_ADDR_INSN); -#endif -} - -/* - * The architecture-independent dump_stack generator - */ -void dump_stack(void) -{ -	printk("CPU: %d %s %s %.*s\n", -	       task_thread_info(current)->cpu, print_tainted(), -	       init_utsname()->release, -	       (int)strcspn(init_utsname()->version, " "), -	       init_utsname()->version); -	printk("Process %s (pid: %d, task: %p, ksp: %p)\n", -	       current->comm, current->pid, current, -	       (void *) current->thread.ksp); -	show_stack(NULL, NULL); -} -EXPORT_SYMBOL(dump_stack); - -static inline int mask_bits(struct pt_regs *regs, unsigned long bits) -{ -	return (regs->psw.mask & bits) / ((~bits + 1) & bits); -} - -void show_registers(struct pt_regs *regs) -{ -	char *mode; - -	mode = user_mode(regs) ? "User" : "Krnl"; -	printk("%s PSW : %p %p", -	       mode, (void *) regs->psw.mask, -	       (void *) regs->psw.addr); -	print_symbol(" (%s)\n", regs->psw.addr & PSW_ADDR_INSN); -	printk("           R:%x T:%x IO:%x EX:%x Key:%x M:%x W:%x " -	       "P:%x AS:%x CC:%x PM:%x", mask_bits(regs, PSW_MASK_PER), -	       mask_bits(regs, PSW_MASK_DAT), mask_bits(regs, PSW_MASK_IO), -	       mask_bits(regs, PSW_MASK_EXT), mask_bits(regs, PSW_MASK_KEY), -	       mask_bits(regs, PSW_MASK_MCHECK), mask_bits(regs, PSW_MASK_WAIT), -	       mask_bits(regs, PSW_MASK_PSTATE), mask_bits(regs, PSW_MASK_ASC), -	       mask_bits(regs, PSW_MASK_CC), mask_bits(regs, PSW_MASK_PM)); -#ifdef CONFIG_64BIT -	printk(" EA:%x", mask_bits(regs, PSW_MASK_EA | PSW_MASK_BA)); -#endif -	printk("\n%s GPRS: " FOURLONG, mode, -	       regs->gprs[0], regs->gprs[1], regs->gprs[2], regs->gprs[3]); -	printk("           " FOURLONG, -	       regs->gprs[4], regs->gprs[5], regs->gprs[6], regs->gprs[7]); -	printk("           " FOURLONG, -	       regs->gprs[8], regs->gprs[9], regs->gprs[10], regs->gprs[11]); -	printk("           " FOURLONG, -	       regs->gprs[12], regs->gprs[13], regs->gprs[14], regs->gprs[15]); - -	show_code(regs); -}	 - -void show_regs(struct pt_regs *regs) -{ -	printk("CPU: %d %s %s %.*s\n", -	       task_thread_info(current)->cpu, print_tainted(), -	       init_utsname()->release, -	       (int)strcspn(init_utsname()->version, " "), -	       init_utsname()->version); -	printk("Process %s (pid: %d, task: %p, ksp: %p)\n", -	       current->comm, current->pid, current, -	       (void *) current->thread.ksp); -	show_registers(regs); -	/* Show stack backtrace if pt_regs is from kernel mode */ -	if (!user_mode(regs)) -		show_trace(NULL, (unsigned long *) regs->gprs[15]); -	show_last_breaking_event(regs); -} - -static DEFINE_SPINLOCK(die_lock); - -void die(struct pt_regs *regs, const char *str) -{ -	static int die_counter; - -	oops_enter(); -	lgr_info_log(); -	debug_stop_all(); -	console_verbose(); -	spin_lock_irq(&die_lock); -	bust_spinlocks(1); -	printk("%s: %04x [#%d] ", str, regs->int_code & 0xffff, ++die_counter); -#ifdef CONFIG_PREEMPT -	printk("PREEMPT "); -#endif -#ifdef CONFIG_SMP -	printk("SMP "); -#endif -#ifdef CONFIG_DEBUG_PAGEALLOC -	printk("DEBUG_PAGEALLOC"); -#endif -	printk("\n"); -	notify_die(DIE_OOPS, str, regs, 0, regs->int_code & 0xffff, SIGSEGV); -	print_modules(); -	show_regs(regs); -	bust_spinlocks(0); -	add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE); -	spin_unlock_irq(&die_lock); -	if (in_interrupt()) -		panic("Fatal exception in interrupt"); -	if (panic_on_oops) -		panic("Fatal exception: panic_on_oops"); -	oops_exit(); -	do_exit(SIGSEGV); -} -  static inline void report_user_fault(struct pt_regs *regs, int signr)  {  	if ((task_pid_nr(current) > 1) && !show_unhandled_signals) diff --git a/arch/s390/kernel/vtime.c b/arch/s390/kernel/vtime.c index a0042acbd98..3fb09359eda 100644 --- a/arch/s390/kernel/vtime.c +++ b/arch/s390/kernel/vtime.c @@ -158,8 +158,6 @@ void __kprobes vtime_stop_cpu(void)  	unsigned long psw_mask;  	trace_hardirqs_on(); -	/* Don't trace preempt off for idle. */ -	stop_critical_timings();  	/* Wait for external, I/O or machine check interrupt. */  	psw_mask = psw_kernel_bits | PSW_MASK_WAIT | PSW_MASK_DAT | @@ -169,9 +167,6 @@ void __kprobes vtime_stop_cpu(void)  	/* Call the assembler magic in entry.S */  	psw_idle(idle, psw_mask); -	/* Reenable preemption tracer. */ -	start_critical_timings(); -  	/* Account time spent with enabled wait psw loaded as idle time. */  	idle->sequence++;  	smp_wmb();  |