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>
		
			
				
	
	
		
			114 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @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
 | |
| *
 | |
| **/
 | |
| 
 | |
| #ifndef ARM_SMC_LIB_H_
 | |
| #define ARM_SMC_LIB_H_
 | |
| 
 | |
| /**
 | |
|  * The size of the SMC arguments are different between AArch64 and AArch32.
 | |
|  * The native size is used for the arguments.
 | |
|  */
 | |
| typedef struct {
 | |
|   UINTN    Arg0;
 | |
|   UINTN    Arg1;
 | |
|   UINTN    Arg2;
 | |
|   UINTN    Arg3;
 | |
|   UINTN    Arg4;
 | |
|   UINTN    Arg5;
 | |
|   UINTN    Arg6;
 | |
|   UINTN    Arg7;
 | |
| } ARM_SMC_ARGS;
 | |
| 
 | |
| /**
 | |
|   Trigger an SMC call
 | |
| 
 | |
|   SMC calls can take up to 7 arguments and return up to 4 return values.
 | |
|   Therefore, the 4 first fields in the ARM_SMC_ARGS structure are used
 | |
|   for both input and output values.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| 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 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_
 |