]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmPkg/Library/ArmSmcLib/ArmSmc.c
ArmPkg: Add SMC helper functions
[mirror_edk2.git] / ArmPkg / Library / ArmSmcLib / ArmSmc.c
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