blob: 139bb89abaef6622698283019b8d243dee98b1aa [file] [log] [blame]
//
// Copyright (c) 2012-2014, ARM Limited. All rights reserved.
//
// SPDX-License-Identifier: BSD-2-Clause-Patent
//
//
#include <AsmMacroLib.h>
ASM_FUNC(ArmCallSmc)
// Push frame pointer and return address on the stack
stp x29, x30, [sp, #-16]!
mov x29, sp
// x0 is the ARM_SMC_ARGS structure address
// x30 is used as a scratch register upon returning from SMC
mov x30, x0
// Load the SMC arguments values into the appropriate registers
ldp x16, x17, [x0, #128]
ldp x14, x15, [x0, #112]
ldp x12, x13, [x0, #96]
ldp x10, x11, [x0, #80]
ldp x8, x9, [x0, #64]
ldp x6, x7, [x0, #48]
ldp x4, x5, [x0, #32]
ldp x2, x3, [x0, #16]
ldp x0, x1, [x0, #0]
smc #0
// Store the SMC returned values into the ARM_SMC_ARGS structure.
// A SMC call can return up to 18 values.
stp x16, x17, [x30, #128]
stp x14, x15, [x30, #112]
stp x12, x13, [x30, #96]
stp x10, x11, [x30, #80]
stp x8, x9, [x30, #64]
stp x6, x7, [x30, #48]
stp x4, x5, [x30, #32]
stp x2, x3, [x30, #16]
stp x0, x1, [x30, #0]
ldp x29, x30, [sp], #16
ret