* [PATCH v6 1/7] KVM: arm64: Add exit to userspace on {LD,ST}64B* outside of memslots
2025-10-24 9:08 [PATCH v6 0/7] Add support for FEAT_{LS64, LS64_V} and related tests Zhou Wang
@ 2025-10-24 9:08 ` Zhou Wang
2025-10-24 9:08 ` [PATCH v6 2/7] KVM: arm64: Add documentation for KVM_EXIT_ARM_LDST64B Zhou Wang
` (6 subsequent siblings)
7 siblings, 0 replies; 18+ messages in thread
From: Zhou Wang @ 2025-10-24 9:08 UTC (permalink / raw)
To: catalin.marinas, will, maz, oliver.upton, joey.gouly,
suzuki.poulose, yuzenghui
Cc: linux-arm-kernel, kvmarm, yangyccccc, prime.zeng, xuwei5
From: Marc Zyngier <maz@kernel.org>
The main use of {LD,ST}64B* is to talk to a device, which is hopefully
directly assigned to the guest and requires no additional handling.
However, this does not preclude a VMM from exposing a virtual device
to the guest, and to allow 64 byte accesses as part of the programming
interface. A direct consequence of this is that we need to be able
to forward such access to userspace.
Given that such a contraption is very unlikely to ever exist, we choose
to offer a limited service: userspace gets (as part of a new exit reason)
the ESR, the IPA, and that's it. It is fully expected to handle the full
semantics of the instructions, deal with ACCDATA, the return values and
increment PC. Much fun.
A canonical implementation can also simply inject an abort and be done
with it. Frankly, don't try to do anything else unless you have time
to waste.
Signed-off-by: Marc Zyngier <maz@kernel.org>
Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
---
arch/arm64/kvm/mmio.c | 27 ++++++++++++++++++++++++++-
include/uapi/linux/kvm.h | 3 ++-
2 files changed, 28 insertions(+), 2 deletions(-)
diff --git a/arch/arm64/kvm/mmio.c b/arch/arm64/kvm/mmio.c
index 54f9358c9e0e..2a6261abb647 100644
--- a/arch/arm64/kvm/mmio.c
+++ b/arch/arm64/kvm/mmio.c
@@ -159,6 +159,9 @@ int io_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa)
bool is_write;
int len;
u8 data_buf[8];
+ u64 esr;
+
+ esr = kvm_vcpu_get_esr(vcpu);
/*
* No valid syndrome? Ask userspace for help if it has
@@ -168,7 +171,7 @@ int io_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa)
* though, so directly deliver an exception to the guest.
*/
if (!kvm_vcpu_dabt_isvalid(vcpu)) {
- trace_kvm_mmio_nisv(*vcpu_pc(vcpu), kvm_vcpu_get_esr(vcpu),
+ trace_kvm_mmio_nisv(*vcpu_pc(vcpu), esr,
kvm_vcpu_get_hfar(vcpu), fault_ipa);
if (vcpu_is_protected(vcpu))
@@ -185,6 +188,28 @@ int io_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa)
return -ENOSYS;
}
+ /*
+ * When (DFSC == 0b00xxxx || DFSC == 0b10101x) && DFSC != 0b0000xx
+ * ESR_EL2[12:11] describe the Load/Store Type. This allows us to
+ * punt the LD64B/ST64B/ST64BV/ST64BV0 instructions to luserspace,
+ * which will have to provide a full emulation of these 4
+ * instructions. No, we don't expect this do be fast.
+ *
+ * We rely on traps being set if the corresponding features are not
+ * enabled, so if we get here, userspace has promised us to handle
+ * it already.
+ */
+ switch (kvm_vcpu_trap_get_fault(vcpu)) {
+ case 0b000100 ... 0b001111:
+ case 0b101010 ... 0b101011:
+ if (FIELD_GET(GENMASK(12, 11), esr)) {
+ run->exit_reason = KVM_EXIT_ARM_LDST64B;
+ run->arm_nisv.esr_iss = esr & ~(u64)ESR_ELx_FSC;
+ run->arm_nisv.fault_ipa = fault_ipa;
+ return 0;
+ }
+ }
+
/*
* Prepare MMIO operation. First decode the syndrome data we get
* from the CPU. Then try if some in-kernel emulation feels
diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h
index 52f6000ab020..d219946b96be 100644
--- a/include/uapi/linux/kvm.h
+++ b/include/uapi/linux/kvm.h
@@ -179,6 +179,7 @@ struct kvm_xen_exit {
#define KVM_EXIT_LOONGARCH_IOCSR 38
#define KVM_EXIT_MEMORY_FAULT 39
#define KVM_EXIT_TDX 40
+#define KVM_EXIT_ARM_LDST64B 41
/* For KVM_EXIT_INTERNAL_ERROR */
/* Emulate instruction failed. */
@@ -401,7 +402,7 @@ struct kvm_run {
} eoi;
/* KVM_EXIT_HYPERV */
struct kvm_hyperv_exit hyperv;
- /* KVM_EXIT_ARM_NISV */
+ /* KVM_EXIT_ARM_NISV / KVM_EXIT_ARM_LDST64B */
struct {
__u64 esr_iss;
__u64 fault_ipa;
--
2.33.0
^ permalink raw reply related [flat|nested] 18+ messages in thread* [PATCH v6 2/7] KVM: arm64: Add documentation for KVM_EXIT_ARM_LDST64B
2025-10-24 9:08 [PATCH v6 0/7] Add support for FEAT_{LS64, LS64_V} and related tests Zhou Wang
2025-10-24 9:08 ` [PATCH v6 1/7] KVM: arm64: Add exit to userspace on {LD,ST}64B* outside of memslots Zhou Wang
@ 2025-10-24 9:08 ` Zhou Wang
2025-10-24 9:08 ` [PATCH v6 3/7] KVM: arm64: Handle DABT caused by LS64* instructions on unsupported memory Zhou Wang
` (5 subsequent siblings)
7 siblings, 0 replies; 18+ messages in thread
From: Zhou Wang @ 2025-10-24 9:08 UTC (permalink / raw)
To: catalin.marinas, will, maz, oliver.upton, joey.gouly,
suzuki.poulose, yuzenghui
Cc: linux-arm-kernel, kvmarm, yangyccccc, prime.zeng, xuwei5
From: Marc Zyngier <maz@kernel.org>
Add a bit of documentation for KVM_EXIT_ARM_LDST64B so that userspace
knows what to expect.
Signed-off-by: Marc Zyngier <maz@kernel.org>
Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
---
Documentation/virt/kvm/api.rst | 43 ++++++++++++++++++++++++++++------
1 file changed, 36 insertions(+), 7 deletions(-)
diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst
index 57061fa29e6a..b4af2a04b51a 100644
--- a/Documentation/virt/kvm/api.rst
+++ b/Documentation/virt/kvm/api.rst
@@ -1303,12 +1303,13 @@ userspace, for example because of missing instruction syndrome decode
information or because there is no device mapped at the accessed IPA, then
userspace can ask the kernel to inject an external abort using the address
from the exiting fault on the VCPU. It is a programming error to set
-ext_dabt_pending after an exit which was not either KVM_EXIT_MMIO or
-KVM_EXIT_ARM_NISV. This feature is only available if the system supports
-KVM_CAP_ARM_INJECT_EXT_DABT. This is a helper which provides commonality in
-how userspace reports accesses for the above cases to guests, across different
-userspace implementations. Nevertheless, userspace can still emulate all Arm
-exceptions by manipulating individual registers using the KVM_SET_ONE_REG API.
+ext_dabt_pending after an exit which was not either KVM_EXIT_MMIO,
+KVM_EXIT_ARM_NISV, or KVM_EXIT_ARM_LDST64B. This feature is only available if
+the system supports KVM_CAP_ARM_INJECT_EXT_DABT. This is a helper which
+provides commonality in how userspace reports accesses for the above cases to
+guests, across different userspace implementations. Nevertheless, userspace
+can still emulate all Arm exceptions by manipulating individual registers
+using the KVM_SET_ONE_REG API.
See KVM_GET_VCPU_EVENTS for the data structure.
@@ -7050,12 +7051,14 @@ in send_page or recv a buffer to recv_page).
::
- /* KVM_EXIT_ARM_NISV */
+ /* KVM_EXIT_ARM_NISV / KVM_EXIT_ARM_LDST64B */
struct {
__u64 esr_iss;
__u64 fault_ipa;
} arm_nisv;
+- KVM_EXIT_ARM_NISV:
+
Used on arm64 systems. If a guest accesses memory not in a memslot,
KVM will typically return to userspace and ask it to do MMIO emulation on its
behalf. However, for certain classes of instructions, no instruction decode
@@ -7089,6 +7092,32 @@ Note that although KVM_CAP_ARM_NISV_TO_USER will be reported if
queried outside of a protected VM context, the feature will not be
exposed if queried on a protected VM file descriptor.
+- KVM_EXIT_ARM_LDST64B:
+
+Used on arm64 systems. When a guest using a LD64B, ST64B, ST64BV, ST64BV0,
+outside of a memslot, KVM will return to userspace with KVM_EXIT_ARM_LDST64B,
+exposing the relevant ESR_EL2 information and faulting IPA, similarly to
+KVM_EXIT_ARM_NISV.
+
+Userspace is supposed to fully emulate the instructions, which includes:
+
+ - fetch of the operands for a store, including ACCDATA_EL1 in the case
+ of a ST64BV0 instruction
+ - deal with the endianness if the guest is big-endian
+ - emulate the access, including the delivery of an exception if the
+ access didn't succeed
+ - provide a return value in the case of ST64BV/ST64BV0
+ - return the data in the case of a load
+ - increment PC if the instruction was successfully executed
+
+Note that there is no expectation of performance for this emulation, as it
+involves a large number of interaction with the guest state. It is, however,
+expected that the instruction's semantics are preserved, specially the
+single-copy atomicity property of the 64 byte access.
+
+This exit reason must be handled if userspace sets ID_AA64ISAR1_EL1.LS64 to a
+non-zero value, indicating that FEAT_LS64* is enabled.
+
::
/* KVM_EXIT_X86_RDMSR / KVM_EXIT_X86_WRMSR */
--
2.33.0
^ permalink raw reply related [flat|nested] 18+ messages in thread* [PATCH v6 3/7] KVM: arm64: Handle DABT caused by LS64* instructions on unsupported memory
2025-10-24 9:08 [PATCH v6 0/7] Add support for FEAT_{LS64, LS64_V} and related tests Zhou Wang
2025-10-24 9:08 ` [PATCH v6 1/7] KVM: arm64: Add exit to userspace on {LD,ST}64B* outside of memslots Zhou Wang
2025-10-24 9:08 ` [PATCH v6 2/7] KVM: arm64: Add documentation for KVM_EXIT_ARM_LDST64B Zhou Wang
@ 2025-10-24 9:08 ` Zhou Wang
2025-10-24 19:54 ` Oliver Upton
2025-10-24 9:08 ` [PATCH v6 4/7] arm64: Provide basic EL2 setup for FEAT_{LS64, LS64_V} usage at EL0/1 Zhou Wang
` (4 subsequent siblings)
7 siblings, 1 reply; 18+ messages in thread
From: Zhou Wang @ 2025-10-24 9:08 UTC (permalink / raw)
To: catalin.marinas, will, maz, oliver.upton, joey.gouly,
suzuki.poulose, yuzenghui
Cc: linux-arm-kernel, kvmarm, yangyccccc, prime.zeng, xuwei5
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, UAoEF) 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 DDI0487L.b Section C3.2.6 Single-copy atomic
64-byte load/store.
If it's implemented as generate the DABT to the final enabled stage
(stage-2), inject the UAoEF back to the guest after checking the
memslot is valid.
Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
---
arch/arm64/include/asm/esr.h | 8 ++++++++
arch/arm64/include/asm/kvm_emulate.h | 1 +
arch/arm64/kvm/inject_fault.c | 22 ++++++++++++++++++++++
arch/arm64/kvm/mmu.c | 14 +++++++++++++-
4 files changed, 44 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/include/asm/kvm_emulate.h b/arch/arm64/include/asm/kvm_emulate.h
index c9eab316398e..759d8c45684d 100644
--- a/arch/arm64/include/asm/kvm_emulate.h
+++ b/arch/arm64/include/asm/kvm_emulate.h
@@ -47,6 +47,7 @@ void kvm_skip_instr32(struct kvm_vcpu *vcpu);
void kvm_inject_undefined(struct kvm_vcpu *vcpu);
int kvm_inject_serror_esr(struct kvm_vcpu *vcpu, u64 esr);
int kvm_inject_sea(struct kvm_vcpu *vcpu, bool iabt, u64 addr);
+void kvm_inject_dabt_excl_atomic(struct kvm_vcpu *vcpu, u64 addr);
void kvm_inject_size_fault(struct kvm_vcpu *vcpu);
static inline int kvm_inject_sea_dabt(struct kvm_vcpu *vcpu, u64 addr)
diff --git a/arch/arm64/kvm/inject_fault.c b/arch/arm64/kvm/inject_fault.c
index dfcd66c65517..e431151412e5 100644
--- a/arch/arm64/kvm/inject_fault.c
+++ b/arch/arm64/kvm/inject_fault.c
@@ -253,6 +253,28 @@ int kvm_inject_sea(struct kvm_vcpu *vcpu, bool iabt, u64 addr)
return 1;
}
+/**
+ * kvm_inject_dabt_excl_atomic - inject a data abort for unsupported exclusive
+ * or atomic access
+ * @vcpu: The VCPU to receive the data abort
+ * @addr: The address to report in the DFAR
+ *
+ * It is assumed that this code is called from the VCPU thread and that the
+ * VCPU therefore is not currently executing guest code.
+ */
+void kvm_inject_dabt_excl_atomic(struct kvm_vcpu *vcpu, u64 addr)
+{
+ u64 esr;
+
+ /* Reuse the general DABT injection routine and modify the DFSC */
+ kvm_inject_sea(vcpu, false, addr);
+
+ esr = vcpu_read_sys_reg(vcpu, exception_esr_elx(vcpu));
+ esr &= ~ESR_ELx_FSC;
+ esr |= ESR_ELx_FSC_EXCL_ATOMIC;
+ vcpu_write_sys_reg(vcpu, esr, exception_esr_elx(vcpu));
+}
+
void kvm_inject_size_fault(struct kvm_vcpu *vcpu)
{
unsigned long addr, esr;
diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c
index 7cc964af8d30..06cec9070ea6 100644
--- a/arch/arm64/kvm/mmu.c
+++ b/arch/arm64/kvm/mmu.c
@@ -1802,6 +1802,17 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
return ret;
}
+ /*
+ * Guest performs atomic/exclusive operations on memory with unsupported
+ * attributes (e.g. ld64b/st64b on normal memory when no FEAT_LS64WB)
+ * and trigger the exception here. Since the memslot is valid, inject
+ * the fault back to the guest.
+ */
+ if (esr_fsc_is_excl_atomic_fault(kvm_vcpu_get_esr(vcpu))) {
+ kvm_inject_dabt_excl_atomic(vcpu, kvm_vcpu_get_hfar(vcpu));
+ return 1;
+ }
+
if (nested)
adjust_nested_fault_perms(nested, &prot, &writable);
@@ -1971,7 +1982,8 @@ int kvm_handle_guest_abort(struct kvm_vcpu *vcpu)
/* Check the stage-2 fault is trans. fault or write fault */
if (!esr_fsc_is_translation_fault(esr) &&
!esr_fsc_is_permission_fault(esr) &&
- !esr_fsc_is_access_flag_fault(esr)) {
+ !esr_fsc_is_access_flag_fault(esr) &&
+ !esr_fsc_is_excl_atomic_fault(esr)) {
kvm_err("Unsupported FSC: EC=%#x xFSC=%#lx ESR_EL2=%#lx\n",
kvm_vcpu_trap_get_class(vcpu),
(unsigned long)kvm_vcpu_trap_get_fault(vcpu),
--
2.33.0
^ permalink raw reply related [flat|nested] 18+ messages in thread* Re: [PATCH v6 3/7] KVM: arm64: Handle DABT caused by LS64* instructions on unsupported memory
2025-10-24 9:08 ` [PATCH v6 3/7] KVM: arm64: Handle DABT caused by LS64* instructions on unsupported memory Zhou Wang
@ 2025-10-24 19:54 ` Oliver Upton
2025-10-25 10:11 ` Zhou Wang
0 siblings, 1 reply; 18+ messages in thread
From: Oliver Upton @ 2025-10-24 19:54 UTC (permalink / raw)
To: Zhou Wang
Cc: catalin.marinas, will, maz, joey.gouly, suzuki.poulose, yuzenghui,
linux-arm-kernel, kvmarm, yangyccccc, prime.zeng, xuwei5
Hi Zhou,
On Fri, Oct 24, 2025 at 05:08:15PM +0800, Zhou Wang wrote:
> +/**
> + * kvm_inject_dabt_excl_atomic - inject a data abort for unsupported exclusive
> + * or atomic access
> + * @vcpu: The VCPU to receive the data abort
> + * @addr: The address to report in the DFAR
> + *
> + * It is assumed that this code is called from the VCPU thread and that the
> + * VCPU therefore is not currently executing guest code.
> + */
> +void kvm_inject_dabt_excl_atomic(struct kvm_vcpu *vcpu, u64 addr)
> +{
> + u64 esr;
> +
> + /* Reuse the general DABT injection routine and modify the DFSC */
> + kvm_inject_sea(vcpu, false, addr);
This potentially injects a nested SEA which I'm not sure you want. There
still is an interaction with nested, from DDI0487L.a B2.2.6:
For the EL1&0 translation regime, if the atomic instruction is not
supported because of the memory type that is defined in the first
stage of translation, or the second stage of translation is not
enabled, then this exception is a first stage abort and is taken to
EL1. Otherwise, the exception is a second stage abort and is taken to EL2.
We don't need to worry about the S1 memory type since hardware will
handle that for us. But we do need to consider whether the guest
hypervisor enabled stage-2 translation or not and route accordingly.
int kvm_inject_nested_excl_atomic(struct kvm_vcpu *vcpu, u64 addr)
{
u64 esr = FIELD_PREP(ESR_ELx_EC_MASK, ESR_ELx_EC_DABT_LOW) |
FIELD_PREP(ESR_ELx_FSC, ESR_ELx_FSC_EXCL_ATOMIC) |
ESR_ELx_IL;
vcpu_write_sys_reg(vcpu, addr, FAR_EL2);
return kvm_inject_nested_sync(vcpu, esr);
}
int kvm_inject_excl_atomic(struct kvm_vcpu *vcpu, u64 addr)
{
if (is_nested_ctxt(vcpu) && (vcpu_read_sys_reg(vcpu, HCR_EL2) & HCR_VM))
return kvm_inject_nested_excl_atomic(vcpu, addr);
__kvm_inject_sea(vcpu, false, addr);
esr = vcpu_read_sys_reg(vcpu, exception_esr_elx(vcpu));
esr &= ~ESR_ELx_FSC;
esr |= ESR_ELx_FSC_EXCL_ATOMIC;
vcpu_write_sys_reg(vcpu, esr, exception_esr_elx(vcpu));
return 1;
}
Thanks,
Oliver
^ permalink raw reply [flat|nested] 18+ messages in thread* Re: [PATCH v6 3/7] KVM: arm64: Handle DABT caused by LS64* instructions on unsupported memory
2025-10-24 19:54 ` Oliver Upton
@ 2025-10-25 10:11 ` Zhou Wang
0 siblings, 0 replies; 18+ messages in thread
From: Zhou Wang @ 2025-10-25 10:11 UTC (permalink / raw)
To: Oliver Upton
Cc: catalin.marinas, will, maz, joey.gouly, suzuki.poulose, yuzenghui,
linux-arm-kernel, kvmarm, yangyccccc, prime.zeng, xuwei5,
Zhou Wang
On 2025/10/25 3:54, Oliver Upton wrote:
> Hi Zhou,
>
> On Fri, Oct 24, 2025 at 05:08:15PM +0800, Zhou Wang wrote:
>> +/**
>> + * kvm_inject_dabt_excl_atomic - inject a data abort for unsupported exclusive
>> + * or atomic access
>> + * @vcpu: The VCPU to receive the data abort
>> + * @addr: The address to report in the DFAR
>> + *
>> + * It is assumed that this code is called from the VCPU thread and that the
>> + * VCPU therefore is not currently executing guest code.
>> + */
>> +void kvm_inject_dabt_excl_atomic(struct kvm_vcpu *vcpu, u64 addr)
>> +{
>> + u64 esr;
>> +
>> + /* Reuse the general DABT injection routine and modify the DFSC */
>> + kvm_inject_sea(vcpu, false, addr);
>
> This potentially injects a nested SEA which I'm not sure you want. There
> still is an interaction with nested, from DDI0487L.a B2.2.6:
>
> For the EL1&0 translation regime, if the atomic instruction is not
> supported because of the memory type that is defined in the first
> stage of translation, or the second stage of translation is not
> enabled, then this exception is a first stage abort and is taken to
> EL1. Otherwise, the exception is a second stage abort and is taken to EL2.
>
> We don't need to worry about the S1 memory type since hardware will
> handle that for us. But we do need to consider whether the guest
> hypervisor enabled stage-2 translation or not and route accordingly.
>
> int kvm_inject_nested_excl_atomic(struct kvm_vcpu *vcpu, u64 addr)
> {
> u64 esr = FIELD_PREP(ESR_ELx_EC_MASK, ESR_ELx_EC_DABT_LOW) |
> FIELD_PREP(ESR_ELx_FSC, ESR_ELx_FSC_EXCL_ATOMIC) |
> ESR_ELx_IL;
>
> vcpu_write_sys_reg(vcpu, addr, FAR_EL2);
> return kvm_inject_nested_sync(vcpu, esr);
> }
>
> int kvm_inject_excl_atomic(struct kvm_vcpu *vcpu, u64 addr)
> {
> if (is_nested_ctxt(vcpu) && (vcpu_read_sys_reg(vcpu, HCR_EL2) & HCR_VM))
> return kvm_inject_nested_excl_atomic(vcpu, addr);
>
> __kvm_inject_sea(vcpu, false, addr);
> esr = vcpu_read_sys_reg(vcpu, exception_esr_elx(vcpu));
> esr &= ~ESR_ELx_FSC;
> esr |= ESR_ELx_FSC_EXCL_ATOMIC;
> vcpu_write_sys_reg(vcpu, esr, exception_esr_elx(vcpu));
> return 1;
> }
Hi Oliver,
Thanks for pointing this, will modify exception injection with
above code.
Best,
Zhou
>
> Thanks,
> Oliver
> .
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v6 4/7] arm64: Provide basic EL2 setup for FEAT_{LS64, LS64_V} usage at EL0/1
2025-10-24 9:08 [PATCH v6 0/7] Add support for FEAT_{LS64, LS64_V} and related tests Zhou Wang
` (2 preceding siblings ...)
2025-10-24 9:08 ` [PATCH v6 3/7] KVM: arm64: Handle DABT caused by LS64* instructions on unsupported memory Zhou Wang
@ 2025-10-24 9:08 ` Zhou Wang
2025-10-24 9:08 ` [PATCH v6 5/7] arm64: Add support for FEAT_{LS64, LS64_V} Zhou Wang
` (3 subsequent siblings)
7 siblings, 0 replies; 18+ messages in thread
From: Zhou Wang @ 2025-10-24 9:08 UTC (permalink / raw)
To: catalin.marinas, will, maz, oliver.upton, joey.gouly,
suzuki.poulose, yuzenghui
Cc: linux-arm-kernel, kvmarm, yangyccccc, prime.zeng, xuwei5
From: Yicong Yang <yangyicong@hisilicon.com>
Instructions introduced by FEAT_{LS64, LS64_V} is controlled by
HCRX_EL2.{EnALS, EnASR}. Configure all of these to allow usage
at EL0/1.
This doesn't mean these instructions are always available in
EL0/1 if provided. The hypervisor still have the control at
runtime.
Acked-by: Will Deacon <will@kernel.org>
Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
---
arch/arm64/include/asm/el2_setup.h | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/arch/arm64/include/asm/el2_setup.h b/arch/arm64/include/asm/el2_setup.h
index 99a7c0235e6d..9dbd0da8eee8 100644
--- a/arch/arm64/include/asm/el2_setup.h
+++ b/arch/arm64/include/asm/el2_setup.h
@@ -83,9 +83,19 @@
/* Enable GCS if supported */
mrs_s x1, SYS_ID_AA64PFR1_EL1
ubfx x1, x1, #ID_AA64PFR1_EL1_GCS_SHIFT, #4
- cbz x1, .Lset_hcrx_\@
+ cbz x1, .Lskip_gcs_hcrx_\@
orr x0, x0, #HCRX_EL2_GCSEn
+.Lskip_gcs_hcrx_\@:
+ /* Enable LS64, LS64_V if supported */
+ mrs_s x1, SYS_ID_AA64ISAR1_EL1
+ ubfx x1, x1, #ID_AA64ISAR1_EL1_LS64_SHIFT, #4
+ cbz x1, .Lset_hcrx_\@
+ orr x0, x0, #HCRX_EL2_EnALS
+ cmp x1, #ID_AA64ISAR1_EL1_LS64_LS64_V
+ b.lt .Lset_hcrx_\@
+ orr x0, x0, #HCRX_EL2_EnASR
+
.Lset_hcrx_\@:
msr_s SYS_HCRX_EL2, x0
.Lskip_hcrx_\@:
--
2.33.0
^ permalink raw reply related [flat|nested] 18+ messages in thread* [PATCH v6 5/7] arm64: Add support for FEAT_{LS64, LS64_V}
2025-10-24 9:08 [PATCH v6 0/7] Add support for FEAT_{LS64, LS64_V} and related tests Zhou Wang
` (3 preceding siblings ...)
2025-10-24 9:08 ` [PATCH v6 4/7] arm64: Provide basic EL2 setup for FEAT_{LS64, LS64_V} usage at EL0/1 Zhou Wang
@ 2025-10-24 9:08 ` Zhou Wang
2025-10-24 9:08 ` [PATCH v6 6/7] KVM: arm64: Enable FEAT_{LS64, LS64_V} in the supported guest Zhou Wang
` (2 subsequent siblings)
7 siblings, 0 replies; 18+ messages in thread
From: Zhou Wang @ 2025-10-24 9:08 UTC (permalink / raw)
To: catalin.marinas, will, maz, oliver.upton, joey.gouly,
suzuki.poulose, yuzenghui
Cc: linux-arm-kernel, kvmarm, yangyccccc, prime.zeng, xuwei5
From: Yicong Yang <yangyicong@hisilicon.com>
Armv8.7 introduces single-copy atomic 64-byte loads and stores
instructions and its variants named under FEAT_{LS64, LS64_V}.
These features are identified by ID_AA64ISAR1_EL1.LS64 and the
use of such instructions in userspace (EL0) can be trapped. In
order to support the use of corresponding instructions in userspace:
- Make ID_AA64ISAR1_EL1.LS64 visbile to userspace
- Add identifying and enabling in the cpufeature list
- Expose these support of these features to userspace through HWCAP3
and cpuinfo
ld64b/st64b (FEAT_LS64) and st64bv (FEAT_LS64_V) is intended for
special memory (device memory) so requires support by the CPU, system
and target memory location (device that support these instructions).
The HWCAP3_{LS64, LS64_V} implies the support of CPU and system (since
no identification method from system, so SoC vendors should advertise
support in the CPU if system also support them).
Otherwise for ld64b/st64b the atomicity may not be guaranteed or a
DABT will be generated, so users (probably userspace driver developer)
should make sure the target memory (device) also have the support.
For st64bv 0xffffffffffffffff will be returned as status result for
unsupported memory so user should check it.
Document the restrictions along with HWCAP3_{LS64, LS64_V}.
Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
---
Documentation/arch/arm64/booting.rst | 12 ++++++
Documentation/arch/arm64/elf_hwcaps.rst | 14 +++++++
arch/arm64/include/asm/hwcap.h | 2 +
arch/arm64/include/uapi/asm/hwcap.h | 2 +
arch/arm64/kernel/cpufeature.c | 51 +++++++++++++++++++++++++
arch/arm64/kernel/cpuinfo.c | 2 +
arch/arm64/tools/cpucaps | 2 +
7 files changed, 85 insertions(+)
diff --git a/Documentation/arch/arm64/booting.rst b/Documentation/arch/arm64/booting.rst
index e4f953839f71..2c56d76ecafb 100644
--- a/Documentation/arch/arm64/booting.rst
+++ b/Documentation/arch/arm64/booting.rst
@@ -556,6 +556,18 @@ Before jumping into the kernel, the following conditions must be met:
- MDCR_EL3.TPM (bit 6) must be initialized to 0b0
+ For CPUs with support for 64-byte loads and stores without status (FEAT_LS64):
+
+ - If the kernel is entered at EL1 and EL2 is present:
+
+ - HCRX_EL2.EnALS (bit 1) must be initialised to 0b1.
+
+ For CPUs with support for 64-byte stores with status (FEAT_LS64_V):
+
+ - If the kernel is entered at EL1 and EL2 is present:
+
+ - HCRX_EL2.EnASR (bit 2) must be initialised to 0b1.
+
The requirements described above for CPU mode, caches, MMUs, architected
timers, coherency and system registers apply to all CPUs. All CPUs must
enter the kernel in the same exception level. Where the values documented
diff --git a/Documentation/arch/arm64/elf_hwcaps.rst b/Documentation/arch/arm64/elf_hwcaps.rst
index a15df4956849..b86059bc288b 100644
--- a/Documentation/arch/arm64/elf_hwcaps.rst
+++ b/Documentation/arch/arm64/elf_hwcaps.rst
@@ -444,6 +444,20 @@ HWCAP3_MTE_STORE_ONLY
HWCAP3_LSFE
Functionality implied by ID_AA64ISAR3_EL1.LSFE == 0b0001
+HWCAP3_LS64
+ Functionality implied by ID_AA64ISAR1_EL1.LS64 == 0b0001. Note that
+ the function of instruction ld64b/st64b requires support by CPU, system
+ and target (device) memory location and HWCAP3_LS64 implies the support
+ of CPU. User should only use ld64b/st64b on supported target (device)
+ memory location, otherwise fallback to the non-atomic alternatives.
+
+HWCAP3_LS64_V
+ Functionality implied by ID_AA64ISAR1_EL1.LS64 == 0b0010. Same to
+ HWCAP3_LS64 that HWCAP3_LS64_V implies CPU's support of instruction
+ st64bv but also requires the support from the system and target (device)
+ memory location. st64bv supports return status result and 0xFFFFFFFFFFFFFFFF
+ will be returned for unsupported memory location.
+
4. Unused AT_HWCAP bits
-----------------------
diff --git a/arch/arm64/include/asm/hwcap.h b/arch/arm64/include/asm/hwcap.h
index 6d567265467c..3c0804fb3435 100644
--- a/arch/arm64/include/asm/hwcap.h
+++ b/arch/arm64/include/asm/hwcap.h
@@ -179,6 +179,8 @@
#define KERNEL_HWCAP_MTE_FAR __khwcap3_feature(MTE_FAR)
#define KERNEL_HWCAP_MTE_STORE_ONLY __khwcap3_feature(MTE_STORE_ONLY)
#define KERNEL_HWCAP_LSFE __khwcap3_feature(LSFE)
+#define KERNEL_HWCAP_LS64 __khwcap3_feature(LS64)
+#define KERNEL_HWCAP_LS64_V __khwcap3_feature(LS64_V)
/*
* This yields a mask that user programs can use to figure out what
diff --git a/arch/arm64/include/uapi/asm/hwcap.h b/arch/arm64/include/uapi/asm/hwcap.h
index 575564ecdb0b..79bc77425b82 100644
--- a/arch/arm64/include/uapi/asm/hwcap.h
+++ b/arch/arm64/include/uapi/asm/hwcap.h
@@ -146,5 +146,7 @@
#define HWCAP3_MTE_FAR (1UL << 0)
#define HWCAP3_MTE_STORE_ONLY (1UL << 1)
#define HWCAP3_LSFE (1UL << 2)
+#define HWCAP3_LS64 (1UL << 3)
+#define HWCAP3_LS64_V (1UL << 4)
#endif /* _UAPI__ASM_HWCAP_H */
diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c
index 5ed401ff79e3..dcc5ba620a7e 100644
--- a/arch/arm64/kernel/cpufeature.c
+++ b/arch/arm64/kernel/cpufeature.c
@@ -239,6 +239,7 @@ static const struct arm64_ftr_bits ftr_id_aa64isar0[] = {
};
static const struct arm64_ftr_bits ftr_id_aa64isar1[] = {
+ ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ISAR1_EL1_LS64_SHIFT, 4, 0),
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ISAR1_EL1_XS_SHIFT, 4, 0),
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ISAR1_EL1_I8MM_SHIFT, 4, 0),
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ISAR1_EL1_DGH_SHIFT, 4, 0),
@@ -2259,6 +2260,38 @@ static void cpu_enable_e0pd(struct arm64_cpu_capabilities const *cap)
}
#endif /* CONFIG_ARM64_E0PD */
+static bool has_ls64(const struct arm64_cpu_capabilities *entry, int __unused)
+{
+ u64 ls64;
+
+ ls64 = cpuid_feature_extract_field(__read_sysreg_by_encoding(entry->sys_reg),
+ entry->field_pos, entry->sign);
+
+ if (ls64 == ID_AA64ISAR1_EL1_LS64_NI ||
+ ls64 > ID_AA64ISAR1_EL1_LS64_LS64_ACCDATA)
+ return false;
+
+ if (entry->capability == ARM64_HAS_LS64 &&
+ ls64 >= ID_AA64ISAR1_EL1_LS64_LS64)
+ return true;
+
+ if (entry->capability == ARM64_HAS_LS64_V &&
+ ls64 >= ID_AA64ISAR1_EL1_LS64_LS64_V)
+ return true;
+
+ return false;
+}
+
+static void cpu_enable_ls64(struct arm64_cpu_capabilities const *cap)
+{
+ sysreg_clear_set(sctlr_el1, SCTLR_EL1_EnALS, SCTLR_EL1_EnALS);
+}
+
+static void cpu_enable_ls64_v(struct arm64_cpu_capabilities const *cap)
+{
+ sysreg_clear_set(sctlr_el1, SCTLR_EL1_EnASR, SCTLR_EL1_EnASR);
+}
+
#ifdef CONFIG_ARM64_PSEUDO_NMI
static bool can_use_gic_priorities(const struct arm64_cpu_capabilities *entry,
int scope)
@@ -3088,6 +3121,22 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
.capability = ARM64_HAS_GICV5_LEGACY,
.matches = test_has_gicv5_legacy,
},
+ {
+ .desc = "LS64",
+ .capability = ARM64_HAS_LS64,
+ .type = ARM64_CPUCAP_SYSTEM_FEATURE,
+ .matches = has_ls64,
+ .cpu_enable = cpu_enable_ls64,
+ ARM64_CPUID_FIELDS(ID_AA64ISAR1_EL1, LS64, LS64)
+ },
+ {
+ .desc = "LS64_V",
+ .capability = ARM64_HAS_LS64_V,
+ .type = ARM64_CPUCAP_SYSTEM_FEATURE,
+ .matches = has_ls64,
+ .cpu_enable = cpu_enable_ls64_v,
+ ARM64_CPUID_FIELDS(ID_AA64ISAR1_EL1, LS64, LS64_V)
+ },
{},
};
@@ -3207,6 +3256,8 @@ static const struct arm64_cpu_capabilities arm64_elf_hwcaps[] = {
HWCAP_CAP(ID_AA64ISAR1_EL1, BF16, EBF16, CAP_HWCAP, KERNEL_HWCAP_EBF16),
HWCAP_CAP(ID_AA64ISAR1_EL1, DGH, IMP, CAP_HWCAP, KERNEL_HWCAP_DGH),
HWCAP_CAP(ID_AA64ISAR1_EL1, I8MM, IMP, CAP_HWCAP, KERNEL_HWCAP_I8MM),
+ HWCAP_CAP(ID_AA64ISAR1_EL1, LS64, LS64, CAP_HWCAP, KERNEL_HWCAP_LS64),
+ HWCAP_CAP(ID_AA64ISAR1_EL1, LS64, LS64_V, CAP_HWCAP, KERNEL_HWCAP_LS64_V),
HWCAP_CAP(ID_AA64ISAR2_EL1, LUT, IMP, CAP_HWCAP, KERNEL_HWCAP_LUT),
HWCAP_CAP(ID_AA64ISAR3_EL1, FAMINMAX, IMP, CAP_HWCAP, KERNEL_HWCAP_FAMINMAX),
HWCAP_CAP(ID_AA64ISAR3_EL1, LSFE, IMP, CAP_HWCAP, KERNEL_HWCAP_LSFE),
diff --git a/arch/arm64/kernel/cpuinfo.c b/arch/arm64/kernel/cpuinfo.c
index c44e6d94f5de..e8ae0a1885e0 100644
--- a/arch/arm64/kernel/cpuinfo.c
+++ b/arch/arm64/kernel/cpuinfo.c
@@ -81,6 +81,8 @@ static const char *const hwcap_str[] = {
[KERNEL_HWCAP_PACA] = "paca",
[KERNEL_HWCAP_PACG] = "pacg",
[KERNEL_HWCAP_GCS] = "gcs",
+ [KERNEL_HWCAP_LS64] = "ls64",
+ [KERNEL_HWCAP_LS64_V] = "ls64_v",
[KERNEL_HWCAP_DCPODP] = "dcpodp",
[KERNEL_HWCAP_SVE2] = "sve2",
[KERNEL_HWCAP_SVEAES] = "sveaes",
diff --git a/arch/arm64/tools/cpucaps b/arch/arm64/tools/cpucaps
index 1b32c1232d28..9aae80ac2280 100644
--- a/arch/arm64/tools/cpucaps
+++ b/arch/arm64/tools/cpucaps
@@ -45,6 +45,8 @@ HAS_HCX
HAS_LDAPR
HAS_LPA2
HAS_LSE_ATOMICS
+HAS_LS64
+HAS_LS64_V
HAS_MOPS
HAS_NESTED_VIRT
HAS_BBML2_NOABORT
--
2.33.0
^ permalink raw reply related [flat|nested] 18+ messages in thread* [PATCH v6 6/7] KVM: arm64: Enable FEAT_{LS64, LS64_V} in the supported guest
2025-10-24 9:08 [PATCH v6 0/7] Add support for FEAT_{LS64, LS64_V} and related tests Zhou Wang
` (4 preceding siblings ...)
2025-10-24 9:08 ` [PATCH v6 5/7] arm64: Add support for FEAT_{LS64, LS64_V} Zhou Wang
@ 2025-10-24 9:08 ` Zhou Wang
2025-10-24 9:08 ` [PATCH v6 7/7] kselftest/arm64: Add HWCAP test for FEAT_{LS64, LS64_V} Zhou Wang
2025-10-24 16:22 ` [PATCH v6 0/7] Add support for FEAT_{LS64, LS64_V} and related tests Arnd Bergmann
7 siblings, 0 replies; 18+ messages in thread
From: Zhou Wang @ 2025-10-24 9:08 UTC (permalink / raw)
To: catalin.marinas, will, maz, oliver.upton, joey.gouly,
suzuki.poulose, yuzenghui
Cc: linux-arm-kernel, kvmarm, yangyccccc, prime.zeng, xuwei5
From: Yicong Yang <yangyicong@hisilicon.com>
Using FEAT_{LS64, LS64_V} instructions in a guest is also controlled
by HCRX_EL2.{EnALS, EnASR}. Enable it if guest has related feature.
Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
---
arch/arm64/include/asm/kvm_emulate.h | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/arch/arm64/include/asm/kvm_emulate.h b/arch/arm64/include/asm/kvm_emulate.h
index 759d8c45684d..754ce9896249 100644
--- a/arch/arm64/include/asm/kvm_emulate.h
+++ b/arch/arm64/include/asm/kvm_emulate.h
@@ -695,6 +695,12 @@ static inline void vcpu_set_hcrx(struct kvm_vcpu *vcpu)
if (kvm_has_sctlr2(kvm))
vcpu->arch.hcrx_el2 |= HCRX_EL2_SCTLR2En;
+
+ if (kvm_has_feat(kvm, ID_AA64ISAR1_EL1, LS64, LS64))
+ vcpu->arch.hcrx_el2 |= HCRX_EL2_EnALS;
+
+ if (kvm_has_feat(kvm, ID_AA64ISAR1_EL1, LS64, LS64_V))
+ vcpu->arch.hcrx_el2 |= HCRX_EL2_EnASR;
}
}
#endif /* __ARM64_KVM_EMULATE_H__ */
--
2.33.0
^ permalink raw reply related [flat|nested] 18+ messages in thread* [PATCH v6 7/7] kselftest/arm64: Add HWCAP test for FEAT_{LS64, LS64_V}
2025-10-24 9:08 [PATCH v6 0/7] Add support for FEAT_{LS64, LS64_V} and related tests Zhou Wang
` (5 preceding siblings ...)
2025-10-24 9:08 ` [PATCH v6 6/7] KVM: arm64: Enable FEAT_{LS64, LS64_V} in the supported guest Zhou Wang
@ 2025-10-24 9:08 ` Zhou Wang
2025-10-24 16:18 ` Arnd Bergmann
2025-10-24 16:22 ` [PATCH v6 0/7] Add support for FEAT_{LS64, LS64_V} and related tests Arnd Bergmann
7 siblings, 1 reply; 18+ messages in thread
From: Zhou Wang @ 2025-10-24 9:08 UTC (permalink / raw)
To: catalin.marinas, will, maz, oliver.upton, joey.gouly,
suzuki.poulose, yuzenghui
Cc: linux-arm-kernel, kvmarm, yangyccccc, prime.zeng, xuwei5
From: Yicong Yang <yangyicong@hisilicon.com>
Add tests for FEAT_{LS64, LS64_V}. Issue related instructions
if feature presents, no SIGILL should be received. When such
instructions operate on Device memory or non-cacheable memory,
we may received a SIGBUS during the test (w/o FEAT_LS64WB).
Just ignore it since we only tested whether the instruction
itself can be issued as expected on platforms declaring the
support of such features.
Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
---
tools/testing/selftests/arm64/abi/hwcap.c | 90 +++++++++++++++++++++++
1 file changed, 90 insertions(+)
diff --git a/tools/testing/selftests/arm64/abi/hwcap.c b/tools/testing/selftests/arm64/abi/hwcap.c
index 3b96d090c5eb..67973eb2fa44 100644
--- a/tools/testing/selftests/arm64/abi/hwcap.c
+++ b/tools/testing/selftests/arm64/abi/hwcap.c
@@ -11,6 +11,8 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <linux/auxvec.h>
+#include <linux/compiler.h>
#include <sys/auxv.h>
#include <sys/prctl.h>
#include <asm/hwcap.h>
@@ -595,6 +597,78 @@ static void lrcpc3_sigill(void)
: "=r" (data0), "=r" (data1) : "r" (src) :);
}
+static void ignore_signal(int sig, siginfo_t *info, void *context)
+{
+ ucontext_t *uc = context;
+
+ uc->uc_mcontext.pc += 4;
+}
+
+static void ls64_sigill(void)
+{
+ struct sigaction ign, old;
+ char src[64] __aligned(64) = { 1 };
+
+ /*
+ * LS64, LS64_V require target memory to be Device/Non-cacheable (if
+ * FEAT_LS64WB not supported) and the completer supports these
+ * instructions, otherwise we'll receive a SIGBUS. Since we are only
+ * testing the ABI here, so just ignore the SIGBUS and see if we can
+ * execute the instructions without receiving a SIGILL. Restore the
+ * handler of SIGBUS after this test.
+ */
+ ign.sa_sigaction = ignore_signal;
+ ign.sa_flags = SA_SIGINFO | SA_RESTART;
+ sigemptyset(&ign.sa_mask);
+ sigaction(SIGBUS, &ign, &old);
+
+ register void *xn asm ("x8") = src;
+ register u64 xt_1 asm ("x0");
+ register u64 __maybe_unused xt_2 asm ("x1");
+ register u64 __maybe_unused xt_3 asm ("x2");
+ register u64 __maybe_unused xt_4 asm ("x3");
+ register u64 __maybe_unused xt_5 asm ("x4");
+ register u64 __maybe_unused xt_6 asm ("x5");
+ register u64 __maybe_unused xt_7 asm ("x6");
+ register u64 __maybe_unused xt_8 asm ("x7");
+
+ /* LD64B x0, [x8] */
+ asm volatile(".inst 0xf83fd100" : "=r" (xt_1) : "r" (xn));
+
+ /* ST64B x0, [x8] */
+ asm volatile(".inst 0xf83f9100" : : "r" (xt_1), "r" (xn));
+
+ sigaction(SIGBUS, &old, NULL);
+}
+
+static void ls64_v_sigill(void)
+{
+ struct sigaction ign, old;
+ char dst[64] __aligned(64);
+
+ /* See comment in ls64_sigill() */
+ ign.sa_sigaction = ignore_signal;
+ ign.sa_flags = SA_SIGINFO | SA_RESTART;
+ sigemptyset(&ign.sa_mask);
+ sigaction(SIGBUS, &ign, &old);
+
+ register void *xn asm ("x8") = dst;
+ register u64 xt_1 asm ("x0") = 1;
+ register u64 __maybe_unused xt_2 asm ("x1") = 2;
+ register u64 __maybe_unused xt_3 asm ("x2") = 3;
+ register u64 __maybe_unused xt_4 asm ("x3") = 4;
+ register u64 __maybe_unused xt_5 asm ("x4") = 5;
+ register u64 __maybe_unused xt_6 asm ("x5") = 6;
+ register u64 __maybe_unused xt_7 asm ("x6") = 7;
+ register u64 __maybe_unused xt_8 asm ("x7") = 8;
+ register u64 st asm ("x9");
+
+ /* ST64BV x9, x0, [x8] */
+ asm volatile(".inst 0xf829b100" : "=r" (st) : "r" (xt_1), "r" (xn));
+
+ sigaction(SIGBUS, &old, NULL);
+}
+
static const struct hwcap_data {
const char *name;
unsigned long at_hwcap;
@@ -1134,6 +1208,22 @@ static const struct hwcap_data {
.hwcap_bit = HWCAP3_MTE_STORE_ONLY,
.cpuinfo = "mtestoreonly",
},
+ {
+ .name = "LS64",
+ .at_hwcap = AT_HWCAP3,
+ .hwcap_bit = HWCAP3_LS64,
+ .cpuinfo = "ls64",
+ .sigill_fn = ls64_sigill,
+ .sigill_reliable = true,
+ },
+ {
+ .name = "LS64_V",
+ .at_hwcap = AT_HWCAP3,
+ .hwcap_bit = HWCAP3_LS64_V,
+ .cpuinfo = "ls64_v",
+ .sigill_fn = ls64_v_sigill,
+ .sigill_reliable = true,
+ },
};
typedef void (*sighandler_fn)(int, siginfo_t *, void *);
--
2.33.0
^ permalink raw reply related [flat|nested] 18+ messages in thread* Re: [PATCH v6 7/7] kselftest/arm64: Add HWCAP test for FEAT_{LS64, LS64_V}
2025-10-24 9:08 ` [PATCH v6 7/7] kselftest/arm64: Add HWCAP test for FEAT_{LS64, LS64_V} Zhou Wang
@ 2025-10-24 16:18 ` Arnd Bergmann
2025-10-25 10:06 ` Zhou Wang
0 siblings, 1 reply; 18+ messages in thread
From: Arnd Bergmann @ 2025-10-24 16:18 UTC (permalink / raw)
To: Zhou Wang, Catalin Marinas, Will Deacon, Marc Zyngier,
Oliver Upton, Joey Gouly, Suzuki K Poulose, Zenghui Yu
Cc: linux-arm-kernel, kvmarm, yangyccccc, prime.zeng, xuwei5
On Fri, Oct 24, 2025, at 11:08, Zhou Wang wrote:
> +static void ls64_sigill(void)
> +{
> + struct sigaction ign, old;
> + char src[64] __aligned(64) = { 1 };
> +
> + /*
> + * LS64, LS64_V require target memory to be Device/Non-cacheable (if
> + * FEAT_LS64WB not supported) and the completer supports these
> + * instructions, otherwise we'll receive a SIGBUS. Since we are only
> + * testing the ABI here, so just ignore the SIGBUS and see if we can
> + * execute the instructions without receiving a SIGILL. Restore the
> + * handler of SIGBUS after this test.
> + */
> + ign.sa_sigaction = ignore_signal;
> + ign.sa_flags = SA_SIGINFO | SA_RESTART;
> + sigemptyset(&ign.sa_mask);
> + sigaction(SIGBUS, &ign, &old);
> +
> + register void *xn asm ("x8") = src;
> + register u64 xt_1 asm ("x0");
> + register u64 __maybe_unused xt_2 asm ("x1");
> + register u64 __maybe_unused xt_3 asm ("x2");
> + register u64 __maybe_unused xt_4 asm ("x3");
> + register u64 __maybe_unused xt_5 asm ("x4");
> + register u64 __maybe_unused xt_6 asm ("x5");
> + register u64 __maybe_unused xt_7 asm ("x6");
> + register u64 __maybe_unused xt_8 asm ("x7");
> +
> + /* LD64B x0, [x8] */
> + asm volatile(".inst 0xf83fd100" : "=r" (xt_1) : "r" (xn));
Relying on the __maybe_unused register declaration seems a little
fragile, can you change this so that the inline asm specifies
all of the registers correctly as input/output arguments?
> +static void ls64_v_sigill(void)
> +{
> + struct sigaction ign, old;
> + char dst[64] __aligned(64);
> +
> + /* See comment in ls64_sigill() */
> + ign.sa_sigaction = ignore_signal;
> + ign.sa_flags = SA_SIGINFO | SA_RESTART;
> + sigemptyset(&ign.sa_mask);
> + sigaction(SIGBUS, &ign, &old);
> +
> + register void *xn asm ("x8") = dst;
> + register u64 xt_1 asm ("x0") = 1;
> + register u64 __maybe_unused xt_2 asm ("x1") = 2;
> + register u64 __maybe_unused xt_3 asm ("x2") = 3;
> + register u64 __maybe_unused xt_4 asm ("x3") = 4;
> + register u64 __maybe_unused xt_5 asm ("x4") = 5;
> + register u64 __maybe_unused xt_6 asm ("x5") = 6;
> + register u64 __maybe_unused xt_7 asm ("x6") = 7;
> + register u64 __maybe_unused xt_8 asm ("x7") = 8;
> + register u64 st asm ("x9");
> +
> + /* ST64BV x9, x0, [x8] */
> + asm volatile(".inst 0xf829b100" : "=r" (st) : "r" (xt_1), "r" (xn));
> +
> + sigaction(SIGBUS, &old, NULL);
Is ST64BV expected to cause SIGBUS here, or should it return the
0xffffffffffffffff output to indicate an unsupported memory area?
Arnd
^ permalink raw reply [flat|nested] 18+ messages in thread* Re: [PATCH v6 7/7] kselftest/arm64: Add HWCAP test for FEAT_{LS64, LS64_V}
2025-10-24 16:18 ` Arnd Bergmann
@ 2025-10-25 10:06 ` Zhou Wang
2025-10-26 21:56 ` Arnd Bergmann
2025-10-27 2:50 ` Zhou Wang
0 siblings, 2 replies; 18+ messages in thread
From: Zhou Wang @ 2025-10-25 10:06 UTC (permalink / raw)
To: Arnd Bergmann, Catalin Marinas, Will Deacon, Marc Zyngier,
Oliver Upton, Joey Gouly, Suzuki K Poulose, Zenghui Yu
Cc: linux-arm-kernel, kvmarm, yangyccccc, prime.zeng, xuwei5,
Zhou Wang
On 2025/10/25 0:18, Arnd Bergmann wrote:
> On Fri, Oct 24, 2025, at 11:08, Zhou Wang wrote:
>
>> +static void ls64_sigill(void)
>> +{
>> + struct sigaction ign, old;
>> + char src[64] __aligned(64) = { 1 };
>> +
>> + /*
>> + * LS64, LS64_V require target memory to be Device/Non-cacheable (if
>> + * FEAT_LS64WB not supported) and the completer supports these
>> + * instructions, otherwise we'll receive a SIGBUS. Since we are only
>> + * testing the ABI here, so just ignore the SIGBUS and see if we can
>> + * execute the instructions without receiving a SIGILL. Restore the
>> + * handler of SIGBUS after this test.
>> + */
>> + ign.sa_sigaction = ignore_signal;
>> + ign.sa_flags = SA_SIGINFO | SA_RESTART;
>> + sigemptyset(&ign.sa_mask);
>> + sigaction(SIGBUS, &ign, &old);
>> +
>> + register void *xn asm ("x8") = src;
>> + register u64 xt_1 asm ("x0");
>> + register u64 __maybe_unused xt_2 asm ("x1");
>> + register u64 __maybe_unused xt_3 asm ("x2");
>> + register u64 __maybe_unused xt_4 asm ("x3");
>> + register u64 __maybe_unused xt_5 asm ("x4");
>> + register u64 __maybe_unused xt_6 asm ("x5");
>> + register u64 __maybe_unused xt_7 asm ("x6");
>> + register u64 __maybe_unused xt_8 asm ("x7");
>> +
>> + /* LD64B x0, [x8] */
>> + asm volatile(".inst 0xf83fd100" : "=r" (xt_1) : "r" (xn));
>
> Relying on the __maybe_unused register declaration seems a little
> fragile, can you change this so that the inline asm specifies
> all of the registers correctly as input/output arguments?
Seems we can remove xt_2 ... xt8, but add x1 ... x7 to asm clobber list,
something like:
asm volatile(".inst 0xf83fd100" : "=r" (xt_1) : "r" (xn)
: "x1", "x2", "x3", "x4", "x5", "x6", "x7");
>> +static void ls64_v_sigill(void)
>> +{
>> + struct sigaction ign, old;
>> + char dst[64] __aligned(64);
>> +
>> + /* See comment in ls64_sigill() */
>> + ign.sa_sigaction = ignore_signal;
>> + ign.sa_flags = SA_SIGINFO | SA_RESTART;
>> + sigemptyset(&ign.sa_mask);
>> + sigaction(SIGBUS, &ign, &old);
>> +
>> + register void *xn asm ("x8") = dst;
>> + register u64 xt_1 asm ("x0") = 1;
>> + register u64 __maybe_unused xt_2 asm ("x1") = 2;
>> + register u64 __maybe_unused xt_3 asm ("x2") = 3;
>> + register u64 __maybe_unused xt_4 asm ("x3") = 4;
>> + register u64 __maybe_unused xt_5 asm ("x4") = 5;
>> + register u64 __maybe_unused xt_6 asm ("x5") = 6;
>> + register u64 __maybe_unused xt_7 asm ("x6") = 7;
>> + register u64 __maybe_unused xt_8 asm ("x7") = 8;
>> + register u64 st asm ("x9");
>> +
>> + /* ST64BV x9, x0, [x8] */
>> + asm volatile(".inst 0xf829b100" : "=r" (st) : "r" (xt_1), "r" (xn));
>> +
>> + sigaction(SIGBUS, &old, NULL);
>
> Is ST64BV expected to cause SIGBUS here, or should it return the
> 0xffffffffffffffff output to indicate an unsupported memory area?
I think it should return 0xffffffffffffffff without an exception,
will modify above test codes in next version.
Best,
Zhou
>
> Arnd
> .
^ permalink raw reply [flat|nested] 18+ messages in thread* Re: [PATCH v6 7/7] kselftest/arm64: Add HWCAP test for FEAT_{LS64, LS64_V}
2025-10-25 10:06 ` Zhou Wang
@ 2025-10-26 21:56 ` Arnd Bergmann
2025-10-27 2:50 ` Zhou Wang
1 sibling, 0 replies; 18+ messages in thread
From: Arnd Bergmann @ 2025-10-26 21:56 UTC (permalink / raw)
To: Zhou Wang, Catalin Marinas, Will Deacon, Marc Zyngier,
Oliver Upton, Joey Gouly, Suzuki K Poulose, Zenghui Yu
Cc: linux-arm-kernel, kvmarm, Yicong Yang, prime.zeng, xuwei5
On Sat, Oct 25, 2025, at 12:06, Zhou Wang wrote:
> On 2025/10/25 0:18, Arnd Bergmann wrote:
>> On Fri, Oct 24, 2025, at 11:08, Zhou Wang wrote:
>>> + register void *xn asm ("x8") = src;
>>> + register u64 xt_1 asm ("x0");
>>> + register u64 __maybe_unused xt_2 asm ("x1");
>>> + register u64 __maybe_unused xt_3 asm ("x2");
>>> + register u64 __maybe_unused xt_4 asm ("x3");
>>> + register u64 __maybe_unused xt_5 asm ("x4");
>>> + register u64 __maybe_unused xt_6 asm ("x5");
>>> + register u64 __maybe_unused xt_7 asm ("x6");
>>> + register u64 __maybe_unused xt_8 asm ("x7");
>>> +
>>> + /* LD64B x0, [x8] */
>>> + asm volatile(".inst 0xf83fd100" : "=r" (xt_1) : "r" (xn));
>>
>> Relying on the __maybe_unused register declaration seems a little
>> fragile, can you change this so that the inline asm specifies
>> all of the registers correctly as input/output arguments?
>
> Seems we can remove xt_2 ... xt8, but add x1 ... x7 to asm clobber list,
> something like:
>
> asm volatile(".inst 0xf83fd100" : "=r" (xt_1) : "r" (xn)
> : "x1", "x2", "x3", "x4", "x5", "x6", "x7");
I was thinking you'd define the function in a way that would
all arguments passed the way one would for a caller that
actually cares about them, but for the test case I guess
a clobber works just as well.
>>> +
>>> + /* ST64BV x9, x0, [x8] */
>>> + asm volatile(".inst 0xf829b100" : "=r" (st) : "r" (xt_1), "r" (xn));
>>> +
>>> + sigaction(SIGBUS, &old, NULL);
>>
>> Is ST64BV expected to cause SIGBUS here, or should it return the
>> 0xffffffffffffffff output to indicate an unsupported memory area?
>
> I think it should return 0xffffffffffffffff without an exception,
> will modify above test codes in next version.
Ok.
Arnd
^ permalink raw reply [flat|nested] 18+ messages in thread* Re: [PATCH v6 7/7] kselftest/arm64: Add HWCAP test for FEAT_{LS64, LS64_V}
2025-10-25 10:06 ` Zhou Wang
2025-10-26 21:56 ` Arnd Bergmann
@ 2025-10-27 2:50 ` Zhou Wang
2025-10-27 6:57 ` Arnd Bergmann
1 sibling, 1 reply; 18+ messages in thread
From: Zhou Wang @ 2025-10-27 2:50 UTC (permalink / raw)
To: Arnd Bergmann, Catalin Marinas, Will Deacon, Marc Zyngier,
Oliver Upton, Joey Gouly, Suzuki K Poulose, Zenghui Yu
Cc: linux-arm-kernel, kvmarm, yangyccccc, prime.zeng, xuwei5
On 2025/10/25 18:06, Zhou Wang wrote:
> On 2025/10/25 0:18, Arnd Bergmann wrote:
>> On Fri, Oct 24, 2025, at 11:08, Zhou Wang wrote:
>>
>>> +static void ls64_sigill(void)
>>> +{
>>> + struct sigaction ign, old;
>>> + char src[64] __aligned(64) = { 1 };
>>> +
>>> + /*
>>> + * LS64, LS64_V require target memory to be Device/Non-cacheable (if
>>> + * FEAT_LS64WB not supported) and the completer supports these
>>> + * instructions, otherwise we'll receive a SIGBUS. Since we are only
>>> + * testing the ABI here, so just ignore the SIGBUS and see if we can
>>> + * execute the instructions without receiving a SIGILL. Restore the
>>> + * handler of SIGBUS after this test.
>>> + */
>>> + ign.sa_sigaction = ignore_signal;
>>> + ign.sa_flags = SA_SIGINFO | SA_RESTART;
>>> + sigemptyset(&ign.sa_mask);
>>> + sigaction(SIGBUS, &ign, &old);
>>> +
>>> + register void *xn asm ("x8") = src;
>>> + register u64 xt_1 asm ("x0");
>>> + register u64 __maybe_unused xt_2 asm ("x1");
>>> + register u64 __maybe_unused xt_3 asm ("x2");
>>> + register u64 __maybe_unused xt_4 asm ("x3");
>>> + register u64 __maybe_unused xt_5 asm ("x4");
>>> + register u64 __maybe_unused xt_6 asm ("x5");
>>> + register u64 __maybe_unused xt_7 asm ("x6");
>>> + register u64 __maybe_unused xt_8 asm ("x7");
>>> +
>>> + /* LD64B x0, [x8] */
>>> + asm volatile(".inst 0xf83fd100" : "=r" (xt_1) : "r" (xn));
>>
>> Relying on the __maybe_unused register declaration seems a little
>> fragile, can you change this so that the inline asm specifies
>> all of the registers correctly as input/output arguments?
>
> Seems we can remove xt_2 ... xt8, but add x1 ... x7 to asm clobber list,
> something like:
>
> asm volatile(".inst 0xf83fd100" : "=r" (xt_1) : "r" (xn)
> : "x1", "x2", "x3", "x4", "x5", "x6", "x7");
>
>>> +static void ls64_v_sigill(void)
>>> +{
>>> + struct sigaction ign, old;
>>> + char dst[64] __aligned(64);
>>> +
>>> + /* See comment in ls64_sigill() */
>>> + ign.sa_sigaction = ignore_signal;
>>> + ign.sa_flags = SA_SIGINFO | SA_RESTART;
>>> + sigemptyset(&ign.sa_mask);
>>> + sigaction(SIGBUS, &ign, &old);
>>> +
>>> + register void *xn asm ("x8") = dst;
>>> + register u64 xt_1 asm ("x0") = 1;
>>> + register u64 __maybe_unused xt_2 asm ("x1") = 2;
>>> + register u64 __maybe_unused xt_3 asm ("x2") = 3;
>>> + register u64 __maybe_unused xt_4 asm ("x3") = 4;
>>> + register u64 __maybe_unused xt_5 asm ("x4") = 5;
>>> + register u64 __maybe_unused xt_6 asm ("x5") = 6;
>>> + register u64 __maybe_unused xt_7 asm ("x6") = 7;
>>> + register u64 __maybe_unused xt_8 asm ("x7") = 8;
>>> + register u64 st asm ("x9");
>>> +
>>> + /* ST64BV x9, x0, [x8] */
>>> + asm volatile(".inst 0xf829b100" : "=r" (st) : "r" (xt_1), "r" (xn));
>>> +
>>> + sigaction(SIGBUS, &old, NULL);
>>
>> Is ST64BV expected to cause SIGBUS here, or should it return the
>> 0xffffffffffffffff output to indicate an unsupported memory area?
>
> I think it should return 0xffffffffffffffff without an exception,
My understanding above is wrong.
As mentioned in C3.2.6 of ARM spec L.b:
1. "When the instructions access a memory type that is not one of the following,
a data abort for unsupported Exclusive or atomic access is generated"
2. "If the target memory location does not support the ST64BV or ST64BV0
instructions, then the register specified by <Xs> is set to 0xFFFFFFFF_FFFFFFFF"
Here the test code is the first case, so a fault should be triggered.
Best,
Zhou
> will modify above test codes in next version.
>
> Best,
> Zhou
>
>>
>> Arnd
>> .
> .
^ permalink raw reply [flat|nested] 18+ messages in thread* Re: [PATCH v6 7/7] kselftest/arm64: Add HWCAP test for FEAT_{LS64, LS64_V}
2025-10-27 2:50 ` Zhou Wang
@ 2025-10-27 6:57 ` Arnd Bergmann
0 siblings, 0 replies; 18+ messages in thread
From: Arnd Bergmann @ 2025-10-27 6:57 UTC (permalink / raw)
To: Zhou Wang, Catalin Marinas, Will Deacon, Marc Zyngier,
Oliver Upton, Joey Gouly, Suzuki K Poulose, Zenghui Yu
Cc: linux-arm-kernel, kvmarm, Yicong Yang, prime.zeng, xuwei5
On Mon, Oct 27, 2025, at 03:50, Zhou Wang wrote:
> On 2025/10/25 18:06, Zhou Wang wrote:
>> On 2025/10/25 0:18, Arnd Bergmann wrote:
>>> On Fri, Oct 24, 2025, at 11:08, Zhou Wang wrote:
>>>
>>> Is ST64BV expected to cause SIGBUS here, or should it return the
>>> 0xffffffffffffffff output to indicate an unsupported memory area?
>>
>> I think it should return 0xffffffffffffffff without an exception,
>
> My understanding above is wrong.
>
> As mentioned in C3.2.6 of ARM spec L.b:
>
> 1. "When the instructions access a memory type that is not one of the following,
> a data abort for unsupported Exclusive or atomic access is generated"
>
> 2. "If the target memory location does not support the ST64BV or ST64BV0
> instructions, then the register specified by <Xs> is set to
> 0xFFFFFFFF_FFFFFFFF"
>
> Here the test code is the first case, so a fault should be triggered.
I see, my mistake.
Arnd
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v6 0/7] Add support for FEAT_{LS64, LS64_V} and related tests
2025-10-24 9:08 [PATCH v6 0/7] Add support for FEAT_{LS64, LS64_V} and related tests Zhou Wang
` (6 preceding siblings ...)
2025-10-24 9:08 ` [PATCH v6 7/7] kselftest/arm64: Add HWCAP test for FEAT_{LS64, LS64_V} Zhou Wang
@ 2025-10-24 16:22 ` Arnd Bergmann
2025-10-25 8:42 ` Zhou Wang
7 siblings, 1 reply; 18+ messages in thread
From: Arnd Bergmann @ 2025-10-24 16:22 UTC (permalink / raw)
To: Zhou Wang, Catalin Marinas, Will Deacon, Marc Zyngier,
Oliver Upton, Joey Gouly, Suzuki K Poulose, Zenghui Yu
Cc: linux-arm-kernel, kvmarm, yangyccccc, prime.zeng, xuwei5
On Fri, Oct 24, 2025, at 11:08, Zhou Wang wrote:
> Armv8.7 introduces single-copy atomic 64-byte loads and stores
> instructions and its variants named under FEAT_{LS64, LS64_V}.
> Add support for Armv8.7 FEAT_{LS64, LS64_V}:
> - Add identifying and enabling in the cpufeature list
> - Expose the support of these features to userspace through HWCAP3 and cpuinfo
> - Add related hwcap test
> - Handle the trap of unsupported memory (normal/uncacheable) access in a VM
>
> A real scenario for this feature is that the userspace driver can make use of
> this to implement direct WQE (workqueue entry) - a mechanism to fill WQE
> directly into the hardware.
>
> Picked Marc's 2 patches form [1] for handling the LS64 trap in a VM on emulated
> MMIO and the introduce of KVM_EXIT_ARM_LDST64B.
>
> As Yicong has left HiSilicon, I will help to continue to upstream this patchset.
>
> [1]
> https://lore.kernel.org/linux-arm-kernel/20240815125959.2097734-1-maz@kernel.org/
The patches all look reasonable to me, but I notice that you forgot
to add your signoff below Yicong's, so the Arm maintainers won't be
able to merge the series.
If nobody else has any comments on this version, please resend in
a couple of days with your signoff added to each patch.
Arnd
^ permalink raw reply [flat|nested] 18+ messages in thread* Re: [PATCH v6 0/7] Add support for FEAT_{LS64, LS64_V} and related tests
2025-10-24 16:22 ` [PATCH v6 0/7] Add support for FEAT_{LS64, LS64_V} and related tests Arnd Bergmann
@ 2025-10-25 8:42 ` Zhou Wang
2025-10-26 21:59 ` Arnd Bergmann
0 siblings, 1 reply; 18+ messages in thread
From: Zhou Wang @ 2025-10-25 8:42 UTC (permalink / raw)
To: Arnd Bergmann, Catalin Marinas, Will Deacon, Marc Zyngier,
Oliver Upton, Joey Gouly, Suzuki K Poulose, Zenghui Yu
Cc: linux-arm-kernel, kvmarm, yangyccccc, prime.zeng, xuwei5,
Zhou Wang
On 2025/10/25 0:22, Arnd Bergmann wrote:
> On Fri, Oct 24, 2025, at 11:08, Zhou Wang wrote:
>> Armv8.7 introduces single-copy atomic 64-byte loads and stores
>> instructions and its variants named under FEAT_{LS64, LS64_V}.
>> Add support for Armv8.7 FEAT_{LS64, LS64_V}:
>> - Add identifying and enabling in the cpufeature list
>> - Expose the support of these features to userspace through HWCAP3 and cpuinfo
>> - Add related hwcap test
>> - Handle the trap of unsupported memory (normal/uncacheable) access in a VM
>>
>> A real scenario for this feature is that the userspace driver can make use of
>> this to implement direct WQE (workqueue entry) - a mechanism to fill WQE
>> directly into the hardware.
>>
>> Picked Marc's 2 patches form [1] for handling the LS64 trap in a VM on emulated
>> MMIO and the introduce of KVM_EXIT_ARM_LDST64B.
>>
>> As Yicong has left HiSilicon, I will help to continue to upstream this patchset.
>>
>> [1]
>> https://lore.kernel.org/linux-arm-kernel/20240815125959.2097734-1-maz@kernel.org/
>
> The patches all look reasonable to me, but I notice that you forgot
> to add your signoff below Yicong's, so the Arm maintainers won't be
> able to merge the series.>
> If nobody else has any comments on this version, please resend in
> a couple of days with your signoff added to each patch.
I will add my signoff in next version. In fact, comparing with v5, there is little
change, so I did not add my signoff.
Best,
Zhou
>
> Arnd
> .
^ permalink raw reply [flat|nested] 18+ messages in thread* Re: [PATCH v6 0/7] Add support for FEAT_{LS64, LS64_V} and related tests
2025-10-25 8:42 ` Zhou Wang
@ 2025-10-26 21:59 ` Arnd Bergmann
0 siblings, 0 replies; 18+ messages in thread
From: Arnd Bergmann @ 2025-10-26 21:59 UTC (permalink / raw)
To: Zhou Wang, Catalin Marinas, Will Deacon, Marc Zyngier,
Oliver Upton, Joey Gouly, Suzuki K Poulose, Zenghui Yu
Cc: linux-arm-kernel, kvmarm, Yicong Yang, prime.zeng, xuwei5
On Sat, Oct 25, 2025, at 10:42, Zhou Wang wrote:
> On 2025/10/25 0:22, Arnd Bergmann wrote:
>> On Fri, Oct 24, 2025, at 11:08, Zhou Wang wrote:
>>>
>>> [1]
>>> https://lore.kernel.org/linux-arm-kernel/20240815125959.2097734-1-maz@kernel.org/
>>
>> The patches all look reasonable to me, but I notice that you forgot
>> to add your signoff below Yicong's, so the Arm maintainers won't be
>> able to merge the series.>
>> If nobody else has any comments on this version, please resend in
>> a couple of days with your signoff added to each patch.
>
> I will add my signoff in next version. In fact, comparing with v5,
> there is little
> change, so I did not add my signoff.
Ok. Note that the Signoff is also needed when you just forward
patches without any changes, see part c of the DCO at
https://www.kernel.org/doc/html/latest/process/submitting-patches.html#sign-your-work-the-developer-s-certificate-of-origin
Arnd
^ permalink raw reply [flat|nested] 18+ messages in thread