]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ArmPkg: Add SMC helper functions
authorRebecca Cran <rebecca@nuviainc.com>
Mon, 13 Dec 2021 18:30:55 +0000 (11:30 -0700)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Tue, 14 Dec 2021 11:30:26 +0000 (11:30 +0000)
Add functions ArmCallSmc0/1/2/3 to do SMC calls with 0, 1, 2 or 3
arguments.
The functions return up to 3 values.

Signed-off-by: Rebecca Cran <rebecca@nuviainc.com>
Reviewed-by: Sami Mujawar <sami.mujawar@arm.com>
ArmPkg/Include/Library/ArmSmcLib.h
ArmPkg/Library/ArmSmcLib/ArmSmc.c [new file with mode: 0644]
ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf
ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.c

index f5b45f0a8cdf792846b5d5db6eada697b6c8860d..beef0175c35ce86aac9e465f9062bf8052b08dfb 100644 (file)
@@ -1,5 +1,6 @@
 /** @file\r
 *\r
+*  Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>\r
 *  Copyright (c) 2012-2014, ARM Limited. All rights reserved.\r
 *\r
 *  SPDX-License-Identifier: BSD-2-Clause-Patent\r
@@ -37,4 +38,76 @@ ArmCallSmc (
   IN OUT ARM_SMC_ARGS  *Args\r
   );\r
 \r
+/** Trigger an SMC call with 3 arguments.\r
+\r
+  @param Function The SMC function.\r
+  @param Arg1     Argument/result.\r
+  @param Arg2     Argument/result.\r
+  @param Arg3     Argument/result.\r
+\r
+  @return The SMC error code.\r
+\r
+**/\r
+UINTN\r
+ArmCallSmc3 (\r
+  IN     UINTN  Function,\r
+  IN OUT UINTN  *Arg1 OPTIONAL,\r
+  IN OUT UINTN  *Arg2 OPTIONAL,\r
+  IN OUT UINTN  *Arg3 OPTIONAL\r
+  );\r
+\r
+/** Trigger an SMC call with 2 arguments.\r
+\r
+  @param Function The SMC function.\r
+  @param Arg1     Argument/result.\r
+  @param Arg2     Argument/result.\r
+  @param Arg3     Result.\r
+\r
+  @return The SMC error code.\r
+\r
+**/\r
+UINTN\r
+ArmCallSmc2 (\r
+  IN     UINTN  Function,\r
+  IN OUT UINTN  *Arg1 OPTIONAL,\r
+  IN OUT UINTN  *Arg2 OPTIONAL,\r
+  OUT UINTN     *Arg3 OPTIONAL\r
+  );\r
+\r
+/** Trigger an SMC call with 1 argument.\r
+\r
+  @param Function The SMC function.\r
+  @param Arg1     Argument/result.\r
+  @param Arg2     Result.\r
+  @param Arg3     Result.\r
+\r
+  @return The SMC error code.\r
+\r
+**/\r
+UINTN\r
+ArmCallSmc1 (\r
+  IN     UINTN  Function,\r
+  IN OUT UINTN  *Arg1 OPTIONAL,\r
+  OUT UINTN     *Arg2 OPTIONAL,\r
+  OUT UINTN     *Arg3 OPTIONAL\r
+  );\r
+\r
+/** Trigger an SMC call with 0 arguments.\r
+\r
+  @param Function The SMC function.\r
+  @param Arg1     Result.\r
+  @param Arg2     Result.\r
+  @param Arg3     Result.\r
+\r
+  @return The SMC error code.\r
+\r
+**/\r
+UINTN\r
+ArmCallSmc0 (\r
+  IN     UINTN  Function,\r
+  OUT UINTN     *Arg1 OPTIONAL,\r
+  OUT UINTN     *Arg2 OPTIONAL,\r
+  OUT UINTN     *Arg3 OPTIONAL\r
+  );\r
+\r
 #endif // ARM_SMC_LIB_H_\r
diff --git a/ArmPkg/Library/ArmSmcLib/ArmSmc.c b/ArmPkg/Library/ArmSmcLib/ArmSmc.c
new file mode 100644 (file)
index 0000000..254507e
--- /dev/null
@@ -0,0 +1,129 @@
+/** @file\r
+  SMC helper functions.\r
+\r
+  Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>\r
+\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#include <Library/ArmSmcLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+\r
+/** Triggers an SMC call with 3 arguments.\r
+\r
+  @param Function The SMC function.\r
+  @param Arg1     Argument/result.\r
+  @param Arg2     Argument/result.\r
+  @param Arg3     Argument/result.\r
+\r
+  @return The SMC error code.\r
+**/\r
+UINTN\r
+ArmCallSmc3 (\r
+  IN     UINTN  Function,\r
+  IN OUT UINTN  *Arg1 OPTIONAL,\r
+  IN OUT UINTN  *Arg2 OPTIONAL,\r
+  IN OUT UINTN  *Arg3 OPTIONAL\r
+  )\r
+{\r
+  ARM_SMC_ARGS  Args;\r
+  UINTN         ErrorCode;\r
+\r
+  ZeroMem (&Args, sizeof (ARM_SMC_ARGS));\r
+\r
+  Args.Arg0 = Function;\r
+\r
+  if (Arg1 != NULL) {\r
+    Args.Arg1 = *Arg1;\r
+  }\r
+\r
+  if (Arg2 != NULL) {\r
+    Args.Arg2 = *Arg2;\r
+  }\r
+\r
+  if (Arg3 != NULL) {\r
+    Args.Arg3 = *Arg3;\r
+  }\r
+\r
+  ArmCallSmc (&Args);\r
+\r
+  ErrorCode = Args.Arg0;\r
+\r
+  if (Arg1 != NULL) {\r
+    *Arg1 = Args.Arg1;\r
+  }\r
+\r
+  if (Arg2 != NULL) {\r
+    *Arg2 = Args.Arg2;\r
+  }\r
+\r
+  if (Arg3 != NULL) {\r
+    *Arg3 = Args.Arg3;\r
+  }\r
+\r
+  return ErrorCode;\r
+}\r
+\r
+/** Trigger an SMC call with 2 arguments.\r
+\r
+  @param Function The SMC function.\r
+  @param Arg1     Argument/result.\r
+  @param Arg2     Argument/result.\r
+  @param Arg3     Result.\r
+\r
+  @return The SMC error code.\r
+\r
+**/\r
+UINTN\r
+ArmCallSmc2 (\r
+  IN     UINTN  Function,\r
+  IN OUT UINTN  *Arg1 OPTIONAL,\r
+  IN OUT UINTN  *Arg2 OPTIONAL,\r
+  OUT UINTN     *Arg3 OPTIONAL\r
+  )\r
+{\r
+  return ArmCallSmc3 (Function, Arg1, Arg2, Arg3);\r
+}\r
+\r
+/** Trigger an SMC call with 1 argument.\r
+\r
+  @param Function The SMC function.\r
+  @param Arg1     Argument/result.\r
+  @param Arg2     Result.\r
+  @param Arg3     Result.\r
+\r
+  @return The SMC error code.\r
+\r
+**/\r
+UINTN\r
+ArmCallSmc1 (\r
+  IN     UINTN  Function,\r
+  IN OUT UINTN  *Arg1 OPTIONAL,\r
+  OUT UINTN     *Arg2 OPTIONAL,\r
+  OUT UINTN     *Arg3 OPTIONAL\r
+  )\r
+{\r
+  return ArmCallSmc3 (Function, Arg1, Arg2, Arg3);\r
+}\r
+\r
+/** Trigger an SMC call with 0 arguments.\r
+\r
+  @param Function The SMC function.\r
+  @param Arg1     Result.\r
+  @param Arg2     Result.\r
+  @param Arg3     Result.\r
+\r
+  @return The SMC error code.\r
+\r
+**/\r
+UINTN\r
+ArmCallSmc0 (\r
+  IN     UINTN  Function,\r
+  OUT UINTN     *Arg1 OPTIONAL,\r
+  OUT UINTN     *Arg2 OPTIONAL,\r
+  OUT UINTN     *Arg3 OPTIONAL\r
+  )\r
+{\r
+  return ArmCallSmc3 (Function, Arg1, Arg2, Arg3);\r
+}\r
index 4f4b09f4528ac3b84d7ac58246c5a77b48c828d2..a89f9203fb7e0d8b471fb0b642af3110ba059398 100644 (file)
@@ -20,6 +20,9 @@
 [Sources.AARCH64]\r
   AArch64/ArmSmc.S\r
 \r
+[Sources]\r
+  ArmSmc.c\r
+\r
 [Packages]\r
   MdePkg/MdePkg.dec\r
   ArmPkg/ArmPkg.dec\r
index 3c1adef8ebe6e38e1e901ea85b2a3188b245e7e9..28514e43c2de229b9d1f49cccac682b2f0abb0f8 100644 (file)
@@ -1,4 +1,5 @@
 //\r
+//  Copyright (c) 2021, NUVIA Inc. All rights reserved.\r
 //  Copyright (c) 2016, Linaro Limited. All rights reserved.\r
 //\r
 //  SPDX-License-Identifier: BSD-2-Clause-Patent\r
@@ -7,6 +8,7 @@
 \r
 #include <Base.h>\r
 #include <Library/ArmSmcLib.h>\r
+#include <IndustryStandard/ArmStdSmc.h>\r
 \r
 VOID\r
 ArmCallSmc (\r
@@ -14,3 +16,86 @@ ArmCallSmc (
   )\r
 {\r
 }\r
+\r
+/** Triggers an SMC call with 3 arguments.\r
+\r
+  @param Function The SMC function.\r
+  @param Arg1      Argument/result.\r
+  @param Arg2      Argument/result.\r
+  @param Arg3      Argument/result.\r
+\r
+  @return The SMC error code.\r
+**/\r
+UINTN\r
+ArmCallSmc3 (\r
+  IN     UINTN  Function,\r
+  IN OUT UINTN  *Arg1 OPTIONAL,\r
+  IN OUT UINTN  *Arg2 OPTIONAL,\r
+  IN OUT UINTN  *Arg3 OPTIONAL\r
+  )\r
+{\r
+  return SMC_ARCH_CALL_NOT_SUPPORTED;\r
+}\r
+\r
+/** Trigger an SMC call with 2 arguments.\r
+\r
+  @param Function The SMC function.\r
+  @param Arg1      Argument/result.\r
+  @param Arg2      Argument/result.\r
+  @param Arg3      Result.\r
+\r
+  @return The SMC error code.\r
+\r
+**/\r
+UINTN\r
+ArmCallSmc2 (\r
+  IN     UINTN  Function,\r
+  IN OUT UINTN  *Arg1 OPTIONAL,\r
+  IN OUT UINTN  *Arg2 OPTIONAL,\r
+  OUT UINTN     *Arg3 OPTIONAL\r
+  )\r
+{\r
+  return SMC_ARCH_CALL_NOT_SUPPORTED;\r
+}\r
+\r
+/** Trigger an SMC call with 1 argument.\r
+\r
+  @param Function The SMC function.\r
+  @param Arg1      Argument/result.\r
+  @param Arg2      Result.\r
+  @param Arg3      Result.\r
+\r
+  @return The SMC error code.\r
+\r
+**/\r
+UINTN\r
+ArmCallSmc1 (\r
+  IN     UINTN  Function,\r
+  IN OUT UINTN  *Arg1 OPTIONAL,\r
+  OUT UINTN     *Arg2 OPTIONAL,\r
+  OUT UINTN     *Arg3 OPTIONAL\r
+  )\r
+{\r
+  return SMC_ARCH_CALL_NOT_SUPPORTED;\r
+}\r
+\r
+/** Trigger an SMC call with 0 arguments.\r
+\r
+  @param Function The SMC function.\r
+  @param Arg1     Result.\r
+  @param Arg2     Result.\r
+  @param Arg3     Result.\r
+\r
+  @return The SMC error code.\r
+\r
+**/\r
+UINTN\r
+ArmCallSmc0 (\r
+  IN  UINTN  Function,\r
+  OUT UINTN  *Arg1 OPTIONAL,\r
+  OUT UINTN  *Arg2 OPTIONAL,\r
+  OUT UINTN  *Arg3 OPTIONAL\r
+  )\r
+{\r
+  return SMC_ARCH_CALL_NOT_SUPPORTED;\r
+}\r