From 4d303524451d87d411c972736015138a8a4f03f6 Mon Sep 17 00:00:00 2001 From: Rebecca Cran Date: Mon, 13 Dec 2021 11:30:55 -0700 Subject: ArmPkg: Add SMC helper functions 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 Reviewed-by: Sami Mujawar --- ArmPkg/Library/ArmSmcLib/ArmSmc.c | 129 +++++++++++++++++++++++++++ ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf | 3 + ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.c | 85 ++++++++++++++++++ 3 files changed, 217 insertions(+) create mode 100644 ArmPkg/Library/ArmSmcLib/ArmSmc.c (limited to 'ArmPkg/Library') diff --git a/ArmPkg/Library/ArmSmcLib/ArmSmc.c b/ArmPkg/Library/ArmSmcLib/ArmSmc.c new file mode 100644 index 0000000000..254507e219 --- /dev/null +++ b/ArmPkg/Library/ArmSmcLib/ArmSmc.c @@ -0,0 +1,129 @@ +/** @file + SMC helper functions. + + Copyright (c) 2021, NUVIA Inc. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include + +/** Triggers an SMC call with 3 arguments. + + @param Function The SMC function. + @param Arg1 Argument/result. + @param Arg2 Argument/result. + @param Arg3 Argument/result. + + @return The SMC error code. +**/ +UINTN +ArmCallSmc3 ( + IN UINTN Function, + IN OUT UINTN *Arg1 OPTIONAL, + IN OUT UINTN *Arg2 OPTIONAL, + IN OUT UINTN *Arg3 OPTIONAL + ) +{ + ARM_SMC_ARGS Args; + UINTN ErrorCode; + + ZeroMem (&Args, sizeof (ARM_SMC_ARGS)); + + Args.Arg0 = Function; + + if (Arg1 != NULL) { + Args.Arg1 = *Arg1; + } + + if (Arg2 != NULL) { + Args.Arg2 = *Arg2; + } + + if (Arg3 != NULL) { + Args.Arg3 = *Arg3; + } + + ArmCallSmc (&Args); + + ErrorCode = Args.Arg0; + + if (Arg1 != NULL) { + *Arg1 = Args.Arg1; + } + + if (Arg2 != NULL) { + *Arg2 = Args.Arg2; + } + + if (Arg3 != NULL) { + *Arg3 = Args.Arg3; + } + + return ErrorCode; +} + +/** Trigger an SMC call with 2 arguments. + + @param Function The SMC function. + @param Arg1 Argument/result. + @param Arg2 Argument/result. + @param Arg3 Result. + + @return The SMC error code. + +**/ +UINTN +ArmCallSmc2 ( + IN UINTN Function, + IN OUT UINTN *Arg1 OPTIONAL, + IN OUT UINTN *Arg2 OPTIONAL, + OUT UINTN *Arg3 OPTIONAL + ) +{ + return ArmCallSmc3 (Function, Arg1, Arg2, Arg3); +} + +/** Trigger an SMC call with 1 argument. + + @param Function The SMC function. + @param Arg1 Argument/result. + @param Arg2 Result. + @param Arg3 Result. + + @return The SMC error code. + +**/ +UINTN +ArmCallSmc1 ( + IN UINTN Function, + IN OUT UINTN *Arg1 OPTIONAL, + OUT UINTN *Arg2 OPTIONAL, + OUT UINTN *Arg3 OPTIONAL + ) +{ + return ArmCallSmc3 (Function, Arg1, Arg2, Arg3); +} + +/** Trigger an SMC call with 0 arguments. + + @param Function The SMC function. + @param Arg1 Result. + @param Arg2 Result. + @param Arg3 Result. + + @return The SMC error code. + +**/ +UINTN +ArmCallSmc0 ( + IN UINTN Function, + OUT UINTN *Arg1 OPTIONAL, + OUT UINTN *Arg2 OPTIONAL, + OUT UINTN *Arg3 OPTIONAL + ) +{ + return ArmCallSmc3 (Function, Arg1, Arg2, Arg3); +} diff --git a/ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf b/ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf index 4f4b09f452..a89f9203fb 100644 --- a/ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf +++ b/ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf @@ -20,6 +20,9 @@ [Sources.AARCH64] AArch64/ArmSmc.S +[Sources] + ArmSmc.c + [Packages] MdePkg/MdePkg.dec ArmPkg/ArmPkg.dec diff --git a/ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.c b/ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.c index 3c1adef8eb..28514e43c2 100644 --- a/ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.c +++ b/ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.c @@ -1,4 +1,5 @@ // +// Copyright (c) 2021, NUVIA Inc. All rights reserved. // Copyright (c) 2016, Linaro Limited. All rights reserved. // // SPDX-License-Identifier: BSD-2-Clause-Patent @@ -7,6 +8,7 @@ #include #include +#include VOID ArmCallSmc ( @@ -14,3 +16,86 @@ ArmCallSmc ( ) { } + +/** Triggers an SMC call with 3 arguments. + + @param Function The SMC function. + @param Arg1 Argument/result. + @param Arg2 Argument/result. + @param Arg3 Argument/result. + + @return The SMC error code. +**/ +UINTN +ArmCallSmc3 ( + IN UINTN Function, + IN OUT UINTN *Arg1 OPTIONAL, + IN OUT UINTN *Arg2 OPTIONAL, + IN OUT UINTN *Arg3 OPTIONAL + ) +{ + return SMC_ARCH_CALL_NOT_SUPPORTED; +} + +/** Trigger an SMC call with 2 arguments. + + @param Function The SMC function. + @param Arg1 Argument/result. + @param Arg2 Argument/result. + @param Arg3 Result. + + @return The SMC error code. + +**/ +UINTN +ArmCallSmc2 ( + IN UINTN Function, + IN OUT UINTN *Arg1 OPTIONAL, + IN OUT UINTN *Arg2 OPTIONAL, + OUT UINTN *Arg3 OPTIONAL + ) +{ + return SMC_ARCH_CALL_NOT_SUPPORTED; +} + +/** Trigger an SMC call with 1 argument. + + @param Function The SMC function. + @param Arg1 Argument/result. + @param Arg2 Result. + @param Arg3 Result. + + @return The SMC error code. + +**/ +UINTN +ArmCallSmc1 ( + IN UINTN Function, + IN OUT UINTN *Arg1 OPTIONAL, + OUT UINTN *Arg2 OPTIONAL, + OUT UINTN *Arg3 OPTIONAL + ) +{ + return SMC_ARCH_CALL_NOT_SUPPORTED; +} + +/** Trigger an SMC call with 0 arguments. + + @param Function The SMC function. + @param Arg1 Result. + @param Arg2 Result. + @param Arg3 Result. + + @return The SMC error code. + +**/ +UINTN +ArmCallSmc0 ( + IN UINTN Function, + OUT UINTN *Arg1 OPTIONAL, + OUT UINTN *Arg2 OPTIONAL, + OUT UINTN *Arg3 OPTIONAL + ) +{ + return SMC_ARCH_CALL_NOT_SUPPORTED; +} -- cgit v1.2.3