From: Itaru Kitayama <itaru.kitayama@fujitsu.com>
To: Wei-Lin Chang <weilin.chang@arm.com>
Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev,
kvm@vger.kernel.org, linux-kselftest@vger.kernel.org,
linux-kernel@vger.kernel.org, Marc Zyngier <maz@kernel.org>,
Oliver Upton <oupton@kernel.org>, Joey Gouly <joey.gouly@arm.com>,
Suzuki K Poulose <suzuki.poulose@arm.com>,
Zenghui Yu <yuzenghui@huawei.com>,
Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will@kernel.org>,
Paolo Bonzini <pbonzini@redhat.com>,
Shuah Khan <shuah@kernel.org>
Subject: Re: [PATCH v2 2/4] KVM: arm64: sefltests: Add helpers for guest hypervisors
Date: Wed, 15 Apr 2026 07:14:46 +0900 [thread overview]
Message-ID: <ad68VjnGQ3trs7AN@sm-arm-grace07> (raw)
In-Reply-To: <20260412142216.3806482-3-weilin.chang@arm.com>
On Sun, Apr 12, 2026 at 03:22:14PM +0100, Wei-Lin Chang wrote:
> Add helpers so that guest hypervisors can run nested guests. SP_EL1
> save/restore is added to allow nested guests to use a stack.
>
> Signed-off-by: Wei-Lin Chang <weilin.chang@arm.com>
> ---
> .../selftests/kvm/include/arm64/nested.h | 17 +++++++
> tools/testing/selftests/kvm/lib/arm64/entry.S | 5 ++
> .../testing/selftests/kvm/lib/arm64/nested.c | 46 +++++++++++++++++++
> 3 files changed, 68 insertions(+)
>
> diff --git a/tools/testing/selftests/kvm/include/arm64/nested.h b/tools/testing/selftests/kvm/include/arm64/nested.h
> index 86d931facacb..7928ef89494a 100644
> --- a/tools/testing/selftests/kvm/include/arm64/nested.h
> +++ b/tools/testing/selftests/kvm/include/arm64/nested.h
> @@ -21,8 +21,17 @@
>
> extern char hyp_vectors[];
>
> +enum vcpu_sysreg {
> + __INVALID_SYSREG__, /* 0 is reserved as an invalid value */
> +
> + SP_EL1,
> +
> + NR_SYS_REGS
> +};
> +
> struct cpu_context {
> struct user_pt_regs regs; /* sp = sp_el0 */
> + u64 sys_regs[NR_SYS_REGS];
> };
>
> struct vcpu {
> @@ -37,9 +46,17 @@ struct hyp_data {
> struct cpu_context hyp_context;
> };
I am not sure of these structs you introduced only for nested guest feature
testing, as the KVM arm64 code they are quite complex and involved,
extracring part of those and add members as hello_nested or simliar
tests evolve, then add test cases to me seems fragile.
But if you have strong reason to add these would you mind explaining a bit?
Thanks,
Itaru.
>
> +void prepare_hyp(void);
> +void init_vcpu(struct vcpu *vcpu, vm_paddr_t l2_pc, vm_paddr_t l2_stack_top);
> +int run_l2(struct vcpu *vcpu, struct hyp_data *hyp_data);
> +
> +void do_hvc(void);
> u64 __guest_enter(struct vcpu *vcpu, struct cpu_context *hyp_context);
> void __hyp_exception(u64 type);
>
> +void __sysreg_save_el1_state(struct cpu_context *ctxt);
> +void __sysreg_restore_el1_state(struct cpu_context *ctxt);
> +
> #endif /* !__ASSEMBLER__ */
>
> #endif /* SELFTEST_KVM_NESTED_H */
> diff --git a/tools/testing/selftests/kvm/lib/arm64/entry.S b/tools/testing/selftests/kvm/lib/arm64/entry.S
> index 33bedf5e7fb2..df3af3463c6c 100644
> --- a/tools/testing/selftests/kvm/lib/arm64/entry.S
> +++ b/tools/testing/selftests/kvm/lib/arm64/entry.S
> @@ -3,6 +3,11 @@
> * adapted from arch/arm64/kvm/hyp/entry.S
> */
>
> + .globl do_hvc
> + do_hvc:
> + hvc #0
> + ret
> +
> /*
> * Manually define these for now
> */
> diff --git a/tools/testing/selftests/kvm/lib/arm64/nested.c b/tools/testing/selftests/kvm/lib/arm64/nested.c
> index 06ddaab2436f..b30d20b101c4 100644
> --- a/tools/testing/selftests/kvm/lib/arm64/nested.c
> +++ b/tools/testing/selftests/kvm/lib/arm64/nested.c
> @@ -4,7 +4,53 @@
> */
>
> #include "nested.h"
> +#include "processor.h"
> #include "test_util.h"
> +#include <asm/sysreg.h>
> +
> +void prepare_hyp(void)
> +{
> + write_sysreg(HCR_EL2_E2H | HCR_EL2_RW, hcr_el2);
> + write_sysreg(hyp_vectors, vbar_el2);
> + isb();
> +}
> +
> +void init_vcpu(struct vcpu *vcpu, vm_paddr_t l2_pc, vm_paddr_t l2_stack_top)
> +{
> + memset(vcpu, 0, sizeof(*vcpu));
> + vcpu->context.regs.pc = l2_pc;
> + vcpu->context.regs.pstate = PSR_MODE_EL1h | PSR_D_BIT | PSR_A_BIT | PSR_I_BIT | PSR_F_BIT;
> + vcpu->context.sys_regs[SP_EL1] = l2_stack_top;
> +}
> +
> +void __sysreg_save_el1_state(struct cpu_context *ctxt)
> +{
> + ctxt->sys_regs[SP_EL1] = read_sysreg(sp_el1);
> +}
> +
> +void __sysreg_restore_el1_state(struct cpu_context *ctxt)
> +{
> + write_sysreg(ctxt->sys_regs[SP_EL1], sp_el1);
> +}
> +
> +int run_l2(struct vcpu *vcpu, struct hyp_data *hyp_data)
> +{
> + u64 ret;
> +
> + __sysreg_restore_el1_state(&vcpu->context);
> +
> + write_sysreg(vcpu->context.regs.pstate, spsr_el2);
> + write_sysreg(vcpu->context.regs.pc, elr_el2);
> +
> + ret = __guest_enter(vcpu, &hyp_data->hyp_context);
> +
> + vcpu->context.regs.pc = read_sysreg(elr_el2);
> + vcpu->context.regs.pstate = read_sysreg(spsr_el2);
> +
> + __sysreg_save_el1_state(&vcpu->context);
> +
> + return ret;
> +}
>
> void __hyp_exception(u64 type)
> {
> --
> 2.43.0
>
next prev parent reply other threads:[~2026-04-14 22:15 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-12 14:22 [PATCH v2 0/4] KVM: arm64: selftests: Basic nested guest support Wei-Lin Chang
2026-04-12 14:22 ` [PATCH v2 1/4] KVM: arm64: selftests: Add GPR save/restore functions for NV Wei-Lin Chang
2026-04-12 14:22 ` [PATCH v2 2/4] KVM: arm64: sefltests: Add helpers for guest hypervisors Wei-Lin Chang
2026-04-14 22:14 ` Itaru Kitayama [this message]
2026-04-16 22:15 ` Wei-Lin Chang
2026-04-16 23:39 ` Itaru Kitayama
2026-04-12 14:22 ` [PATCH v2 3/4] KVM: arm64: sefltests: Add basic NV selftest Wei-Lin Chang
2026-04-12 23:19 ` Itaru Kitayama
2026-04-13 9:18 ` Wei-Lin Chang
2026-04-13 21:31 ` Itaru Kitayama
2026-04-14 10:16 ` Wei-Lin Chang
2026-04-14 22:05 ` Itaru Kitayama
2026-04-16 21:58 ` Wei-Lin Chang
2026-04-12 14:22 ` [PATCH v2 4/4] KVM: arm64: selftests: Enhance hello_nested test Wei-Lin Chang
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=ad68VjnGQ3trs7AN@sm-arm-grace07 \
--to=itaru.kitayama@fujitsu.com \
--cc=catalin.marinas@arm.com \
--cc=joey.gouly@arm.com \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.linux.dev \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=maz@kernel.org \
--cc=oupton@kernel.org \
--cc=pbonzini@redhat.com \
--cc=shuah@kernel.org \
--cc=suzuki.poulose@arm.com \
--cc=weilin.chang@arm.com \
--cc=will@kernel.org \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox