| /** @file | |
| SMC helper functions. | |
| Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #include <Library/ArmSmcLib.h> | |
| #include <Library/BaseMemoryLib.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 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); | |
| } |