/** @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
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
--- /dev/null
+/** @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
[Sources.AARCH64]\r
AArch64/ArmSmc.S\r
\r
+[Sources]\r
+ ArmSmc.c\r
+\r
[Packages]\r
MdePkg/MdePkg.dec\r
ArmPkg/ArmPkg.dec\r
//\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
\r
#include <Base.h>\r
#include <Library/ArmSmcLib.h>\r
+#include <IndustryStandard/ArmStdSmc.h>\r
\r
VOID\r
ArmCallSmc (\r
)\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