* Enable AP (crypto adapter) instructions for s390x PV-guests
* Allow NVME for s390x machines * Update Linux headers to v6.6-rc1 -----BEGIN PGP SIGNATURE----- iQJFBAABCAAvFiEEJ7iIR+7gJQEY8+q5LtnXdP5wLbUFAmUATY8RHHRodXRoQHJl ZGhhdC5jb20ACgkQLtnXdP5wLbVjBhAAlfXhQuxFdSRkPLyPgSuAInGTZfsW7A56 6vunyzP3ZyY5G0WtbgKZ5ovDIfjzlNYvkxWmQ4m4PWEY2JaBKOqeS9+lFkdZmGD9 Sj1u+EereQS5MsJ31Vg2LHDKv5QbtNbVOq4KIm30qpzj1OfhfZzzqU0tGnaDlz/T PW2bSQl4cGHExcYpprWx02cXsMnodWwGV2FTgtc9D42YyE1q5IDX8phjFFzUHfcQ p3cjM0S2M8KOGJ5+0w2/0C4DEKgLH0OuA/JY3W+f94O+jdqoYUJpom4m6FywIKrr 38c7UqQESh7r/te1UkgvxfVCbTlptsS21xQNbsa+TS/apP6IMU7VJI3N14Qshtba cqcP54aGC+9v5FRz7E5njCJWJQv9JWInrKYTEEtSTFCguGCQO2owulba70MNrQc8 hQkBXOzqnqYVxdktcHkbnq6QZoKLfsGAxfarQPPJySNUyGgoaM0JFlzp3z0hjAHY aGRZdN4kU+hF7/0RQygYDN4AzTQhn3EMZ6q6o81xVeKzfbziA3fCLXX5J1bd+rO8 3LKPrmOuk3dadRVlVTyFrtlG9SEMRen8dh12oru28ebW2WTeYm71zQf7SCPGzaKE hJMtlN7B9ogGxDpLJvTDLHbKNbwyIcW00GjyWiUwBg88ACg63tulD2kpUxBs2PwF bVk/lIWMqL0= =zeRZ -----END PGP SIGNATURE----- Merge tag 'pull-request-2023-09-12' of https://gitlab.com/thuth/qemu into staging * Enable AP (crypto adapter) instructions for s390x PV-guests * Allow NVME for s390x machines * Update Linux headers to v6.6-rc1 # -----BEGIN PGP SIGNATURE----- # # iQJFBAABCAAvFiEEJ7iIR+7gJQEY8+q5LtnXdP5wLbUFAmUATY8RHHRodXRoQHJl # ZGhhdC5jb20ACgkQLtnXdP5wLbVjBhAAlfXhQuxFdSRkPLyPgSuAInGTZfsW7A56 # 6vunyzP3ZyY5G0WtbgKZ5ovDIfjzlNYvkxWmQ4m4PWEY2JaBKOqeS9+lFkdZmGD9 # Sj1u+EereQS5MsJ31Vg2LHDKv5QbtNbVOq4KIm30qpzj1OfhfZzzqU0tGnaDlz/T # PW2bSQl4cGHExcYpprWx02cXsMnodWwGV2FTgtc9D42YyE1q5IDX8phjFFzUHfcQ # p3cjM0S2M8KOGJ5+0w2/0C4DEKgLH0OuA/JY3W+f94O+jdqoYUJpom4m6FywIKrr # 38c7UqQESh7r/te1UkgvxfVCbTlptsS21xQNbsa+TS/apP6IMU7VJI3N14Qshtba # cqcP54aGC+9v5FRz7E5njCJWJQv9JWInrKYTEEtSTFCguGCQO2owulba70MNrQc8 # hQkBXOzqnqYVxdktcHkbnq6QZoKLfsGAxfarQPPJySNUyGgoaM0JFlzp3z0hjAHY # aGRZdN4kU+hF7/0RQygYDN4AzTQhn3EMZ6q6o81xVeKzfbziA3fCLXX5J1bd+rO8 # 3LKPrmOuk3dadRVlVTyFrtlG9SEMRen8dh12oru28ebW2WTeYm71zQf7SCPGzaKE # hJMtlN7B9ogGxDpLJvTDLHbKNbwyIcW00GjyWiUwBg88ACg63tulD2kpUxBs2PwF # bVk/lIWMqL0= # =zeRZ # -----END PGP SIGNATURE----- # gpg: Signature made Tue 12 Sep 2023 07:37:51 EDT # gpg: using RSA key 27B88847EEE0250118F3EAB92ED9D774FE702DB5 # gpg: issuer "thuth@redhat.com" # gpg: Good signature from "Thomas Huth <th.huth@gmx.de>" [full] # gpg: aka "Thomas Huth <thuth@redhat.com>" [full] # gpg: aka "Thomas Huth <huth@tuxfamily.org>" [full] # gpg: aka "Thomas Huth <th.huth@posteo.de>" [unknown] # Primary key fingerprint: 27B8 8847 EEE0 2501 18F3 EAB9 2ED9 D774 FE70 2DB5 * tag 'pull-request-2023-09-12' of https://gitlab.com/thuth/qemu: tests/qtest/pflash: Clean up local variable shadowing kconfig: Add NVME to s390x machines target/s390x: AP-passthrough for PV guests target/s390x/kvm: Refactor AP functionalities linux-headers: Update to Linux v6.6-rc1 s390x: do a subsystem reset before the unprotect on reboot s390x/ap: fix missing subsystem reset registration Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
commit
9a8af69967
@ -1,4 +1,4 @@
|
||||
config NVME_PCI
|
||||
bool
|
||||
default y if PCI_DEVICES
|
||||
default y if PCI_DEVICES || PCIE_DEVICES
|
||||
depends on PCI
|
||||
|
@ -109,6 +109,7 @@ static const char *const reset_dev_types[] = {
|
||||
"s390-flic",
|
||||
"diag288",
|
||||
TYPE_S390_PCI_HOST_BRIDGE,
|
||||
TYPE_AP_BRIDGE,
|
||||
};
|
||||
|
||||
static void subsystem_reset(void)
|
||||
@ -437,10 +438,20 @@ static void s390_machine_reset(MachineState *machine, ShutdownCause reason)
|
||||
switch (reset_type) {
|
||||
case S390_RESET_EXTERNAL:
|
||||
case S390_RESET_REIPL:
|
||||
/*
|
||||
* Reset the subsystem which includes a AP reset. If a PV
|
||||
* guest had APQNs attached the AP reset is a prerequisite to
|
||||
* unprotecting since the UV checks if all APQNs are reset.
|
||||
*/
|
||||
subsystem_reset();
|
||||
if (s390_is_pv()) {
|
||||
s390_machine_unprotect(ms);
|
||||
}
|
||||
|
||||
/*
|
||||
* Device reset includes CPU clear resets so this has to be
|
||||
* done AFTER the unprotect call above.
|
||||
*/
|
||||
qemu_devices_reset(reason);
|
||||
s390_crypto_reset();
|
||||
|
||||
|
@ -206,6 +206,11 @@
|
||||
* - add extension header
|
||||
* - add FUSE_EXT_GROUPS
|
||||
* - add FUSE_CREATE_SUPP_GROUP
|
||||
* - add FUSE_HAS_EXPIRE_ONLY
|
||||
*
|
||||
* 7.39
|
||||
* - add FUSE_DIRECT_IO_RELAX
|
||||
* - add FUSE_STATX and related structures
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_FUSE_H
|
||||
@ -237,7 +242,7 @@
|
||||
#define FUSE_KERNEL_VERSION 7
|
||||
|
||||
/** Minor version number of this interface */
|
||||
#define FUSE_KERNEL_MINOR_VERSION 38
|
||||
#define FUSE_KERNEL_MINOR_VERSION 39
|
||||
|
||||
/** The node ID of the root inode */
|
||||
#define FUSE_ROOT_ID 1
|
||||
@ -264,6 +269,40 @@ struct fuse_attr {
|
||||
uint32_t flags;
|
||||
};
|
||||
|
||||
/*
|
||||
* The following structures are bit-for-bit compatible with the statx(2) ABI in
|
||||
* Linux.
|
||||
*/
|
||||
struct fuse_sx_time {
|
||||
int64_t tv_sec;
|
||||
uint32_t tv_nsec;
|
||||
int32_t __reserved;
|
||||
};
|
||||
|
||||
struct fuse_statx {
|
||||
uint32_t mask;
|
||||
uint32_t blksize;
|
||||
uint64_t attributes;
|
||||
uint32_t nlink;
|
||||
uint32_t uid;
|
||||
uint32_t gid;
|
||||
uint16_t mode;
|
||||
uint16_t __spare0[1];
|
||||
uint64_t ino;
|
||||
uint64_t size;
|
||||
uint64_t blocks;
|
||||
uint64_t attributes_mask;
|
||||
struct fuse_sx_time atime;
|
||||
struct fuse_sx_time btime;
|
||||
struct fuse_sx_time ctime;
|
||||
struct fuse_sx_time mtime;
|
||||
uint32_t rdev_major;
|
||||
uint32_t rdev_minor;
|
||||
uint32_t dev_major;
|
||||
uint32_t dev_minor;
|
||||
uint64_t __spare2[14];
|
||||
};
|
||||
|
||||
struct fuse_kstatfs {
|
||||
uint64_t blocks;
|
||||
uint64_t bfree;
|
||||
@ -365,6 +404,9 @@ struct fuse_file_lock {
|
||||
* FUSE_HAS_INODE_DAX: use per inode DAX
|
||||
* FUSE_CREATE_SUPP_GROUP: add supplementary group info to create, mkdir,
|
||||
* symlink and mknod (single group that matches parent)
|
||||
* FUSE_HAS_EXPIRE_ONLY: kernel supports expiry-only entry invalidation
|
||||
* FUSE_DIRECT_IO_RELAX: relax restrictions in FOPEN_DIRECT_IO mode, for now
|
||||
* allow shared mmap
|
||||
*/
|
||||
#define FUSE_ASYNC_READ (1 << 0)
|
||||
#define FUSE_POSIX_LOCKS (1 << 1)
|
||||
@ -402,6 +444,8 @@ struct fuse_file_lock {
|
||||
#define FUSE_SECURITY_CTX (1ULL << 32)
|
||||
#define FUSE_HAS_INODE_DAX (1ULL << 33)
|
||||
#define FUSE_CREATE_SUPP_GROUP (1ULL << 34)
|
||||
#define FUSE_HAS_EXPIRE_ONLY (1ULL << 35)
|
||||
#define FUSE_DIRECT_IO_RELAX (1ULL << 36)
|
||||
|
||||
/**
|
||||
* CUSE INIT request/reply flags
|
||||
@ -568,6 +612,7 @@ enum fuse_opcode {
|
||||
FUSE_REMOVEMAPPING = 49,
|
||||
FUSE_SYNCFS = 50,
|
||||
FUSE_TMPFILE = 51,
|
||||
FUSE_STATX = 52,
|
||||
|
||||
/* CUSE specific operations */
|
||||
CUSE_INIT = 4096,
|
||||
@ -632,6 +677,22 @@ struct fuse_attr_out {
|
||||
struct fuse_attr attr;
|
||||
};
|
||||
|
||||
struct fuse_statx_in {
|
||||
uint32_t getattr_flags;
|
||||
uint32_t reserved;
|
||||
uint64_t fh;
|
||||
uint32_t sx_flags;
|
||||
uint32_t sx_mask;
|
||||
};
|
||||
|
||||
struct fuse_statx_out {
|
||||
uint64_t attr_valid; /* Cache timeout for the attributes */
|
||||
uint32_t attr_valid_nsec;
|
||||
uint32_t flags;
|
||||
uint64_t spare[2];
|
||||
struct fuse_statx stat;
|
||||
};
|
||||
|
||||
#define FUSE_COMPAT_MKNOD_IN_SIZE 8
|
||||
|
||||
struct fuse_mknod_in {
|
||||
|
@ -181,5 +181,9 @@ struct vhost_vdpa_iova_range {
|
||||
#define VHOST_BACKEND_F_SUSPEND 0x4
|
||||
/* Device can be resumed */
|
||||
#define VHOST_BACKEND_F_RESUME 0x5
|
||||
/* Device supports the driver enabling virtqueues both before and after
|
||||
* DRIVER_OK
|
||||
*/
|
||||
#define VHOST_BACKEND_F_ENABLE_AFTER_DRIVER_OK 0x6
|
||||
|
||||
#endif
|
||||
|
@ -56,6 +56,7 @@
|
||||
#define VIRTIO_NET_F_MQ 22 /* Device supports Receive Flow
|
||||
* Steering */
|
||||
#define VIRTIO_NET_F_CTRL_MAC_ADDR 23 /* Set MAC address */
|
||||
#define VIRTIO_NET_F_VQ_NOTF_COAL 52 /* Device supports virtqueue notification coalescing */
|
||||
#define VIRTIO_NET_F_NOTF_COAL 53 /* Device supports notifications coalescing */
|
||||
#define VIRTIO_NET_F_GUEST_USO4 54 /* Guest can handle USOv4 in. */
|
||||
#define VIRTIO_NET_F_GUEST_USO6 55 /* Guest can handle USOv6 in. */
|
||||
@ -391,5 +392,18 @@ struct virtio_net_ctrl_coal_rx {
|
||||
};
|
||||
|
||||
#define VIRTIO_NET_CTRL_NOTF_COAL_RX_SET 1
|
||||
#define VIRTIO_NET_CTRL_NOTF_COAL_VQ_SET 2
|
||||
#define VIRTIO_NET_CTRL_NOTF_COAL_VQ_GET 3
|
||||
|
||||
struct virtio_net_ctrl_coal {
|
||||
uint32_t max_packets;
|
||||
uint32_t max_usecs;
|
||||
};
|
||||
|
||||
struct virtio_net_ctrl_coal_vq {
|
||||
uint16_t vqn;
|
||||
uint16_t reserved;
|
||||
struct virtio_net_ctrl_coal coal;
|
||||
};
|
||||
|
||||
#endif /* _LINUX_VIRTIO_NET_H */
|
||||
|
@ -1 +1,24 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
/*
|
||||
* Copyright (C) 2012 ARM Ltd.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#ifndef __ASM_BITSPERLONG_H
|
||||
#define __ASM_BITSPERLONG_H
|
||||
|
||||
#define __BITS_PER_LONG 64
|
||||
|
||||
#include <asm-generic/bitsperlong.h>
|
||||
|
||||
#endif /* __ASM_BITSPERLONG_H */
|
||||
|
@ -820,8 +820,11 @@ __SYSCALL(__NR_set_mempolicy_home_node, sys_set_mempolicy_home_node)
|
||||
#define __NR_cachestat 451
|
||||
__SYSCALL(__NR_cachestat, sys_cachestat)
|
||||
|
||||
#define __NR_fchmodat2 452
|
||||
__SYSCALL(__NR_fchmodat2, sys_fchmodat2)
|
||||
|
||||
#undef __NR_syscalls
|
||||
#define __NR_syscalls 452
|
||||
#define __NR_syscalls 453
|
||||
|
||||
/*
|
||||
* 32 bit systems traditionally used different
|
||||
|
@ -380,5 +380,6 @@
|
||||
#define __NR_futex_waitv (__NR_Linux + 449)
|
||||
#define __NR_set_mempolicy_home_node (__NR_Linux + 450)
|
||||
#define __NR_cachestat (__NR_Linux + 451)
|
||||
#define __NR_fchmodat2 (__NR_Linux + 452)
|
||||
|
||||
#endif /* _ASM_UNISTD_N32_H */
|
||||
|
@ -356,5 +356,6 @@
|
||||
#define __NR_futex_waitv (__NR_Linux + 449)
|
||||
#define __NR_set_mempolicy_home_node (__NR_Linux + 450)
|
||||
#define __NR_cachestat (__NR_Linux + 451)
|
||||
#define __NR_fchmodat2 (__NR_Linux + 452)
|
||||
|
||||
#endif /* _ASM_UNISTD_N64_H */
|
||||
|
@ -426,5 +426,6 @@
|
||||
#define __NR_futex_waitv (__NR_Linux + 449)
|
||||
#define __NR_set_mempolicy_home_node (__NR_Linux + 450)
|
||||
#define __NR_cachestat (__NR_Linux + 451)
|
||||
#define __NR_fchmodat2 (__NR_Linux + 452)
|
||||
|
||||
#endif /* _ASM_UNISTD_O32_H */
|
||||
|
@ -433,6 +433,7 @@
|
||||
#define __NR_futex_waitv 449
|
||||
#define __NR_set_mempolicy_home_node 450
|
||||
#define __NR_cachestat 451
|
||||
#define __NR_fchmodat2 452
|
||||
|
||||
|
||||
#endif /* _ASM_UNISTD_32_H */
|
||||
|
@ -405,6 +405,7 @@
|
||||
#define __NR_futex_waitv 449
|
||||
#define __NR_set_mempolicy_home_node 450
|
||||
#define __NR_cachestat 451
|
||||
#define __NR_fchmodat2 452
|
||||
|
||||
|
||||
#endif /* _ASM_UNISTD_64_H */
|
||||
|
@ -1 +1,14 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */
|
||||
/*
|
||||
* Copyright (C) 2012 ARM Ltd.
|
||||
* Copyright (C) 2015 Regents of the University of California
|
||||
*/
|
||||
|
||||
#ifndef _ASM_RISCV_BITSPERLONG_H
|
||||
#define _ASM_RISCV_BITSPERLONG_H
|
||||
|
||||
#define __BITS_PER_LONG (__SIZEOF_POINTER__ * 8)
|
||||
|
||||
#include <asm-generic/bitsperlong.h>
|
||||
|
||||
#endif /* _ASM_RISCV_BITSPERLONG_H */
|
||||
|
@ -55,6 +55,7 @@ struct kvm_riscv_config {
|
||||
unsigned long marchid;
|
||||
unsigned long mimpid;
|
||||
unsigned long zicboz_block_size;
|
||||
unsigned long satp_mode;
|
||||
};
|
||||
|
||||
/* CORE registers for KVM_GET_ONE_REG and KVM_SET_ONE_REG */
|
||||
@ -124,6 +125,12 @@ enum KVM_RISCV_ISA_EXT_ID {
|
||||
KVM_RISCV_ISA_EXT_SSAIA,
|
||||
KVM_RISCV_ISA_EXT_V,
|
||||
KVM_RISCV_ISA_EXT_SVNAPOT,
|
||||
KVM_RISCV_ISA_EXT_ZBA,
|
||||
KVM_RISCV_ISA_EXT_ZBS,
|
||||
KVM_RISCV_ISA_EXT_ZICNTR,
|
||||
KVM_RISCV_ISA_EXT_ZICSR,
|
||||
KVM_RISCV_ISA_EXT_ZIFENCEI,
|
||||
KVM_RISCV_ISA_EXT_ZIHPM,
|
||||
KVM_RISCV_ISA_EXT_MAX,
|
||||
};
|
||||
|
||||
@ -193,6 +200,15 @@ enum KVM_RISCV_SBI_EXT_ID {
|
||||
|
||||
/* ISA Extension registers are mapped as type 7 */
|
||||
#define KVM_REG_RISCV_ISA_EXT (0x07 << KVM_REG_RISCV_TYPE_SHIFT)
|
||||
#define KVM_REG_RISCV_ISA_SINGLE (0x0 << KVM_REG_RISCV_SUBTYPE_SHIFT)
|
||||
#define KVM_REG_RISCV_ISA_MULTI_EN (0x1 << KVM_REG_RISCV_SUBTYPE_SHIFT)
|
||||
#define KVM_REG_RISCV_ISA_MULTI_DIS (0x2 << KVM_REG_RISCV_SUBTYPE_SHIFT)
|
||||
#define KVM_REG_RISCV_ISA_MULTI_REG(__ext_id) \
|
||||
((__ext_id) / __BITS_PER_LONG)
|
||||
#define KVM_REG_RISCV_ISA_MULTI_MASK(__ext_id) \
|
||||
(1UL << ((__ext_id) % __BITS_PER_LONG))
|
||||
#define KVM_REG_RISCV_ISA_MULTI_REG_LAST \
|
||||
KVM_REG_RISCV_ISA_MULTI_REG(KVM_RISCV_ISA_EXT_MAX - 1)
|
||||
|
||||
/* SBI extension registers are mapped as type 8 */
|
||||
#define KVM_REG_RISCV_SBI_EXT (0x08 << KVM_REG_RISCV_TYPE_SHIFT)
|
||||
|
@ -159,6 +159,22 @@ struct kvm_s390_vm_cpu_subfunc {
|
||||
__u8 reserved[1728];
|
||||
};
|
||||
|
||||
#define KVM_S390_VM_CPU_PROCESSOR_UV_FEAT_GUEST 6
|
||||
#define KVM_S390_VM_CPU_MACHINE_UV_FEAT_GUEST 7
|
||||
|
||||
#define KVM_S390_VM_CPU_UV_FEAT_NR_BITS 64
|
||||
struct kvm_s390_vm_cpu_uv_feat {
|
||||
union {
|
||||
struct {
|
||||
__u64 : 4;
|
||||
__u64 ap : 1; /* bit 4 */
|
||||
__u64 ap_intr : 1; /* bit 5 */
|
||||
__u64 : 58;
|
||||
};
|
||||
__u64 feat;
|
||||
};
|
||||
};
|
||||
|
||||
/* kvm attributes for crypto */
|
||||
#define KVM_S390_VM_CRYPTO_ENABLE_AES_KW 0
|
||||
#define KVM_S390_VM_CRYPTO_ENABLE_DEA_KW 1
|
||||
|
@ -424,5 +424,6 @@
|
||||
#define __NR_futex_waitv 449
|
||||
#define __NR_set_mempolicy_home_node 450
|
||||
#define __NR_cachestat 451
|
||||
#define __NR_fchmodat2 452
|
||||
|
||||
#endif /* _ASM_S390_UNISTD_32_H */
|
||||
|
@ -372,5 +372,6 @@
|
||||
#define __NR_futex_waitv 449
|
||||
#define __NR_set_mempolicy_home_node 450
|
||||
#define __NR_cachestat 451
|
||||
#define __NR_fchmodat2 452
|
||||
|
||||
#endif /* _ASM_S390_UNISTD_64_H */
|
||||
|
@ -3,14 +3,10 @@
|
||||
#define _ASM_X86_MMAN_H
|
||||
|
||||
#define MAP_32BIT 0x40 /* only give out 32bit addresses */
|
||||
#define MAP_ABOVE4G 0x80 /* only map above 4GB */
|
||||
|
||||
#ifdef CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS
|
||||
#define arch_calc_vm_prot_bits(prot, key) ( \
|
||||
((key) & 0x1 ? VM_PKEY_BIT0 : 0) | \
|
||||
((key) & 0x2 ? VM_PKEY_BIT1 : 0) | \
|
||||
((key) & 0x4 ? VM_PKEY_BIT2 : 0) | \
|
||||
((key) & 0x8 ? VM_PKEY_BIT3 : 0))
|
||||
#endif
|
||||
/* Flags for map_shadow_stack(2) */
|
||||
#define SHADOW_STACK_SET_TOKEN (1ULL << 0) /* Set up a restore token in the shadow stack */
|
||||
|
||||
#include <asm-generic/mman.h>
|
||||
|
||||
|
@ -442,6 +442,7 @@
|
||||
#define __NR_futex_waitv 449
|
||||
#define __NR_set_mempolicy_home_node 450
|
||||
#define __NR_cachestat 451
|
||||
#define __NR_fchmodat2 452
|
||||
|
||||
|
||||
#endif /* _ASM_UNISTD_32_H */
|
||||
|
@ -364,6 +364,8 @@
|
||||
#define __NR_futex_waitv 449
|
||||
#define __NR_set_mempolicy_home_node 450
|
||||
#define __NR_cachestat 451
|
||||
#define __NR_fchmodat2 452
|
||||
#define __NR_map_shadow_stack 453
|
||||
|
||||
|
||||
#endif /* _ASM_UNISTD_64_H */
|
||||
|
@ -317,6 +317,7 @@
|
||||
#define __NR_futex_waitv (__X32_SYSCALL_BIT + 449)
|
||||
#define __NR_set_mempolicy_home_node (__X32_SYSCALL_BIT + 450)
|
||||
#define __NR_cachestat (__X32_SYSCALL_BIT + 451)
|
||||
#define __NR_fchmodat2 (__X32_SYSCALL_BIT + 452)
|
||||
#define __NR_rt_sigaction (__X32_SYSCALL_BIT + 512)
|
||||
#define __NR_rt_sigreturn (__X32_SYSCALL_BIT + 513)
|
||||
#define __NR_ioctl (__X32_SYSCALL_BIT + 514)
|
||||
|
@ -1414,9 +1414,16 @@ struct kvm_device_attr {
|
||||
__u64 addr; /* userspace address of attr data */
|
||||
};
|
||||
|
||||
#define KVM_DEV_VFIO_GROUP 1
|
||||
#define KVM_DEV_VFIO_GROUP_ADD 1
|
||||
#define KVM_DEV_VFIO_GROUP_DEL 2
|
||||
#define KVM_DEV_VFIO_FILE 1
|
||||
|
||||
#define KVM_DEV_VFIO_FILE_ADD 1
|
||||
#define KVM_DEV_VFIO_FILE_DEL 2
|
||||
|
||||
/* KVM_DEV_VFIO_GROUP aliases are for compile time uapi compatibility */
|
||||
#define KVM_DEV_VFIO_GROUP KVM_DEV_VFIO_FILE
|
||||
|
||||
#define KVM_DEV_VFIO_GROUP_ADD KVM_DEV_VFIO_FILE_ADD
|
||||
#define KVM_DEV_VFIO_GROUP_DEL KVM_DEV_VFIO_FILE_DEL
|
||||
#define KVM_DEV_VFIO_GROUP_SET_SPAPR_TCE 3
|
||||
|
||||
enum kvm_device_type {
|
||||
|
@ -45,3 +45,7 @@
|
||||
TYPE NAME[]; \
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef __counted_by
|
||||
#define __counted_by(m)
|
||||
#endif
|
||||
|
@ -39,7 +39,8 @@
|
||||
UFFD_FEATURE_MINOR_SHMEM | \
|
||||
UFFD_FEATURE_EXACT_ADDRESS | \
|
||||
UFFD_FEATURE_WP_HUGETLBFS_SHMEM | \
|
||||
UFFD_FEATURE_WP_UNPOPULATED)
|
||||
UFFD_FEATURE_WP_UNPOPULATED | \
|
||||
UFFD_FEATURE_POISON)
|
||||
#define UFFD_API_IOCTLS \
|
||||
((__u64)1 << _UFFDIO_REGISTER | \
|
||||
(__u64)1 << _UFFDIO_UNREGISTER | \
|
||||
@ -49,12 +50,14 @@
|
||||
(__u64)1 << _UFFDIO_COPY | \
|
||||
(__u64)1 << _UFFDIO_ZEROPAGE | \
|
||||
(__u64)1 << _UFFDIO_WRITEPROTECT | \
|
||||
(__u64)1 << _UFFDIO_CONTINUE)
|
||||
(__u64)1 << _UFFDIO_CONTINUE | \
|
||||
(__u64)1 << _UFFDIO_POISON)
|
||||
#define UFFD_API_RANGE_IOCTLS_BASIC \
|
||||
((__u64)1 << _UFFDIO_WAKE | \
|
||||
(__u64)1 << _UFFDIO_COPY | \
|
||||
(__u64)1 << _UFFDIO_WRITEPROTECT | \
|
||||
(__u64)1 << _UFFDIO_CONTINUE | \
|
||||
(__u64)1 << _UFFDIO_WRITEPROTECT)
|
||||
(__u64)1 << _UFFDIO_POISON)
|
||||
|
||||
/*
|
||||
* Valid ioctl command number range with this API is from 0x00 to
|
||||
@ -71,6 +74,7 @@
|
||||
#define _UFFDIO_ZEROPAGE (0x04)
|
||||
#define _UFFDIO_WRITEPROTECT (0x06)
|
||||
#define _UFFDIO_CONTINUE (0x07)
|
||||
#define _UFFDIO_POISON (0x08)
|
||||
#define _UFFDIO_API (0x3F)
|
||||
|
||||
/* userfaultfd ioctl ids */
|
||||
@ -91,6 +95,8 @@
|
||||
struct uffdio_writeprotect)
|
||||
#define UFFDIO_CONTINUE _IOWR(UFFDIO, _UFFDIO_CONTINUE, \
|
||||
struct uffdio_continue)
|
||||
#define UFFDIO_POISON _IOWR(UFFDIO, _UFFDIO_POISON, \
|
||||
struct uffdio_poison)
|
||||
|
||||
/* read() structure */
|
||||
struct uffd_msg {
|
||||
@ -225,6 +231,7 @@ struct uffdio_api {
|
||||
#define UFFD_FEATURE_EXACT_ADDRESS (1<<11)
|
||||
#define UFFD_FEATURE_WP_HUGETLBFS_SHMEM (1<<12)
|
||||
#define UFFD_FEATURE_WP_UNPOPULATED (1<<13)
|
||||
#define UFFD_FEATURE_POISON (1<<14)
|
||||
__u64 features;
|
||||
|
||||
__u64 ioctls;
|
||||
@ -321,6 +328,18 @@ struct uffdio_continue {
|
||||
__s64 mapped;
|
||||
};
|
||||
|
||||
struct uffdio_poison {
|
||||
struct uffdio_range range;
|
||||
#define UFFDIO_POISON_MODE_DONTWAKE ((__u64)1<<0)
|
||||
__u64 mode;
|
||||
|
||||
/*
|
||||
* Fields below here are written by the ioctl and must be at the end:
|
||||
* the copy_from_user will not read past here.
|
||||
*/
|
||||
__s64 updated;
|
||||
};
|
||||
|
||||
/*
|
||||
* Flags for the userfaultfd(2) system call itself.
|
||||
*/
|
||||
|
@ -217,6 +217,7 @@ struct vfio_device_info {
|
||||
__u32 num_regions; /* Max region index + 1 */
|
||||
__u32 num_irqs; /* Max IRQ index + 1 */
|
||||
__u32 cap_offset; /* Offset within info struct of first cap */
|
||||
__u32 pad;
|
||||
};
|
||||
#define VFIO_DEVICE_GET_INFO _IO(VFIO_TYPE, VFIO_BASE + 7)
|
||||
|
||||
@ -677,11 +678,60 @@ enum {
|
||||
* VFIO_DEVICE_GET_PCI_HOT_RESET_INFO - _IOWR(VFIO_TYPE, VFIO_BASE + 12,
|
||||
* struct vfio_pci_hot_reset_info)
|
||||
*
|
||||
* This command is used to query the affected devices in the hot reset for
|
||||
* a given device.
|
||||
*
|
||||
* This command always reports the segment, bus, and devfn information for
|
||||
* each affected device, and selectively reports the group_id or devid per
|
||||
* the way how the calling device is opened.
|
||||
*
|
||||
* - If the calling device is opened via the traditional group/container
|
||||
* API, group_id is reported. User should check if it has owned all
|
||||
* the affected devices and provides a set of group fds to prove the
|
||||
* ownership in VFIO_DEVICE_PCI_HOT_RESET ioctl.
|
||||
*
|
||||
* - If the calling device is opened as a cdev, devid is reported.
|
||||
* Flag VFIO_PCI_HOT_RESET_FLAG_DEV_ID is set to indicate this
|
||||
* data type. All the affected devices should be represented in
|
||||
* the dev_set, ex. bound to a vfio driver, and also be owned by
|
||||
* this interface which is determined by the following conditions:
|
||||
* 1) Has a valid devid within the iommufd_ctx of the calling device.
|
||||
* Ownership cannot be determined across separate iommufd_ctx and
|
||||
* the cdev calling conventions do not support a proof-of-ownership
|
||||
* model as provided in the legacy group interface. In this case
|
||||
* valid devid with value greater than zero is provided in the return
|
||||
* structure.
|
||||
* 2) Does not have a valid devid within the iommufd_ctx of the calling
|
||||
* device, but belongs to the same IOMMU group as the calling device
|
||||
* or another opened device that has a valid devid within the
|
||||
* iommufd_ctx of the calling device. This provides implicit ownership
|
||||
* for devices within the same DMA isolation context. In this case
|
||||
* the devid value of VFIO_PCI_DEVID_OWNED is provided in the return
|
||||
* structure.
|
||||
*
|
||||
* A devid value of VFIO_PCI_DEVID_NOT_OWNED is provided in the return
|
||||
* structure for affected devices where device is NOT represented in the
|
||||
* dev_set or ownership is not available. Such devices prevent the use
|
||||
* of VFIO_DEVICE_PCI_HOT_RESET ioctl outside of the proof-of-ownership
|
||||
* calling conventions (ie. via legacy group accessed devices). Flag
|
||||
* VFIO_PCI_HOT_RESET_FLAG_DEV_ID_OWNED would be set when all the
|
||||
* affected devices are represented in the dev_set and also owned by
|
||||
* the user. This flag is available only when
|
||||
* flag VFIO_PCI_HOT_RESET_FLAG_DEV_ID is set, otherwise reserved.
|
||||
* When set, user could invoke VFIO_DEVICE_PCI_HOT_RESET with a zero
|
||||
* length fd array on the calling device as the ownership is validated
|
||||
* by iommufd_ctx.
|
||||
*
|
||||
* Return: 0 on success, -errno on failure:
|
||||
* -enospc = insufficient buffer, -enodev = unsupported for device.
|
||||
*/
|
||||
struct vfio_pci_dependent_device {
|
||||
__u32 group_id;
|
||||
union {
|
||||
__u32 group_id;
|
||||
__u32 devid;
|
||||
#define VFIO_PCI_DEVID_OWNED 0
|
||||
#define VFIO_PCI_DEVID_NOT_OWNED -1
|
||||
};
|
||||
__u16 segment;
|
||||
__u8 bus;
|
||||
__u8 devfn; /* Use PCI_SLOT/PCI_FUNC */
|
||||
@ -690,6 +740,8 @@ struct vfio_pci_dependent_device {
|
||||
struct vfio_pci_hot_reset_info {
|
||||
__u32 argsz;
|
||||
__u32 flags;
|
||||
#define VFIO_PCI_HOT_RESET_FLAG_DEV_ID (1 << 0)
|
||||
#define VFIO_PCI_HOT_RESET_FLAG_DEV_ID_OWNED (1 << 1)
|
||||
__u32 count;
|
||||
struct vfio_pci_dependent_device devices[];
|
||||
};
|
||||
@ -700,6 +752,24 @@ struct vfio_pci_hot_reset_info {
|
||||
* VFIO_DEVICE_PCI_HOT_RESET - _IOW(VFIO_TYPE, VFIO_BASE + 13,
|
||||
* struct vfio_pci_hot_reset)
|
||||
*
|
||||
* A PCI hot reset results in either a bus or slot reset which may affect
|
||||
* other devices sharing the bus/slot. The calling user must have
|
||||
* ownership of the full set of affected devices as determined by the
|
||||
* VFIO_DEVICE_GET_PCI_HOT_RESET_INFO ioctl.
|
||||
*
|
||||
* When called on a device file descriptor acquired through the vfio
|
||||
* group interface, the user is required to provide proof of ownership
|
||||
* of those affected devices via the group_fds array in struct
|
||||
* vfio_pci_hot_reset.
|
||||
*
|
||||
* When called on a direct cdev opened vfio device, the flags field of
|
||||
* struct vfio_pci_hot_reset_info reports the ownership status of the
|
||||
* affected devices and this ioctl must be called with an empty group_fds
|
||||
* array. See above INFO ioctl definition for ownership requirements.
|
||||
*
|
||||
* Mixed usage of legacy groups and cdevs across the set of affected
|
||||
* devices is not supported.
|
||||
*
|
||||
* Return: 0 on success, -errno on failure.
|
||||
*/
|
||||
struct vfio_pci_hot_reset {
|
||||
@ -828,6 +898,83 @@ struct vfio_device_feature {
|
||||
|
||||
#define VFIO_DEVICE_FEATURE _IO(VFIO_TYPE, VFIO_BASE + 17)
|
||||
|
||||
/*
|
||||
* VFIO_DEVICE_BIND_IOMMUFD - _IOR(VFIO_TYPE, VFIO_BASE + 18,
|
||||
* struct vfio_device_bind_iommufd)
|
||||
* @argsz: User filled size of this data.
|
||||
* @flags: Must be 0.
|
||||
* @iommufd: iommufd to bind.
|
||||
* @out_devid: The device id generated by this bind. devid is a handle for
|
||||
* this device/iommufd bond and can be used in IOMMUFD commands.
|
||||
*
|
||||
* Bind a vfio_device to the specified iommufd.
|
||||
*
|
||||
* User is restricted from accessing the device before the binding operation
|
||||
* is completed. Only allowed on cdev fds.
|
||||
*
|
||||
* Unbind is automatically conducted when device fd is closed.
|
||||
*
|
||||
* Return: 0 on success, -errno on failure.
|
||||
*/
|
||||
struct vfio_device_bind_iommufd {
|
||||
__u32 argsz;
|
||||
__u32 flags;
|
||||
__s32 iommufd;
|
||||
__u32 out_devid;
|
||||
};
|
||||
|
||||
#define VFIO_DEVICE_BIND_IOMMUFD _IO(VFIO_TYPE, VFIO_BASE + 18)
|
||||
|
||||
/*
|
||||
* VFIO_DEVICE_ATTACH_IOMMUFD_PT - _IOW(VFIO_TYPE, VFIO_BASE + 19,
|
||||
* struct vfio_device_attach_iommufd_pt)
|
||||
* @argsz: User filled size of this data.
|
||||
* @flags: Must be 0.
|
||||
* @pt_id: Input the target id which can represent an ioas or a hwpt
|
||||
* allocated via iommufd subsystem.
|
||||
* Output the input ioas id or the attached hwpt id which could
|
||||
* be the specified hwpt itself or a hwpt automatically created
|
||||
* for the specified ioas by kernel during the attachment.
|
||||
*
|
||||
* Associate the device with an address space within the bound iommufd.
|
||||
* Undo by VFIO_DEVICE_DETACH_IOMMUFD_PT or device fd close. This is only
|
||||
* allowed on cdev fds.
|
||||
*
|
||||
* If a vfio device is currently attached to a valid hw_pagetable, without doing
|
||||
* a VFIO_DEVICE_DETACH_IOMMUFD_PT, a second VFIO_DEVICE_ATTACH_IOMMUFD_PT ioctl
|
||||
* passing in another hw_pagetable (hwpt) id is allowed. This action, also known
|
||||
* as a hw_pagetable replacement, will replace the device's currently attached
|
||||
* hw_pagetable with a new hw_pagetable corresponding to the given pt_id.
|
||||
*
|
||||
* Return: 0 on success, -errno on failure.
|
||||
*/
|
||||
struct vfio_device_attach_iommufd_pt {
|
||||
__u32 argsz;
|
||||
__u32 flags;
|
||||
__u32 pt_id;
|
||||
};
|
||||
|
||||
#define VFIO_DEVICE_ATTACH_IOMMUFD_PT _IO(VFIO_TYPE, VFIO_BASE + 19)
|
||||
|
||||
/*
|
||||
* VFIO_DEVICE_DETACH_IOMMUFD_PT - _IOW(VFIO_TYPE, VFIO_BASE + 20,
|
||||
* struct vfio_device_detach_iommufd_pt)
|
||||
* @argsz: User filled size of this data.
|
||||
* @flags: Must be 0.
|
||||
*
|
||||
* Remove the association of the device and its current associated address
|
||||
* space. After it, the device should be in a blocking DMA state. This is only
|
||||
* allowed on cdev fds.
|
||||
*
|
||||
* Return: 0 on success, -errno on failure.
|
||||
*/
|
||||
struct vfio_device_detach_iommufd_pt {
|
||||
__u32 argsz;
|
||||
__u32 flags;
|
||||
};
|
||||
|
||||
#define VFIO_DEVICE_DETACH_IOMMUFD_PT _IO(VFIO_TYPE, VFIO_BASE + 20)
|
||||
|
||||
/*
|
||||
* Provide support for setting a PCI VF Token, which is used as a shared
|
||||
* secret between PF and VF drivers. This feature may only be set on a
|
||||
@ -1304,6 +1451,7 @@ struct vfio_iommu_type1_info {
|
||||
#define VFIO_IOMMU_INFO_CAPS (1 << 1) /* Info supports caps */
|
||||
__u64 iova_pgsizes; /* Bitmap of supported page sizes */
|
||||
__u32 cap_offset; /* Offset within info struct of first cap */
|
||||
__u32 pad;
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -43,6 +43,7 @@ typedef enum {
|
||||
S390_FEAT_TYPE_KDSA,
|
||||
S390_FEAT_TYPE_SORTL,
|
||||
S390_FEAT_TYPE_DFLTCC,
|
||||
S390_FEAT_TYPE_UV_FEAT_GUEST,
|
||||
} S390FeatType;
|
||||
|
||||
/* Definition of a CPU feature */
|
||||
|
@ -379,3 +379,7 @@ DEF_FEAT(DEFLATE_GHDT, "dfltcc-gdht", DFLTCC, 1, "DFLTCC GDHT")
|
||||
DEF_FEAT(DEFLATE_CMPR, "dfltcc-cmpr", DFLTCC, 2, "DFLTCC CMPR")
|
||||
DEF_FEAT(DEFLATE_XPND, "dfltcc-xpnd", DFLTCC, 4, "DFLTCC XPND")
|
||||
DEF_FEAT(DEFLATE_F0, "dfltcc-f0", DFLTCC, 192, "DFLTCC format 0 parameter-block")
|
||||
|
||||
/* Features exposed via the UV-CALL instruction */
|
||||
DEF_FEAT(UV_FEAT_AP, "appv", UV_FEAT_GUEST, 4, "AP instructions installed for secure guests")
|
||||
DEF_FEAT(UV_FEAT_AP_INTR, "appvi", UV_FEAT_GUEST, 5, "AP instructions interruption support for secure guests")
|
||||
|
@ -483,6 +483,8 @@ static void check_consistency(const S390CPUModel *model)
|
||||
{ S390_FEAT_DIAG_318, S390_FEAT_EXTENDED_LENGTH_SCCB },
|
||||
{ S390_FEAT_NNPA, S390_FEAT_VECTOR },
|
||||
{ S390_FEAT_RDP, S390_FEAT_LOCAL_TLB_CLEARING },
|
||||
{ S390_FEAT_UV_FEAT_AP, S390_FEAT_AP },
|
||||
{ S390_FEAT_UV_FEAT_AP_INTR, S390_FEAT_UV_FEAT_AP },
|
||||
};
|
||||
int i;
|
||||
|
||||
|
@ -576,6 +576,8 @@ static uint16_t full_GEN16_GA1[] = {
|
||||
S390_FEAT_RDP,
|
||||
S390_FEAT_PAI,
|
||||
S390_FEAT_PAIE,
|
||||
S390_FEAT_UV_FEAT_AP,
|
||||
S390_FEAT_UV_FEAT_AP_INTR,
|
||||
};
|
||||
|
||||
|
||||
|
@ -240,7 +240,7 @@ static void kvm_s390_enable_cmma(void)
|
||||
trace_kvm_enable_cmma(rc);
|
||||
}
|
||||
|
||||
static void kvm_s390_set_attr(uint64_t attr)
|
||||
static void kvm_s390_set_crypto_attr(uint64_t attr)
|
||||
{
|
||||
struct kvm_device_attr attribute = {
|
||||
.group = KVM_S390_VM_CRYPTO,
|
||||
@ -265,7 +265,7 @@ static void kvm_s390_init_aes_kw(void)
|
||||
}
|
||||
|
||||
if (kvm_vm_check_attr(kvm_state, KVM_S390_VM_CRYPTO, attr)) {
|
||||
kvm_s390_set_attr(attr);
|
||||
kvm_s390_set_crypto_attr(attr);
|
||||
}
|
||||
}
|
||||
|
||||
@ -279,7 +279,7 @@ static void kvm_s390_init_dea_kw(void)
|
||||
}
|
||||
|
||||
if (kvm_vm_check_attr(kvm_state, KVM_S390_VM_CRYPTO, attr)) {
|
||||
kvm_s390_set_attr(attr);
|
||||
kvm_s390_set_crypto_attr(attr);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2288,6 +2288,53 @@ static int configure_cpu_subfunc(const S390FeatBitmap features)
|
||||
return kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
|
||||
}
|
||||
|
||||
static bool ap_available(void)
|
||||
{
|
||||
return kvm_vm_check_attr(kvm_state, KVM_S390_VM_CRYPTO,
|
||||
KVM_S390_VM_CRYPTO_ENABLE_APIE);
|
||||
}
|
||||
|
||||
static bool ap_enabled(const S390FeatBitmap features)
|
||||
{
|
||||
return test_bit(S390_FEAT_AP, features);
|
||||
}
|
||||
|
||||
static bool uv_feat_supported(void)
|
||||
{
|
||||
return kvm_vm_check_attr(kvm_state, KVM_S390_VM_CPU_MODEL,
|
||||
KVM_S390_VM_CPU_PROCESSOR_UV_FEAT_GUEST);
|
||||
}
|
||||
|
||||
static int query_uv_feat_guest(S390FeatBitmap features)
|
||||
{
|
||||
struct kvm_s390_vm_cpu_uv_feat prop = {};
|
||||
struct kvm_device_attr attr = {
|
||||
.group = KVM_S390_VM_CPU_MODEL,
|
||||
.attr = KVM_S390_VM_CPU_MACHINE_UV_FEAT_GUEST,
|
||||
.addr = (uint64_t) &prop,
|
||||
};
|
||||
int rc;
|
||||
|
||||
/* AP support check is currently the only user of the UV feature test */
|
||||
if (!(uv_feat_supported() && ap_available())) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
rc = kvm_vm_ioctl(kvm_state, KVM_GET_DEVICE_ATTR, &attr);
|
||||
if (rc) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (prop.ap) {
|
||||
set_bit(S390_FEAT_UV_FEAT_AP, features);
|
||||
}
|
||||
if (prop.ap_intr) {
|
||||
set_bit(S390_FEAT_UV_FEAT_AP_INTR, features);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int kvm_to_feat[][2] = {
|
||||
{ KVM_S390_VM_CPU_FEAT_ESOP, S390_FEAT_ESOP },
|
||||
{ KVM_S390_VM_CPU_FEAT_SIEF2, S390_FEAT_SIE_F2 },
|
||||
@ -2467,8 +2514,7 @@ void kvm_s390_get_host_cpu_model(S390CPUModel *model, Error **errp)
|
||||
return;
|
||||
}
|
||||
/* for now, we can only provide the AP feature with HW support */
|
||||
if (kvm_vm_check_attr(kvm_state, KVM_S390_VM_CRYPTO,
|
||||
KVM_S390_VM_CRYPTO_ENABLE_APIE)) {
|
||||
if (ap_available()) {
|
||||
set_bit(S390_FEAT_AP, model->features);
|
||||
}
|
||||
|
||||
@ -2483,18 +2529,45 @@ void kvm_s390_get_host_cpu_model(S390CPUModel *model, Error **errp)
|
||||
set_bit(S390_FEAT_DIAG_318, model->features);
|
||||
}
|
||||
|
||||
/* Test for Ultravisor features that influence secure guest behavior */
|
||||
query_uv_feat_guest(model->features);
|
||||
|
||||
/* strip of features that are not part of the maximum model */
|
||||
bitmap_and(model->features, model->features, model->def->full_feat,
|
||||
S390_FEAT_MAX);
|
||||
}
|
||||
|
||||
static int configure_uv_feat_guest(const S390FeatBitmap features)
|
||||
{
|
||||
struct kvm_s390_vm_cpu_uv_feat uv_feat = {};
|
||||
struct kvm_device_attr attribute = {
|
||||
.group = KVM_S390_VM_CPU_MODEL,
|
||||
.attr = KVM_S390_VM_CPU_PROCESSOR_UV_FEAT_GUEST,
|
||||
.addr = (__u64) &uv_feat,
|
||||
};
|
||||
|
||||
/* AP support check is currently the only user of the UV feature test */
|
||||
if (!(uv_feat_supported() && ap_enabled(features))) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (test_bit(S390_FEAT_UV_FEAT_AP, features)) {
|
||||
uv_feat.ap = 1;
|
||||
}
|
||||
if (test_bit(S390_FEAT_UV_FEAT_AP_INTR, features)) {
|
||||
uv_feat.ap_intr = 1;
|
||||
}
|
||||
|
||||
return kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attribute);
|
||||
}
|
||||
|
||||
static void kvm_s390_configure_apie(bool interpret)
|
||||
{
|
||||
uint64_t attr = interpret ? KVM_S390_VM_CRYPTO_ENABLE_APIE :
|
||||
KVM_S390_VM_CRYPTO_DISABLE_APIE;
|
||||
|
||||
if (kvm_vm_check_attr(kvm_state, KVM_S390_VM_CRYPTO, attr)) {
|
||||
kvm_s390_set_attr(attr);
|
||||
kvm_s390_set_crypto_attr(attr);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2548,9 +2621,16 @@ void kvm_s390_apply_cpu_model(const S390CPUModel *model, Error **errp)
|
||||
kvm_s390_enable_cmma();
|
||||
}
|
||||
|
||||
if (test_bit(S390_FEAT_AP, model->features)) {
|
||||
if (ap_enabled(model->features)) {
|
||||
kvm_s390_configure_apie(true);
|
||||
}
|
||||
|
||||
/* configure UV-features for the guest indicated via query / test_bit */
|
||||
rc = configure_uv_feat_guest(model->features);
|
||||
if (rc) {
|
||||
error_setg(errp, "KVM: Error configuring CPU UV features %d", rc);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void kvm_s390_restart_interrupt(S390CPU *cpu)
|
||||
|
@ -406,7 +406,7 @@ static void test_geometry(const void *opaque)
|
||||
|
||||
for (int region = 0; region < nb_erase_regions; ++region) {
|
||||
for (uint32_t i = 0; i < c->nb_blocs[region]; ++i) {
|
||||
uint64_t byte_addr = (uint64_t)i * c->sector_len[region];
|
||||
byte_addr = (uint64_t)i * c->sector_len[region];
|
||||
g_assert_cmphex(flash_read(c, byte_addr), ==, bank_mask(c));
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user