smccc-call.S 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Copyright (c) 2015, Linaro Limited
  4. */
  5. #include <linux/linkage.h>
  6. #include <linux/arm-smccc.h>
  7. #include <generated/asm-offsets.h>
  8. #ifdef CONFIG_EFI_LOADER
  9. .section .text.efi_runtime
  10. #endif
  11. .macro SMCCC instr
  12. .cfi_startproc
  13. \instr #0
  14. ldr x4, [sp]
  15. stp x0, x1, [x4, #ARM_SMCCC_RES_X0_OFFS]
  16. stp x2, x3, [x4, #ARM_SMCCC_RES_X2_OFFS]
  17. ldr x4, [sp, #8]
  18. cbz x4, 1f /* no quirk structure */
  19. ldr x9, [x4, #ARM_SMCCC_QUIRK_ID_OFFS]
  20. cmp x9, #ARM_SMCCC_QUIRK_QCOM_A6
  21. b.ne 1f
  22. str x6, [x4, ARM_SMCCC_QUIRK_STATE_OFFS]
  23. 1: ret
  24. .cfi_endproc
  25. .endm
  26. /*
  27. * void arm_smccc_smc(unsigned long a0, unsigned long a1, unsigned long a2,
  28. * unsigned long a3, unsigned long a4, unsigned long a5,
  29. * unsigned long a6, unsigned long a7, struct arm_smccc_res *res,
  30. * struct arm_smccc_quirk *quirk)
  31. */
  32. ENTRY(__arm_smccc_smc)
  33. SMCCC smc
  34. ENDPROC(__arm_smccc_smc)
  35. /*
  36. * void arm_smccc_hvc(unsigned long a0, unsigned long a1, unsigned long a2,
  37. * unsigned long a3, unsigned long a4, unsigned long a5,
  38. * unsigned long a6, unsigned long a7, struct arm_smccc_res *res,
  39. * struct arm_smccc_quirk *quirk)
  40. */
  41. ENTRY(__arm_smccc_hvc)
  42. SMCCC hvc
  43. ENDPROC(__arm_smccc_hvc)