]> git.proxmox.com Git - mirror_edk2.git/blame - EdkUnixPkg/Dxe/UnixThunk/Bus/Console/Console.c
Fix component name bugs when input Controller Name is invalid
[mirror_edk2.git] / EdkUnixPkg / Dxe / UnixThunk / Bus / Console / Console.c
CommitLineData
c9093a06 1/*++\r
2\r
3Copyright (c) 2004 - 2005, Intel Corporation \r
4All rights reserved. This program and the accompanying materials \r
5are licensed and made available under the terms and conditions of the BSD License \r
6which accompanies this distribution. The full text of the license may be found at \r
7http://opensource.org/licenses/bsd-license.php \r
8 \r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
11\r
12Module Name:\r
13\r
14 Console.c\r
15\r
16Abstract:\r
17\r
377fc2ae 18 Console based on Posix APIs. \r
c9093a06 19\r
20--*/\r
21\r
22#include "Console.h"\r
23\r
24EFI_STATUS\r
25EFIAPI\r
26UnixConsoleDriverBindingSupported (\r
27 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
28 IN EFI_HANDLE Handle,\r
29 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
30 );\r
31\r
32EFI_STATUS\r
33EFIAPI\r
34UnixConsoleDriverBindingStart (\r
35 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
36 IN EFI_HANDLE Handle,\r
37 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
38 );\r
39\r
40EFI_STATUS\r
41EFIAPI\r
42UnixConsoleDriverBindingStop (\r
43 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
44 IN EFI_HANDLE Handle,\r
45 IN UINTN NumberOfChildren,\r
46 IN EFI_HANDLE *ChildHandleBuffer\r
47 );\r
48\r
49EFI_DRIVER_BINDING_PROTOCOL gUnixConsoleDriverBinding = {\r
50 UnixConsoleDriverBindingSupported,\r
51 UnixConsoleDriverBindingStart,\r
52 UnixConsoleDriverBindingStop,\r
caea5554 53 0xa,\r
c9093a06 54 NULL,\r
55 NULL\r
56};\r
57\r
58EFI_STATUS\r
59EFIAPI\r
60UnixConsoleDriverBindingSupported (\r
61 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
62 IN EFI_HANDLE Handle,\r
63 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
64 )\r
65/*++\r
66\r
67Routine Description:\r
68\r
69Arguments:\r
70\r
71Returns:\r
72\r
73 None\r
74\r
75--*/\r
76// TODO: This - add argument and description to function comment\r
77// TODO: Handle - add argument and description to function comment\r
78// TODO: RemainingDevicePath - add argument and description to function comment\r
79{\r
80 EFI_STATUS Status;\r
81 EFI_UNIX_IO_PROTOCOL *UnixIo;\r
82\r
83 //\r
84 // Open the IO Abstraction(s) needed to perform the supported test\r
85 //\r
86 Status = gBS->OpenProtocol (\r
87 Handle,\r
88 &gEfiUnixIoProtocolGuid,\r
89 (void *)&UnixIo,\r
90 This->DriverBindingHandle,\r
91 Handle,\r
92 EFI_OPEN_PROTOCOL_BY_DRIVER\r
93 );\r
94 if (EFI_ERROR (Status)) {\r
95 return Status;\r
96 }\r
97\r
98 //\r
99 // Make sure that the Unix Thunk Protocol is valid\r
100 //\r
101 Status = EFI_UNSUPPORTED;\r
102 if (UnixIo->UnixThunk->Signature == EFI_UNIX_THUNK_PROTOCOL_SIGNATURE) {\r
103\r
104 //\r
105 // Check the GUID to see if this is a handle type the driver supports\r
106 //\r
107 if (CompareGuid (UnixIo->TypeGuid, &gEfiUnixConsoleGuid)) {\r
108 Status = EFI_SUCCESS;\r
109 }\r
110 }\r
111\r
112 //\r
113 // Close the I/O Abstraction(s) used to perform the supported test\r
114 //\r
115 gBS->CloseProtocol (\r
116 Handle,\r
117 &gEfiUnixIoProtocolGuid,\r
118 This->DriverBindingHandle,\r
119 Handle\r
120 );\r
121\r
122 return Status;\r
123}\r
124\r
125EFI_STATUS\r
126EFIAPI\r
127UnixConsoleDriverBindingStart (\r
128 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
129 IN EFI_HANDLE Handle,\r
130 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
131 )\r
132/*++\r
133\r
134Routine Description:\r
135\r
136Arguments:\r
137\r
138Returns:\r
139\r
140 None\r
141\r
142--*/\r
143// TODO: This - add argument and description to function comment\r
144// TODO: Handle - add argument and description to function comment\r
145// TODO: RemainingDevicePath - add argument and description to function comment\r
146{\r
147 EFI_STATUS Status;\r
148 EFI_UNIX_IO_PROTOCOL *UnixIo;\r
149 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
150\r
151 //\r
152 // Grab the IO abstraction we need to get any work done\r
153 //\r
154 Status = gBS->OpenProtocol (\r
155 Handle,\r
156 &gEfiUnixIoProtocolGuid,\r
157 (void *)&UnixIo,\r
158 This->DriverBindingHandle,\r
159 Handle,\r
160 EFI_OPEN_PROTOCOL_BY_DRIVER\r
161 );\r
162 if (EFI_ERROR (Status)) {\r
163 return Status;\r
164 }\r
165\r
166 Status = gBS->AllocatePool (\r
167 EfiBootServicesData,\r
168 sizeof (UNIX_SIMPLE_TEXT_PRIVATE_DATA),\r
169 (void *)&Private\r
170 );\r
171 if (EFI_ERROR (Status)) {\r
172 goto Done;\r
173 }\r
174\r
175 ZeroMem (Private, sizeof (UNIX_SIMPLE_TEXT_PRIVATE_DATA));\r
176\r
177 Private->Signature = UNIX_SIMPLE_TEXT_PRIVATE_DATA_SIGNATURE;\r
178 Private->Handle = Handle;\r
179 Private->UnixIo = UnixIo;\r
180 Private->UnixThunk = UnixIo->UnixThunk;\r
181\r
182 UnixSimpleTextOutOpenWindow (Private);\r
183 UnixSimpleTextInAttachToWindow (Private);\r
184\r
185 Status = gBS->InstallMultipleProtocolInterfaces (\r
186 &Handle,\r
187 &gEfiSimpleTextOutProtocolGuid,\r
188 &Private->SimpleTextOut,\r
189 &gEfiSimpleTextInProtocolGuid,\r
190 &Private->SimpleTextIn,\r
191 NULL\r
192 );\r
193 if (!EFI_ERROR (Status)) {\r
194 return Status;\r
195 }\r
196\r
197Done:\r
198 gBS->CloseProtocol (\r
199 Handle,\r
200 &gEfiUnixIoProtocolGuid,\r
201 This->DriverBindingHandle,\r
202 Handle\r
203 );\r
204 if (Private != NULL) {\r
205\r
206 FreeUnicodeStringTable (Private->ControllerNameTable);\r
207\r
caea5554 208#if 0\r
c9093a06 209 if (Private->NtOutHandle != NULL) {\r
210 Private->UnixThunk->CloseHandle (Private->NtOutHandle);\r
211 }\r
caea5554 212#endif\r
c9093a06 213\r
214 if (Private->SimpleTextIn.WaitForKey != NULL) {\r
215 gBS->CloseEvent (Private->SimpleTextIn.WaitForKey);\r
216 }\r
217\r
218 gBS->FreePool (Private);\r
219 }\r
220\r
221 return Status;\r
222}\r
223\r
224EFI_STATUS\r
225EFIAPI\r
226UnixConsoleDriverBindingStop (\r
227 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
228 IN EFI_HANDLE Handle,\r
229 IN UINTN NumberOfChildren,\r
230 IN EFI_HANDLE *ChildHandleBuffer\r
231 )\r
232/*++\r
233\r
234Routine Description:\r
235\r
236 TODO: Add function description\r
237\r
238Arguments:\r
239\r
240 This - TODO: add argument description\r
241 Handle - TODO: add argument description\r
242 NumberOfChildren - TODO: add argument description\r
243 ChildHandleBuffer - TODO: add argument description\r
244\r
245Returns:\r
246\r
247 EFI_UNSUPPORTED - TODO: Add description for return value\r
248\r
249--*/\r
250{\r
251 EFI_SIMPLE_TEXT_OUT_PROTOCOL *SimpleTextOut;\r
252 EFI_STATUS Status;\r
253 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
254\r
255 //\r
256 // Kick people off our interface???\r
257 //\r
258 Status = gBS->OpenProtocol (\r
259 Handle,\r
260 &gEfiSimpleTextOutProtocolGuid,\r
261 (void *)&SimpleTextOut,\r
262 This->DriverBindingHandle,\r
263 Handle,\r
264 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
265 );\r
266 if (EFI_ERROR (Status)) {\r
267 return EFI_UNSUPPORTED;\r
268 }\r
269\r
270 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (SimpleTextOut);\r
271\r
272 ASSERT (Private->Handle == Handle);\r
273\r
274 Status = gBS->UninstallMultipleProtocolInterfaces (\r
275 Handle,\r
276 &gEfiSimpleTextOutProtocolGuid,\r
277 &Private->SimpleTextOut,\r
278 &gEfiSimpleTextInProtocolGuid,\r
279 &Private->SimpleTextIn,\r
280 NULL\r
281 );\r
282 if (!EFI_ERROR (Status)) {\r
283\r
284 //\r
285 // Shut down our device\r
286 //\r
287 Status = gBS->CloseProtocol (\r
288 Handle,\r
289 &gEfiUnixIoProtocolGuid,\r
290 This->DriverBindingHandle,\r
291 Handle\r
292 );\r
293\r
294 Status = gBS->CloseEvent (Private->SimpleTextIn.WaitForKey);\r
295 ASSERT_EFI_ERROR (Status);\r
296\r
caea5554 297#if 0\r
c9093a06 298 Private->UnixThunk->CloseHandle (Private->NtOutHandle);\r
caea5554 299#endif\r
c9093a06 300 //\r
301 // DO NOT close Private->NtInHandle. It points to StdIn and not\r
302 // the Private->NtOutHandle is StdIn and should not be closed!\r
303 //\r
304 FreeUnicodeStringTable (Private->ControllerNameTable);\r
305\r
306 gBS->FreePool (Private);\r
307 }\r
308\r
309 return Status;\r
310}\r