[edk2-devel] [PATCH v2 1/2] ArmPkg: Add SMC helper functions

Rebecca Cran posted 2 patches 4 years, 3 months ago
There is a newer version of this series
[edk2-devel] [PATCH v2 1/2] ArmPkg: Add SMC helper functions
Posted by Rebecca Cran 4 years, 3 months ago
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>
---
 ArmPkg/Include/Library/ArmSmcLib.h           |  73 ++++++++++++
 ArmPkg/Library/ArmSmcLib/ArmSmc.c            | 122 ++++++++++++++++++++
 ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf       |   3 +
 ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.c |  85 ++++++++++++++
 4 files changed, 283 insertions(+)

diff --git a/ArmPkg/Include/Library/ArmSmcLib.h b/ArmPkg/Include/Library/ArmSmcLib.h
index ced60b3c1147..343ae7f40ad2 100644
--- a/ArmPkg/Include/Library/ArmSmcLib.h
+++ b/ArmPkg/Include/Library/ArmSmcLib.h
@@ -1,5 +1,6 @@
 /** @file
 *
+*  Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
 *  Copyright (c) 2012-2014, ARM Limited. All rights reserved.
 *
 *  SPDX-License-Identifier: BSD-2-Clause-Patent
@@ -37,4 +38,76 @@ ArmCallSmc (
   IN OUT ARM_SMC_ARGS *Args
   );
 
+/** Trigger 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,
+  IN OUT UINTN *Arg2,
+  IN OUT UINTN *Arg3
+  );
+
+/** 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,
+  IN OUT UINTN *Arg2,
+     OUT UINTN *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,
+     OUT UINTN *Arg2,
+     OUT UINTN *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,
+     OUT UINTN *Arg2,
+     OUT UINTN *Arg3
+  );
+
 #endif // ARM_SMC_LIB_H_
diff --git a/ArmPkg/Library/ArmSmcLib/ArmSmc.c b/ArmPkg/Library/ArmSmcLib/ArmSmc.c
new file mode 100644
index 000000000000..d596003a857e
--- /dev/null
+++ b/ArmPkg/Library/ArmSmcLib/ArmSmc.c
@@ -0,0 +1,122 @@
+/** @file
+  SMC helper functions.
+
+  Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Library/ArmSmcLib.h>
+
+/** 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,
+  IN OUT UINTN *Arg2,
+  IN OUT UINTN *Arg3
+  )
+{
+  ARM_SMC_ARGS Args;
+  UINTN        ErrorCode;
+
+  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,
+  IN OUT UINTN *Arg2,
+     OUT UINTN *Arg3
+  )
+{
+  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,
+     OUT UINTN *Arg2,
+     OUT UINTN *Arg3
+  )
+{
+  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,
+     OUT UINTN *Arg2,
+     OUT UINTN *Arg3
+  )
+{
+  return ArmCallSmc3 (Function, Arg1, Arg2, Arg3);
+}
diff --git a/ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf b/ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf
index 4f4b09f4528a..a89f9203fb7e 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 2d79aadaf1fa..ca1b8830a119 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 <Base.h>
 #include <Library/ArmSmcLib.h>
+#include <IndustryStandard/ArmStdSmc.h>
 
 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,
+  IN OUT UINTN *Arg2,
+  IN OUT UINTN *Arg3
+  )
+{
+  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,
+  IN OUT UINTN *Arg2,
+     OUT UINTN *Arg3
+  )
+{
+  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,
+     OUT UINTN *Arg2,
+     OUT UINTN *Arg3
+  )
+{
+  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,
+     OUT UINTN *Arg2,
+     OUT UINTN *Arg3
+  )
+{
+  return SMC_ARCH_CALL_NOT_SUPPORTED;
+}
-- 
2.31.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#83063): https://edk2.groups.io/g/devel/message/83063
Mute This Topic: https://groups.io/mt/86753694/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-


Re: [edk2-devel] [PATCH v2 1/2] ArmPkg: Add SMC helper functions
Posted by Sami Mujawar 4 years, 1 month ago
Hi Rebecca,

Thank you for this patch series.

The patch series does not apply on top of latest master, which I believe
is due to the Uncrustify changes.

I have some minor suggestions marked inline as [SAMI].

Otherwise this patch looks good to me.

Reviewed-by: Sami Mujawar <sami.mujawar@arm.com>

Regards,

Sami Mujawar


On 01/11/2021 10:11 PM, Rebecca Cran wrote:
> 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>
> ---
>   ArmPkg/Include/Library/ArmSmcLib.h           |  73 ++++++++++++
>   ArmPkg/Library/ArmSmcLib/ArmSmc.c            | 122 ++++++++++++++++++++
>   ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf       |   3 +
>   ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.c |  85 ++++++++++++++
>   4 files changed, 283 insertions(+)
>
> diff --git a/ArmPkg/Include/Library/ArmSmcLib.h b/ArmPkg/Include/Library/ArmSmcLib.h
> index ced60b3c1147..343ae7f40ad2 100644
> --- a/ArmPkg/Include/Library/ArmSmcLib.h
> +++ b/ArmPkg/Include/Library/ArmSmcLib.h
> @@ -1,5 +1,6 @@
>   /** @file
>   *
> +*  Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
>   *  Copyright (c) 2012-2014, ARM Limited. All rights reserved.
>   *
>   *  SPDX-License-Identifier: BSD-2-Clause-Patent
> @@ -37,4 +38,76 @@ ArmCallSmc (
>     IN OUT ARM_SMC_ARGS *Args
>     );
>
> +/** Trigger 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,
> +  IN OUT UINTN *Arg2,
> +  IN OUT UINTN *Arg3
> +  );
> +
> +/** 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,
> +  IN OUT UINTN *Arg2,
> +     OUT UINTN *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,
> +     OUT UINTN *Arg2,
> +     OUT UINTN *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,
> +     OUT UINTN *Arg2,
> +     OUT UINTN *Arg3
> +  );
> +
>   #endif // ARM_SMC_LIB_H_
> diff --git a/ArmPkg/Library/ArmSmcLib/ArmSmc.c b/ArmPkg/Library/ArmSmcLib/ArmSmc.c
> new file mode 100644
> index 000000000000..d596003a857e
> --- /dev/null
> +++ b/ArmPkg/Library/ArmSmcLib/ArmSmc.c
> @@ -0,0 +1,122 @@
> +/** @file
> +  SMC helper functions.
> +
> +  Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
> +
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#include <Library/ArmSmcLib.h>
> +
> +/** Triggers an SMC call with 3 arguments.
> +
> +  @param Function The SMC function.
> +  @param Arg1     Argument/result.
[SAMI] It may be good to document that these parameters are optional. I
believe the OPTIONAL tag can be used in the function prototype as well.
Similar comment for other functions as well.
> +  @param Arg2     Argument/result.
> +  @param Arg3     Argument/result.
> +
> +  @return The SMC error code.
> +**/
> +UINTN
> +ArmCallSmc3 (
> +  IN     UINTN Function,
> +  IN OUT UINTN *Arg1,
> +  IN OUT UINTN *Arg2,
> +  IN OUT UINTN *Arg3
> +  )
> +{
> +  ARM_SMC_ARGS Args;
> +  UINTN        ErrorCode;
> +
> +  Args.Arg0 = Function;
[SAMI] I think it would be good to zero initialise Args before use.
> +
> +  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,
> +  IN OUT UINTN *Arg2,
> +     OUT UINTN *Arg3
> +  )
> +{
> +  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,
> +     OUT UINTN *Arg2,
> +     OUT UINTN *Arg3
> +  )
> +{
> +  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,
> +     OUT UINTN *Arg2,
> +     OUT UINTN *Arg3
> +  )
> +{
> +  return ArmCallSmc3 (Function, Arg1, Arg2, Arg3);
> +}
> diff --git a/ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf b/ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf
> index 4f4b09f4528a..a89f9203fb7e 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 2d79aadaf1fa..ca1b8830a119 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 <Base.h>
>   #include <Library/ArmSmcLib.h>
> +#include <IndustryStandard/ArmStdSmc.h>
>
>   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,
> +  IN OUT UINTN *Arg2,
> +  IN OUT UINTN *Arg3
> +  )
> +{
> +  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,
> +  IN OUT UINTN *Arg2,
> +     OUT UINTN *Arg3
> +  )
> +{
> +  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,
> +     OUT UINTN *Arg2,
> +     OUT UINTN *Arg3
> +  )
> +{
> +  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,
> +     OUT UINTN *Arg2,
> +     OUT UINTN *Arg3
> +  )
> +{
> +  return SMC_ARCH_CALL_NOT_SUPPORTED;
> +}

IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#84705): https://edk2.groups.io/g/devel/message/84705
Mute This Topic: https://groups.io/mt/86753694/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-


Re: [edk2-devel] [PATCH v2 1/2] ArmPkg: Add SMC helper functions
Posted by Rebecca Cran 4 years, 3 months ago
Could I have some reviews on this please?


-- 
Rebecca Cran


On 11/1/21 4:11 PM, Rebecca Cran wrote:
> 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>
> ---
>   ArmPkg/Include/Library/ArmSmcLib.h           |  73 ++++++++++++
>   ArmPkg/Library/ArmSmcLib/ArmSmc.c            | 122 ++++++++++++++++++++
>   ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf       |   3 +
>   ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.c |  85 ++++++++++++++
>   4 files changed, 283 insertions(+)
>
> diff --git a/ArmPkg/Include/Library/ArmSmcLib.h b/ArmPkg/Include/Library/ArmSmcLib.h
> index ced60b3c1147..343ae7f40ad2 100644
> --- a/ArmPkg/Include/Library/ArmSmcLib.h
> +++ b/ArmPkg/Include/Library/ArmSmcLib.h
> @@ -1,5 +1,6 @@
>   /** @file
>   *
> +*  Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
>   *  Copyright (c) 2012-2014, ARM Limited. All rights reserved.
>   *
>   *  SPDX-License-Identifier: BSD-2-Clause-Patent
> @@ -37,4 +38,76 @@ ArmCallSmc (
>     IN OUT ARM_SMC_ARGS *Args
>     );
>   
> +/** Trigger 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,
> +  IN OUT UINTN *Arg2,
> +  IN OUT UINTN *Arg3
> +  );
> +
> +/** 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,
> +  IN OUT UINTN *Arg2,
> +     OUT UINTN *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,
> +     OUT UINTN *Arg2,
> +     OUT UINTN *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,
> +     OUT UINTN *Arg2,
> +     OUT UINTN *Arg3
> +  );
> +
>   #endif // ARM_SMC_LIB_H_
> diff --git a/ArmPkg/Library/ArmSmcLib/ArmSmc.c b/ArmPkg/Library/ArmSmcLib/ArmSmc.c
> new file mode 100644
> index 000000000000..d596003a857e
> --- /dev/null
> +++ b/ArmPkg/Library/ArmSmcLib/ArmSmc.c
> @@ -0,0 +1,122 @@
> +/** @file
> +  SMC helper functions.
> +
> +  Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
> +
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#include <Library/ArmSmcLib.h>
> +
> +/** 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,
> +  IN OUT UINTN *Arg2,
> +  IN OUT UINTN *Arg3
> +  )
> +{
> +  ARM_SMC_ARGS Args;
> +  UINTN        ErrorCode;
> +
> +  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,
> +  IN OUT UINTN *Arg2,
> +     OUT UINTN *Arg3
> +  )
> +{
> +  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,
> +     OUT UINTN *Arg2,
> +     OUT UINTN *Arg3
> +  )
> +{
> +  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,
> +     OUT UINTN *Arg2,
> +     OUT UINTN *Arg3
> +  )
> +{
> +  return ArmCallSmc3 (Function, Arg1, Arg2, Arg3);
> +}
> diff --git a/ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf b/ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf
> index 4f4b09f4528a..a89f9203fb7e 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 2d79aadaf1fa..ca1b8830a119 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 <Base.h>
>   #include <Library/ArmSmcLib.h>
> +#include <IndustryStandard/ArmStdSmc.h>
>   
>   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,
> +  IN OUT UINTN *Arg2,
> +  IN OUT UINTN *Arg3
> +  )
> +{
> +  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,
> +  IN OUT UINTN *Arg2,
> +     OUT UINTN *Arg3
> +  )
> +{
> +  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,
> +     OUT UINTN *Arg2,
> +     OUT UINTN *Arg3
> +  )
> +{
> +  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,
> +     OUT UINTN *Arg2,
> +     OUT UINTN *Arg3
> +  )
> +{
> +  return SMC_ARCH_CALL_NOT_SUPPORTED;
> +}


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#83476): https://edk2.groups.io/g/devel/message/83476
Mute This Topic: https://groups.io/mt/86753694/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-


Re: [edk2-devel] [PATCH v2 1/2] ArmPkg: Add SMC helper functions
Posted by Leif Lindholm 4 years, 3 months ago
On Mon, Nov 08, 2021 at 18:56:09 -0700, Rebecca Cran wrote:
> Could I have some reviews on this please?

I'm all for it. It's clunky, but less clunky than the situation
without, and it improves readability at call sites.

Ard had some reservations for v1 not actually adding any users.
Ard - do you like it any better now Rebecca's added some?

/
    Leif

> Rebecca Cran
> 
> 
> On 11/1/21 4:11 PM, Rebecca Cran wrote:
> > 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>
> > ---
> >   ArmPkg/Include/Library/ArmSmcLib.h           |  73 ++++++++++++
> >   ArmPkg/Library/ArmSmcLib/ArmSmc.c            | 122 ++++++++++++++++++++
> >   ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf       |   3 +
> >   ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.c |  85 ++++++++++++++
> >   4 files changed, 283 insertions(+)
> > 
> > diff --git a/ArmPkg/Include/Library/ArmSmcLib.h b/ArmPkg/Include/Library/ArmSmcLib.h
> > index ced60b3c1147..343ae7f40ad2 100644
> > --- a/ArmPkg/Include/Library/ArmSmcLib.h
> > +++ b/ArmPkg/Include/Library/ArmSmcLib.h
> > @@ -1,5 +1,6 @@
> >   /** @file
> >   *
> > +*  Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
> >   *  Copyright (c) 2012-2014, ARM Limited. All rights reserved.
> >   *
> >   *  SPDX-License-Identifier: BSD-2-Clause-Patent
> > @@ -37,4 +38,76 @@ ArmCallSmc (
> >     IN OUT ARM_SMC_ARGS *Args
> >     );
> > +/** Trigger 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,
> > +  IN OUT UINTN *Arg2,
> > +  IN OUT UINTN *Arg3
> > +  );
> > +
> > +/** 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,
> > +  IN OUT UINTN *Arg2,
> > +     OUT UINTN *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,
> > +     OUT UINTN *Arg2,
> > +     OUT UINTN *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,
> > +     OUT UINTN *Arg2,
> > +     OUT UINTN *Arg3
> > +  );
> > +
> >   #endif // ARM_SMC_LIB_H_
> > diff --git a/ArmPkg/Library/ArmSmcLib/ArmSmc.c b/ArmPkg/Library/ArmSmcLib/ArmSmc.c
> > new file mode 100644
> > index 000000000000..d596003a857e
> > --- /dev/null
> > +++ b/ArmPkg/Library/ArmSmcLib/ArmSmc.c
> > @@ -0,0 +1,122 @@
> > +/** @file
> > +  SMC helper functions.
> > +
> > +  Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
> > +
> > +  SPDX-License-Identifier: BSD-2-Clause-Patent
> > +
> > +**/
> > +
> > +#include <Library/ArmSmcLib.h>
> > +
> > +/** 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,
> > +  IN OUT UINTN *Arg2,
> > +  IN OUT UINTN *Arg3
> > +  )
> > +{
> > +  ARM_SMC_ARGS Args;
> > +  UINTN        ErrorCode;
> > +
> > +  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,
> > +  IN OUT UINTN *Arg2,
> > +     OUT UINTN *Arg3
> > +  )
> > +{
> > +  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,
> > +     OUT UINTN *Arg2,
> > +     OUT UINTN *Arg3
> > +  )
> > +{
> > +  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,
> > +     OUT UINTN *Arg2,
> > +     OUT UINTN *Arg3
> > +  )
> > +{
> > +  return ArmCallSmc3 (Function, Arg1, Arg2, Arg3);
> > +}
> > diff --git a/ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf b/ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf
> > index 4f4b09f4528a..a89f9203fb7e 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 2d79aadaf1fa..ca1b8830a119 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 <Base.h>
> >   #include <Library/ArmSmcLib.h>
> > +#include <IndustryStandard/ArmStdSmc.h>
> >   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,
> > +  IN OUT UINTN *Arg2,
> > +  IN OUT UINTN *Arg3
> > +  )
> > +{
> > +  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,
> > +  IN OUT UINTN *Arg2,
> > +     OUT UINTN *Arg3
> > +  )
> > +{
> > +  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,
> > +     OUT UINTN *Arg2,
> > +     OUT UINTN *Arg3
> > +  )
> > +{
> > +  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,
> > +     OUT UINTN *Arg2,
> > +     OUT UINTN *Arg3
> > +  )
> > +{
> > +  return SMC_ARCH_CALL_NOT_SUPPORTED;
> > +}


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#83506): https://edk2.groups.io/g/devel/message/83506
Mute This Topic: https://groups.io/mt/86753694/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-


Re: [edk2-devel] [PATCH v2 1/2] ArmPkg: Add SMC helper functions
Posted by Ard Biesheuvel 4 years, 3 months ago
On Tue, 9 Nov 2021 at 12:57, Leif Lindholm <leif@nuviainc.com> wrote:
>
> On Mon, Nov 08, 2021 at 18:56:09 -0700, Rebecca Cran wrote:
> > Could I have some reviews on this please?
>
> I'm all for it. It's clunky, but less clunky than the situation
> without, and it improves readability at call sites.
>
> Ard had some reservations for v1 not actually adding any users.
> Ard - do you like it any better now Rebecca's added some?
>

Yeah, this is fine. TBH, I am not going to have time to look into this
in detail again, so if you're both happy, then I am too.

Acked-by: Ard Biesheuvel <ardb@kernel.org>



> > On 11/1/21 4:11 PM, Rebecca Cran wrote:
> > > 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>
> > > ---
> > >   ArmPkg/Include/Library/ArmSmcLib.h           |  73 ++++++++++++
> > >   ArmPkg/Library/ArmSmcLib/ArmSmc.c            | 122 ++++++++++++++++++++
> > >   ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf       |   3 +
> > >   ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.c |  85 ++++++++++++++
> > >   4 files changed, 283 insertions(+)
> > >
> > > diff --git a/ArmPkg/Include/Library/ArmSmcLib.h b/ArmPkg/Include/Library/ArmSmcLib.h
> > > index ced60b3c1147..343ae7f40ad2 100644
> > > --- a/ArmPkg/Include/Library/ArmSmcLib.h
> > > +++ b/ArmPkg/Include/Library/ArmSmcLib.h
> > > @@ -1,5 +1,6 @@
> > >   /** @file
> > >   *
> > > +*  Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
> > >   *  Copyright (c) 2012-2014, ARM Limited. All rights reserved.
> > >   *
> > >   *  SPDX-License-Identifier: BSD-2-Clause-Patent
> > > @@ -37,4 +38,76 @@ ArmCallSmc (
> > >     IN OUT ARM_SMC_ARGS *Args
> > >     );
> > > +/** Trigger 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,
> > > +  IN OUT UINTN *Arg2,
> > > +  IN OUT UINTN *Arg3
> > > +  );
> > > +
> > > +/** 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,
> > > +  IN OUT UINTN *Arg2,
> > > +     OUT UINTN *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,
> > > +     OUT UINTN *Arg2,
> > > +     OUT UINTN *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,
> > > +     OUT UINTN *Arg2,
> > > +     OUT UINTN *Arg3
> > > +  );
> > > +
> > >   #endif // ARM_SMC_LIB_H_
> > > diff --git a/ArmPkg/Library/ArmSmcLib/ArmSmc.c b/ArmPkg/Library/ArmSmcLib/ArmSmc.c
> > > new file mode 100644
> > > index 000000000000..d596003a857e
> > > --- /dev/null
> > > +++ b/ArmPkg/Library/ArmSmcLib/ArmSmc.c
> > > @@ -0,0 +1,122 @@
> > > +/** @file
> > > +  SMC helper functions.
> > > +
> > > +  Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
> > > +
> > > +  SPDX-License-Identifier: BSD-2-Clause-Patent
> > > +
> > > +**/
> > > +
> > > +#include <Library/ArmSmcLib.h>
> > > +
> > > +/** 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,
> > > +  IN OUT UINTN *Arg2,
> > > +  IN OUT UINTN *Arg3
> > > +  )
> > > +{
> > > +  ARM_SMC_ARGS Args;
> > > +  UINTN        ErrorCode;
> > > +
> > > +  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,
> > > +  IN OUT UINTN *Arg2,
> > > +     OUT UINTN *Arg3
> > > +  )
> > > +{
> > > +  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,
> > > +     OUT UINTN *Arg2,
> > > +     OUT UINTN *Arg3
> > > +  )
> > > +{
> > > +  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,
> > > +     OUT UINTN *Arg2,
> > > +     OUT UINTN *Arg3
> > > +  )
> > > +{
> > > +  return ArmCallSmc3 (Function, Arg1, Arg2, Arg3);
> > > +}
> > > diff --git a/ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf b/ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf
> > > index 4f4b09f4528a..a89f9203fb7e 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 2d79aadaf1fa..ca1b8830a119 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 <Base.h>
> > >   #include <Library/ArmSmcLib.h>
> > > +#include <IndustryStandard/ArmStdSmc.h>
> > >   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,
> > > +  IN OUT UINTN *Arg2,
> > > +  IN OUT UINTN *Arg3
> > > +  )
> > > +{
> > > +  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,
> > > +  IN OUT UINTN *Arg2,
> > > +     OUT UINTN *Arg3
> > > +  )
> > > +{
> > > +  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,
> > > +     OUT UINTN *Arg2,
> > > +     OUT UINTN *Arg3
> > > +  )
> > > +{
> > > +  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,
> > > +     OUT UINTN *Arg2,
> > > +     OUT UINTN *Arg3
> > > +  )
> > > +{
> > > +  return SMC_ARCH_CALL_NOT_SUPPORTED;
> > > +}


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#83508): https://edk2.groups.io/g/devel/message/83508
Mute This Topic: https://groups.io/mt/86753694/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-


Re: [edk2-devel] [PATCH v2 1/2] ArmPkg: Add SMC helper functions
Posted by Rebecca Cran 4 years, 2 months ago
Now that the edk2 tree is unfrozen, I'd like to get this committed.

Could anyone else review it please, or if it's ready commit it?


Thanks.

Rebecca Cran


On 11/9/21 5:15 AM, Ard Biesheuvel wrote:
> On Tue, 9 Nov 2021 at 12:57, Leif Lindholm <leif@nuviainc.com> wrote:
>> On Mon, Nov 08, 2021 at 18:56:09 -0700, Rebecca Cran wrote:
>>> Could I have some reviews on this please?
>> I'm all for it. It's clunky, but less clunky than the situation
>> without, and it improves readability at call sites.
>>
>> Ard had some reservations for v1 not actually adding any users.
>> Ard - do you like it any better now Rebecca's added some?
>>
> Yeah, this is fine. TBH, I am not going to have time to look into this
> in detail again, so if you're both happy, then I am too.
>
> Acked-by: Ard Biesheuvel <ardb@kernel.org>
>
>
>
>>> On 11/1/21 4:11 PM, Rebecca Cran wrote:
>>>> 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>
>>>> ---
>>>>    ArmPkg/Include/Library/ArmSmcLib.h           |  73 ++++++++++++
>>>>    ArmPkg/Library/ArmSmcLib/ArmSmc.c            | 122 ++++++++++++++++++++
>>>>    ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf       |   3 +
>>>>    ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.c |  85 ++++++++++++++
>>>>    4 files changed, 283 insertions(+)
>>>>
>>>> diff --git a/ArmPkg/Include/Library/ArmSmcLib.h b/ArmPkg/Include/Library/ArmSmcLib.h
>>>> index ced60b3c1147..343ae7f40ad2 100644
>>>> --- a/ArmPkg/Include/Library/ArmSmcLib.h
>>>> +++ b/ArmPkg/Include/Library/ArmSmcLib.h
>>>> @@ -1,5 +1,6 @@
>>>>    /** @file
>>>>    *
>>>> +*  Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
>>>>    *  Copyright (c) 2012-2014, ARM Limited. All rights reserved.
>>>>    *
>>>>    *  SPDX-License-Identifier: BSD-2-Clause-Patent
>>>> @@ -37,4 +38,76 @@ ArmCallSmc (
>>>>      IN OUT ARM_SMC_ARGS *Args
>>>>      );
>>>> +/** Trigger 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,
>>>> +  IN OUT UINTN *Arg2,
>>>> +  IN OUT UINTN *Arg3
>>>> +  );
>>>> +
>>>> +/** 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,
>>>> +  IN OUT UINTN *Arg2,
>>>> +     OUT UINTN *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,
>>>> +     OUT UINTN *Arg2,
>>>> +     OUT UINTN *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,
>>>> +     OUT UINTN *Arg2,
>>>> +     OUT UINTN *Arg3
>>>> +  );
>>>> +
>>>>    #endif // ARM_SMC_LIB_H_
>>>> diff --git a/ArmPkg/Library/ArmSmcLib/ArmSmc.c b/ArmPkg/Library/ArmSmcLib/ArmSmc.c
>>>> new file mode 100644
>>>> index 000000000000..d596003a857e
>>>> --- /dev/null
>>>> +++ b/ArmPkg/Library/ArmSmcLib/ArmSmc.c
>>>> @@ -0,0 +1,122 @@
>>>> +/** @file
>>>> +  SMC helper functions.
>>>> +
>>>> +  Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
>>>> +
>>>> +  SPDX-License-Identifier: BSD-2-Clause-Patent
>>>> +
>>>> +**/
>>>> +
>>>> +#include <Library/ArmSmcLib.h>
>>>> +
>>>> +/** 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,
>>>> +  IN OUT UINTN *Arg2,
>>>> +  IN OUT UINTN *Arg3
>>>> +  )
>>>> +{
>>>> +  ARM_SMC_ARGS Args;
>>>> +  UINTN        ErrorCode;
>>>> +
>>>> +  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,
>>>> +  IN OUT UINTN *Arg2,
>>>> +     OUT UINTN *Arg3
>>>> +  )
>>>> +{
>>>> +  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,
>>>> +     OUT UINTN *Arg2,
>>>> +     OUT UINTN *Arg3
>>>> +  )
>>>> +{
>>>> +  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,
>>>> +     OUT UINTN *Arg2,
>>>> +     OUT UINTN *Arg3
>>>> +  )
>>>> +{
>>>> +  return ArmCallSmc3 (Function, Arg1, Arg2, Arg3);
>>>> +}
>>>> diff --git a/ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf b/ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf
>>>> index 4f4b09f4528a..a89f9203fb7e 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 2d79aadaf1fa..ca1b8830a119 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 <Base.h>
>>>>    #include <Library/ArmSmcLib.h>
>>>> +#include <IndustryStandard/ArmStdSmc.h>
>>>>    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,
>>>> +  IN OUT UINTN *Arg2,
>>>> +  IN OUT UINTN *Arg3
>>>> +  )
>>>> +{
>>>> +  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,
>>>> +  IN OUT UINTN *Arg2,
>>>> +     OUT UINTN *Arg3
>>>> +  )
>>>> +{
>>>> +  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,
>>>> +     OUT UINTN *Arg2,
>>>> +     OUT UINTN *Arg3
>>>> +  )
>>>> +{
>>>> +  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,
>>>> +     OUT UINTN *Arg2,
>>>> +     OUT UINTN *Arg3
>>>> +  )
>>>> +{
>>>> +  return SMC_ARCH_CALL_NOT_SUPPORTED;
>>>> +}


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#84613): https://edk2.groups.io/g/devel/message/84613
Mute This Topic: https://groups.io/mt/86753694/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-


Re: [edk2-devel] [PATCH v2 1/2] ArmPkg: Add SMC helper functions
Posted by Ard Biesheuvel 4 years, 1 month ago
On Thu, 9 Dec 2021 at 23:54, Rebecca Cran <rebecca@nuviainc.com> wrote:
>
> Now that the edk2 tree is unfrozen, I'd like to get this committed.
>
> Could anyone else review it please, or if it's ready commit it?
>
>

I think this is fine to go in, but you'll need to rebase on top of the
uncrustify changes in any case.

Sami, Leif: any comments?



>
> On 11/9/21 5:15 AM, Ard Biesheuvel wrote:
> > On Tue, 9 Nov 2021 at 12:57, Leif Lindholm <leif@nuviainc.com> wrote:
> >> On Mon, Nov 08, 2021 at 18:56:09 -0700, Rebecca Cran wrote:
> >>> Could I have some reviews on this please?
> >> I'm all for it. It's clunky, but less clunky than the situation
> >> without, and it improves readability at call sites.
> >>
> >> Ard had some reservations for v1 not actually adding any users.
> >> Ard - do you like it any better now Rebecca's added some?
> >>
> > Yeah, this is fine. TBH, I am not going to have time to look into this
> > in detail again, so if you're both happy, then I am too.
> >
> > Acked-by: Ard Biesheuvel <ardb@kernel.org>
> >
> >
> >
> >>> On 11/1/21 4:11 PM, Rebecca Cran wrote:
> >>>> 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>
> >>>> ---
> >>>>    ArmPkg/Include/Library/ArmSmcLib.h           |  73 ++++++++++++
> >>>>    ArmPkg/Library/ArmSmcLib/ArmSmc.c            | 122 ++++++++++++++++++++
> >>>>    ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf       |   3 +
> >>>>    ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.c |  85 ++++++++++++++
> >>>>    4 files changed, 283 insertions(+)
> >>>>
> >>>> diff --git a/ArmPkg/Include/Library/ArmSmcLib.h b/ArmPkg/Include/Library/ArmSmcLib.h
> >>>> index ced60b3c1147..343ae7f40ad2 100644
> >>>> --- a/ArmPkg/Include/Library/ArmSmcLib.h
> >>>> +++ b/ArmPkg/Include/Library/ArmSmcLib.h
> >>>> @@ -1,5 +1,6 @@
> >>>>    /** @file
> >>>>    *
> >>>> +*  Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
> >>>>    *  Copyright (c) 2012-2014, ARM Limited. All rights reserved.
> >>>>    *
> >>>>    *  SPDX-License-Identifier: BSD-2-Clause-Patent
> >>>> @@ -37,4 +38,76 @@ ArmCallSmc (
> >>>>      IN OUT ARM_SMC_ARGS *Args
> >>>>      );
> >>>> +/** Trigger 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,
> >>>> +  IN OUT UINTN *Arg2,
> >>>> +  IN OUT UINTN *Arg3
> >>>> +  );
> >>>> +
> >>>> +/** 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,
> >>>> +  IN OUT UINTN *Arg2,
> >>>> +     OUT UINTN *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,
> >>>> +     OUT UINTN *Arg2,
> >>>> +     OUT UINTN *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,
> >>>> +     OUT UINTN *Arg2,
> >>>> +     OUT UINTN *Arg3
> >>>> +  );
> >>>> +
> >>>>    #endif // ARM_SMC_LIB_H_
> >>>> diff --git a/ArmPkg/Library/ArmSmcLib/ArmSmc.c b/ArmPkg/Library/ArmSmcLib/ArmSmc.c
> >>>> new file mode 100644
> >>>> index 000000000000..d596003a857e
> >>>> --- /dev/null
> >>>> +++ b/ArmPkg/Library/ArmSmcLib/ArmSmc.c
> >>>> @@ -0,0 +1,122 @@
> >>>> +/** @file
> >>>> +  SMC helper functions.
> >>>> +
> >>>> +  Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
> >>>> +
> >>>> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> >>>> +
> >>>> +**/
> >>>> +
> >>>> +#include <Library/ArmSmcLib.h>
> >>>> +
> >>>> +/** 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,
> >>>> +  IN OUT UINTN *Arg2,
> >>>> +  IN OUT UINTN *Arg3
> >>>> +  )
> >>>> +{
> >>>> +  ARM_SMC_ARGS Args;
> >>>> +  UINTN        ErrorCode;
> >>>> +
> >>>> +  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,
> >>>> +  IN OUT UINTN *Arg2,
> >>>> +     OUT UINTN *Arg3
> >>>> +  )
> >>>> +{
> >>>> +  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,
> >>>> +     OUT UINTN *Arg2,
> >>>> +     OUT UINTN *Arg3
> >>>> +  )
> >>>> +{
> >>>> +  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,
> >>>> +     OUT UINTN *Arg2,
> >>>> +     OUT UINTN *Arg3
> >>>> +  )
> >>>> +{
> >>>> +  return ArmCallSmc3 (Function, Arg1, Arg2, Arg3);
> >>>> +}
> >>>> diff --git a/ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf b/ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf
> >>>> index 4f4b09f4528a..a89f9203fb7e 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 2d79aadaf1fa..ca1b8830a119 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 <Base.h>
> >>>>    #include <Library/ArmSmcLib.h>
> >>>> +#include <IndustryStandard/ArmStdSmc.h>
> >>>>    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,
> >>>> +  IN OUT UINTN *Arg2,
> >>>> +  IN OUT UINTN *Arg3
> >>>> +  )
> >>>> +{
> >>>> +  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,
> >>>> +  IN OUT UINTN *Arg2,
> >>>> +     OUT UINTN *Arg3
> >>>> +  )
> >>>> +{
> >>>> +  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,
> >>>> +     OUT UINTN *Arg2,
> >>>> +     OUT UINTN *Arg3
> >>>> +  )
> >>>> +{
> >>>> +  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,
> >>>> +     OUT UINTN *Arg2,
> >>>> +     OUT UINTN *Arg3
> >>>> +  )
> >>>> +{
> >>>> +  return SMC_ARCH_CALL_NOT_SUPPORTED;
> >>>> +}


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#84698): https://edk2.groups.io/g/devel/message/84698
Mute This Topic: https://groups.io/mt/86753694/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-


Re: [edk2-devel] [PATCH v2 1/2] ArmPkg: Add SMC helper functions
Posted by Sami Mujawar 4 years, 1 month ago
Hi Ard,

On 13/12/2021 11:49 AM, Ard Biesheuvel wrote:
> On Thu, 9 Dec 2021 at 23:54, Rebecca Cran <rebecca@nuviainc.com> wrote:
>> Now that the edk2 tree is unfrozen, I'd like to get this committed.
>>
>> Could anyone else review it please, or if it's ready commit it?
>>
>>
> I think this is fine to go in, but you'll need to rebase on top of the
> uncrustify changes in any case.
>
> Sami, Leif: any comments?
I have some minor suggestions, that I will reply back shortly.

Regards,

Sami Mujawar
>
>
>
>> On 11/9/21 5:15 AM, Ard Biesheuvel wrote:
>>> On Tue, 9 Nov 2021 at 12:57, Leif Lindholm <leif@nuviainc.com> wrote:
>>>> On Mon, Nov 08, 2021 at 18:56:09 -0700, Rebecca Cran wrote:
>>>>> Could I have some reviews on this please?
>>>> I'm all for it. It's clunky, but less clunky than the situation
>>>> without, and it improves readability at call sites.
>>>>
>>>> Ard had some reservations for v1 not actually adding any users.
>>>> Ard - do you like it any better now Rebecca's added some?
>>>>
>>> Yeah, this is fine. TBH, I am not going to have time to look into this
>>> in detail again, so if you're both happy, then I am too.
>>>
>>> Acked-by: Ard Biesheuvel <ardb@kernel.org>
>>>
>>>
>>>
>>>>> On 11/1/21 4:11 PM, Rebecca Cran wrote:
>>>>>> 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>
>>>>>> ---
>>>>>>     ArmPkg/Include/Library/ArmSmcLib.h           |  73 ++++++++++++
>>>>>>     ArmPkg/Library/ArmSmcLib/ArmSmc.c            | 122 ++++++++++++++++++++
>>>>>>     ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf       |   3 +
>>>>>>     ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.c |  85 ++++++++++++++
>>>>>>     4 files changed, 283 insertions(+)
>>>>>>
>>>>>> diff --git a/ArmPkg/Include/Library/ArmSmcLib.h b/ArmPkg/Include/Library/ArmSmcLib.h
>>>>>> index ced60b3c1147..343ae7f40ad2 100644
>>>>>> --- a/ArmPkg/Include/Library/ArmSmcLib.h
>>>>>> +++ b/ArmPkg/Include/Library/ArmSmcLib.h
>>>>>> @@ -1,5 +1,6 @@
>>>>>>     /** @file
>>>>>>     *
>>>>>> +*  Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
>>>>>>     *  Copyright (c) 2012-2014, ARM Limited. All rights reserved.
>>>>>>     *
>>>>>>     *  SPDX-License-Identifier: BSD-2-Clause-Patent
>>>>>> @@ -37,4 +38,76 @@ ArmCallSmc (
>>>>>>       IN OUT ARM_SMC_ARGS *Args
>>>>>>       );
>>>>>> +/** Trigger 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,
>>>>>> +  IN OUT UINTN *Arg2,
>>>>>> +  IN OUT UINTN *Arg3
>>>>>> +  );
>>>>>> +
>>>>>> +/** 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,
>>>>>> +  IN OUT UINTN *Arg2,
>>>>>> +     OUT UINTN *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,
>>>>>> +     OUT UINTN *Arg2,
>>>>>> +     OUT UINTN *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,
>>>>>> +     OUT UINTN *Arg2,
>>>>>> +     OUT UINTN *Arg3
>>>>>> +  );
>>>>>> +
>>>>>>     #endif // ARM_SMC_LIB_H_
>>>>>> diff --git a/ArmPkg/Library/ArmSmcLib/ArmSmc.c b/ArmPkg/Library/ArmSmcLib/ArmSmc.c
>>>>>> new file mode 100644
>>>>>> index 000000000000..d596003a857e
>>>>>> --- /dev/null
>>>>>> +++ b/ArmPkg/Library/ArmSmcLib/ArmSmc.c
>>>>>> @@ -0,0 +1,122 @@
>>>>>> +/** @file
>>>>>> +  SMC helper functions.
>>>>>> +
>>>>>> +  Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
>>>>>> +
>>>>>> +  SPDX-License-Identifier: BSD-2-Clause-Patent
>>>>>> +
>>>>>> +**/
>>>>>> +
>>>>>> +#include <Library/ArmSmcLib.h>
>>>>>> +
>>>>>> +/** 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,
>>>>>> +  IN OUT UINTN *Arg2,
>>>>>> +  IN OUT UINTN *Arg3
>>>>>> +  )
>>>>>> +{
>>>>>> +  ARM_SMC_ARGS Args;
>>>>>> +  UINTN        ErrorCode;
>>>>>> +
>>>>>> +  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,
>>>>>> +  IN OUT UINTN *Arg2,
>>>>>> +     OUT UINTN *Arg3
>>>>>> +  )
>>>>>> +{
>>>>>> +  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,
>>>>>> +     OUT UINTN *Arg2,
>>>>>> +     OUT UINTN *Arg3
>>>>>> +  )
>>>>>> +{
>>>>>> +  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,
>>>>>> +     OUT UINTN *Arg2,
>>>>>> +     OUT UINTN *Arg3
>>>>>> +  )
>>>>>> +{
>>>>>> +  return ArmCallSmc3 (Function, Arg1, Arg2, Arg3);
>>>>>> +}
>>>>>> diff --git a/ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf b/ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf
>>>>>> index 4f4b09f4528a..a89f9203fb7e 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 2d79aadaf1fa..ca1b8830a119 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 <Base.h>
>>>>>>     #include <Library/ArmSmcLib.h>
>>>>>> +#include <IndustryStandard/ArmStdSmc.h>
>>>>>>     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,
>>>>>> +  IN OUT UINTN *Arg2,
>>>>>> +  IN OUT UINTN *Arg3
>>>>>> +  )
>>>>>> +{
>>>>>> +  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,
>>>>>> +  IN OUT UINTN *Arg2,
>>>>>> +     OUT UINTN *Arg3
>>>>>> +  )
>>>>>> +{
>>>>>> +  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,
>>>>>> +     OUT UINTN *Arg2,
>>>>>> +     OUT UINTN *Arg3
>>>>>> +  )
>>>>>> +{
>>>>>> +  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,
>>>>>> +     OUT UINTN *Arg2,
>>>>>> +     OUT UINTN *Arg3
>>>>>> +  )
>>>>>> +{
>>>>>> +  return SMC_ARCH_CALL_NOT_SUPPORTED;
>>>>>> +}



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#84703): https://edk2.groups.io/g/devel/message/84703
Mute This Topic: https://groups.io/mt/86753694/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-