mirror of https://github.com/acidanthera/audk.git
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 <rebecca@nuviainc.com> Reviewed-by: Sami Mujawar <sami.mujawar@arm.com>
This commit is contained in:
parent
7a6e6ae933
commit
4d30352445
|
@ -1,5 +1,6 @@
|
||||||
/** @file
|
/** @file
|
||||||
*
|
*
|
||||||
|
* Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
|
||||||
* Copyright (c) 2012-2014, ARM Limited. All rights reserved.
|
* Copyright (c) 2012-2014, ARM Limited. All rights reserved.
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
@ -37,4 +38,76 @@ ArmCallSmc (
|
||||||
IN OUT ARM_SMC_ARGS *Args
|
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 OPTIONAL,
|
||||||
|
IN OUT UINTN *Arg2 OPTIONAL,
|
||||||
|
IN OUT UINTN *Arg3 OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
/** 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
|
||||||
|
);
|
||||||
|
|
||||||
|
/** 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
|
||||||
|
);
|
||||||
|
|
||||||
|
/** 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
|
||||||
|
);
|
||||||
|
|
||||||
#endif // ARM_SMC_LIB_H_
|
#endif // ARM_SMC_LIB_H_
|
||||||
|
|
|
@ -0,0 +1,129 @@
|
||||||
|
/** @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);
|
||||||
|
}
|
|
@ -20,6 +20,9 @@
|
||||||
[Sources.AARCH64]
|
[Sources.AARCH64]
|
||||||
AArch64/ArmSmc.S
|
AArch64/ArmSmc.S
|
||||||
|
|
||||||
|
[Sources]
|
||||||
|
ArmSmc.c
|
||||||
|
|
||||||
[Packages]
|
[Packages]
|
||||||
MdePkg/MdePkg.dec
|
MdePkg/MdePkg.dec
|
||||||
ArmPkg/ArmPkg.dec
|
ArmPkg/ArmPkg.dec
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
//
|
//
|
||||||
|
// Copyright (c) 2021, NUVIA Inc. All rights reserved.
|
||||||
// Copyright (c) 2016, Linaro Limited. All rights reserved.
|
// Copyright (c) 2016, Linaro Limited. All rights reserved.
|
||||||
//
|
//
|
||||||
// SPDX-License-Identifier: BSD-2-Clause-Patent
|
// SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
@ -7,6 +8,7 @@
|
||||||
|
|
||||||
#include <Base.h>
|
#include <Base.h>
|
||||||
#include <Library/ArmSmcLib.h>
|
#include <Library/ArmSmcLib.h>
|
||||||
|
#include <IndustryStandard/ArmStdSmc.h>
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
ArmCallSmc (
|
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;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue