OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
OcResetSystem.c
Go to the documentation of this file.
1
8#include <Uefi.h>
9#include <Library/BaseMemoryLib.h>
12#include <Library/OcMiscLib.h>
13#include <Library/OcStringLib.h>
14#include <Library/UefiApplicationEntryPoint.h>
15#include <Library/UefiBootServicesTableLib.h>
16#include <Library/UefiRuntimeServicesTableLib.h>
17#include <Library/UefiLib.h>
18#include <Guid/GlobalVariable.h>
19
20EFI_STATUS
21EFIAPI
23 VOID
24 )
25{
26 EFI_STATUS Status;
27 UINT64 OsIndications;
28 UINT32 Attr;
29 UINTN DataSize;
30
31 DataSize = sizeof (OsIndications);
32 Status = gRT->GetVariable (
33 EFI_OS_INDICATIONS_SUPPORT_VARIABLE_NAME,
35 &Attr,
36 &DataSize,
37 &OsIndications
38 );
39
40 if (EFI_ERROR (Status)) {
41 DEBUG ((DEBUG_WARN, "OCRST: Failed to acquire firmware features - %r\n", Status));
42 return EFI_NOT_FOUND;
43 }
44
45 if ((OsIndications & EFI_OS_INDICATIONS_BOOT_TO_FW_UI) == 0) {
46 DEBUG ((DEBUG_WARN, "OCRST: Firmware do not support EFI_OS_INDICATIONS_BOOT_TO_FW_UI - %r\n", Status));
47 return EFI_UNSUPPORTED;
48 }
49
50 return EFI_SUCCESS;
51}
52
53EFI_STATUS
54EFIAPI
56 IN CHAR16 *Mode
57 )
58{
59 EFI_STATUS Status;
60 EFI_RESET_TYPE ResetMode;
61 UINT64 OsIndications;
62 UINT32 Attr;
63 UINTN DataSize;
64
65 if (OcStriCmp (Mode, L"firmware") == 0) {
66 DEBUG ((DEBUG_INFO, "OCRST: Entering firmware...\n"));
68 if (EFI_ERROR (Status)) {
69 return Status;
70 }
71
72 DataSize = sizeof (OsIndications);
73 Status = gRT->GetVariable (
74 EFI_OS_INDICATIONS_VARIABLE_NAME,
76 &Attr,
77 &DataSize,
78 &OsIndications
79 );
80 if (!EFI_ERROR (Status)) {
81 OsIndications |= EFI_OS_INDICATIONS_BOOT_TO_FW_UI;
82 } else {
83 OsIndications = EFI_OS_INDICATIONS_BOOT_TO_FW_UI;
84 }
85
86 Status = gRT->SetVariable (
87 EFI_OS_INDICATIONS_VARIABLE_NAME,
89 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
90 sizeof (OsIndications),
91 &OsIndications
92 );
93 if (EFI_ERROR (Status)) {
94 DEBUG ((DEBUG_WARN, "OCRST: Failed to set EFI_OS_INDICATIONS_BOOT_TO_FW_UI - %r\n", Status));
95 return EFI_ABORTED;
96 }
97
98 Mode = L"coldreset";
99 }
100
101 if (OcStriCmp (Mode, L"coldreset") == 0) {
102 DEBUG ((DEBUG_INFO, "OCRST: Perform cold reset...\n"));
103 ResetMode = EfiResetCold;
104 } else if (OcStriCmp (Mode, L"warmreset") == 0) {
105 DEBUG ((DEBUG_INFO, "OCRST: Perform warm reset...\n"));
106 ResetMode = EfiResetWarm;
107 } else if (OcStriCmp (Mode, L"shutdown") == 0) {
108 DEBUG ((DEBUG_INFO, "OCRST: Perform shutdown...\n"));
109 ResetMode = EfiResetShutdown;
110 } else {
111 DEBUG ((DEBUG_INFO, "OCRST: Unknown argument %s, defaulting to cold reset...\n", Mode));
112 ResetMode = EfiResetCold;
113 }
114
115 gRT->ResetSystem (
116 ResetMode,
117 EFI_SUCCESS,
118 0,
119 NULL
120 );
121
122 DEBUG ((DEBUG_INFO, "OCRST: Failed to reset, trying direct\n"));
123
125
126 DEBUG ((DEBUG_INFO, "OCRST: Failed to reset directly, entering dead loop\n"));
127
128 CpuDeadLoop ();
129
130 return EFI_SUCCESS;
131}
VOID DirectResetCold(VOID)
Definition DirectReset.c:16
EFI_STATUS EFIAPI OcResetSystem(IN CHAR16 *Mode)
EFI_STATUS EFIAPI OcResetToFirmwareSettingsSupported(VOID)
INTN EFIAPI OcStriCmp(IN CONST CHAR16 *FirstString, IN CONST CHAR16 *SecondString)
EFI_RUNTIME_SERVICES * gRT
EFI_GUID gEfiGlobalVariableGuid