OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
ToggleSipEntry.c
Go to the documentation of this file.
1
10
11#include <Uefi.h>
12#include <Library/BaseLib.h>
13#include <Library/MemoryAllocationLib.h>
15#include <Library/UefiBootServicesTableLib.h>
16#include <Library/UefiRuntimeServicesTableLib.h>
17
19
20#define OC_MENU_TOGGLE_SIP "Toggle SIP (%a)"
21#define OC_MENU_TOGGLE_SIP_SHOW_CSR "Toggle SIP (0x%X:%a)"
22#define OC_MENU_TOGGLE_SIP_MAX_SIZE (\
23 sizeof(OC_MENU_TOGGLE_SIP_SHOW_CSR) \
24 + sizeof(UINT32) * 2 * sizeof (CHAR8) - L_STR_LEN("%X") \
25 + L_STR_LEN("Disabled") - L_STR_LEN("%a"))
26
27STATIC UINT32 mCsrUserConfig;
28STATIC UINT32 mCsrNextConfig;
29STATIC UINT32 mAttributes;
30STATIC BOOLEAN mShowCsr;
31
32STATIC
33EFI_STATUS
35 IN OUT OC_PICKER_CONTEXT *Context
36 )
37{
38 EFI_STATUS Status;
39 BOOLEAN IsEnabled;
40 UINT32 CsrActiveConfig;
41
43 if (EFI_ERROR (Status)) {
44 DEBUG ((DEBUG_WARN, "BEP: OcSetSip (0x%X, 0x%X) failed! - %r\n", mCsrNextConfig, mAttributes, Status));
45 return Status;
46 }
47
48 Status = OcGetSip (&CsrActiveConfig, &mAttributes);
49 if (EFI_ERROR (Status)) {
50 DEBUG ((DEBUG_WARN, "BEP: OcGetSip (0x%X, 0x%X) failed! - %r\n", mCsrNextConfig, mAttributes, Status));
51 return Status;
52 }
53
54 IsEnabled = OcIsSipEnabled (Status, CsrActiveConfig);
55
56 DEBUG ((
57 DEBUG_INFO,
58 "BEP: SystemActionSetSip csr-active-config=0x%X (SIP %a) - %r\n",
59 CsrActiveConfig,
60 (IsEnabled ? "enabled" : "disabled"),
61 Status
62 ));
63
64 return Status;
65}
66
68 {
69 .Id = "toggle_sip",
70 .Name = NULL,
71 .Path = NULL,
72 .Arguments = NULL,
73 .Flavour = NULL,
74 .Auxiliary = TRUE,
75 .Tool = FALSE,
76 .TextMode = FALSE,
77 .RealPath = FALSE,
78 .SystemAction = SystemActionSetSip,
79 .AudioBasePath = NULL,
81 }
82};
83
84STATIC
85EFI_STATUS
86EFIAPI
88 IN OUT OC_PICKER_CONTEXT *PickerContext,
89 IN CONST EFI_HANDLE Device OPTIONAL,
90 OUT OC_PICKER_ENTRY **Entries,
91 OUT UINTN *NumEntries
92 )
93{
94 EFI_STATUS Status;
95 UINT32 CsrActiveConfig;
96 BOOLEAN IsEnabled;
97 CHAR8 *Name;
98
99 //
100 // Custom entries only.
101 //
102 if (Device != NULL) {
103 return EFI_NOT_FOUND;
104 }
105
106 //
107 // Configure current action.
108 //
109 Status = OcGetSip (&CsrActiveConfig, &mAttributes);
110 if (!EFI_ERROR (Status) || (Status == EFI_NOT_FOUND)) {
111 IsEnabled = OcIsSipEnabled (Status, CsrActiveConfig);
112
113 //
114 // Same logic as in CsrUtil.efi to determine attributes to use
115 // (specifically keep same V or NV setting as existing value, if any).
116 //
117 if (Status == EFI_NOT_FOUND) {
118 //
119 // TODO: We may want to upgrade Boot Entry Protocol again, so that
120 // this line is able to access and respect OC WriteFlash setting?
121 //
123 CsrActiveConfig = 0;
124 } else {
125 //
126 // We are finding other bits set on Apl, specifically 0x80000000,
127 // so only consider relevant bits.
128 //
130 }
131 } else {
132 DEBUG ((DEBUG_WARN, "BEP: ToggleSip failed to read csr-active-config, aborting! - %r\n", Status));
133 return Status;
134 }
135
136 Name = AllocatePool (OC_MENU_TOGGLE_SIP_MAX_SIZE);
137 if (Name == NULL) {
138 return EFI_OUT_OF_RESOURCES;
139 }
140
141 if (mShowCsr) {
142 Status = OcAsciiSafeSPrint (
143 Name,
146 CsrActiveConfig,
147 IsEnabled ? "Enabled" : "Disabled"
148 );
149 } else {
150 Status = OcAsciiSafeSPrint (
151 Name,
154 IsEnabled ? "Enabled" : "Disabled"
155 );
156 }
157
158 if (EFI_ERROR (Status)) {
159 ASSERT (FALSE);
160 FreePool (Name);
161 return EFI_ABORTED;
162 }
163
164 mToggleSipBootEntries[0].Name = Name;
165 if (IsEnabled) {
169 } else {
172 mCsrNextConfig = 0;
173 }
174
175 DEBUG ((
176 DEBUG_INFO,
177 "BEP: Toggle SIP entry, currently %a, will change 0x%X->0x%X%a\n",
178 (IsEnabled ? "enabled" : "disabled"),
179 CsrActiveConfig,
181 ((mAttributes & EFI_VARIABLE_NON_VOLATILE) == 0 ? " (volatile)" : "")
182 ));
183
184 *Entries = mToggleSipBootEntries;
185 *NumEntries = ARRAY_SIZE (mToggleSipBootEntries);
186
187 return EFI_SUCCESS;
188}
189
190STATIC
191VOID
192EFIAPI
194 IN OC_PICKER_ENTRY **Entries,
195 IN UINTN NumEntries
196 )
197{
198 UINTN Index;
199
200 if (NumEntries == 0) {
201 return;
202 }
203
204 ASSERT (NumEntries == 1);
205 ASSERT (Entries != NULL);
206
207 for (Index = 0; Index < NumEntries; Index++) {
208 if (Entries[Index]->Name != NULL) {
209 FreePool ((VOID *)Entries[Index]->Name);
210 }
211 }
212}
213
214STATIC
221
222EFI_STATUS
223EFIAPI
225 IN EFI_HANDLE ImageHandle,
226 IN EFI_SYSTEM_TABLE *SystemTable
227 )
228{
229 EFI_STATUS Status;
230 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
231 OC_FLEX_ARRAY *ParsedLoadOptions;
232 CHAR16 *Option;
233 UINTN Index;
234 UINTN Data;
235 BOOLEAN HasUserCsr;
236
237 Status = gBS->HandleProtocol (
238 ImageHandle,
240 (VOID **)&LoadedImage
241 );
242 if (EFI_ERROR (Status)) {
243 return Status;
244 }
245
246 Status = OcParseLoadOptions (LoadedImage, &ParsedLoadOptions);
247 HasUserCsr = FALSE;
248 if (!EFI_ERROR (Status)) {
249 for (Index = 0; Index < ParsedLoadOptions->Count; Index++) {
250 Option = OcParsedVarsItemAt (ParsedLoadOptions, Index)->Unicode.Name;
251 if (Option[0] != L'-') {
252 if (OcUnicodeStartsWith (Option, L"0x", TRUE)) {
253 Status = StrHexToUintnS (Option, NULL, &Data);
254 } else {
255 Status = StrDecimalToUintnS (Option, NULL, &Data);
256 }
257
258 if (EFI_ERROR (Status)) {
259 DEBUG ((DEBUG_WARN, "BEP: ToggleSip cannot parse %s - %r\n", Option, Status));
260 HasUserCsr = FALSE;
261 } else {
262 HasUserCsr = TRUE;
263 }
264 }
265 }
266
267 mShowCsr = OcHasParsedVar (ParsedLoadOptions, L"--show-csr", OcStringFormatUnicode);
268
269 OcFlexArrayFree (&ParsedLoadOptions);
270 } else {
271 ASSERT (ParsedLoadOptions == NULL);
272
273 if (Status != EFI_NOT_FOUND) {
274 return Status;
275 }
276
277 mShowCsr = FALSE;
278 }
279
280 if (HasUserCsr) {
281 mCsrUserConfig = (UINT32)Data;
282 if (OcIsSipEnabled (EFI_SUCCESS, mCsrUserConfig)) {
283 DEBUG ((DEBUG_WARN, "BEP: Specified value 0x%X will not disable SIP!\n", mCsrUserConfig));
284 }
285 } else {
287 }
288
289 Status = gBS->InstallMultipleProtocolInterfaces (
290 &ImageHandle,
293 NULL
294 );
295 return Status;
296}
#define OC_CSR_DISABLE_FLAGS
#define CSR_APPLE_SIP_NVRAM_NV_ATTR
#define ARRAY_SIZE(Array)
Definition AppleMacEfi.h:34
#define OC_VOICE_OVER_AUDIO_FILE_SIP_IS_ENABLED
Definition OcAudio.h:71
#define OC_VOICE_OVER_AUDIO_FILE_SIP_IS_DISABLED
Definition OcAudio.h:70
#define OC_VOICE_OVER_AUDIO_BASE_TYPE_OPEN_CORE
Definition OcAudio.h:38
EFI_GUID gOcBootEntryProtocolGuid
#define OC_BOOT_ENTRY_PROTOCOL_REVISION
Definition OcBootEntry.h:31
#define OC_FLAVOUR_TOGGLE_SIP_DISABLED
OC_PARSED_VAR * OcParsedVarsItemAt(IN CONST OC_FLEX_ARRAY *ParsedVars, IN CONST UINTN Index)
EFI_STATUS OcParseLoadOptions(IN CONST EFI_LOADED_IMAGE_PROTOCOL *LoadedImage, OUT OC_FLEX_ARRAY **ParsedVars)
BOOLEAN OcHasParsedVar(IN CONST OC_FLEX_ARRAY *ParsedVars, IN CONST VOID *Name, IN CONST OC_STRING_FORMAT StringFormat)
#define OC_FLAVOUR_TOGGLE_SIP_ENABLED
EFI_BOOT_SERVICES * gBS
VOID OcFlexArrayFree(IN OUT OC_FLEX_ARRAY **FlexArray)
EFI_STATUS EFIAPI OcAsciiSafeSPrint(OUT CHAR8 *StartOfBuffer, IN UINTN BufferSize, IN CONST CHAR8 *FormatString,...)
Definition OcAsciiLib.c:190
@ OcStringFormatUnicode
Definition OcStringLib.h:51
BOOLEAN EFIAPI OcUnicodeStartsWith(IN CONST CHAR16 *String, IN CONST CHAR16 *SearchString, IN BOOLEAN CaseInsensitiveMatch)
EFI_STATUS OcGetSip(OUT UINT32 *CsrActiveConfig, OUT UINT32 *Attributes OPTIONAL)
Definition Sip.c:15
BOOLEAN OcIsSipEnabled(IN EFI_STATUS GetStatus, IN UINT32 CsrActiveConfig)
Definition Sip.c:58
EFI_STATUS OcSetSip(IN UINT32 *CsrActiveConfig, IN UINT32 Attributes)
Definition Sip.c:39
#define OC_MENU_TOGGLE_SIP
STATIC UINT32 mAttributes
STATIC OC_BOOT_ENTRY_PROTOCOL mToggleSipBootEntryProtocol
STATIC EFI_STATUS SystemActionSetSip(IN OUT OC_PICKER_CONTEXT *Context)
EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
#define OC_MENU_TOGGLE_SIP_MAX_SIZE
STATIC VOID EFIAPI ToggleSipFreeBootEntries(IN OC_PICKER_ENTRY **Entries, IN UINTN NumEntries)
STATIC BOOLEAN mShowCsr
STATIC UINT32 mCsrNextConfig
#define OC_MENU_TOGGLE_SIP_SHOW_CSR
STATIC OC_PICKER_ENTRY mToggleSipBootEntries[1]
STATIC EFI_STATUS EFIAPI ToggleSipGetBootEntries(IN OUT OC_PICKER_CONTEXT *PickerContext, IN CONST EFI_HANDLE Device OPTIONAL, OUT OC_PICKER_ENTRY **Entries, OUT UINTN *NumEntries)
STATIC UINT32 mCsrUserConfig
EFI_GUID gEfiLoadedImageProtocolGuid
#define ASSERT(x)
Definition coder.h:55
OC_PARSED_VAR_UNICODE Unicode