Support SPCI functions with multiple return values.
Change-Id: I5fad2ec27c04fccf08df0c3405012b6d2ef8cdce
diff --git a/hf_call.c b/hf_call.c
index 53245be..ef263a4 100644
--- a/hf_call.c
+++ b/hf_call.c
@@ -16,6 +16,7 @@
*/
#include "hf/call.h"
+#include "hf/spci.h"
#include "hf/types.h"
int64_t hf_call(uint64_t arg0, uint64_t arg1, uint64_t arg2, uint64_t arg3)
@@ -35,3 +36,30 @@
return r0;
}
+
+struct spci_value spci_call(struct spci_value args)
+{
+ register uint64_t r0 __asm__("x0") = args.func;
+ register uint64_t r1 __asm__("x1") = args.arg1;
+ register uint64_t r2 __asm__("x2") = args.arg2;
+ register uint64_t r3 __asm__("x3") = args.arg3;
+ register uint64_t r4 __asm__("x4") = args.arg3;
+ register uint64_t r5 __asm__("x5") = args.arg3;
+ register uint64_t r6 __asm__("x6") = args.arg3;
+ register uint64_t r7 __asm__("x7") = args.arg3;
+
+ __asm__ volatile(
+ "hvc #0"
+ : /* Output registers, also used as inputs ('+' constraint). */
+ "+r"(r0), "+r"(r1), "+r"(r2), "+r"(r3), "+r"(r4), "+r"(r5),
+ "+r"(r6), "+r"(r7));
+
+ return (struct spci_value){.func = r0,
+ .arg1 = r1,
+ .arg2 = r2,
+ .arg3 = r3,
+ .arg4 = r4,
+ .arg5 = r5,
+ .arg6 = r6,
+ .arg7 = r7};
+}