Commit c91c1461 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 's390-6.12-3' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux

Pull s390 fixes from Heiko Carstens:

 - Fix PCI error recovery by handling error events correctly

 - Fix CCA crypto card behavior within protected execution environment

 - Two KVM commits which fix virtual vs physical address handling bugs
   in KVM pfault handling

 - Fix return code handling in pckmo_key2protkey()

 - Deactivate sclp console as late as possible so that outstanding
   messages appear on the console instead of being dropped on reboot

 - Convert newlines to CRLF instead of LFCR for the sclp vt220 driver,
   as required by the vt220 specification

 - Initialize also psw mask in perf_arch_fetch_caller_regs() to make
   sure that user_mode(regs) will return false

 - Update defconfigs

* tag 's390-6.12-3' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
  s390: Update defconfigs
  s390: Initialize psw mask in perf_arch_fetch_caller_regs()
  s390/sclp_vt220: Convert newlines to CRLF instead of LFCR
  s390/sclp: Deactivate sclp after all its users
  s390/pkey_pckmo: Return with success for valid protected key types
  KVM: s390: Change virtual to physical address access in diag 0x258 handler
  KVM: s390: gaccess: Check if guest address is in memslot
  s390/ap: Fix CCA crypto card behavior within protected execution environment
  s390/pci: Handle PCI error codes other than 0x3a
parents ade8ff3b b4fa00fd
...@@ -50,7 +50,6 @@ CONFIG_NUMA=y ...@@ -50,7 +50,6 @@ CONFIG_NUMA=y
CONFIG_HZ_100=y CONFIG_HZ_100=y
CONFIG_CERT_STORE=y CONFIG_CERT_STORE=y
CONFIG_EXPOLINE=y CONFIG_EXPOLINE=y
# CONFIG_EXPOLINE_EXTERN is not set
CONFIG_EXPOLINE_AUTO=y CONFIG_EXPOLINE_AUTO=y
CONFIG_CHSC_SCH=y CONFIG_CHSC_SCH=y
CONFIG_VFIO_CCW=m CONFIG_VFIO_CCW=m
...@@ -95,6 +94,7 @@ CONFIG_BINFMT_MISC=m ...@@ -95,6 +94,7 @@ CONFIG_BINFMT_MISC=m
CONFIG_ZSWAP=y CONFIG_ZSWAP=y
CONFIG_ZSWAP_ZPOOL_DEFAULT_ZBUD=y CONFIG_ZSWAP_ZPOOL_DEFAULT_ZBUD=y
CONFIG_ZSMALLOC_STAT=y CONFIG_ZSMALLOC_STAT=y
CONFIG_SLAB_BUCKETS=y
CONFIG_SLUB_STATS=y CONFIG_SLUB_STATS=y
# CONFIG_COMPAT_BRK is not set # CONFIG_COMPAT_BRK is not set
CONFIG_MEMORY_HOTPLUG=y CONFIG_MEMORY_HOTPLUG=y
...@@ -426,6 +426,13 @@ CONFIG_DEVTMPFS_SAFE=y ...@@ -426,6 +426,13 @@ CONFIG_DEVTMPFS_SAFE=y
# CONFIG_FW_LOADER is not set # CONFIG_FW_LOADER is not set
CONFIG_CONNECTOR=y CONFIG_CONNECTOR=y
CONFIG_ZRAM=y CONFIG_ZRAM=y
CONFIG_ZRAM_BACKEND_LZ4=y
CONFIG_ZRAM_BACKEND_LZ4HC=y
CONFIG_ZRAM_BACKEND_ZSTD=y
CONFIG_ZRAM_BACKEND_DEFLATE=y
CONFIG_ZRAM_BACKEND_842=y
CONFIG_ZRAM_BACKEND_LZO=y
CONFIG_ZRAM_DEF_COMP_DEFLATE=y
CONFIG_BLK_DEV_LOOP=m CONFIG_BLK_DEV_LOOP=m
CONFIG_BLK_DEV_DRBD=m CONFIG_BLK_DEV_DRBD=m
CONFIG_BLK_DEV_NBD=m CONFIG_BLK_DEV_NBD=m
...@@ -486,6 +493,7 @@ CONFIG_DM_UEVENT=y ...@@ -486,6 +493,7 @@ CONFIG_DM_UEVENT=y
CONFIG_DM_FLAKEY=m CONFIG_DM_FLAKEY=m
CONFIG_DM_VERITY=m CONFIG_DM_VERITY=m
CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG=y CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG=y
CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG_PLATFORM_KEYRING=y
CONFIG_DM_SWITCH=m CONFIG_DM_SWITCH=m
CONFIG_DM_INTEGRITY=m CONFIG_DM_INTEGRITY=m
CONFIG_DM_VDO=m CONFIG_DM_VDO=m
...@@ -535,6 +543,7 @@ CONFIG_NLMON=m ...@@ -535,6 +543,7 @@ CONFIG_NLMON=m
CONFIG_MLX4_EN=m CONFIG_MLX4_EN=m
CONFIG_MLX5_CORE=m CONFIG_MLX5_CORE=m
CONFIG_MLX5_CORE_EN=y CONFIG_MLX5_CORE_EN=y
# CONFIG_NET_VENDOR_META is not set
# CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICREL is not set
# CONFIG_NET_VENDOR_MICROCHIP is not set # CONFIG_NET_VENDOR_MICROCHIP is not set
# CONFIG_NET_VENDOR_MICROSEMI is not set # CONFIG_NET_VENDOR_MICROSEMI is not set
...@@ -695,6 +704,7 @@ CONFIG_NFSD=m ...@@ -695,6 +704,7 @@ CONFIG_NFSD=m
CONFIG_NFSD_V3_ACL=y CONFIG_NFSD_V3_ACL=y
CONFIG_NFSD_V4=y CONFIG_NFSD_V4=y
CONFIG_NFSD_V4_SECURITY_LABEL=y CONFIG_NFSD_V4_SECURITY_LABEL=y
# CONFIG_NFSD_LEGACY_CLIENT_TRACKING is not set
CONFIG_CIFS=m CONFIG_CIFS=m
CONFIG_CIFS_UPCALL=y CONFIG_CIFS_UPCALL=y
CONFIG_CIFS_XATTR=y CONFIG_CIFS_XATTR=y
...@@ -740,7 +750,6 @@ CONFIG_CRYPTO_DH=m ...@@ -740,7 +750,6 @@ CONFIG_CRYPTO_DH=m
CONFIG_CRYPTO_ECDH=m CONFIG_CRYPTO_ECDH=m
CONFIG_CRYPTO_ECDSA=m CONFIG_CRYPTO_ECDSA=m
CONFIG_CRYPTO_ECRDSA=m CONFIG_CRYPTO_ECRDSA=m
CONFIG_CRYPTO_SM2=m
CONFIG_CRYPTO_CURVE25519=m CONFIG_CRYPTO_CURVE25519=m
CONFIG_CRYPTO_AES_TI=m CONFIG_CRYPTO_AES_TI=m
CONFIG_CRYPTO_ANUBIS=m CONFIG_CRYPTO_ANUBIS=m
......
...@@ -48,7 +48,6 @@ CONFIG_NUMA=y ...@@ -48,7 +48,6 @@ CONFIG_NUMA=y
CONFIG_HZ_100=y CONFIG_HZ_100=y
CONFIG_CERT_STORE=y CONFIG_CERT_STORE=y
CONFIG_EXPOLINE=y CONFIG_EXPOLINE=y
# CONFIG_EXPOLINE_EXTERN is not set
CONFIG_EXPOLINE_AUTO=y CONFIG_EXPOLINE_AUTO=y
CONFIG_CHSC_SCH=y CONFIG_CHSC_SCH=y
CONFIG_VFIO_CCW=m CONFIG_VFIO_CCW=m
...@@ -89,6 +88,7 @@ CONFIG_BINFMT_MISC=m ...@@ -89,6 +88,7 @@ CONFIG_BINFMT_MISC=m
CONFIG_ZSWAP=y CONFIG_ZSWAP=y
CONFIG_ZSWAP_ZPOOL_DEFAULT_ZBUD=y CONFIG_ZSWAP_ZPOOL_DEFAULT_ZBUD=y
CONFIG_ZSMALLOC_STAT=y CONFIG_ZSMALLOC_STAT=y
CONFIG_SLAB_BUCKETS=y
# CONFIG_COMPAT_BRK is not set # CONFIG_COMPAT_BRK is not set
CONFIG_MEMORY_HOTPLUG=y CONFIG_MEMORY_HOTPLUG=y
CONFIG_MEMORY_HOTREMOVE=y CONFIG_MEMORY_HOTREMOVE=y
...@@ -416,6 +416,13 @@ CONFIG_DEVTMPFS_SAFE=y ...@@ -416,6 +416,13 @@ CONFIG_DEVTMPFS_SAFE=y
# CONFIG_FW_LOADER is not set # CONFIG_FW_LOADER is not set
CONFIG_CONNECTOR=y CONFIG_CONNECTOR=y
CONFIG_ZRAM=y CONFIG_ZRAM=y
CONFIG_ZRAM_BACKEND_LZ4=y
CONFIG_ZRAM_BACKEND_LZ4HC=y
CONFIG_ZRAM_BACKEND_ZSTD=y
CONFIG_ZRAM_BACKEND_DEFLATE=y
CONFIG_ZRAM_BACKEND_842=y
CONFIG_ZRAM_BACKEND_LZO=y
CONFIG_ZRAM_DEF_COMP_DEFLATE=y
CONFIG_BLK_DEV_LOOP=m CONFIG_BLK_DEV_LOOP=m
CONFIG_BLK_DEV_DRBD=m CONFIG_BLK_DEV_DRBD=m
CONFIG_BLK_DEV_NBD=m CONFIG_BLK_DEV_NBD=m
...@@ -476,6 +483,7 @@ CONFIG_DM_UEVENT=y ...@@ -476,6 +483,7 @@ CONFIG_DM_UEVENT=y
CONFIG_DM_FLAKEY=m CONFIG_DM_FLAKEY=m
CONFIG_DM_VERITY=m CONFIG_DM_VERITY=m
CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG=y CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG=y
CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG_PLATFORM_KEYRING=y
CONFIG_DM_SWITCH=m CONFIG_DM_SWITCH=m
CONFIG_DM_INTEGRITY=m CONFIG_DM_INTEGRITY=m
CONFIG_DM_VDO=m CONFIG_DM_VDO=m
...@@ -525,6 +533,7 @@ CONFIG_NLMON=m ...@@ -525,6 +533,7 @@ CONFIG_NLMON=m
CONFIG_MLX4_EN=m CONFIG_MLX4_EN=m
CONFIG_MLX5_CORE=m CONFIG_MLX5_CORE=m
CONFIG_MLX5_CORE_EN=y CONFIG_MLX5_CORE_EN=y
# CONFIG_NET_VENDOR_META is not set
# CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICREL is not set
# CONFIG_NET_VENDOR_MICROCHIP is not set # CONFIG_NET_VENDOR_MICROCHIP is not set
# CONFIG_NET_VENDOR_MICROSEMI is not set # CONFIG_NET_VENDOR_MICROSEMI is not set
...@@ -682,6 +691,7 @@ CONFIG_NFSD=m ...@@ -682,6 +691,7 @@ CONFIG_NFSD=m
CONFIG_NFSD_V3_ACL=y CONFIG_NFSD_V3_ACL=y
CONFIG_NFSD_V4=y CONFIG_NFSD_V4=y
CONFIG_NFSD_V4_SECURITY_LABEL=y CONFIG_NFSD_V4_SECURITY_LABEL=y
# CONFIG_NFSD_LEGACY_CLIENT_TRACKING is not set
CONFIG_CIFS=m CONFIG_CIFS=m
CONFIG_CIFS_UPCALL=y CONFIG_CIFS_UPCALL=y
CONFIG_CIFS_XATTR=y CONFIG_CIFS_XATTR=y
...@@ -726,7 +736,6 @@ CONFIG_CRYPTO_DH=m ...@@ -726,7 +736,6 @@ CONFIG_CRYPTO_DH=m
CONFIG_CRYPTO_ECDH=m CONFIG_CRYPTO_ECDH=m
CONFIG_CRYPTO_ECDSA=m CONFIG_CRYPTO_ECDSA=m
CONFIG_CRYPTO_ECRDSA=m CONFIG_CRYPTO_ECRDSA=m
CONFIG_CRYPTO_SM2=m
CONFIG_CRYPTO_CURVE25519=m CONFIG_CRYPTO_CURVE25519=m
CONFIG_CRYPTO_AES_TI=m CONFIG_CRYPTO_AES_TI=m
CONFIG_CRYPTO_ANUBIS=m CONFIG_CRYPTO_ANUBIS=m
...@@ -767,6 +776,7 @@ CONFIG_CRYPTO_LZ4=m ...@@ -767,6 +776,7 @@ CONFIG_CRYPTO_LZ4=m
CONFIG_CRYPTO_LZ4HC=m CONFIG_CRYPTO_LZ4HC=m
CONFIG_CRYPTO_ZSTD=m CONFIG_CRYPTO_ZSTD=m
CONFIG_CRYPTO_ANSI_CPRNG=m CONFIG_CRYPTO_ANSI_CPRNG=m
CONFIG_CRYPTO_JITTERENTROPY_OSR=1
CONFIG_CRYPTO_USER_API_HASH=m CONFIG_CRYPTO_USER_API_HASH=m
CONFIG_CRYPTO_USER_API_SKCIPHER=m CONFIG_CRYPTO_USER_API_SKCIPHER=m
CONFIG_CRYPTO_USER_API_RNG=m CONFIG_CRYPTO_USER_API_RNG=m
......
...@@ -49,6 +49,7 @@ CONFIG_ZFCP=y ...@@ -49,6 +49,7 @@ CONFIG_ZFCP=y
# CONFIG_HVC_IUCV is not set # CONFIG_HVC_IUCV is not set
# CONFIG_HW_RANDOM_S390 is not set # CONFIG_HW_RANDOM_S390 is not set
# CONFIG_HMC_DRV is not set # CONFIG_HMC_DRV is not set
# CONFIG_S390_UV_UAPI is not set
# CONFIG_S390_TAPE is not set # CONFIG_S390_TAPE is not set
# CONFIG_VMCP is not set # CONFIG_VMCP is not set
# CONFIG_MONWRITER is not set # CONFIG_MONWRITER is not set
......
...@@ -49,6 +49,7 @@ struct perf_sf_sde_regs { ...@@ -49,6 +49,7 @@ struct perf_sf_sde_regs {
}; };
#define perf_arch_fetch_caller_regs(regs, __ip) do { \ #define perf_arch_fetch_caller_regs(regs, __ip) do { \
(regs)->psw.mask = 0; \
(regs)->psw.addr = (__ip); \ (regs)->psw.addr = (__ip); \
(regs)->gprs[15] = (unsigned long)__builtin_frame_address(0) - \ (regs)->gprs[15] = (unsigned long)__builtin_frame_address(0) - \
offsetof(struct stack_frame, back_chain); \ offsetof(struct stack_frame, back_chain); \
......
...@@ -77,7 +77,7 @@ static int __diag_page_ref_service(struct kvm_vcpu *vcpu) ...@@ -77,7 +77,7 @@ static int __diag_page_ref_service(struct kvm_vcpu *vcpu)
vcpu->stat.instruction_diagnose_258++; vcpu->stat.instruction_diagnose_258++;
if (vcpu->run->s.regs.gprs[rx] & 7) if (vcpu->run->s.regs.gprs[rx] & 7)
return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION); return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
rc = read_guest(vcpu, vcpu->run->s.regs.gprs[rx], rx, &parm, sizeof(parm)); rc = read_guest_real(vcpu, vcpu->run->s.regs.gprs[rx], &parm, sizeof(parm));
if (rc) if (rc)
return kvm_s390_inject_prog_cond(vcpu, rc); return kvm_s390_inject_prog_cond(vcpu, rc);
if (parm.parm_version != 2 || parm.parm_len < 5 || parm.code != 0x258) if (parm.parm_version != 2 || parm.parm_len < 5 || parm.code != 0x258)
......
...@@ -828,6 +828,8 @@ static int access_guest_page(struct kvm *kvm, enum gacc_mode mode, gpa_t gpa, ...@@ -828,6 +828,8 @@ static int access_guest_page(struct kvm *kvm, enum gacc_mode mode, gpa_t gpa,
const gfn_t gfn = gpa_to_gfn(gpa); const gfn_t gfn = gpa_to_gfn(gpa);
int rc; int rc;
if (!gfn_to_memslot(kvm, gfn))
return PGM_ADDRESSING;
if (mode == GACC_STORE) if (mode == GACC_STORE)
rc = kvm_write_guest_page(kvm, gfn, data, offset, len); rc = kvm_write_guest_page(kvm, gfn, data, offset, len);
else else
...@@ -985,6 +987,8 @@ int access_guest_real(struct kvm_vcpu *vcpu, unsigned long gra, ...@@ -985,6 +987,8 @@ int access_guest_real(struct kvm_vcpu *vcpu, unsigned long gra,
gra += fragment_len; gra += fragment_len;
data += fragment_len; data += fragment_len;
} }
if (rc > 0)
vcpu->arch.pgm.code = rc;
return rc; return rc;
} }
......
...@@ -405,11 +405,12 @@ int read_guest_abs(struct kvm_vcpu *vcpu, unsigned long gpa, void *data, ...@@ -405,11 +405,12 @@ int read_guest_abs(struct kvm_vcpu *vcpu, unsigned long gpa, void *data,
* @len: number of bytes to copy * @len: number of bytes to copy
* *
* Copy @len bytes from @data (kernel space) to @gra (guest real address). * Copy @len bytes from @data (kernel space) to @gra (guest real address).
* It is up to the caller to ensure that the entire guest memory range is
* valid memory before calling this function.
* Guest low address and key protection are not checked. * Guest low address and key protection are not checked.
* *
* Returns zero on success or -EFAULT on error. * Returns zero on success, -EFAULT when copying from @data failed, or
* PGM_ADRESSING in case @gra is outside a memslot. In this case, pgm check info
* is also stored to allow injecting into the guest (if applicable) using
* kvm_s390_inject_prog_cond().
* *
* If an error occurs data may have been copied partially to guest memory. * If an error occurs data may have been copied partially to guest memory.
*/ */
...@@ -428,11 +429,12 @@ int write_guest_real(struct kvm_vcpu *vcpu, unsigned long gra, void *data, ...@@ -428,11 +429,12 @@ int write_guest_real(struct kvm_vcpu *vcpu, unsigned long gra, void *data,
* @len: number of bytes to copy * @len: number of bytes to copy
* *
* Copy @len bytes from @gra (guest real address) to @data (kernel space). * Copy @len bytes from @gra (guest real address) to @data (kernel space).
* It is up to the caller to ensure that the entire guest memory range is
* valid memory before calling this function.
* Guest key protection is not checked. * Guest key protection is not checked.
* *
* Returns zero on success or -EFAULT on error. * Returns zero on success, -EFAULT when copying to @data failed, or
* PGM_ADRESSING in case @gra is outside a memslot. In this case, pgm check info
* is also stored to allow injecting into the guest (if applicable) using
* kvm_s390_inject_prog_cond().
* *
* If an error occurs data may have been copied partially to kernel space. * If an error occurs data may have been copied partially to kernel space.
*/ */
......
...@@ -280,18 +280,19 @@ static void __zpci_event_error(struct zpci_ccdf_err *ccdf) ...@@ -280,18 +280,19 @@ static void __zpci_event_error(struct zpci_ccdf_err *ccdf)
goto no_pdev; goto no_pdev;
switch (ccdf->pec) { switch (ccdf->pec) {
case 0x003a: /* Service Action or Error Recovery Successful */ case 0x002a: /* Error event concerns FMB */
case 0x002b:
case 0x002c:
break;
case 0x0040: /* Service Action or Error Recovery Failed */
case 0x003b:
zpci_event_io_failure(pdev, pci_channel_io_perm_failure);
break;
default: /* PCI function left in the error state attempt to recover */
ers_res = zpci_event_attempt_error_recovery(pdev); ers_res = zpci_event_attempt_error_recovery(pdev);
if (ers_res != PCI_ERS_RESULT_RECOVERED) if (ers_res != PCI_ERS_RESULT_RECOVERED)
zpci_event_io_failure(pdev, pci_channel_io_perm_failure); zpci_event_io_failure(pdev, pci_channel_io_perm_failure);
break; break;
default:
/*
* Mark as frozen not permanently failed because the device
* could be subsequently recovered by the platform.
*/
zpci_event_io_failure(pdev, pci_channel_io_frozen);
break;
} }
pci_dev_put(pdev); pci_dev_put(pdev);
no_pdev: no_pdev:
......
...@@ -1195,7 +1195,8 @@ sclp_reboot_event(struct notifier_block *this, unsigned long event, void *ptr) ...@@ -1195,7 +1195,8 @@ sclp_reboot_event(struct notifier_block *this, unsigned long event, void *ptr)
} }
static struct notifier_block sclp_reboot_notifier = { static struct notifier_block sclp_reboot_notifier = {
.notifier_call = sclp_reboot_event .notifier_call = sclp_reboot_event,
.priority = INT_MIN,
}; };
static ssize_t con_pages_show(struct device_driver *dev, char *buf) static ssize_t con_pages_show(struct device_driver *dev, char *buf)
......
...@@ -319,7 +319,7 @@ sclp_vt220_add_msg(struct sclp_vt220_request *request, ...@@ -319,7 +319,7 @@ sclp_vt220_add_msg(struct sclp_vt220_request *request,
buffer = (void *) ((addr_t) sccb + sccb->header.length); buffer = (void *) ((addr_t) sccb + sccb->header.length);
if (convertlf) { if (convertlf) {
/* Perform Linefeed conversion (0x0a -> 0x0a 0x0d)*/ /* Perform Linefeed conversion (0x0a -> 0x0d 0x0a)*/
for (from=0, to=0; for (from=0, to=0;
(from < count) && (to < sclp_vt220_space_left(request)); (from < count) && (to < sclp_vt220_space_left(request));
from++) { from++) {
...@@ -328,8 +328,8 @@ sclp_vt220_add_msg(struct sclp_vt220_request *request, ...@@ -328,8 +328,8 @@ sclp_vt220_add_msg(struct sclp_vt220_request *request,
/* Perform conversion */ /* Perform conversion */
if (c == 0x0a) { if (c == 0x0a) {
if (to + 1 < sclp_vt220_space_left(request)) { if (to + 1 < sclp_vt220_space_left(request)) {
((unsigned char *) buffer)[to++] = c;
((unsigned char *) buffer)[to++] = 0x0d; ((unsigned char *) buffer)[to++] = 0x0d;
((unsigned char *) buffer)[to++] = c;
} else } else
break; break;
......
...@@ -1864,13 +1864,12 @@ static inline void ap_scan_domains(struct ap_card *ac) ...@@ -1864,13 +1864,12 @@ static inline void ap_scan_domains(struct ap_card *ac)
} }
/* if no queue device exists, create a new one */ /* if no queue device exists, create a new one */
if (!aq) { if (!aq) {
aq = ap_queue_create(qid, ac->ap_dev.device_type); aq = ap_queue_create(qid, ac);
if (!aq) { if (!aq) {
AP_DBF_WARN("%s(%d,%d) ap_queue_create() failed\n", AP_DBF_WARN("%s(%d,%d) ap_queue_create() failed\n",
__func__, ac->id, dom); __func__, ac->id, dom);
continue; continue;
} }
aq->card = ac;
aq->config = !decfg; aq->config = !decfg;
aq->chkstop = chkstop; aq->chkstop = chkstop;
aq->se_bstate = hwinfo.bs; aq->se_bstate = hwinfo.bs;
......
...@@ -272,7 +272,7 @@ int ap_test_config_usage_domain(unsigned int domain); ...@@ -272,7 +272,7 @@ int ap_test_config_usage_domain(unsigned int domain);
int ap_test_config_ctrl_domain(unsigned int domain); int ap_test_config_ctrl_domain(unsigned int domain);
void ap_queue_init_reply(struct ap_queue *aq, struct ap_message *ap_msg); void ap_queue_init_reply(struct ap_queue *aq, struct ap_message *ap_msg);
struct ap_queue *ap_queue_create(ap_qid_t qid, int device_type); struct ap_queue *ap_queue_create(ap_qid_t qid, struct ap_card *ac);
void ap_queue_prepare_remove(struct ap_queue *aq); void ap_queue_prepare_remove(struct ap_queue *aq);
void ap_queue_remove(struct ap_queue *aq); void ap_queue_remove(struct ap_queue *aq);
void ap_queue_init_state(struct ap_queue *aq); void ap_queue_init_state(struct ap_queue *aq);
......
...@@ -22,6 +22,11 @@ static void __ap_flush_queue(struct ap_queue *aq); ...@@ -22,6 +22,11 @@ static void __ap_flush_queue(struct ap_queue *aq);
* some AP queue helper functions * some AP queue helper functions
*/ */
static inline bool ap_q_supported_in_se(struct ap_queue *aq)
{
return aq->card->hwinfo.ep11 || aq->card->hwinfo.accel;
}
static inline bool ap_q_supports_bind(struct ap_queue *aq) static inline bool ap_q_supports_bind(struct ap_queue *aq)
{ {
return aq->card->hwinfo.ep11 || aq->card->hwinfo.accel; return aq->card->hwinfo.ep11 || aq->card->hwinfo.accel;
...@@ -1104,18 +1109,19 @@ static void ap_queue_device_release(struct device *dev) ...@@ -1104,18 +1109,19 @@ static void ap_queue_device_release(struct device *dev)
kfree(aq); kfree(aq);
} }
struct ap_queue *ap_queue_create(ap_qid_t qid, int device_type) struct ap_queue *ap_queue_create(ap_qid_t qid, struct ap_card *ac)
{ {
struct ap_queue *aq; struct ap_queue *aq;
aq = kzalloc(sizeof(*aq), GFP_KERNEL); aq = kzalloc(sizeof(*aq), GFP_KERNEL);
if (!aq) if (!aq)
return NULL; return NULL;
aq->card = ac;
aq->ap_dev.device.release = ap_queue_device_release; aq->ap_dev.device.release = ap_queue_device_release;
aq->ap_dev.device.type = &ap_queue_type; aq->ap_dev.device.type = &ap_queue_type;
aq->ap_dev.device_type = device_type; aq->ap_dev.device_type = ac->ap_dev.device_type;
// add optional SE secure binding attributes group /* in SE environment add bind/associate attributes group */
if (ap_sb_available() && is_prot_virt_guest()) if (ap_is_se_guest() && ap_q_supported_in_se(aq))
aq->ap_dev.device.groups = ap_queue_dev_sb_attr_groups; aq->ap_dev.device.groups = ap_queue_dev_sb_attr_groups;
aq->qid = qid; aq->qid = qid;
spin_lock_init(&aq->lock); spin_lock_init(&aq->lock);
...@@ -1196,10 +1202,16 @@ bool ap_queue_usable(struct ap_queue *aq) ...@@ -1196,10 +1202,16 @@ bool ap_queue_usable(struct ap_queue *aq)
} }
/* SE guest's queues additionally need to be bound */ /* SE guest's queues additionally need to be bound */
if (ap_is_se_guest()) {
if (!ap_q_supported_in_se(aq)) {
rc = false;
goto unlock_and_out;
}
if (ap_q_needs_bind(aq) && if (ap_q_needs_bind(aq) &&
!(aq->se_bstate == AP_BS_Q_USABLE || !(aq->se_bstate == AP_BS_Q_USABLE ||
aq->se_bstate == AP_BS_Q_USABLE_NO_SECURE_KEY)) aq->se_bstate == AP_BS_Q_USABLE_NO_SECURE_KEY))
rc = false; rc = false;
}
unlock_and_out: unlock_and_out:
spin_unlock_bh(&aq->lock); spin_unlock_bh(&aq->lock);
......
...@@ -324,6 +324,7 @@ static int pckmo_key2protkey(const u8 *key, u32 keylen, ...@@ -324,6 +324,7 @@ static int pckmo_key2protkey(const u8 *key, u32 keylen,
memcpy(protkey, t->protkey, t->len); memcpy(protkey, t->protkey, t->len);
*protkeylen = t->len; *protkeylen = t->len;
*protkeytype = t->keytype; *protkeytype = t->keytype;
rc = 0;
break; break;
} }
case TOKVER_CLEAR_KEY: { case TOKVER_CLEAR_KEY: {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment