From f8f0e454e1f9e0be354cfab2b70d4faa14982f6f Mon Sep 17 00:00:00 2001 From: Supreeth Venkatesh Date: Wed, 20 Sep 2017 20:48:11 +0100 Subject: [PATCH] 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 Signed-off-by: Supreeth Venkatesh [ardb: assign frame pointer (AArch64) keep stack alignment (ARM)] Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ard Biesheuvel --- ArmPkg/ArmPkg.dsc | 1 + ArmPkg/Library/ArmSvcLib/AArch64/ArmSvc.S | 46 +++++++++++++++++++++++ ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.S | 39 +++++++++++++++++++ ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.asm | 39 +++++++++++++++++++ ArmPkg/Library/ArmSvcLib/ArmSvcLib.inf | 31 +++++++++++++++ 5 files changed, 156 insertions(+) create mode 100644 ArmPkg/Library/ArmSvcLib/AArch64/ArmSvc.S create mode 100644 ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.S create mode 100644 ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.asm create mode 100644 ArmPkg/Library/ArmSvcLib/ArmSvcLib.inf diff --git a/ArmPkg/ArmPkg.dsc b/ArmPkg/ArmPkg.dsc index fc24a788df..cf9a5c1210 100644 --- a/ArmPkg/ArmPkg.dsc +++ b/ArmPkg/ArmPkg.dsc @@ -133,6 +133,7 @@ ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.inf ArmPkg/Library/ArmHvcLib/ArmHvcLib.inf + ArmPkg/Library/ArmSvcLib/ArmSvcLib.inf ArmPkg/Filesystem/SemihostFs/SemihostFs.inf diff --git a/ArmPkg/Library/ArmSvcLib/AArch64/ArmSvc.S b/ArmPkg/Library/ArmSvcLib/AArch64/ArmSvc.S new file mode 100644 index 0000000000..7b8e4a965b --- /dev/null +++ b/ArmPkg/Library/ArmSvcLib/AArch64/ArmSvc.S @@ -0,0 +1,46 @@ +// +// Copyright (c) 2012 - 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. +// +// + +.text +.align 3 + +GCC_ASM_EXPORT(ArmCallSvc) + +ASM_PFX(ArmCallSvc): + // Push frame pointer and return address on the stack + stp x29, x30, [sp, #-32]! + mov x29, sp + + // Push x0 on the stack - The stack must always be quad-word aligned + str x0, [sp, #16] + + // Load the SVC arguments values into the appropriate registers + ldp x6, x7, [x0, #48] + ldp x4, x5, [x0, #32] + ldp x2, x3, [x0, #16] + ldp x0, x1, [x0, #0] + + svc #0 + + // Pop the ARM_SVC_ARGS structure address from the stack into x9 + ldr x9, [sp, #16] + + // Store the SVC returned values into the ARM_SVC_ARGS structure. + // A SVC call can return up to 4 values - we do not need to store back x4-x7. + stp x0, x1, [x9, #0] + stp x2, x3, [x9, #16] + + mov x0, x9 + + ldp x29, x30, [sp], #32 + ret diff --git a/ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.S b/ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.S new file mode 100644 index 0000000000..29bf8e452b --- /dev/null +++ b/ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.S @@ -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. +// +// + +.text +.align 3 + +GCC_ASM_EXPORT(ArmCallSvc) + +ASM_PFX(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 diff --git a/ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.asm b/ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.asm new file mode 100644 index 0000000000..8f9ad17a6a --- /dev/null +++ b/ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.asm @@ -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 diff --git a/ArmPkg/Library/ArmSvcLib/ArmSvcLib.inf b/ArmPkg/Library/ArmSvcLib/ArmSvcLib.inf new file mode 100644 index 0000000000..12658c7c41 --- /dev/null +++ b/ArmPkg/Library/ArmSvcLib/ArmSvcLib.inf @@ -0,0 +1,31 @@ +#/** @file +# +# Copyright (c) 2016 - 2017, ARM Ltd. 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. +# +#**/ + +[Defines] + INF_VERSION = 0x0001001A + BASE_NAME = ArmSvcLib + FILE_GUID = 8e3618d7-f01d-4d65-b32b-4c70aacc8e49 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = ArmSvcLib + +[Sources.ARM] + Arm/ArmSvc.asm | RVCT + Arm/ArmSvc.S | GCC + +[Sources.AARCH64] + AArch64/ArmSvc.S + +[Packages] + ArmPkg/ArmPkg.dec + MdePkg/MdePkg.dec