public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [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