linux/arch/arm64/kernel/smccc-call.S
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2015, Linaro Limited
   3 *
   4 * This program is free software; you can redistribute it and/or modify
   5 * it under the terms of the GNU General Public License Version 2 as
   6 * published by the Free Software Foundation.
   7 *
   8 * This program is distributed in the hope that it will be useful,
   9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11 * GNU General Public License for more details.
  12 *
  13 */
  14#include <linux/linkage.h>
  15#include <linux/arm-smccc.h>
  16#include <asm/asm-offsets.h>
  17
  18        .macro SMCCC instr
  19        .cfi_startproc
  20        \instr  #0
  21        ldr     x4, [sp]
  22        stp     x0, x1, [x4, #ARM_SMCCC_RES_X0_OFFS]
  23        stp     x2, x3, [x4, #ARM_SMCCC_RES_X2_OFFS]
  24        ldr     x4, [sp, #8]
  25        cbz     x4, 1f /* no quirk structure */
  26        ldr     x9, [x4, #ARM_SMCCC_QUIRK_ID_OFFS]
  27        cmp     x9, #ARM_SMCCC_QUIRK_QCOM_A6
  28        b.ne    1f
  29        str     x6, [x4, ARM_SMCCC_QUIRK_STATE_OFFS]
  301:      ret
  31        .cfi_endproc
  32        .endm
  33
  34/*
  35 * void arm_smccc_smc(unsigned long a0, unsigned long a1, unsigned long a2,
  36 *                unsigned long a3, unsigned long a4, unsigned long a5,
  37 *                unsigned long a6, unsigned long a7, struct arm_smccc_res *res,
  38 *                struct arm_smccc_quirk *quirk)
  39 */
  40ENTRY(__arm_smccc_smc)
  41        SMCCC   smc
  42ENDPROC(__arm_smccc_smc)
  43
  44/*
  45 * void arm_smccc_hvc(unsigned long a0, unsigned long a1, unsigned long a2,
  46 *                unsigned long a3, unsigned long a4, unsigned long a5,
  47 *                unsigned long a6, unsigned long a7, struct arm_smccc_res *res,
  48 *                struct arm_smccc_quirk *quirk)
  49 */
  50ENTRY(__arm_smccc_hvc)
  51        SMCCC   hvc
  52ENDPROC(__arm_smccc_hvc)
  53