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
This commit is contained in:
Andrew Turner 2022-08-22 18:09:28 +01:00
parent 7a060a8895
commit 48a7e53db7
2 changed files with 25 additions and 47 deletions

View File

@ -37,38 +37,25 @@ __FBSDID("$FreeBSD$");
.arch_extension sec /* For smc */
.arch_extension virt /* For hvc */
.macro arm_smccc_1_0 insn
ENTRY(arm_smccc_\insn)
mov r12, sp
push {r4-r7}
ldm r12, {r4-r7}
\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_\insn)
.endm
/*
* 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)
mov r12, sp
push {r4-r7}
ldm r12, {r4-r7}
hvc #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)
/*
* int arm_smccc_smc(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

View File

@ -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