53 lines
1.5 KiB
ArmAsm
53 lines
1.5 KiB
ArmAsm
|
/*
|
||
|
* Copyright (c) 2015, Linaro Limited
|
||
|
*
|
||
|
* This program is free software; you can redistribute it and/or modify
|
||
|
* it under the terms of the GNU General Public License Version 2 as
|
||
|
* published by the Free Software Foundation.
|
||
|
*
|
||
|
* This program is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
* GNU General Public License for more details.
|
||
|
*
|
||
|
*/
|
||
|
#include <linux/linkage.h>
|
||
|
#include <linux/arm-smccc.h>
|
||
|
#include <asm/asm-offsets.h>
|
||
|
|
||
|
.macro SMCCC instr
|
||
|
.cfi_startproc
|
||
|
\instr #0
|
||
|
ldr x4, [sp]
|
||
|
stp x0, x1, [x4, #ARM_SMCCC_RES_X0_OFFS]
|
||
|
stp x2, x3, [x4, #ARM_SMCCC_RES_X2_OFFS]
|
||
|
ldr x4, [sp, #8]
|
||
|
cbz x4, 1f /* no quirk structure */
|
||
|
ldr x9, [x4, #ARM_SMCCC_QUIRK_ID_OFFS]
|
||
|
cmp x9, #ARM_SMCCC_QUIRK_QCOM_A6
|
||
|
b.ne 1f
|
||
|
str x6, [x4, ARM_SMCCC_QUIRK_STATE_OFFS]
|
||
|
1: ret
|
||
|
.cfi_endproc
|
||
|
.endm
|
||
|
|
||
|
/*
|
||
|
* void arm_smccc_smc(unsigned long a0, unsigned long a1, unsigned long a2,
|
||
|
* unsigned long a3, unsigned long a4, unsigned long a5,
|
||
|
* unsigned long a6, unsigned long a7, struct arm_smccc_res *res,
|
||
|
* struct arm_smccc_quirk *quirk)
|
||
|
*/
|
||
|
ENTRY(__arm_smccc_smc)
|
||
|
SMCCC smc
|
||
|
ENDPROC(__arm_smccc_smc)
|
||
|
|
||
|
/*
|
||
|
* void arm_smccc_hvc(unsigned long a0, unsigned long a1, unsigned long a2,
|
||
|
* unsigned long a3, unsigned long a4, unsigned long a5,
|
||
|
* unsigned long a6, unsigned long a7, struct arm_smccc_res *res,
|
||
|
* struct arm_smccc_quirk *quirk)
|
||
|
*/
|
||
|
ENTRY(__arm_smccc_hvc)
|
||
|
SMCCC hvc
|
||
|
ENDPROC(__arm_smccc_hvc)
|