OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
OcOSInfoLib.c
Go to the documentation of this file.
1
15#include <Guid/AppleOSLoaded.h>
16
17#include <Library/BaseLib.h>
18#include <Library/DebugLib.h>
19#include <Library/MemoryAllocationLib.h>
20#include <Library/OcMiscLib.h>
21#include <Library/OcOSInfoLib.h>
22#include <Library/UefiLib.h>
23#include <Library/UefiBootServicesTableLib.h>
24
25STATIC UINTN mBootVTdEnabled;
26STATIC CHAR8 *mOSName;
27STATIC CHAR8 *mOSVendor;
29
30STATIC
31VOID
33 VOID
34 )
35{
36 UINTN Index;
37 UINTN Length;
38 CHAR8 *VersionPtr;
39 UINT32 MajorVersion;
40 UINT32 MinorVersion;
41
42 DEBUG ((
43 DEBUG_INFO,
44 "OCOS: OS set: %a %a\n",
45 mOSVendor != NULL ? mOSVendor : "<null>",
46 mOSName != NULL ? mOSName : "<null>"
47 ));
48
49 if (mOSVendor == NULL) {
50 return;
51 }
52
53 if (AsciiStrCmp (mOSVendor, EFI_OS_INFO_APPLE_VENDOR_NAME) == 0) {
55 EfiNamedEventSignal (&gAppleOSLoadedNamedEventGuid);
57 }
58
59 if (mOSName == NULL) {
60 return;
61 }
62
63 Length = AsciiStrLen (mOSName);
64 for (Index = 0; Index < Length; ++Index) {
65 if (mOSName[Index] == '.') {
66 break;
67 }
68 }
69
70 if ((Index == Length) || (Index == 0) || (mOSName[Index + 1] == '\0')) {
71 return;
72 }
73
74 VersionPtr = &mOSName[Index - 1];
75 while (VersionPtr > mOSName) {
76 if ((*VersionPtr < '0') || (*VersionPtr > '9')) {
77 ++VersionPtr;
78 break;
79 }
80
81 --VersionPtr;
82 }
83
84 if (&mOSName[Index] == VersionPtr) {
85 return;
86 }
87
88 MajorVersion = 0;
89 while (VersionPtr < &mOSName[Index]) {
90 MajorVersion = MajorVersion * 10 + (*VersionPtr - '0');
91 ++VersionPtr;
92 }
93
94 VersionPtr = &mOSName[Index + 1];
95 MinorVersion = 0;
96 while (*VersionPtr != '\0') {
97 if ((*VersionPtr < '0') || (*VersionPtr > '9')) {
98 break;
99 }
100
101 MinorVersion = MinorVersion * 10 + (*VersionPtr - '0');
102 ++VersionPtr;
103 }
104
105 if (&mOSName[Index + 1] == VersionPtr) {
106 return;
107 }
108
109 if (((MajorVersion << 16U) | MinorVersion) > ((10U << 16U) | 9U)) {
110 //
111 // if (BootCurrent == 0x80) RTC[0x30] |= 0x1U;
112 // REF: E121EC07-9C42-45EE-B0B6-FFF8EF03C521, gAppleRtcRamProtocolGuid.
113 //
114 DEBUG ((DEBUG_VERBOSE, "OCOS: Should use black background\n"));
115 } else {
116 //
117 // if (BootCurrent == 0x80) RTC[0x30] &= ~0x1U;
118 //
119 DEBUG ((DEBUG_VERBOSE, "OCOS: Should use grey background\n"));
120 }
121 }
122}
123
124STATIC
125VOID
126EFIAPI
128 IN CHAR8 *OSName
129 )
130{
131 UINTN Size;
132 CHAR8 *Buffer;
133
134 if (mOSName != NULL) {
135 FreePool (mOSName);
136 mOSName = NULL;
137 }
138
139 Size = AsciiStrSize (OSName);
140 Buffer = AllocateCopyPool (Size, OSName);
141
142 mOSName = Buffer;
143
145}
146
147VOID
148EFIAPI
150 IN CHAR8 *OSVendor
151 )
152{
153 UINTN Size;
154 CHAR8 *Buffer;
155
156 if (mOSVendor != NULL) {
157 FreePool (mOSVendor);
158 mOSVendor = NULL;
159 }
160
161 Size = AsciiStrSize (OSVendor);
162 Buffer = AllocateCopyPool (Size, OSVendor);
163
165
167}
168
169STATIC
170VOID
171EFIAPI
173 IN UINTN *BootVTdEnabled
174 )
175{
176 mBootVTdEnabled = *BootVTdEnabled;
177}
178
179STATIC
180VOID
181EFIAPI
183 OUT UINTN *BootVTdEnabled
184 )
185{
186 *BootVTdEnabled = mBootVTdEnabled;
187}
188
189STATIC
198
201 IN BOOLEAN Reinstall
202 )
203{
204 EFI_STATUS Status;
205 EFI_OS_INFO_PROTOCOL *Protocol;
206 EFI_HANDLE NewHandle;
207
208 DEBUG ((DEBUG_VERBOSE, "OcOSInfoInstallProtocol\n"));
209
210 if (Reinstall) {
212 if (EFI_ERROR (Status)) {
213 DEBUG ((DEBUG_ERROR, "OCOS: Uninstall failed - %r\n", Status));
214 return NULL;
215 }
216 } else {
217 Status = gBS->LocateProtocol (
219 NULL,
220 (VOID *)&Protocol
221 );
222
223 if (!EFI_ERROR (Status)) {
224 return Protocol;
225 }
226 }
227
228 NewHandle = NULL;
229 Status = gBS->InstallMultipleProtocolInterfaces (
230 &NewHandle,
232 (VOID *)&mOSInfoProtocol,
233 NULL
234 );
235
236 if (EFI_ERROR (Status)) {
237 return NULL;
238 }
239
240 return &mOSInfoProtocol;
241}
EFI_GUID gAppleOSLoadedNamedEventGuid
UINT64 Length
#define EFI_OS_INFO_PROTOCOL_REVISION
Definition OSInfo.h:20
EFI_GUID gEfiOSInfoProtocolGuid
#define EFI_OS_INFO_APPLE_VENDOR_NAME
Definition OSInfo.h:27
DMG_SIZE_DEVICE_PATH Size
EFI_BOOT_SERVICES * gBS
EFI_STATUS OcUninstallAllProtocolInstances(EFI_GUID *Protocol)
STATIC VOID EFIAPI GetBootVTdEnabled(OUT UINTN *BootVTdEnabled)
STATIC VOID InternalOSInfoSet(VOID)
Definition OcOSInfoLib.c:32
STATIC BOOLEAN mAppleOSLoadedSignaled
Definition OcOSInfoLib.c:28
STATIC EFI_OS_INFO_PROTOCOL mOSInfoProtocol
STATIC CHAR8 * mOSVendor
Definition OcOSInfoLib.c:27
STATIC VOID EFIAPI SetBootVTdEnabled(IN UINTN *BootVTdEnabled)
EFI_OS_INFO_PROTOCOL * OcOSInfoInstallProtocol(IN BOOLEAN Reinstall)
VOID EFIAPI SetVendor(IN CHAR8 *OSVendor)
STATIC UINTN mBootVTdEnabled
Definition OcOSInfoLib.c:25
STATIC CHAR8 * mOSName
Definition OcOSInfoLib.c:26
STATIC VOID EFIAPI SetName(IN CHAR8 *OSName)
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
Definition OcTypingLib.h:42