Commit e08d2278 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull more s390 updates from Vasily Gorbik:

 - Clean up and improve vdso code: use SYM_* macros for function and
   data annotations, add CFI annotations to fix GDB unwinding, optimize
   the chacha20 implementation

 - Add vfio-ap driver feature advertisement for use by libvirt and
   mdevctl

* tag 's390-6.12-2' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
  s390/vfio-ap: Driver feature advertisement
  s390/vdso: Use one large alternative instead of an alternative branch
  s390/vdso: Use SYM_DATA_START_LOCAL()/SYM_DATA_END() for data objects
  tools: Add additional SYM_*() stubs to linkage.h
  s390/vdso: Use macros for annotation of asm functions
  s390/vdso: Add CFI annotations to __arch_chacha20_blocks_nostack()
  s390/vdso: Fix comment within __arch_chacha20_blocks_nostack()
  s390/vdso: Get rid of permutation constants
parents 6f81a446 2d872136
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
@@ -999,6 +999,36 @@ the vfio_ap mediated device to which it is assigned as long as each new APQN
resulting from plugging it in references a queue device bound to the vfio_ap
device driver.

Driver Features
===============
The vfio_ap driver exposes a sysfs file containing supported features.
This exists so third party tools (like Libvirt and mdevctl) can query the
availability of specific features.

The features list can be found here: /sys/bus/matrix/devices/matrix/features

Entries are space delimited. Each entry consists of a combination of
alphanumeric and underscore characters.

Example:
cat /sys/bus/matrix/devices/matrix/features
guest_matrix dyn ap_config

the following features are advertised:

---------------+---------------------------------------------------------------+
| Flag         | Description                                                   |
+==============+===============================================================+
| guest_matrix | guest_matrix attribute exists. It reports the matrix of       |
|              | adapters and domains that are or will be passed through to a  |
|              | guest when the mdev is attached to it.                        |
+--------------+---------------------------------------------------------------+
| dyn          | Indicates hot plug/unplug of AP adapters, domains and control |
|              | domains for a guest to which the mdev is attached.            |
+------------+-----------------------------------------------------------------+
| ap_config    | ap_config interface for one-shot modifications to mdev config |
+--------------+---------------------------------------------------------------+

Limitations
===========
Live guest migration is not supported for guests using AP devices without
+4 −10
Original line number Diff line number Diff line
@@ -13,10 +13,7 @@
 * for details.
 */
.macro vdso_func func
	.globl __kernel_\func
	.type  __kernel_\func,@function
	__ALIGN
__kernel_\func:
SYM_FUNC_START(__kernel_\func)
	CFI_STARTPROC
	aghi	%r15,-STACK_FRAME_VDSO_OVERHEAD
	CFI_DEF_CFA_OFFSET (STACK_FRAME_USER_OVERHEAD + STACK_FRAME_VDSO_OVERHEAD)
@@ -32,7 +29,7 @@ __kernel_\func:
	CFI_RESTORE 15
	br	%r14
	CFI_ENDPROC
	.size	__kernel_\func,.-__kernel_\func
SYM_FUNC_END(__kernel_\func)
.endm

vdso_func gettimeofday
@@ -41,16 +38,13 @@ vdso_func clock_gettime
vdso_func getcpu

.macro vdso_syscall func,syscall
	.globl __kernel_\func
	.type  __kernel_\func,@function
	__ALIGN
__kernel_\func:
SYM_FUNC_START(__kernel_\func)
	CFI_STARTPROC
	svc	\syscall
	/* Make sure we notice when a syscall returns, which shouldn't happen */
	.word	0
	CFI_ENDPROC
	.size	__kernel_\func,.-__kernel_\func
SYM_FUNC_END(__kernel_\func)
.endm

vdso_syscall restart_syscall,__NR_restart_syscall
+36 −40
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0 */

#include <linux/stringify.h>
#include <linux/linkage.h>
#include <asm/alternative.h>
#include <asm/dwarf.h>
#include <asm/fpu-insn.h>

#define STATE0	%v0
@@ -12,9 +14,6 @@
#define COPY1	%v5
#define COPY2	%v6
#define COPY3	%v7
#define PERM4	%v16
#define PERM8	%v17
#define PERM12	%v18
#define BEPERM	%v19
#define TMP0	%v20
#define TMP1	%v21
@@ -23,13 +22,11 @@

	.section .rodata

	.balign 128
.Lconstants:
	.balign 32
SYM_DATA_START_LOCAL(chacha20_constants)
	.long	0x61707865,0x3320646e,0x79622d32,0x6b206574 # endian-neutral
	.long	0x04050607,0x08090a0b,0x0c0d0e0f,0x00010203 # rotl  4 bytes
	.long	0x08090a0b,0x0c0d0e0f,0x00010203,0x04050607 # rotl  8 bytes
	.long	0x0c0d0e0f,0x00010203,0x04050607,0x08090a0b # rotl 12 bytes
	.long	0x03020100,0x07060504,0x0b0a0908,0x0f0e0d0c # byte swap
SYM_DATA_END(chacha20_constants)

	.text
/*
@@ -43,13 +40,14 @@
 *				       size_t nblocks)
 */
SYM_FUNC_START(__arch_chacha20_blocks_nostack)
	larl	%r1,.Lconstants
	CFI_STARTPROC
	larl	%r1,chacha20_constants

	/* COPY0 = "expand 32-byte k" */
	VL	COPY0,0,,%r1

	/* PERM4-PERM12,BEPERM = byte selectors for VPERM */
	VLM	PERM4,BEPERM,16,%r1
	/* BEPERM = byte selectors for VPERM */
	ALTERNATIVE __stringify(VL BEPERM,16,,%r1), "brcl 0,0", ALT_FACILITY(148)

	/* COPY1,COPY2 = key */
	VLM	COPY1,COPY2,0,%r3
@@ -89,11 +87,11 @@ SYM_FUNC_START(__arch_chacha20_blocks_nostack)
	VERLLF	STATE1,STATE1,7

	/* STATE1[0,1,2,3] = STATE1[1,2,3,0] */
	VPERM	STATE1,STATE1,STATE1,PERM4
	VSLDB	STATE1,STATE1,STATE1,4
	/* STATE2[0,1,2,3] = STATE2[2,3,0,1] */
	VPERM	STATE2,STATE2,STATE2,PERM8
	VSLDB	STATE2,STATE2,STATE2,8
	/* STATE3[0,1,2,3] = STATE3[3,0,1,2] */
	VPERM	STATE3,STATE3,STATE3,PERM12
	VSLDB	STATE3,STATE3,STATE3,12

	/* STATE0 += STATE1, STATE3 = rotl32(STATE3 ^ STATE0, 16) */
	VAF	STATE0,STATE0,STATE1
@@ -116,32 +114,38 @@ SYM_FUNC_START(__arch_chacha20_blocks_nostack)
	VERLLF	STATE1,STATE1,7

	/* STATE1[0,1,2,3] = STATE1[3,0,1,2] */
	VPERM	STATE1,STATE1,STATE1,PERM12
	VSLDB	STATE1,STATE1,STATE1,12
	/* STATE2[0,1,2,3] = STATE2[2,3,0,1] */
	VPERM	STATE2,STATE2,STATE2,PERM8
	VSLDB	STATE2,STATE2,STATE2,8
	/* STATE3[0,1,2,3] = STATE3[1,2,3,0] */
	VPERM	STATE3,STATE3,STATE3,PERM4
	VSLDB	STATE3,STATE3,STATE3,4
	brctg	%r0,.Ldoubleround

	/* OUTPUT0 = STATE0 + STATE0 */
	/* OUTPUT0 = STATE0 + COPY0 */
	VAF	STATE0,STATE0,COPY0
	/* OUTPUT1 = STATE1 + STATE1 */
	/* OUTPUT1 = STATE1 + COPY1 */
	VAF	STATE1,STATE1,COPY1
	/* OUTPUT2 = STATE2 + STATE2 */
	/* OUTPUT2 = STATE2 + COPY2 */
	VAF	STATE2,STATE2,COPY2
	/* OUTPUT2 = STATE3 + STATE3 */
	/* OUTPUT3 = STATE3 + COPY3 */
	VAF	STATE3,STATE3,COPY3

	/*
	 * 32 bit wise little endian store to OUTPUT. If the vector
	 * enhancement facility 2 is not installed use the slow path.
	 */
	ALTERNATIVE "brc 0xf,.Lstoreslow", "nop", ALT_FACILITY(148)
	VSTBRF	STATE0,0,,%r2
	VSTBRF	STATE1,16,,%r2
	VSTBRF	STATE2,32,,%r2
	VSTBRF	STATE3,48,,%r2
.Lstoredone:
	ALTERNATIVE							\
		__stringify(						\
		/* Convert STATE to little endian and store to OUTPUT */\
		VPERM	TMP0,STATE0,STATE0,BEPERM;			\
		VPERM	TMP1,STATE1,STATE1,BEPERM;			\
		VPERM	TMP2,STATE2,STATE2,BEPERM;			\
		VPERM	TMP3,STATE3,STATE3,BEPERM;			\
		VSTM	TMP0,TMP3,0,%r2),				\
		__stringify(						\
		/* 32 bit wise little endian store to OUTPUT */		\
		VSTBRF	STATE0,0,,%r2;					\
		VSTBRF	STATE1,16,,%r2;					\
		VSTBRF	STATE2,32,,%r2;					\
		VSTBRF	STATE3,48,,%r2;					\
		brcl	0,0),						\
		ALT_FACILITY(148)

	/* ++COPY3.COUNTER */
	/* alsih %r3,1 */
@@ -173,13 +177,5 @@ SYM_FUNC_START(__arch_chacha20_blocks_nostack)
	VZERO	TMP3

	br	%r14

.Lstoreslow:
	/* Convert STATE to little endian format and store to OUTPUT */
	VPERM	TMP0,STATE0,STATE0,BEPERM
	VPERM	TMP1,STATE1,STATE1,BEPERM
	VPERM	TMP2,STATE2,STATE2,BEPERM
	VPERM	TMP3,STATE3,STATE3,BEPERM
	VSTM	TMP0,TMP3,0,%r2
	j	.Lstoredone
	CFI_ENDPROC
SYM_FUNC_END(__arch_chacha20_blocks_nostack)
+13 −0
Original line number Diff line number Diff line
@@ -26,6 +26,18 @@ MODULE_LICENSE("GPL v2");
struct ap_matrix_dev *matrix_dev;
debug_info_t *vfio_ap_dbf_info;

static ssize_t features_show(struct device *dev, struct device_attribute *attr, char *buf)
{
	return sysfs_emit(buf, "guest_matrix hotplug ap_config\n");
}
static DEVICE_ATTR_RO(features);

static struct attribute *matrix_dev_attrs[] = {
	&dev_attr_features.attr,
	NULL,
};
ATTRIBUTE_GROUPS(matrix_dev);

/* Only type 10 adapters (CEX4 and later) are supported
 * by the AP matrix device driver
 */
@@ -68,6 +80,7 @@ static struct device_driver matrix_driver = {
	.name = "vfio_ap",
	.bus = &matrix_bus,
	.suppress_bind_attrs = true,
	.dev_groups = matrix_dev_groups,
};

static int vfio_ap_matrix_dev_create(void)
+3 −1
Original line number Diff line number Diff line
@@ -4,7 +4,9 @@
#include <linux/export.h>

#define SYM_FUNC_START(x) .globl x; x:

#define SYM_FUNC_END(x)
#define SYM_DATA_START(x) .globl x; x:
#define SYM_DATA_START_LOCAL(x) x:
#define SYM_DATA_END(x)

#endif /* _TOOLS_INCLUDE_LINUX_LINKAGE_H */