OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
ResetNvramEntry.c
Go to the documentation of this file.
1
9
10#include <Uefi.h>
11#include <Library/BaseLib.h>
14#include <Library/UefiBootServicesTableLib.h>
15#include <Library/UefiRuntimeServicesTableLib.h>
16
18
19#define OC_MENU_RESET_NVRAM_ID "reset_nvram"
20#define OC_MENU_RESET_NVRAM_ENTRY "Reset NVRAM"
21
22STATIC BOOLEAN mUseApple = FALSE;
23STATIC BOOLEAN mPreserveBoot = FALSE;
24
25STATIC
26VOID
28 IN OUT OC_PICKER_CONTEXT *Context
29 )
30{
31 //
32 // Allow chime to finish, if playing.
33 //
34 if (Context->OcAudio != NULL) {
35 Context->OcAudio->StopPlayback (Context->OcAudio, TRUE);
36 }
37}
38
39STATIC
40EFI_STATUS
42 IN OUT OC_PICKER_CONTEXT *PickerContext
43 )
44{
45 UINT8 ResetNVRam = 1;
46
47 WaitForChime (PickerContext);
48
49 //
50 // Does not return if legacy NVRAM protocol is present.
51 //
53
54 if (!mUseApple) {
56 }
57
58 //
59 // Any size, any value for this variable will cause a reset on supported firmware.
60 //
61 gRT->SetVariable (
64 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
65 sizeof (ResetNVRam),
66 &ResetNVRam
67 );
68
70
71 return EFI_DEVICE_ERROR;
72}
73
75 {
78 .Path = NULL,
79 .Arguments = NULL,
80 .Flavour = OC_FLAVOUR_RESET_NVRAM,
81 .Auxiliary = TRUE,
82 .Tool = FALSE,
83 .TextMode = FALSE,
84 .RealPath = FALSE,
85 .SystemAction = SystemActionResetNvram,
88 }
89};
90
91STATIC
92EFI_STATUS
93EFIAPI
95 IN OUT OC_PICKER_CONTEXT *PickerContext,
96 IN CONST EFI_HANDLE Device OPTIONAL,
97 OUT OC_PICKER_ENTRY **Entries,
98 OUT UINTN *NumEntries
99 )
100{
101 //
102 // Custom entries only.
103 //
104 if (Device != NULL) {
105 return EFI_NOT_FOUND;
106 }
107
108 DEBUG ((DEBUG_INFO, "BEP: Reset NVRAM entry, preserve boot %u, apple %u\n", mPreserveBoot, mUseApple));
109
110 *Entries = mResetNvramBootEntries;
111 *NumEntries = ARRAY_SIZE (mResetNvramBootEntries);
112
113 return EFI_SUCCESS;
114}
115
116STATIC
117CHAR8 *
118EFIAPI
120 IN OUT OC_PICKER_CONTEXT *Context,
121 IN UINTN NumKeys,
122 IN APPLE_MODIFIER_MAP Modifiers,
123 IN APPLE_KEY_CODE *Keys
124 )
125{
126 BOOLEAN HasCommand;
127 BOOLEAN HasOption;
128 BOOLEAN HasKeyP;
129 BOOLEAN HasKeyR;
130
131 HasCommand = (Modifiers & (APPLE_MODIFIER_LEFT_COMMAND | APPLE_MODIFIER_RIGHT_COMMAND)) != 0;
132 HasOption = (Modifiers & (APPLE_MODIFIER_LEFT_OPTION | APPLE_MODIFIER_RIGHT_OPTION)) != 0;
133 HasKeyP = OcKeyMapHasKey (Keys, NumKeys, AppleHidUsbKbUsageKeyP);
134 HasKeyR = OcKeyMapHasKey (Keys, NumKeys, AppleHidUsbKbUsageKeyR);
135
136 if (HasOption && HasCommand && HasKeyP && HasKeyR) {
137 DEBUG ((DEBUG_INFO, "BEP: CMD+OPT+P+R causes NVRAM reset\n"));
139 }
140
141 return NULL;
142}
143
144STATIC
152
153EFI_STATUS
154EFIAPI
156 IN EFI_HANDLE ImageHandle,
157 IN EFI_SYSTEM_TABLE *SystemTable
158 )
159{
160 EFI_STATUS Status;
161 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
162 OC_FLEX_ARRAY *ParsedLoadOptions;
163
164 Status = gBS->HandleProtocol (
165 ImageHandle,
167 (VOID **)&LoadedImage
168 );
169 if (EFI_ERROR (Status)) {
170 return Status;
171 }
172
173 Status = OcParseLoadOptions (LoadedImage, &ParsedLoadOptions);
174 if (!EFI_ERROR (Status)) {
175 mPreserveBoot = OcHasParsedVar (ParsedLoadOptions, L"--preserve-boot", OcStringFormatUnicode);
176 mUseApple = OcHasParsedVar (ParsedLoadOptions, L"--apple", OcStringFormatUnicode);
177
178 OcFlexArrayFree (&ParsedLoadOptions);
179 } else {
180 ASSERT (ParsedLoadOptions == NULL);
181
182 if (Status != EFI_NOT_FOUND) {
183 return Status;
184 }
185 }
186
187 if (mUseApple && mPreserveBoot) {
188 DEBUG ((DEBUG_WARN, "BEP: ResetNvram %s is ignored due to %s!\n", L"--preserve-boot", L"--apple"));
189 }
190
191 Status = gBS->InstallMultipleProtocolInterfaces (
192 &ImageHandle,
195 NULL
196 );
197 return Status;
198}
#define APPLE_MODIFIER_RIGHT_OPTION
Definition AppleHid.h:81
@ AppleHidUsbKbUsageKeyP
Definition AppleHid.h:122
@ AppleHidUsbKbUsageKeyR
Definition AppleHid.h:124
APPLE_HID_USAGE APPLE_KEY_CODE
Definition AppleHid.h:317
UINT16 APPLE_MODIFIER_MAP
Definition AppleHid.h:102
#define APPLE_MODIFIER_LEFT_COMMAND
Definition AppleHid.h:78
#define APPLE_MODIFIER_RIGHT_COMMAND
Definition AppleHid.h:82
#define APPLE_MODIFIER_LEFT_OPTION
Definition AppleHid.h:77
#define ARRAY_SIZE(Array)
Definition AppleMacEfi.h:34
EFI_GUID gAppleBootVariableGuid
#define APPLE_RESET_NVRAM_VARIABLE_NAME
BOOLEAN OcKeyMapHasKey(IN CONST APPLE_KEY_CODE *Keys, IN UINTN NumKeys, IN CONST APPLE_KEY_CODE KeyCode)
#define OC_VOICE_OVER_AUDIO_FILE_RESET_NVRAM
Definition OcAudio.h:65
#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
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_RESET_NVRAM
EFI_BOOT_SERVICES * gBS
VOID DirectResetCold(VOID)
Definition DirectReset.c:16
VOID OcFlexArrayFree(IN OUT OC_FLEX_ARRAY **FlexArray)
@ OcStringFormatUnicode
Definition OcStringLib.h:51
VOID EFIAPI OcResetLegacyNvram(VOID)
EFI_STATUS OcResetNvram(IN BOOLEAN PreserveBoot)
#define OC_MENU_RESET_NVRAM_ID
EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
STATIC VOID WaitForChime(IN OUT OC_PICKER_CONTEXT *Context)
STATIC BOOLEAN mUseApple
STATIC OC_PICKER_ENTRY mResetNvramBootEntries[1]
STATIC CHAR8 *EFIAPI ResetNvramCheckHotKeys(IN OUT OC_PICKER_CONTEXT *Context, IN UINTN NumKeys, IN APPLE_MODIFIER_MAP Modifiers, IN APPLE_KEY_CODE *Keys)
STATIC BOOLEAN mPreserveBoot
STATIC OC_BOOT_ENTRY_PROTOCOL mResetNvramBootEntryProtocol
STATIC EFI_STATUS SystemActionResetNvram(IN OUT OC_PICKER_CONTEXT *PickerContext)
#define OC_MENU_RESET_NVRAM_ENTRY
STATIC EFI_STATUS EFIAPI ResetNvramGetBootEntries(IN OUT OC_PICKER_CONTEXT *PickerContext, IN CONST EFI_HANDLE Device OPTIONAL, OUT OC_PICKER_ENTRY **Entries, OUT UINTN *NumEntries)
EFI_RUNTIME_SERVICES * gRT
EFI_GUID gEfiLoadedImageProtocolGuid
#define ASSERT(x)
Definition coder.h:55