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:
parent
7a060a8895
commit
48a7e53db7
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user