* [Patch v2 0/3] *** Add ArmSvc Library ***
@ 2017-09-20 19:48 Supreeth Venkatesh
2017-09-20 19:48 ` [Patch v2 1/3] ArmPkg/ArmSvcLib: Add ArmSvcLib implementation Supreeth Venkatesh
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Supreeth Venkatesh @ 2017-09-20 19:48 UTC (permalink / raw)
To: edk2-devel; +Cc: leif.lindholm, ard.biesheuvel, Supreeth Venkatesh
***
This patchset 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.
Further, it builds the library during the build of Arm Pacakge and the library
exports the header file for inclusion in other modules.
This is tested on AARCH64 Reference platform and
has not been tested on ARM 32 bit Platform.
Changes Since v1:
(*) Update Review Comments from Ard.
(*) Reword Commit subject for the patches in the set to convey meaningful summary.
***
Supreeth Venkatesh (3):
ArmPkg/ArmSvcLib: Add ArmSvcLib implementation.
ArmPkg: Modify description file to build ArmSvcLib.
ArmPkg/Include: Add ArmSvcLib header file.
ArmPkg/ArmPkg.dsc | 1 +
ArmPkg/Include/Library/ArmSvcLib.h | 46 +++++++++++++++++++++++++++++++
ArmPkg/Library/ArmSvcLib/AArch64/ArmSvc.S | 43 +++++++++++++++++++++++++++++
ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.S | 41 +++++++++++++++++++++++++++
ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.asm | 39 ++++++++++++++++++++++++++
ArmPkg/Library/ArmSvcLib/ArmSvcLib.inf | 31 +++++++++++++++++++++
6 files changed, 201 insertions(+)
create mode 100644 ArmPkg/Include/Library/ArmSvcLib.h
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
--
2.14.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Patch v2 1/3] ArmPkg/ArmSvcLib: Add ArmSvcLib implementation.
2017-09-20 19:48 [Patch v2 0/3] *** Add ArmSvc Library *** Supreeth Venkatesh
@ 2017-09-20 19:48 ` Supreeth Venkatesh
2017-09-20 19:48 ` [Patch v2 2/3] ArmPkg: Modify description file to build ArmSvcLib Supreeth Venkatesh
2017-09-20 19:48 ` [Patch v2 3/3] ArmPkg/Include: Add ArmSvcLib header file Supreeth Venkatesh
2 siblings, 0 replies; 4+ messages in thread
From: Supreeth Venkatesh @ 2017-09-20 19:48 UTC (permalink / raw)
To: edk2-devel; +Cc: leif.lindholm, ard.biesheuvel, Supreeth Venkatesh, Achin Gupta
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>
---
ArmPkg/Library/ArmSvcLib/AArch64/ArmSvc.S | 43 +++++++++++++++++++++++++++++++
ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.S | 41 +++++++++++++++++++++++++++++
ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.asm | 39 ++++++++++++++++++++++++++++
ArmPkg/Library/ArmSvcLib/ArmSvcLib.inf | 31 ++++++++++++++++++++++
4 files changed, 154 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/Library/ArmSvcLib/AArch64/ArmSvc.S b/ArmPkg/Library/ArmSvcLib/AArch64/ArmSvc.S
new file mode 100644
index 0000000000..ffe005c07c
--- /dev/null
+++ b/ArmPkg/Library/ArmSvcLib/AArch64/ArmSvc.S
@@ -0,0 +1,43 @@
+//
+// 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 x0 on the stack - The stack must always be quad-word aligned
+ str x0, [sp, #-16]!
+ // Push frame pointer and return address on the stack
+ stp x29, x30, [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], #32
+
+ // 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
+
+ ret
diff --git a/ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.S b/ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.S
new file mode 100644
index 0000000000..6072d86d6f
--- /dev/null
+++ b/ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.S
@@ -0,0 +1,41 @@
+//
+// 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
+.arch_extension sec
+
+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
+
+ // Pop the ARM_SVC_ARGS structure address from the stack into r8
+ pop {r8}
+
+ // 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 {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..fd3e77c3b6
--- /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
+
+ // Pop the ARM_SVC_ARGS structure address from the stack into r8
+ pop {r8}
+
+ // 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 {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.<BR>
+# 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
--
2.14.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [Patch v2 2/3] ArmPkg: Modify description file to build ArmSvcLib.
2017-09-20 19:48 [Patch v2 0/3] *** Add ArmSvc Library *** Supreeth Venkatesh
2017-09-20 19:48 ` [Patch v2 1/3] ArmPkg/ArmSvcLib: Add ArmSvcLib implementation Supreeth Venkatesh
@ 2017-09-20 19:48 ` Supreeth Venkatesh
2017-09-20 19:48 ` [Patch v2 3/3] ArmPkg/Include: Add ArmSvcLib header file Supreeth Venkatesh
2 siblings, 0 replies; 4+ messages in thread
From: Supreeth Venkatesh @ 2017-09-20 19:48 UTC (permalink / raw)
To: edk2-devel; +Cc: leif.lindholm, ard.biesheuvel, Supreeth Venkatesh, Achin Gupta
Add ArmPkg/Library/ArmSvcLib/ArmSvcLib.inf to [Components.common]
section of ArmPkg.dsc file to build it as part of Arm package.
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>
---
ArmPkg/ArmPkg.dsc | 1 +
1 file changed, 1 insertion(+)
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
--
2.14.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [Patch v2 3/3] ArmPkg/Include: Add ArmSvcLib header file.
2017-09-20 19:48 [Patch v2 0/3] *** Add ArmSvc Library *** Supreeth Venkatesh
2017-09-20 19:48 ` [Patch v2 1/3] ArmPkg/ArmSvcLib: Add ArmSvcLib implementation Supreeth Venkatesh
2017-09-20 19:48 ` [Patch v2 2/3] ArmPkg: Modify description file to build ArmSvcLib Supreeth Venkatesh
@ 2017-09-20 19:48 ` Supreeth Venkatesh
2 siblings, 0 replies; 4+ messages in thread
From: Supreeth Venkatesh @ 2017-09-20 19:48 UTC (permalink / raw)
To: edk2-devel; +Cc: leif.lindholm, ard.biesheuvel, Supreeth Venkatesh, Achin Gupta
ArmSvcLib header file to specify the SVC arguments structure and
function prototype to trigger an SVC call.
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>
---
ArmPkg/Include/Library/ArmSvcLib.h | 46 ++++++++++++++++++++++++++++++++++++++
1 file changed, 46 insertions(+)
create mode 100644 ArmPkg/Include/Library/ArmSvcLib.h
diff --git a/ArmPkg/Include/Library/ArmSvcLib.h b/ArmPkg/Include/Library/ArmSvcLib.h
new file mode 100644
index 0000000000..77a60b3679
--- /dev/null
+++ b/ArmPkg/Include/Library/ArmSvcLib.h
@@ -0,0 +1,46 @@
+/** @file
+*
+* 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.
+*
+**/
+
+#ifndef __ARM_SVC_LIB__
+#define __ARM_SVC_LIB__
+
+/**
+ * The size of the SVC arguments are different between AArch64 and AArch32.
+ * The native size is used for the arguments.
+ */
+typedef struct {
+ UINTN Arg0;
+ UINTN Arg1;
+ UINTN Arg2;
+ UINTN Arg3;
+ UINTN Arg4;
+ UINTN Arg5;
+ UINTN Arg6;
+ UINTN Arg7;
+} ARM_SVC_ARGS;
+
+/**
+ Trigger an SVC call
+
+ SVC calls can take up to 7 arguments and return up to 4 return values.
+ Therefore, the 4 first fields in the ARM_SVC_ARGS structure are used
+ for both input and output values.
+
+**/
+VOID
+ArmCallSvc (
+ IN OUT ARM_SVC_ARGS *Args
+ );
+
+#endif
--
2.14.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2017-09-20 19:45 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-09-20 19:48 [Patch v2 0/3] *** Add ArmSvc Library *** Supreeth Venkatesh
2017-09-20 19:48 ` [Patch v2 1/3] ArmPkg/ArmSvcLib: Add ArmSvcLib implementation Supreeth Venkatesh
2017-09-20 19:48 ` [Patch v2 2/3] ArmPkg: Modify description file to build ArmSvcLib Supreeth Venkatesh
2017-09-20 19:48 ` [Patch v2 3/3] ArmPkg/Include: Add ArmSvcLib header file Supreeth Venkatesh
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox