aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Turner <andrew@FreeBSD.org>2022-08-22 17:09:28 +0000
committerAndrew Turner <andrew@FreeBSD.org>2022-08-25 11:17:28 +0000
commit48a7e53db78293ba2723cecfb3a3d5d23ea8e44d (patch)
tree884ffda354215df1773258f3e5551496bacb62cd
parent7a060a8895b8e6c1cd0afded15da27c373eb0de9 (diff)
downloadsrc-48a7e53db78293ba2723cecfb3a3d5d23ea8e44d.tar.gz
src-48a7e53db78293ba2723cecfb3a3d5d23ea8e44d.zip
Merge the common parts of the SMCCC handlers
To simplify adding new handlers merge the common parts of the functions used to call into the arm SMCCC firmware. Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D36297
-rw-r--r--sys/dev/psci/smccc_arm.S29
-rw-r--r--sys/dev/psci/smccc_arm64.S25
2 files changed, 16 insertions, 38 deletions
diff --git a/sys/dev/psci/smccc_arm.S b/sys/dev/psci/smccc_arm.S
index ae5a94197718..dd7cd6a690bd 100644
--- a/sys/dev/psci/smccc_arm.S
+++ b/sys/dev/psci/smccc_arm.S
@@ -37,38 +37,25 @@ __FBSDID("$FreeBSD$");
.arch_extension sec /* For smc */
.arch_extension virt /* For hvc */
-/*
- * int arm_smccc_hvc(register_t, register_t, register_t, register_t,
- * register_t, register_t, register_t, register_t,
- * struct arm_smccc_res *res)
- */
-ENTRY(arm_smccc_hvc)
+.macro arm_smccc_1_0 insn
+ENTRY(arm_smccc_\insn)
mov r12, sp
push {r4-r7}
ldm r12, {r4-r7}
- hvc #0
+ \insn #0
pop {r4-r7}
ldr r12, [sp, #(4 * 4)]
cmp r12, #0
beq 1f
stm r12, {r0-r3}
1: bx lr
-END(arm_smccc_hvc)
+END(arm_smccc_\insn)
+.endm
/*
- * int arm_smccc_smc(register_t, register_t, register_t, register_t,
+ * int arm_smccc_hvc(register_t, register_t, register_t, register_t,
* register_t, register_t, register_t, register_t,
* struct arm_smccc_res *res)
*/
-ENTRY(arm_smccc_smc)
- mov r12, sp
- push {r4-r7}
- ldm r12, {r4-r7}
- smc #0
- pop {r4-r7}
- ldr r12, [sp, #(4 * 4)]
- cmp r12, #0
- beq 1f
- stm r12, {r0-r3}
-1: bx lr
-END(arm_smccc_smc)
+arm_smccc_1_0 hvc
+arm_smccc_1_0 smc
diff --git a/sys/dev/psci/smccc_arm64.S b/sys/dev/psci/smccc_arm64.S
index 0b94a11fdf04..ba10f7493e71 100644
--- a/sys/dev/psci/smccc_arm64.S
+++ b/sys/dev/psci/smccc_arm64.S
@@ -33,30 +33,21 @@
#include <machine/asm.h>
__FBSDID("$FreeBSD$");
-/*
- * int arm_smccc_hvc(register_t, register_t, register_t, register_t,
- * register_t, register_t, register_t, register_t,
- * struct arm_smccc_res *res)
- */
-ENTRY(arm_smccc_hvc)
- hvc #0
+.macro arm_smccc_1_0 insn
+ENTRY(arm_smccc_\insn)
+ \insn #0
ldr x4, [sp]
cbz x4, 1f
stp x0, x1, [x4, #16 * 0]
stp x2, x3, [x4, #16 * 1]
1: ret
-END(arm_smccc_hvc)
+END(arm_smccc_\insn)
+.endm
/*
- * int arm_smccc_smc(register_t, register_t, register_t, register_t,
+ * int arm_smccc_*(register_t, register_t, register_t, register_t,
* register_t, register_t, register_t, register_t,
* struct arm_smccc_res *res)
*/
-ENTRY(arm_smccc_smc)
- smc #0
- ldr x4, [sp]
- cbz x4, 1f
- stp x0, x1, [x4, #16 * 0]
- stp x2, x3, [x4, #16 * 1]
-1: ret
-END(arm_smccc_smc)
+arm_smccc_1_0 hvc
+arm_smccc_1_0 smc