ArmPkg/ArmSvcLib: Add ArmSvcLib implementation.
This patch adds a library that enables invocation of SVCs from Exception Level EL0. It will be used by the Standalone MM environment to request services from a software running in a privileged EL e.g. ARM Trusted Firmware. The library is derived directly from Arm SMC Library. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Achin Gupta <achin.gupta@arm.com> Signed-off-by: Supreeth Venkatesh <supreeth.venkatesh@arm.com> [ardb: assign frame pointer (AArch64) keep stack alignment (ARM)] Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
This commit is contained in:
committed by
Ard Biesheuvel
parent
4d163696f2
commit
f8f0e454e1
39
ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.asm
Normal file
39
ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.asm
Normal file
@@ -0,0 +1,39 @@
|
||||
//
|
||||
// Copyright (c) 2016 - 2017, ARM Limited. All rights reserved.
|
||||
//
|
||||
// This program and the accompanying materials
|
||||
// are licensed and made available under the terms and conditions of the BSD License
|
||||
// which accompanies this distribution. The full text of the license may be found at
|
||||
// http://opensource.org/licenses/bsd-license.php
|
||||
//
|
||||
// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
//
|
||||
//
|
||||
|
||||
|
||||
INCLUDE AsmMacroExport.inc
|
||||
|
||||
RVCT_ASM_EXPORT ArmCallSvc
|
||||
// r0 will be popped just after the SVC call
|
||||
push {r0, r4-r8}
|
||||
|
||||
// Load the SVC arguments values into the appropriate registers
|
||||
ldm r0, {r0-r7}
|
||||
|
||||
svc #0
|
||||
|
||||
// Load the ARM_SVC_ARGS structure address from the stack into r8
|
||||
ldr r8, [sp]
|
||||
|
||||
// Load the SVC returned values into the appropriate registers
|
||||
// A SVC call can return up to 4 values - we do not need to store back r4-r7.
|
||||
stm r8, {r0-r3}
|
||||
|
||||
mov r0, r8
|
||||
|
||||
// Restore the registers r4-r8
|
||||
pop {r1, r4-r8}
|
||||
bx lr
|
||||
|
||||
END
|
Reference in New Issue
Block a user