From: Claudio Imbrenda <imbrenda@linux.ibm.com>
To: Janosch Frank <frankja@linux.ibm.com>
Cc: kvm@vger.kernel.org, linux-s390@vger.kernel.org,
borntraeger@linux.ibm.com, akrowiak@linux.ibm.com
Subject: Re: [RFC 05/10] KVM: s390: vsie: Cleanup and fixup of crycb handling
Date: Wed, 18 Mar 2026 17:48:15 +0100 [thread overview]
Message-ID: <20260318174815.66b3326e@p-imbrenda> (raw)
In-Reply-To: <20260316180310.17765-6-frankja@linux.ibm.com>
On Mon, 16 Mar 2026 16:23:52 +0000
Janosch Frank <frankja@linux.ibm.com> wrote:
> The crycbd denotes an absolute address and as such we need to use
> gpa_t and read_guest_abs() instead of read_guest_real().
>
> We don't want to copy the reserved fields into the host, so let's
> define size constants that only include the masks and ignore the
> reserved fields.
>
> While we're at it, remove magic constants with compiler backed
> constants.
>
> Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
> ---
> arch/s390/include/asm/kvm_host.h | 6 ++++
> arch/s390/kvm/vsie.c | 50 +++++++++++++++-----------------
> 2 files changed, 30 insertions(+), 26 deletions(-)
>
> diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h
> index 64a50f0862aa..52827db2fa97 100644
> --- a/arch/s390/include/asm/kvm_host.h
> +++ b/arch/s390/include/asm/kvm_host.h
> @@ -516,6 +516,8 @@ struct kvm_s390_crypto {
> __u8 apie;
> };
>
> +#define APCB_NUM_MASKS 3
> +
> #define APCB0_MASK_SIZE 1
> struct kvm_s390_apcb0 {
> __u64 apm[APCB0_MASK_SIZE]; /* 0x0000 */
> @@ -540,6 +542,10 @@ struct kvm_s390_crypto_cb {
> struct kvm_s390_apcb1 apcb1; /* 0x0080 */
> };
>
> +#define APCB_KEY_MASK_SIZE \
> + (sizeof_field(struct kvm_s390_crypto_cb, dea_wrapping_key_mask) + \
> + sizeof_field(struct kvm_s390_crypto_cb, aes_wrapping_key_mask))
> +
> struct kvm_s390_gisa {
> union {
> struct { /* common to all formats */
> diff --git a/arch/s390/kvm/vsie.c b/arch/s390/kvm/vsie.c
> index c0d36afd4023..13480d65c59d 100644
> --- a/arch/s390/kvm/vsie.c
> +++ b/arch/s390/kvm/vsie.c
> @@ -155,17 +155,17 @@ static int prepare_cpuflags(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
> atomic_set(&scb_s->cpuflags, newflags);
> return 0;
> }
> +
> /* Copy to APCB FORMAT1 from APCB FORMAT0 */
> static int setup_apcb10(struct kvm_vcpu *vcpu, struct kvm_s390_apcb1 *apcb_s,
> - unsigned long crycb_gpa, struct kvm_s390_apcb1 *apcb_h)
> + gpa_t crycb_gpa, struct kvm_s390_apcb1 *apcb_h)
> {
> struct kvm_s390_apcb0 tmp;
> - unsigned long apcb_gpa;
> + gpa_t apcb_gpa;
>
> apcb_gpa = crycb_gpa + offsetof(struct kvm_s390_crypto_cb, apcb0);
>
> - if (read_guest_real(vcpu, apcb_gpa, &tmp,
> - sizeof(struct kvm_s390_apcb0)))
> + if (read_guest_abs(vcpu, apcb_gpa, &tmp, sizeof(tmp)))
> return -EFAULT;
>
> apcb_s->apm[0] = apcb_h->apm[0] & tmp.apm[0];
> @@ -173,7 +173,6 @@ static int setup_apcb10(struct kvm_vcpu *vcpu, struct kvm_s390_apcb1 *apcb_s,
> apcb_s->adm[0] = apcb_h->adm[0] & tmp.adm[0] & 0xffff000000000000UL;
>
> return 0;
> -
> }
>
> /**
> @@ -186,18 +185,18 @@ static int setup_apcb10(struct kvm_vcpu *vcpu, struct kvm_s390_apcb1 *apcb_s,
> * Returns 0 and -EFAULT on error reading guest apcb
> */
> static int setup_apcb00(struct kvm_vcpu *vcpu, unsigned long *apcb_s,
> - unsigned long crycb_gpa, unsigned long *apcb_h)
> + gpa_t crycb_gpa, unsigned long *apcb_h)
> {
> - unsigned long apcb_gpa;
> + /* sizeof() would include reserved fields which we do not need/want */
> + unsigned long len = APCB_NUM_MASKS * APCB0_MASK_SIZE * sizeof(u64);
> + gpa_t apcb_gpa;
>
> apcb_gpa = crycb_gpa + offsetof(struct kvm_s390_crypto_cb, apcb0);
>
> - if (read_guest_real(vcpu, apcb_gpa, apcb_s,
> - sizeof(struct kvm_s390_apcb0)))
> + if (read_guest_abs(vcpu, apcb_gpa, apcb_s, len))
> return -EFAULT;
>
> - bitmap_and(apcb_s, apcb_s, apcb_h,
> - BITS_PER_BYTE * sizeof(struct kvm_s390_apcb0));
> + bitmap_and(apcb_s, apcb_s, apcb_h, BITS_PER_BYTE * len);
>
> return 0;
> }
> @@ -212,19 +211,18 @@ static int setup_apcb00(struct kvm_vcpu *vcpu, unsigned long *apcb_s,
> * Returns 0 and -EFAULT on error reading guest apcb
> */
> static int setup_apcb11(struct kvm_vcpu *vcpu, unsigned long *apcb_s,
> - unsigned long crycb_gpa,
> - unsigned long *apcb_h)
> + gpa_t crycb_gpa, unsigned long *apcb_h)
> {
> - unsigned long apcb_gpa;
> + /* sizeof() would include reserved fields which we do not need/want */
> + unsigned long len = APCB_NUM_MASKS * APCB1_MASK_SIZE * sizeof(u64);
> + gpa_t apcb_gpa;
>
> apcb_gpa = crycb_gpa + offsetof(struct kvm_s390_crypto_cb, apcb1);
>
> - if (read_guest_real(vcpu, apcb_gpa, apcb_s,
> - sizeof(struct kvm_s390_apcb1)))
> + if (read_guest_abs(vcpu, apcb_gpa, apcb_s, len))
> return -EFAULT;
>
> - bitmap_and(apcb_s, apcb_s, apcb_h,
> - BITS_PER_BYTE * sizeof(struct kvm_s390_apcb1));
> + bitmap_and(apcb_s, apcb_s, apcb_h, BITS_PER_BYTE * len);
>
> return 0;
> }
> @@ -244,8 +242,7 @@ static int setup_apcb11(struct kvm_vcpu *vcpu, unsigned long *apcb_s,
> * Return 0 or an error number if the guest and host crycb are incompatible.
> */
> static int setup_apcb(struct kvm_vcpu *vcpu, struct kvm_s390_crypto_cb *crycb_s,
> - const u32 crycb_gpa,
> - struct kvm_s390_crypto_cb *crycb_h,
> + const gpa_t crycb_gpa, struct kvm_s390_crypto_cb *crycb_h,
> int fmt_o, int fmt_h)
> {
> switch (fmt_o) {
> @@ -315,7 +312,8 @@ static int shadow_crycb(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
> struct kvm_s390_sie_block *scb_s = &vsie_page->scb_s;
> struct kvm_s390_sie_block *scb_o = vsie_page->scb_o;
> const uint32_t crycbd_o = READ_ONCE(scb_o->crycbd);
> - const u32 crycb_addr = crycbd_o & 0x7ffffff8U;
> + /* CRYCB origin is a 31 bit absolute address with a bit of masking */
> + const gpa_t crycb_addr = crycbd_o & 0x7ffffff8U;
> unsigned long *b1, *b2;
> u8 ecb3_flags;
> u32 ecd_flags;
> @@ -359,8 +357,9 @@ static int shadow_crycb(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
> goto end;
>
> /* copy only the wrapping keys */
> - if (read_guest_real(vcpu, crycb_addr + 72,
> - vsie_page->crycb.dea_wrapping_key_mask, 56))
> + if (read_guest_abs(vcpu,
> + crycb_addr + offsetof(struct kvm_s390_crypto_cb, dea_wrapping_key_mask),
> + vsie_page->crycb.dea_wrapping_key_mask, APCB_KEY_MASK_SIZE))
> return set_validity_icpt(scb_s, 0x0035U);
>
> scb_s->ecb3 |= ecb3_flags;
> @@ -368,10 +367,9 @@ static int shadow_crycb(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
>
> /* xor both blocks in one run */
> b1 = (unsigned long *) vsie_page->crycb.dea_wrapping_key_mask;
> - b2 = (unsigned long *)
> - vcpu->kvm->arch.crypto.crycb->dea_wrapping_key_mask;
> + b2 = (unsigned long *) vcpu->kvm->arch.crypto.crycb->dea_wrapping_key_mask;
> /* as 56%8 == 0, bitmap_xor won't overwrite any data */
> - bitmap_xor(b1, b1, b2, BITS_PER_BYTE * 56);
> + bitmap_xor(b1, b1, b2, BITS_PER_BYTE * APCB_KEY_MASK_SIZE);
> end:
> switch (ret) {
> case -EINVAL:
next prev parent reply other threads:[~2026-03-18 16:48 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-16 16:23 [RFC 00/10] KVM: s390: spring cleanup Janosch Frank
2026-03-16 16:23 ` [RFC 01/10] KVM: s390: diag258: Pass absolute address to kvm_is_gpa_in_memslot() Janosch Frank
2026-03-16 18:34 ` Christian Borntraeger
2026-03-17 10:01 ` Christoph Schlameuss
2026-03-18 16:04 ` Claudio Imbrenda
2026-03-16 16:23 ` [RFC 02/10] KVM: s390: Consolidate lpswe variants Janosch Frank
2026-03-16 18:47 ` Christian Borntraeger
2026-03-17 8:13 ` Janosch Frank
2026-03-17 13:03 ` [PATCH] KVM: s390: Fix lpsw/e breaking event handling Janosch Frank
2026-03-17 13:30 ` Christian Borntraeger
2026-03-23 15:08 ` Hendrik Brueckner
2026-03-16 16:23 ` [RFC 03/10] KVM: s390: Convert shifts to gpa_to_gfn() Janosch Frank
2026-03-16 18:49 ` Christian Borntraeger
2026-03-17 10:38 ` Christoph Schlameuss
2026-03-18 14:26 ` Claudio Imbrenda
2026-03-16 16:23 ` [RFC 04/10] KVM: s390: kvm_s390_real_to_abs() should return gpa_t Janosch Frank
2026-03-16 18:53 ` Christian Borntraeger
2026-03-18 7:10 ` Christoph Schlameuss
2026-03-18 14:29 ` Claudio Imbrenda
2026-03-16 16:23 ` [RFC 05/10] KVM: s390: vsie: Cleanup and fixup of crycb handling Janosch Frank
2026-03-18 14:13 ` Christoph Schlameuss
2026-03-18 16:48 ` Claudio Imbrenda [this message]
2026-03-20 12:01 ` Anthony Krowiak
2026-03-23 15:54 ` Janosch Frank
2026-03-16 16:23 ` [RFC 06/10] KVM: s390: Rework lowcore access functions Janosch Frank
2026-03-18 14:25 ` Claudio Imbrenda
2026-03-23 9:11 ` Christoph Schlameuss
2026-03-16 16:23 ` [RFC 07/10] KVM: s390: Use gpa_t and gva_t in gaccess files Janosch Frank
2026-03-18 15:36 ` Claudio Imbrenda
2026-03-23 9:10 ` Christoph Schlameuss
2026-03-16 16:23 ` [RFC 08/10] KVM: s390: Use gpa_t in priv.c Janosch Frank
2026-03-18 16:02 ` Claudio Imbrenda
2026-03-30 14:53 ` Janosch Frank
2026-03-23 9:28 ` Christoph Schlameuss
2026-03-16 16:23 ` [RFC 09/10] KVM: s390: Use gpa_t in pv.c Janosch Frank
2026-03-18 15:46 ` Claudio Imbrenda
2026-03-23 9:41 ` Christoph Schlameuss
2026-03-30 14:36 ` Janosch Frank
2026-03-16 16:23 ` [RFC 10/10] KVM: s390: Cleanup kvm_s390_store_status_unloaded Janosch Frank
2026-03-18 15:51 ` Claudio Imbrenda
2026-03-23 9:47 ` Christoph Schlameuss
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260318174815.66b3326e@p-imbrenda \
--to=imbrenda@linux.ibm.com \
--cc=akrowiak@linux.ibm.com \
--cc=borntraeger@linux.ibm.com \
--cc=frankja@linux.ibm.com \
--cc=kvm@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox