0001
0002
0003
0004
0005 #include <linux/linkage.h>
0006 #include <linux/arm-smccc.h>
0007
0008 #include <asm/asm-offsets.h>
0009 #include <asm/opcodes-sec.h>
0010 #include <asm/opcodes-virt.h>
0011 #include <asm/unwind.h>
0012
0013
0014
0015
0016
0017 .macro SMCCC_SMC
0018 __SMC(0)
0019 .endm
0020
0021 .macro SMCCC_HVC
0022 __HVC(0)
0023 .endm
0024
0025 .macro SMCCC instr
0026 UNWIND( .fnstart)
0027 mov r12, sp
0028 push {r4-r7}
0029 UNWIND( .save {r4-r7})
0030 ldm r12, {r4-r7}
0031 \instr
0032 ldr r4, [sp, #36]
0033 cmp r4, #0
0034 beq 1f // No quirk structure
0035 ldr r5, [r4, #ARM_SMCCC_QUIRK_ID_OFFS]
0036 cmp r5, #ARM_SMCCC_QUIRK_QCOM_A6
0037 bne 1f // No quirk present
0038 str r6, [r4, #ARM_SMCCC_QUIRK_STATE_OFFS]
0039 1: pop {r4-r7}
0040 ldr r12, [sp, #(4 * 4)]
0041 stm r12, {r0-r3}
0042 bx lr
0043 UNWIND( .fnend)
0044 .endm
0045
0046
0047
0048
0049
0050
0051
0052 ENTRY(__arm_smccc_smc)
0053 SMCCC SMCCC_SMC
0054 ENDPROC(__arm_smccc_smc)
0055
0056
0057
0058
0059
0060
0061
0062 ENTRY(__arm_smccc_hvc)
0063 SMCCC SMCCC_HVC
0064 ENDPROC(__arm_smccc_hvc)