diff mbox

[RFC,v2,4/6] xen/arm: Introduce call_smcc64

Message ID 1486496525-14637-5-git-send-email-edgar.iglesias@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Edgar E. Iglesias Feb. 7, 2017, 7:42 p.m. UTC
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>

Introduce call_smcc64, a helper function to issue 64-bit SMC
calls that follow the SMC Calling Convention. This includes
returning up to 4 64-bit values.

Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
---
 xen/include/asm-arm/processor.h | 40 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)

Comments

Stefano Stabellini Feb. 13, 2017, 10:11 p.m. UTC | #1
On Tue, 7 Feb 2017, Edgar E. Iglesias wrote:
> From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
> 
> Introduce call_smcc64, a helper function to issue 64-bit SMC
> calls that follow the SMC Calling Convention. This includes
> returning up to 4 64-bit values.
> 
> Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>

Please write it in assembly following the example of the exiting
call_smc.



>  xen/include/asm-arm/processor.h | 40 ++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 40 insertions(+)
> 
> diff --git a/xen/include/asm-arm/processor.h b/xen/include/asm-arm/processor.h
> index afc0e9a..a604f8c 100644
> --- a/xen/include/asm-arm/processor.h
> +++ b/xen/include/asm-arm/processor.h
> @@ -706,6 +706,46 @@ void vcpu_regs_user_to_hyp(struct vcpu *vcpu,
>  int call_smc(register_t function_id, register_t arg0, register_t arg1,
>               register_t arg2);
>  
> +/*
> + * Helper to issue a 64-bit SMC according to the SMC Calling Convention.
> + *
> + * @fid:      Function Identifier
> + * @a0 - a5:  6 arguments
> + * @ret:      Pointer to 4 register_t carrying return values
> + */
> +static inline register_t call_smcc64(register_t fid,
> +                                     register_t a0,
> +                                     register_t a1,
> +                                     register_t a2,
> +                                     register_t a3,
> +                                     register_t a4,
> +                                     register_t a5,
> +                                     register_t *ret)
> +{
> +    register register_t x0 asm("x0") = fid;
> +    register register_t x1 asm("x1") = a0;
> +    register register_t x2 asm("x2") = a1;
> +    register register_t x3 asm("x3") = a2;
> +    register register_t x4 asm("x4") = a3;
> +    register register_t x5 asm("x5") = a4;
> +    register register_t x6 asm("x6") = a5;
> +
> +    asm volatile ("smc #0\n"
> +                  : "+r" (x0), "+r" (x1), "+r" (x2), "+r" (x3),
> +                    "+r" (x4), "+r" (x5), "+r" (x6)
> +                  :
> +                  : "x7", "x8", "x9", "x10", "x11", "x12",
> +                    "x13", "x14", "x15", "x16", "x17" );
> +
> +    if (ret) {
> +        ret[0] = x0;
> +        ret[1] = x1;
> +        ret[2] = x2;
> +        ret[3] = x3;
> +    }
> +    return x0;
> +}
> +
>  void do_trap_guest_error(struct cpu_user_regs *regs);
>  
>  #endif /* __ASSEMBLY__ */
> -- 
> 2.7.4
>
diff mbox

Patch

diff --git a/xen/include/asm-arm/processor.h b/xen/include/asm-arm/processor.h
index afc0e9a..a604f8c 100644
--- a/xen/include/asm-arm/processor.h
+++ b/xen/include/asm-arm/processor.h
@@ -706,6 +706,46 @@  void vcpu_regs_user_to_hyp(struct vcpu *vcpu,
 int call_smc(register_t function_id, register_t arg0, register_t arg1,
              register_t arg2);
 
+/*
+ * Helper to issue a 64-bit SMC according to the SMC Calling Convention.
+ *
+ * @fid:      Function Identifier
+ * @a0 - a5:  6 arguments
+ * @ret:      Pointer to 4 register_t carrying return values
+ */
+static inline register_t call_smcc64(register_t fid,
+                                     register_t a0,
+                                     register_t a1,
+                                     register_t a2,
+                                     register_t a3,
+                                     register_t a4,
+                                     register_t a5,
+                                     register_t *ret)
+{
+    register register_t x0 asm("x0") = fid;
+    register register_t x1 asm("x1") = a0;
+    register register_t x2 asm("x2") = a1;
+    register register_t x3 asm("x3") = a2;
+    register register_t x4 asm("x4") = a3;
+    register register_t x5 asm("x5") = a4;
+    register register_t x6 asm("x6") = a5;
+
+    asm volatile ("smc #0\n"
+                  : "+r" (x0), "+r" (x1), "+r" (x2), "+r" (x3),
+                    "+r" (x4), "+r" (x5), "+r" (x6)
+                  :
+                  : "x7", "x8", "x9", "x10", "x11", "x12",
+                    "x13", "x14", "x15", "x16", "x17" );
+
+    if (ret) {
+        ret[0] = x0;
+        ret[1] = x1;
+        ret[2] = x2;
+        ret[3] = x3;
+    }
+    return x0;
+}
+
 void do_trap_guest_error(struct cpu_user_regs *regs);
 
 #endif /* __ASSEMBLY__ */