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

Commit 162bdafa authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull s390 fixes from Martin Schwidefsky:
 "A couple of bux fixes, notable are the regression with ptrace vs
  restarting system calls and the patch for kdump to be able to copy
  from virtual memory"

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
  s390: fix system call restart after inferior call
  s390: Allow vmalloc target buffers for copy_from_oldmem()
  s390/sclp: properly detect line mode console
  s390/kprobes: add exrl to list of prohibited opcodes
  s390/3270: fix return value check in tty3270_resize_work()
parents d0e639c9 dbbfe487
Loading
Loading
Loading
Loading
+20 −22
Original line number Diff line number Diff line
@@ -40,28 +40,26 @@ static inline void *load_real_addr(void *addr)
}

/*
 * Copy up to one page to vmalloc or real memory
 * Copy real to virtual or real memory
 */
static ssize_t copy_page_real(void *buf, void *src, size_t csize)
static int copy_from_realmem(void *dest, void *src, size_t count)
{
	size_t size;
	unsigned long size;
	int rc;

	if (is_vmalloc_addr(buf)) {
		BUG_ON(csize >= PAGE_SIZE);
		/* If buf is not page aligned, copy first part */
		size = min(roundup(__pa(buf), PAGE_SIZE) - __pa(buf), csize);
		if (size) {
			if (memcpy_real(load_real_addr(buf), src, size))
	if (!count)
		return 0;
	if (!is_vmalloc_or_module_addr(dest))
		return memcpy_real(dest, src, count);
	do {
		size = min(count, PAGE_SIZE - (__pa(dest) & ~PAGE_MASK));
		if (memcpy_real(load_real_addr(dest), src, size))
			return -EFAULT;
			buf += size;
		count -= size;
		dest += size;
		src += size;
		}
		/* Copy second part */
		size = csize - size;
		return (size) ? memcpy_real(load_real_addr(buf), src, size) : 0;
	} else {
		return memcpy_real(buf, src, csize);
	}
	} while (count);
	return 0;
}

/*
@@ -114,7 +112,7 @@ static ssize_t copy_oldmem_page_kdump(char *buf, size_t csize,
		rc = copy_to_user_real((void __force __user *) buf,
				       (void *) src, csize);
	else
		rc = copy_page_real(buf, (void *) src, csize);
		rc = copy_from_realmem(buf, (void *) src, csize);
	return (rc == 0) ? rc : csize;
}

@@ -210,7 +208,7 @@ int copy_from_oldmem(void *dest, void *src, size_t count)
	if (OLDMEM_BASE) {
		if ((unsigned long) src < OLDMEM_SIZE) {
			copied = min(count, OLDMEM_SIZE - (unsigned long) src);
			rc = memcpy_real(dest, src + OLDMEM_BASE, copied);
			rc = copy_from_realmem(dest, src + OLDMEM_BASE, copied);
			if (rc)
				return rc;
		}
@@ -223,7 +221,7 @@ int copy_from_oldmem(void *dest, void *src, size_t count)
				return rc;
		}
	}
	return memcpy_real(dest + copied, src + copied, count - copied);
	return copy_from_realmem(dest + copied, src + copied, count - copied);
}

/*
+1 −0
Original line number Diff line number Diff line
@@ -266,6 +266,7 @@ sysc_sigpending:
	tm	__TI_flags+3(%r12),_TIF_SYSCALL
	jno	sysc_return
	lm	%r2,%r7,__PT_R2(%r11)	# load svc arguments
	l	%r10,__TI_sysc_table(%r12)	# 31 bit system call table
	xr	%r8,%r8			# svc 0 returns -ENOSYS
	clc	__PT_INT_CODE+2(2,%r11),BASED(.Lnr_syscalls+2)
	jnl	sysc_nr_ok		# invalid svc number -> do svc 0
+1 −0
Original line number Diff line number Diff line
@@ -297,6 +297,7 @@ sysc_sigpending:
	tm	__TI_flags+7(%r12),_TIF_SYSCALL
	jno	sysc_return
	lmg	%r2,%r7,__PT_R2(%r11)	# load svc arguments
	lg	%r10,__TI_sysc_table(%r12)	# address of system call table
	lghi	%r8,0			# svc 0 returns -ENOSYS
	llgh	%r1,__PT_INT_CODE+2(%r11)	# load new svc number
	cghi	%r1,NR_syscalls
+5 −1
Original line number Diff line number Diff line
@@ -67,6 +67,11 @@ static int __kprobes is_prohibited_opcode(kprobe_opcode_t *insn)
	case 0xac:	/* stnsm */
	case 0xad:	/* stosm */
		return -EINVAL;
	case 0xc6:
		switch (insn[0] & 0x0f) {
		case 0x00: /* exrl   */
			return -EINVAL;
		}
	}
	switch (insn[0]) {
	case 0x0101:	/* pr	 */
@@ -180,7 +185,6 @@ static int __kprobes is_insn_relative_long(kprobe_opcode_t *insn)
		break;
	case 0xc6:
		switch (insn[0] & 0x0f) {
		case 0x00: /* exrl   */
		case 0x02: /* pfdrl  */
		case 0x04: /* cghrl  */
		case 0x05: /* chrl   */
+5 −3
Original line number Diff line number Diff line
@@ -145,9 +145,11 @@ bool __init sclp_has_linemode(void)

	if (sccb->header.response_code != 0x20)
		return 0;
	if (sccb->sclp_send_mask & (EVTYP_MSG_MASK | EVTYP_PMSGCMD_MASK))
		return 1;
	if (!(sccb->sclp_send_mask & (EVTYP_OPCMD_MASK | EVTYP_PMSGCMD_MASK)))
		return 0;
	if (!(sccb->sclp_receive_mask & (EVTYP_MSG_MASK | EVTYP_PMSGCMD_MASK)))
		return 0;
	return 1;
}

bool __init sclp_has_vt220(void)
Loading