[PATCH v9 00/24] KVM: s390: Introduce arm64 KVM
Steffen Eiden
seiden at linux.ibm.com
Wed Oct 14 02:23:43 PDT 2026
On Wed, Sep 30, 2026 at 07:34:15PM +0200, Steffen Eiden wrote:
> Introduce arm-on-s390. Enable KVM-accelerated ARM CPU virtualisation on s390.
>
....
The s390 patches (12..) of this series currently have 3 **build**
conflicts with linux-next / armkvm-next. But git will apply them clean.
Triggered by:
a467f39afc2a ("KVM: arm64: Prevent unsupported vcpu features for VM types")
eb2eb48c8d72 ("arm64: Add ESR fault helpers")
caa63620f9e3 ("KVM: Allow architectures to disallow pre-fault")
They can be solved by applying the following patches while merging.
Fix is below the patch they fixup.
>
> Hendrik Brueckner (1):
> s390/hwcaps: Report SAE support as hwcap
>
> Steffen Eiden (23):
> KVM: Make device name configurable
> KVM: Move architecture capability Kconfigs to header defines
> KVM: Replace CONFIG_KVM_MMIO with KVM_NO_MMIO
> arm64: Use proper include variant
> arm64: ptrace: Use constants for compat register numbers
> arm64: sysreg: Convert SPSR_ELx to automatic register generation
> KVM: arm64: Access elements of vcpu_gp_regs individually
> KVM: arm64: Use accessor functions for core regs
> arm64: Prepare sharing arm64 headers with s390
> arm64: Share arm64 headers with s390
> KVM: arm64: Share arm64 code with s390
> s390/Kconfig: remove PCI dependency from HAS_IOMEM
> KVM: s390: Use dedicated function for migration mode
> s390/tools: Use arm64 headers
> KVM: s390: Use arm64 code
> s390: Introduce Start Arm Execution instruction
> KVM: s390: arm64: Introduce host definitions
> KVM: s390: Add basic arm64 kvm module
diff --git a/arch/s390/kvm/arm64/arm.c b/arch/s390/kvm/arm64/arm.c
index 803325fc3d55..bd9d85235f43 100644
--- a/arch/s390/kvm/arm64/arm.c
+++ b/arch/s390/kvm/arm64/arm.c
@@ -23,7 +23,7 @@
#define CREATE_TRACE_POINTS
#include "trace.h"
-static unsigned long system_supported_vcpu_features(void);
+static unsigned long system_supported_vcpu_features(struct kvm_vcpu *vcpu);
#define __INCL_GEN_ARM_FILE
#include "generated/arm.inc"
@@ -242,7 +242,7 @@ int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu)
return 0;
}
-static unsigned long system_supported_vcpu_features(void)
+static unsigned long system_supported_vcpu_features(struct kvm_vcpu *vcpu)
{
unsigned long features = KVM_S390_ARM64_IMPL_FEATURES;
> KVM: s390: arm64: Implement required functions
> KVM: s390: arm64: Implement vm/vcpu create destroy
> KVM: s390: arm64: Implement vCPU IOCTLs
> KVM: s390: arm64: Implement basic page fault handler
diff --git a/arch/s390/kvm/arm64/mmu.c b/arch/s390/kvm/arm64/mmu.c
index 3c1c8a2def73..31e0d036896f 100644
--- a/arch/s390/kvm/arm64/mmu.c
+++ b/arch/s390/kvm/arm64/mmu.c
@@ -76,6 +76,7 @@ int kvm_handle_guest_abort(struct kvm_vcpu *vcpu)
bool translation = false;
phys_addr_t fault_ipa;
unsigned long hva;
+ unsigned long esr;
bool write_fault;
bool guest_size_err;
bool writable;
@@ -83,6 +84,7 @@ int kvm_handle_guest_abort(struct kvm_vcpu *vcpu)
int ret;
gfn_t gfn;
+ esr = kvm_vcpu_get_esr(vcpu);
fault_ipa = kvm_vcpu_get_fault_ipa(vcpu);
is_iabt = kvm_vcpu_trap_is_iabt(vcpu);
guest_size_err = vcpu->arch.sae_block.icptr == SAE_ICPTR_GUEST_ADDRESS_SIZE;
@@ -143,7 +145,7 @@ int kvm_handle_guest_abort(struct kvm_vcpu *vcpu)
* Check for a cache maintenance operation. Assume the guest is
* cautious and skip instruction
*/
- if (kvm_is_error_hva(hva) && kvm_vcpu_dabt_is_cm(vcpu)) {
+ if (kvm_is_error_hva(hva) && esr_dabt_is_cm(esr)) {
kvm_incr_pc(vcpu);
ret = 1;
goto out_unlock;
@@ -198,3 +200,11 @@ long kvm_arch_vcpu_pre_fault_memory(struct kvm_vcpu *vcpu, struct kvm_pre_fault_
end = ALIGN(range->gpa + PAGE_SIZE, f.crste_region3 ? _REGION3_SIZE : HPAGE_SIZE);
return min(range->size, end - range->gpa);
}
+
+int kvm_arch_pre_fault_allowed(struct kvm_vcpu *vcpu)
+{
+ if (!kvm_vcpu_initialized(vcpu))
+ return -ENOEXEC;
+
+ return 0;
+}
> KVM: s390: arm64: Integrate arm on s390
>
Steffen
> MAINTAINERS | 1 +
> arch/arm64/Makefile | 3 +
> arch/arm64/include/asm/brk-imm.h | 1 +
> arch/arm64/include/asm/esr.h | 5 +-
> arch/arm64/include/asm/kvm_arm.h | 6 +-
> arch/arm64/include/asm/kvm_emulate.h | 64 +-
> arch/arm64/include/asm/kvm_host.h | 120 +--
> arch/arm64/include/asm/ptrace.h | 64 +-
> arch/arm64/include/asm/sysreg.h | 22 +-
> arch/arm64/kvm/Kconfig | 4 -
> arch/arm64/kvm/arm.c | 3 +
> arch/arm64/kvm/guest.c | 22 +-
> arch/arm64/kvm/hyp/exception.c | 4 +-
> arch/arm64/kvm/hyp/include/hyp/adjust_pc.h | 4 +-
> arch/arm64/kvm/hyp/include/hyp/switch.h | 4 +-
> arch/arm64/kvm/mmio.c | 2 +
> arch/arm64/tools/sysreg | 51 ++
> arch/loongarch/include/asm/kvm_host.h | 2 +
> arch/loongarch/kvm/Kconfig | 3 -
> arch/mips/include/asm/kvm_host.h | 1 +
> arch/mips/kvm/Kconfig | 2 -
> arch/powerpc/include/asm/kvm_host.h | 10 +
> arch/powerpc/kvm/Kconfig | 5 -
> arch/riscv/include/asm/kvm_host.h | 2 +
> arch/riscv/kvm/Kconfig | 3 -
> arch/s390/Kconfig | 5 +-
> arch/s390/include/arm64/kvm_emulate.h | 130 ++++
> arch/s390/include/arm64/kvm_nested.h | 11 +
> arch/s390/include/arm64/ptrace.h | 11 +
> arch/s390/include/arm64/sysreg.h | 13 +
> arch/s390/include/asm/asm-prototypes.h | 1 +
> arch/s390/include/asm/elf.h | 2 +
> arch/s390/include/asm/io.h | 12 +-
> arch/s390/include/asm/kvm.h | 6 +
> arch/s390/include/asm/kvm_host.h | 4 +
> arch/s390/include/asm/kvm_host_arm64.h | 209 +++++
> arch/s390/include/asm/kvm_host_arm64_types.h | 124 +++
> arch/s390/include/asm/kvm_host_s390.h | 5 +
> arch/s390/include/asm/kvm_host_types.h | 4 +
> arch/s390/include/asm/sae.h | 49 ++
> arch/s390/include/asm/sclp.h | 5 +-
> arch/s390/include/asm/stacktrace.h | 5 +
> arch/s390/include/uapi/Kbuild | 6 +
> arch/s390/kernel/asm-offsets.c | 1 +
> arch/s390/kernel/entry.S | 22 +
> arch/s390/kernel/processor.c | 3 +
> arch/s390/kvm/Kconfig | 27 +-
> arch/s390/kvm/Makefile | 1 +
> arch/s390/kvm/arm64/.gitignore | 2 +
> arch/s390/kvm/arm64/Makefile | 110 +++
> arch/s390/kvm/arm64/Makefile.gen | 28 +
> arch/s390/kvm/arm64/arm.c | 754 +++++++++++++++++++
> arch/s390/kvm/arm64/arm.h | 58 ++
> arch/s390/kvm/arm64/copy-arm64c.awk | 82 ++
> arch/s390/kvm/arm64/guest.c | 135 ++++
> arch/s390/kvm/arm64/handle_exit.c | 161 ++++
> arch/s390/kvm/arm64/handle_exit.h | 9 +
> arch/s390/kvm/arm64/inject_fault.c | 21 +
> arch/s390/kvm/arm64/mmio.c | 15 +
> arch/s390/kvm/arm64/mmu.c | 200 +++++
> arch/s390/kvm/arm64/reset.c | 71 ++
> arch/s390/kvm/arm64/trace.h | 101 +++
> arch/s390/kvm/gmap/faultin.c | 5 +
> arch/s390/kvm/gmap/gmap.c | 4 +
> arch/s390/kvm/gmap/kvm_mmu.c | 6 +-
> arch/s390/kvm/gmap/trace_gmap.h | 17 +-
> arch/s390/kvm/s390/Makefile | 2 +-
> arch/s390/tools/Makefile | 6 +-
> arch/s390/tools/Makefile.arm64h | 55 ++
> arch/s390/tools/copy-arm64h-full.awk | 50 ++
> arch/s390/tools/copy-arm64h.awk | 83 ++
> arch/s390/tools/opcodes.txt | 3 +
> arch/x86/include/asm/kvm_host.h | 3 +
> arch/x86/kvm/Kconfig | 4 -
> drivers/s390/char/sclp_early.c | 1 +
> include/linux/kvm_host.h | 24 +-
> include/trace/events/kvm.h | 8 +-
> virt/kvm/Kconfig | 18 -
> virt/kvm/Makefile.kvm | 9 +-
> virt/kvm/async_pf.c | 5 +-
> virt/kvm/coalesced_mmio.c | 4 +
> virt/kvm/coalesced_mmio.h | 2 +-
> virt/kvm/eventfd.c | 3 +-
> virt/kvm/kvm_main.c | 44 +-
> 84 files changed, 2968 insertions(+), 199 deletions(-)
> create mode 100644 arch/s390/include/arm64/kvm_emulate.h
> create mode 100644 arch/s390/include/arm64/kvm_nested.h
> create mode 100644 arch/s390/include/arm64/ptrace.h
> create mode 100644 arch/s390/include/arm64/sysreg.h
> create mode 100644 arch/s390/include/asm/kvm.h
> create mode 100644 arch/s390/include/asm/kvm_host_arm64.h
> create mode 100644 arch/s390/include/asm/kvm_host_arm64_types.h
> create mode 100644 arch/s390/include/asm/sae.h
> create mode 100644 arch/s390/include/uapi/Kbuild
> create mode 100644 arch/s390/kvm/arm64/.gitignore
> create mode 100644 arch/s390/kvm/arm64/Makefile
> create mode 100644 arch/s390/kvm/arm64/Makefile.gen
> create mode 100644 arch/s390/kvm/arm64/arm.c
> create mode 100644 arch/s390/kvm/arm64/arm.h
> create mode 100644 arch/s390/kvm/arm64/copy-arm64c.awk
> create mode 100644 arch/s390/kvm/arm64/guest.c
> create mode 100644 arch/s390/kvm/arm64/handle_exit.c
> create mode 100644 arch/s390/kvm/arm64/handle_exit.h
> create mode 100644 arch/s390/kvm/arm64/inject_fault.c
> create mode 100644 arch/s390/kvm/arm64/mmio.c
> create mode 100644 arch/s390/kvm/arm64/mmu.c
> create mode 100644 arch/s390/kvm/arm64/reset.c
> create mode 100644 arch/s390/kvm/arm64/trace.h
> create mode 100644 arch/s390/tools/Makefile.arm64h
> create mode 100644 arch/s390/tools/copy-arm64h-full.awk
> create mode 100644 arch/s390/tools/copy-arm64h.awk
>
>
> base-commit: 16096aadaa3d15c11d37bbea750bad0917e8eadf
> --
> 2.53.0
>
More information about the linux-arm-kernel
mailing list