Handle an "add" hypercall in L1 to add 2 numbers passed by L2, and
return the result. This better tests our save/restore functionality.

Signed-off-by: Wei-Lin Chang <[email protected]>
---
 .../selftests/kvm/arm64/hello_nested.c        | 32 ++++++++++++++++++-
 .../selftests/kvm/include/arm64/nested.h      |  2 +-
 2 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/tools/testing/selftests/kvm/arm64/hello_nested.c 
b/tools/testing/selftests/kvm/arm64/hello_nested.c
index 1cab56e4597b..9ed5285f5f2d 100644
--- a/tools/testing/selftests/kvm/arm64/hello_nested.c
+++ b/tools/testing/selftests/kvm/arm64/hello_nested.c
@@ -11,6 +11,10 @@
 #define XLATE2GPA      (0xABCD)
 #define L2STACKSZ      (0x100)
 
+#define L2SUCCESS      (0x0)
+#define L2FAILED       (0x1)
+#define L2ADD          (0x2)
+
 /*
  * TPIDR_EL2 is used to store vcpu id, so save and restore it.
  */
@@ -31,7 +35,14 @@ static gpa_t ucall_translate_to_gpa(void *gva)
 
 static void l2_guest_code(void)
 {
-       do_hvc();
+       int ans = 0;
+
+       ans = do_hvc(L2ADD, 2, 3);
+
+       if (ans == 5)
+               do_hvc(L2SUCCESS, 0, 0);
+       else
+               do_hvc(L2FAILED, 0, 0);
 }
 
 static void guest_code(void)
@@ -42,6 +53,7 @@ static void guest_code(void)
        gpa_t l2_pc, l2_stack_top;
        /* force 16-byte alignment for the stack pointer */
        u8 l2_stack[L2STACKSZ] __attribute__((aligned(16)));
+       u64 arg1, arg2;
 
        GUEST_ASSERT_EQ(get_current_el(), 2);
        GUEST_PRINTF("vEL2 entry\n");
@@ -55,6 +67,24 @@ static void guest_code(void)
        ret = run_l2(&vcpu, &hyp_data);
        GUEST_ASSERT_EQ(ret, ARM_EXCEPTION_TRAP);
        GUEST_ASSERT_EQ(ESR_ELx_EC(read_sysreg(esr_el2)), ESR_ELx_EC_HVC64);
+
+       if (vcpu.context.regs.regs[0] == L2ADD) {
+               arg1 = vcpu.context.regs.regs[1];
+               arg2 = vcpu.context.regs.regs[2];
+               GUEST_PRINTF("L2 add request, arg1: %lx, arg2: %lx\n", arg1, 
arg2);
+               vcpu.context.regs.regs[0] = arg1 + arg2;
+       } else {
+               GUEST_FAIL("Unexpected hvc action\n");
+       }
+
+       ret = run_l2(&vcpu, &hyp_data);
+       GUEST_ASSERT_EQ(ret, ARM_EXCEPTION_TRAP);
+       GUEST_ASSERT_EQ(ESR_ELx_EC(read_sysreg(esr_el2)), ESR_ELx_EC_HVC64);
+
+       if (vcpu.context.regs.regs[0] != L2SUCCESS)
+               GUEST_FAIL("L2 failed\n");
+
+       GUEST_PRINTF("L2 success!\n");
        GUEST_DONE();
 }
 
diff --git a/tools/testing/selftests/kvm/include/arm64/nested.h 
b/tools/testing/selftests/kvm/include/arm64/nested.h
index 30e626e427da..c10ef4a85be7 100644
--- a/tools/testing/selftests/kvm/include/arm64/nested.h
+++ b/tools/testing/selftests/kvm/include/arm64/nested.h
@@ -50,7 +50,7 @@ void prepare_hyp(void);
 void init_vcpu(struct vcpu *vcpu, gpa_t l2_pc, gpa_t l2_stack_top);
 int run_l2(struct vcpu *vcpu, struct hyp_data *hyp_data);
 
-void do_hvc(void);
+u64 do_hvc(u64 action, u64 arg1, u64 arg2);
 u64 __guest_enter(struct vcpu *vcpu, struct cpu_context *hyp_context);
 void __hyp_exception(u64 type);
 
-- 
2.43.0


Reply via email to