aboutsummaryrefslogtreecommitdiffstats
path: root/roms/edk2/ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.S
diff options
context:
space:
mode:
Diffstat (limited to 'roms/edk2/ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.S')
-rw-r--r--roms/edk2/ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.S36
1 files changed, 36 insertions, 0 deletions
diff --git a/roms/edk2/ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.S b/roms/edk2/ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.S
new file mode 100644
index 000000000..e81eb88f2
--- /dev/null
+++ b/roms/edk2/ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.S
@@ -0,0 +1,36 @@
+//
+// Copyright (c) 2016 - 2020, ARM Limited. All rights reserved.
+//
+// SPDX-License-Identifier: BSD-2-Clause-Patent
+//
+//
+
+.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
+ // Prevent speculative execution beyond svc instruction
+ dsb nsh
+ isb
+
+ // 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