Commit 4ab6cfc4 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull more s390 updates from Heiko Carstens:
 "Just a couple of small improvements, bug fixes and cleanups:

   - Add Eric Farman as maintainer for s390 virtio drivers.

   - Improve machine check handling, and avoid incorrectly injecting a
     machine check into a kvm guest.

   - Add cond_resched() call to gmap page table walker in order to avoid
     possible huge latencies. Also use non-quiesing sske instruction to
     speed up storage key handling.

   - Add __GFP_NORETRY to KEXEC_CONTROL_MEMORY_GFP so s390 behaves
     similar like common code.

   - Get sie control block address from correct stack slot in perf event
     code. This fixes potential random memory accesses.

   - Change uaccess code so that the exception handler sets the result
     of get_user() and __get_kernel_nofault() to zero in case of a
     fault. Until now this was done via input parameters for inline
     assemblies. Doing it via fault handling is what most or even all
     other architectures are doing.

   - Couple of other small cleanups and fixes"

* tag 's390-5.19-2' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
  s390/stack: add union to reflect kvm stack slot usages
  s390/stack: merge empty stack frame slots
  s390/uaccess: whitespace cleanup
  s390/uaccess: use __noreturn instead of __attribute__((noreturn))
  s390/uaccess: use exception handler to zero result on get_user() failure
  s390/uaccess: use symbolic names for inline assembler operands
  s390/mcck: isolate SIE instruction when setting CIF_MCCK_GUEST flag
  s390/mm: use non-quiescing sske for KVM switch to keyed guest
  s390/gmap: voluntarily schedule during key setting
  MAINTAINERS: Update s390 virtio-ccw
  s390/kexec: add __GFP_NORETRY to KEXEC_CONTROL_MEMORY_GFP
  s390/Kconfig.debug: fix indentation
  s390/Kconfig: fix indentation
  s390/perf: obtain sie_block from the right address
  s390: generate register offsets into pt_regs automatically
  s390: simplify early program check handler
  s390/crypto: fix scatterwalk_unmap() callers in AES-GCM
parents 93ce7948 e0ffcf3f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -21057,6 +21057,7 @@ F: include/uapi/linux/virtio_crypto.h
VIRTIO DRIVERS FOR S390
M:	Cornelia Huck <cohuck@redhat.com>
M:	Halil Pasic <pasic@linux.ibm.com>
M:	Eric Farman <farman@linux.ibm.com>
L:	linux-s390@vger.kernel.org
L:	virtualization@lists.linux-foundation.org
L:	kvm@vger.kernel.org
+2 −2
Original line number Diff line number Diff line
@@ -701,7 +701,7 @@ static inline void _gcm_sg_unmap_and_advance(struct gcm_sg_walk *gw,
					     unsigned int nbytes)
{
	gw->walk_bytes_remain -= nbytes;
	scatterwalk_unmap(&gw->walk);
	scatterwalk_unmap(gw->walk_ptr);
	scatterwalk_advance(&gw->walk, nbytes);
	scatterwalk_done(&gw->walk, 0, gw->walk_bytes_remain);
	gw->walk_ptr = NULL;
@@ -776,7 +776,7 @@ static int gcm_out_walk_go(struct gcm_sg_walk *gw, unsigned int minbytesneeded)
		goto out;
	}

	scatterwalk_unmap(&gw->walk);
	scatterwalk_unmap(gw->walk_ptr);
	gw->walk_ptr = NULL;

	gw->ptr = gw->buf;
+63 −28
Original line number Diff line number Diff line
@@ -3,12 +3,24 @@
#define __ASM_EXTABLE_H

#include <linux/stringify.h>
#include <linux/bits.h>
#include <asm/asm-const.h>

#define EX_TYPE_NONE		0
#define EX_TYPE_FIXUP		1
#define EX_TYPE_BPF		2
#define EX_TYPE_UACCESS	3
#define EX_TYPE_UA_STORE	3
#define EX_TYPE_UA_LOAD_MEM	4
#define EX_TYPE_UA_LOAD_REG	5

#define EX_DATA_REG_ERR_SHIFT	0
#define EX_DATA_REG_ERR		GENMASK(3, 0)

#define EX_DATA_REG_ADDR_SHIFT	4
#define EX_DATA_REG_ADDR	GENMASK(7, 4)

#define EX_DATA_LEN_SHIFT	8
#define EX_DATA_LEN		GENMASK(11, 8)

#define __EX_TABLE(_section, _fault, _target, _type)			\
	stringify_in_c(.section	_section,"a";)				\
@@ -19,35 +31,58 @@
	stringify_in_c(.short	0;)					\
	stringify_in_c(.previous)

#define __EX_TABLE_UA(_section, _fault, _target, _type, _reg)		\
#define __EX_TABLE_UA(_section, _fault, _target, _type, _regerr, _regaddr, _len)\
	stringify_in_c(.section _section,"a";)					\
	stringify_in_c(.align	4;)						\
	stringify_in_c(.long	(_fault) - .;)					\
	stringify_in_c(.long	(_target) - .;)					\
	stringify_in_c(.short	(_type);)					\
	stringify_in_c(.macro extable_reg reg;)				\
	stringify_in_c(.macro	extable_reg regerr, regaddr;)			\
	stringify_in_c(.set	.Lfound, 0;)					\
	stringify_in_c(.set .Lregnr, 0;)				\
	stringify_in_c(.irp rs,r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15;) \
	stringify_in_c(.ifc "\reg", "%%\rs";)				\
	stringify_in_c(.set	.Lcurr, 0;)					\
	stringify_in_c(.irp	rs,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;)	\
	stringify_in_c(		.ifc	"\regerr", "%%r\rs";)			\
	stringify_in_c(			.set	.Lfound, 1;)			\
	stringify_in_c(.short .Lregnr;)					\
	stringify_in_c(			.set	.Lregerr, .Lcurr;)		\
	stringify_in_c(		.endif;)					\
	stringify_in_c(.set .Lregnr, .Lregnr+1;)			\
	stringify_in_c(		.set	.Lcurr, .Lcurr+1;)			\
	stringify_in_c(.endr;)							\
	stringify_in_c(.ifne	(.Lfound != 1);)				\
	stringify_in_c(.error "extable_reg: bad register argument";)	\
	stringify_in_c(		.error	"extable_reg: bad register argument1";)	\
	stringify_in_c(.endif;)							\
	stringify_in_c(.set	.Lfound, 0;)					\
	stringify_in_c(.set	.Lcurr, 0;)					\
	stringify_in_c(.irp	rs,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;)	\
	stringify_in_c(		.ifc	"\regaddr", "%%r\rs";)			\
	stringify_in_c(			.set	.Lfound, 1;)			\
	stringify_in_c(			.set	.Lregaddr, .Lcurr;)		\
	stringify_in_c(		.endif;)					\
	stringify_in_c(		.set	.Lcurr, .Lcurr+1;)			\
	stringify_in_c(.endr;)							\
	stringify_in_c(.ifne	(.Lfound != 1);)				\
	stringify_in_c(		.error	"extable_reg: bad register argument2";)	\
	stringify_in_c(.endif;)							\
	stringify_in_c(.short	.Lregerr << EX_DATA_REG_ERR_SHIFT |		\
				.Lregaddr << EX_DATA_REG_ADDR_SHIFT |		\
				_len << EX_DATA_LEN_SHIFT;)			\
	stringify_in_c(.endm;)							\
	stringify_in_c(extable_reg _reg;)				\
	stringify_in_c(extable_reg _regerr,_regaddr;)				\
	stringify_in_c(.purgem	extable_reg;)					\
	stringify_in_c(.previous)

#define EX_TABLE(_fault, _target)					\
	__EX_TABLE(__ex_table, _fault, _target, EX_TYPE_FIXUP)

#define EX_TABLE_AMODE31(_fault, _target)				\
	__EX_TABLE(.amode31.ex_table, _fault, _target, EX_TYPE_FIXUP)
#define EX_TABLE_UA(_fault, _target, _reg)				\
	__EX_TABLE_UA(__ex_table, _fault, _target, EX_TYPE_UACCESS, _reg)

#define EX_TABLE_UA_STORE(_fault, _target, _regerr)			\
	__EX_TABLE_UA(__ex_table, _fault, _target, EX_TYPE_UA_STORE, _regerr, _regerr, 0)

#define EX_TABLE_UA_LOAD_MEM(_fault, _target, _regerr, _regmem, _len)	\
	__EX_TABLE_UA(__ex_table, _fault, _target, EX_TYPE_UA_LOAD_MEM, _regerr, _regmem, _len)

#define EX_TABLE_UA_LOAD_REG(_fault, _target, _regerr, _regzero)	\
	__EX_TABLE_UA(__ex_table, _fault, _target, EX_TYPE_UA_LOAD_REG, _regerr, _regzero, 0)

#endif /* __ASM_EXTABLE_H */
+1 −1
Original line number Diff line number Diff line
@@ -31,7 +31,7 @@
#define KEXEC_CONTROL_MEMORY_LIMIT (1UL<<31)

/* Allocate control page with GFP_DMA */
#define KEXEC_CONTROL_MEMORY_GFP GFP_DMA
#define KEXEC_CONTROL_MEMORY_GFP (GFP_DMA | __GFP_NORETRY)

/* Maximum address we can use for the crash control pages */
#define KEXEC_CRASH_CONTROL_MEMORY_LIMIT (-1UL)
+0 −6
Original line number Diff line number Diff line
@@ -304,12 +304,6 @@ static __always_inline void __noreturn disabled_wait(void)
	while (1);
}

/*
 * Basic Program Check Handler.
 */
extern void s390_base_pgm_handler(void);
extern void (*s390_base_pgm_handler_fn)(struct pt_regs *regs);

#define ARCH_LOW_ADDRESS_LIMIT	0x7fffffffUL

extern int memcpy_real(void *, unsigned long, size_t);
Loading