]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Library/ArmSmcLib/ArmSmc.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / ArmPkg / Library / ArmSmcLib / ArmSmc.c
CommitLineData
4d303524
RC
1/** @file\r
2 SMC helper functions.\r
3\r
4 Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>\r
5\r
6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
7\r
8**/\r
9\r
10#include <Library/ArmSmcLib.h>\r
11#include <Library/BaseMemoryLib.h>\r
12\r
13/** Triggers an SMC call with 3 arguments.\r
14\r
15 @param Function The SMC function.\r
16 @param Arg1 Argument/result.\r
17 @param Arg2 Argument/result.\r
18 @param Arg3 Argument/result.\r
19\r
20 @return The SMC error code.\r
21**/\r
22UINTN\r
23ArmCallSmc3 (\r
24 IN UINTN Function,\r
25 IN OUT UINTN *Arg1 OPTIONAL,\r
26 IN OUT UINTN *Arg2 OPTIONAL,\r
27 IN OUT UINTN *Arg3 OPTIONAL\r
28 )\r
29{\r
30 ARM_SMC_ARGS Args;\r
31 UINTN ErrorCode;\r
32\r
33 ZeroMem (&Args, sizeof (ARM_SMC_ARGS));\r
34\r
35 Args.Arg0 = Function;\r
36\r
37 if (Arg1 != NULL) {\r
38 Args.Arg1 = *Arg1;\r
39 }\r
40\r
41 if (Arg2 != NULL) {\r
42 Args.Arg2 = *Arg2;\r
43 }\r
44\r
45 if (Arg3 != NULL) {\r
46 Args.Arg3 = *Arg3;\r
47 }\r
48\r
49 ArmCallSmc (&Args);\r
50\r
51 ErrorCode = Args.Arg0;\r
52\r
53 if (Arg1 != NULL) {\r
54 *Arg1 = Args.Arg1;\r
55 }\r
56\r
57 if (Arg2 != NULL) {\r
58 *Arg2 = Args.Arg2;\r
59 }\r
60\r
61 if (Arg3 != NULL) {\r
62 *Arg3 = Args.Arg3;\r
63 }\r
64\r
65 return ErrorCode;\r
66}\r
67\r
68/** Trigger an SMC call with 2 arguments.\r
69\r
70 @param Function The SMC function.\r
71 @param Arg1 Argument/result.\r
72 @param Arg2 Argument/result.\r
73 @param Arg3 Result.\r
74\r
75 @return The SMC error code.\r
76\r
77**/\r
78UINTN\r
79ArmCallSmc2 (\r
80 IN UINTN Function,\r
81 IN OUT UINTN *Arg1 OPTIONAL,\r
82 IN OUT UINTN *Arg2 OPTIONAL,\r
83 OUT UINTN *Arg3 OPTIONAL\r
84 )\r
85{\r
86 return ArmCallSmc3 (Function, Arg1, Arg2, Arg3);\r
87}\r
88\r
89/** Trigger an SMC call with 1 argument.\r
90\r
91 @param Function The SMC function.\r
92 @param Arg1 Argument/result.\r
93 @param Arg2 Result.\r
94 @param Arg3 Result.\r
95\r
96 @return The SMC error code.\r
97\r
98**/\r
99UINTN\r
100ArmCallSmc1 (\r
101 IN UINTN Function,\r
102 IN OUT UINTN *Arg1 OPTIONAL,\r
103 OUT UINTN *Arg2 OPTIONAL,\r
104 OUT UINTN *Arg3 OPTIONAL\r
105 )\r
106{\r
107 return ArmCallSmc3 (Function, Arg1, Arg2, Arg3);\r
108}\r
109\r
110/** Trigger an SMC call with 0 arguments.\r
111\r
112 @param Function The SMC function.\r
113 @param Arg1 Result.\r
114 @param Arg2 Result.\r
115 @param Arg3 Result.\r
116\r
117 @return The SMC error code.\r
118\r
119**/\r
120UINTN\r
121ArmCallSmc0 (\r
122 IN UINTN Function,\r
123 OUT UINTN *Arg1 OPTIONAL,\r
124 OUT UINTN *Arg2 OPTIONAL,\r
125 OUT UINTN *Arg3 OPTIONAL\r
126 )\r
127{\r
128 return ArmCallSmc3 (Function, Arg1, Arg2, Arg3);\r
129}\r