From: Marc Zyngier <maz@kernel.org>
To: Yicong Yang <yangyicong@huawei.com>
Cc: <catalin.marinas@arm.com>, <will@kernel.org>,
<oliver.upton@linux.dev>, <corbet@lwn.net>,
<linux-arm-kernel@lists.infradead.org>, <kvmarm@lists.linux.dev>,
<linux-kselftest@vger.kernel.org>, <linux-doc@vger.kernel.org>,
<joey.gouly@arm.com>, <suzuki.poulose@arm.com>,
<yuzenghui@huawei.com>, <shuah@kernel.org>,
<jonathan.cameron@huawei.com>,
<shameerali.kolothum.thodi@huawei.com>, <linuxarm@huawei.com>,
<prime.zeng@hisilicon.com>, <xuwei5@huawei.com>,
<yangyicong@hisilicon.com>, <tangchengchang@huawei.com>,
<wangzhou1@hisilicon.com>
Subject: Re: [PATCH v3 3/7] KVM: arm64: Handle DABT caused by LS64* instructions on unsupported memory
Date: Thu, 26 Jun 2025 09:51:49 +0100 [thread overview]
Message-ID: <86zfduc2ca.wl-maz@kernel.org> (raw)
In-Reply-To: <20250626080906.64230-4-yangyicong@huawei.com>
On Thu, 26 Jun 2025 09:09:02 +0100,
Yicong Yang <yangyicong@huawei.com> wrote:
>
> From: Yicong Yang <yangyicong@hisilicon.com>
>
> If FEAT_LS64WB not supported, FEAT_LS64* instructions only support
> to access Device/Uncacheable memory, otherwise a data abort for
> unsupported Exclusive or atomic access (0x35) is generated per spec.
> It's implementation defined whether the target exception level is
> routed and is possible to implemented as route to EL2 on a VHE VM
> according to DDI0487K.a Section C3.2.12.2 Single-copy atomic 64-byte
> load/store.
Nit: in DDI0487L.b (the latest as I write), this is in C3.2.6.
>
> If it's implemented as generate the DABT to the final enabled stage
> (stage-2), since no valid ISV indicated in the ESR, it's better for
> the userspace to decide how to handle it. Reuse the
> NISV_IO_ABORT_TO_USER path with exit reason KVM_EXIT_ARM_LDST64B.
>
> Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
> ---
> arch/arm64/include/asm/esr.h | 8 ++++++++
> arch/arm64/kvm/mmu.c | 21 ++++++++++++++++++++-
> 2 files changed, 28 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm64/include/asm/esr.h b/arch/arm64/include/asm/esr.h
> index e1deed824464..63cd17f830da 100644
> --- a/arch/arm64/include/asm/esr.h
> +++ b/arch/arm64/include/asm/esr.h
> @@ -124,6 +124,7 @@
> #define ESR_ELx_FSC_SEA_TTW(n) (0x14 + (n))
> #define ESR_ELx_FSC_SECC (0x18)
> #define ESR_ELx_FSC_SECC_TTW(n) (0x1c + (n))
> +#define ESR_ELx_FSC_EXCL_ATOMIC (0x35)
> #define ESR_ELx_FSC_ADDRSZ (0x00)
>
> /*
> @@ -488,6 +489,13 @@ static inline bool esr_fsc_is_access_flag_fault(unsigned long esr)
> (esr == ESR_ELx_FSC_ACCESS_L(0));
> }
>
> +static inline bool esr_fsc_is_excl_atomic_fault(unsigned long esr)
> +{
> + esr = esr & ESR_ELx_FSC;
> +
> + return esr == ESR_ELx_FSC_EXCL_ATOMIC;
> +}
> +
> static inline bool esr_fsc_is_addr_sz_fault(unsigned long esr)
> {
> esr &= ESR_ELx_FSC;
> diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c
> index 2942ec92c5a4..5f05d1c4b5a2 100644
> --- a/arch/arm64/kvm/mmu.c
> +++ b/arch/arm64/kvm/mmu.c
> @@ -1665,6 +1665,24 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
> if (exec_fault && device)
> return -ENOEXEC;
>
> + /*
> + * Target address is normal memory on the Host. We come here
> + * because:
> + * 1) Guest map it as device memory and perform LS64 operations
> + * 2) VMM report it as device memory mistakenly
> + * Hand it to the userspace.
> + */
> + if (esr_fsc_is_excl_atomic_fault(kvm_vcpu_get_esr(vcpu))) {
> + struct kvm_run *run = vcpu->run;
> +
> + run->exit_reason = KVM_EXIT_ARM_LDST64B;
> + run->arm_nisv.esr_iss = kvm_vcpu_dabt_iss_nisv_sanitized(vcpu);
> + run->arm_nisv.fault_ipa = fault_ipa |
> + (kvm_vcpu_get_hfar(vcpu) & (vma_pagesize - 1));
> +
> + return -EAGAIN;
> + }
I'm not sure that's the right thing to do.
If:
- the guest was told it doesn't have LS64WB,
- it was told that some range is memory,
- it uses that range as device,
- thanks to FWB the resulting memory type is "Normal-Cacheable"
- which results in an Unsupported Atomic exception
why would we involve the VMM at all? The VMM clearly said it didn't
want to be involved in this (we have a memslot).
I think we should simply inject the corresponding S1 fault back into
the guest.
Thanks,
M.
--
Without deviation from the norm, progress is not possible.
next prev parent reply other threads:[~2025-06-26 8:51 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-26 8:08 [PATCH v3 0/7] Add support for FEAT_{LS64, LS64_V} and related tests Yicong Yang
2025-06-26 8:09 ` [PATCH v3 1/7] KVM: arm64: Add exit to userspace on {LD,ST}64B* outside of memslots Yicong Yang
2025-06-26 8:09 ` [PATCH v3 2/7] KVM: arm64: Add documentation for KVM_EXIT_ARM_LDST64B Yicong Yang
2025-06-26 8:09 ` [PATCH v3 3/7] KVM: arm64: Handle DABT caused by LS64* instructions on unsupported memory Yicong Yang
2025-06-26 8:51 ` Marc Zyngier [this message]
2025-06-26 11:39 ` Yicong Yang
2025-06-27 13:12 ` Marc Zyngier
2025-07-01 12:31 ` Yicong Yang
2025-06-26 8:09 ` [PATCH v3 4/7] KVM: arm/arm64: Allow user injection of unsupported exclusive/atomic DABT Yicong Yang
2025-06-26 8:11 ` Yicong Yang
2025-06-26 8:09 ` [PATCH v3 5/7] arm64: Provide basic EL2 setup for FEAT_{LS64, LS64_V} usage at EL0/1 Yicong Yang
2025-06-26 8:09 ` [PATCH v3 6/7] arm64: Add support for FEAT_{LS64, LS64_V} Yicong Yang
2025-06-26 8:09 ` [PATCH v3 7/7] KVM: arm64: Enable FEAT_{LS64, LS64_V} in the supported guest Yicong Yang
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=86zfduc2ca.wl-maz@kernel.org \
--to=maz@kernel.org \
--cc=catalin.marinas@arm.com \
--cc=corbet@lwn.net \
--cc=joey.gouly@arm.com \
--cc=jonathan.cameron@huawei.com \
--cc=kvmarm@lists.linux.dev \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linuxarm@huawei.com \
--cc=oliver.upton@linux.dev \
--cc=prime.zeng@hisilicon.com \
--cc=shameerali.kolothum.thodi@huawei.com \
--cc=shuah@kernel.org \
--cc=suzuki.poulose@arm.com \
--cc=tangchengchang@huawei.com \
--cc=wangzhou1@hisilicon.com \
--cc=will@kernel.org \
--cc=xuwei5@huawei.com \
--cc=yangyicong@hisilicon.com \
--cc=yangyicong@huawei.com \
--cc=yuzenghui@huawei.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.