OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
ConsoleControl.c
Go to the documentation of this file.
1
16
18
19#include <Library/BaseMemoryLib.h>
20#include <Library/BaseLib.h>
21#include <Library/DebugLib.h>
22#include <Library/MemoryAllocationLib.h>
24#include <Library/OcMiscLib.h>
25#include <Library/UefiBootServicesTableLib.h>
26#include <Library/UefiRuntimeServicesTableLib.h>
27
31 )
32{
33 EFI_STATUS Status;
34 EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl;
36
38 &gST->ConsoleOutHandle,
40 (VOID *)&ConsoleControl
41 );
42
43 //
44 // No console control, assume already set.
45 //
46 if (EFI_ERROR (Status)) {
47 return Mode;
48 }
49
50 Status = ConsoleControl->GetMode (
51 ConsoleControl,
52 &OldMode,
53 NULL,
54 NULL
55 );
56
57 //
58 // Cannot get mode, assume already set.
59 // Same mode, do not waste time.
60 //
61 if (EFI_ERROR (Status) || (OldMode == Mode)) {
62 return Mode;
63 }
64
65 ConsoleControl->SetMode (
66 ConsoleControl,
67 Mode
68 );
69
70 return OldMode;
71}
72
75 VOID
76 )
77{
78 EFI_STATUS Status;
79 EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl;
81
83 &gST->ConsoleOutHandle,
85 (VOID *)&ConsoleControl
86 );
87
88 if (EFI_ERROR (Status)) {
90 }
91
92 Status = ConsoleControl->GetMode (
93 ConsoleControl,
94 &ExistingMode,
95 NULL,
96 NULL
97 );
98
99 if (EFI_ERROR (Status)) {
101 }
102
103 return ExistingMode;
104}
105
106EFI_STATUS
108 IN EFI_CONSOLE_CONTROL_PROTOCOL *NewProtocol,
109 OUT EFI_CONSOLE_CONTROL_PROTOCOL *OldProtocol OPTIONAL,
110 IN OUT EFI_CONSOLE_CONTROL_SCREEN_MODE *OldMode OPTIONAL
111 )
112{
113 EFI_STATUS Status;
114 EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl;
115
116 Status = OcHandleProtocolFallback (
117 &gST->ConsoleOutHandle,
119 (VOID *)&ConsoleControl
120 );
121
122 DEBUG ((
123 DEBUG_INFO,
124 "OCC: Install console control (%p/%p/%p), current - %r\n",
125 NewProtocol,
126 OldProtocol,
127 OldMode,
128 Status
129 ));
130
131 //
132 // Native implementation exists, overwrite.
133 //
134 if (!EFI_ERROR (Status)) {
135 //
136 // Provide original mode if requested.
137 //
138 if (OldMode != NULL) {
139 ConsoleControl->GetMode (ConsoleControl, OldMode, NULL, NULL);
140 }
141
142 if (OldProtocol != NULL) {
143 CopyMem (
144 OldProtocol,
145 ConsoleControl,
146 sizeof (*OldProtocol)
147 );
148 }
149
150 CopyMem (
151 ConsoleControl,
152 NewProtocol,
153 sizeof (*ConsoleControl)
154 );
155
156 return EFI_SUCCESS;
157 }
158
159 if (OldProtocol != NULL) {
160 ZeroMem (
161 OldProtocol,
162 sizeof (*OldProtocol)
163 );
164 }
165
166 Status = gBS->InstallMultipleProtocolInterfaces (
167 &gST->ConsoleOutHandle,
169 NewProtocol,
170 NULL
171 );
172
173 DEBUG ((DEBUG_INFO, "OCC: Install console control, new - %r\n", Status));
174
175 return Status;
176}
177
178EFI_STATUS
180 IN EFI_CONSOLE_CONTROL_PROTOCOL *OldProtocol
181 )
182{
183 EFI_STATUS Status;
184 EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl;
185
186 Status = gBS->HandleProtocol (
187 &gST->ConsoleOutHandle,
189 (VOID *)&ConsoleControl
190 );
191
192 if (OldProtocol->GetMode == NULL) {
193 Status = gBS->UninstallMultipleProtocolInterfaces (
194 &gST->ConsoleOutHandle,
196 ConsoleControl,
197 NULL
198 );
199
200 return Status;
201 }
202
203 CopyMem (
204 ConsoleControl,
205 OldProtocol,
206 sizeof (*ConsoleControl)
207 );
208
209 return EFI_SUCCESS;
210}
EFI_CONSOLE_CONTROL_SCREEN_MODE OcConsoleControlSetMode(IN EFI_CONSOLE_CONTROL_SCREEN_MODE Mode)
EFI_STATUS OcConsoleControlInstallProtocol(IN EFI_CONSOLE_CONTROL_PROTOCOL *NewProtocol, OUT EFI_CONSOLE_CONTROL_PROTOCOL *OldProtocol OPTIONAL, IN OUT EFI_CONSOLE_CONTROL_SCREEN_MODE *OldMode OPTIONAL)
EFI_CONSOLE_CONTROL_SCREEN_MODE OcConsoleControlGetMode(VOID)
EFI_STATUS OcConsoleControlRestoreProtocol(IN EFI_CONSOLE_CONTROL_PROTOCOL *OldProtocol)
EFI_CONSOLE_CONTROL_SCREEN_MODE
@ EfiConsoleControlScreenText
EFI_GUID gEfiConsoleControlProtocolGuid
EFI_SYSTEM_TABLE * gST
EFI_BOOT_SERVICES * gBS
EFI_STATUS OcHandleProtocolFallback(IN EFI_HANDLE Handle, IN EFI_GUID *Protocol, OUT VOID **Interface)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
EFI_CONSOLE_CONTROL_PROTOCOL_GET_MODE GetMode
EFI_CONSOLE_CONTROL_PROTOCOL_SET_MODE SetMode