]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - UnixPkg/UnixConsoleDxe/ConsoleOut.c
CryptoPkg SysCall Lib: Fix warning with GCC in CrtWrapper.c
[mirror_edk2.git] / UnixPkg / UnixConsoleDxe / ConsoleOut.c
... / ...
CommitLineData
1/*++\r
2\r
3Copyright (c) 2004, Intel Corporation. All rights reserved.<BR>\r
4This 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 ConsoleOut.c\r
15\r
16Abstract:\r
17\r
18 Console based on Posix APIs. \r
19\r
20 This file creates an Posix window and attaches a SimpleTextOut protocol.\r
21\r
22--*/\r
23\r
24#include "Console.h"\r
25//\r
26// Private worker functions.\r
27//\r
28\r
29#if 0\r
30VOID\r
31UnixSimpleTextOutScrollScreen (\r
32 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console\r
33 );\r
34\r
35#endif\r
36VOID\r
37UnixSimpleTextOutPutChar (\r
38 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console,\r
39 IN CHAR16 Char\r
40 );\r
41\r
42EFI_STATUS\r
43EFIAPI\r
44UnixSimpleTextOutSetAttribute (\r
45 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
46 IN UINTN Attribute\r
47 );\r
48EFI_STATUS\r
49EFIAPI\r
50UnixSimpleTextOutSetMode (\r
51 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
52 IN UINTN ModeNumber\r
53 );\r
54\r
55//\r
56// Modeule Global for Simple Text Out Mode.\r
57//\r
58#define MAX_SIMPLE_TEXT_OUT_MODE \\r
59 (sizeof(mUnixSimpleTextOutSupportedModes)/sizeof(UNIX_SIMPLE_TEXT_OUT_MODE))\r
60\r
61UNIX_SIMPLE_TEXT_OUT_MODE mUnixSimpleTextOutSupportedModes[] = {\r
62 { 80, 25 }, \r
63#if 0\r
64 { 80, 50 }, \r
65 { 80, 43 }, \r
66 { 100, 100 }, \r
67 { 100, 999 } \r
68#endif\r
69};\r
70\r
71EFI_STATUS\r
72EFIAPI\r
73UnixSimpleTextOutReset (\r
74 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
75 IN BOOLEAN ExtendedVerification\r
76 )\r
77/*++\r
78\r
79Routine Description:\r
80\r
81 TODO: Add function description\r
82\r
83Arguments:\r
84\r
85 This - TODO: add argument description\r
86 ExtendedVerification - TODO: add argument description\r
87\r
88Returns:\r
89\r
90 EFI_SUCCESS - TODO: Add description for return value\r
91\r
92--*/\r
93{\r
94 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
95\r
96 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
97\r
98 UnixSimpleTextOutSetAttribute (This, EFI_TEXT_ATTR (This->Mode->Attribute & 0x0F, EFI_BACKGROUND_BLACK));\r
99\r
100 UnixSimpleTextOutSetMode (This, 0);\r
101 return EFI_SUCCESS;\r
102}\r
103\r
104EFI_STATUS\r
105EFIAPI\r
106UnixSimpleTextOutOutputString (\r
107 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
108 IN CHAR16 *String\r
109 )\r
110/*++\r
111\r
112Routine Description:\r
113\r
114 TODO: Add function description\r
115\r
116Arguments:\r
117\r
118 This - TODO: add argument description\r
119 String - TODO: add argument description\r
120\r
121Returns:\r
122\r
123 EFI_SUCCESS - TODO: Add description for return value\r
124\r
125--*/\r
126{\r
127 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
128 CHAR16 *Str;\r
129\r
130 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
131\r
132 for (Str = String; *Str != '\0'; Str++) {\r
133 switch (*Str) {\r
134#if 0\r
135 case '\n':\r
136 if (Private->Position.Y == (Private->MaxScreenSize.Y - 1)) {\r
137 UnixSimpleTextOutScrollScreen (Private);\r
138 }\r
139\r
140 if (Private->Position.Y < (Private->MaxScreenSize.Y - 1)) {\r
141 Private->Position.Y++;\r
142 This->Mode->CursorRow++;\r
143 }\r
144 break;\r
145\r
146 case '\r':\r
147 Private->Position.X = 0;\r
148 This->Mode->CursorColumn = 0;\r
149 break;\r
150\r
151 case '\b':\r
152 if (Private->Position.X > 0) {\r
153 Private->Position.X--;\r
154 This->Mode->CursorColumn--;\r
155 }\r
156 break;\r
157\r
158#endif\r
159 default:\r
160 UnixSimpleTextOutPutChar (Private, *Str);\r
161 }\r
162 }\r
163\r
164 return EFI_SUCCESS;\r
165}\r
166\r
167VOID\r
168UnixSimpleTextOutPutChar (\r
169 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console,\r
170 IN CHAR16 Char\r
171 )\r
172/*++\r
173\r
174Routine Description:\r
175\r
176 TODO: Add function description\r
177\r
178Arguments:\r
179\r
180 Console - TODO: add argument description\r
181 Char - TODO: add argument description\r
182\r
183Returns:\r
184\r
185 TODO: add return values\r
186\r
187--*/\r
188{\r
189 char c = Char;\r
190 Console->UnixThunk->Write (1, &c, 1);\r
191}\r
192\r
193#if 0\r
194VOID\r
195UnixSimpleTextOutScrollScreen (\r
196 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console\r
197 )\r
198/*++\r
199\r
200Routine Description:\r
201\r
202 TODO: Add function description\r
203\r
204Arguments:\r
205\r
206 Console - TODO: add argument description\r
207\r
208Returns:\r
209\r
210 TODO: add return values\r
211\r
212--*/\r
213{\r
214}\r
215#endif\r
216\r
217\r
218EFI_STATUS\r
219EFIAPI\r
220UnixSimpleTextOutTestString (\r
221 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
222 IN CHAR16 *String\r
223 )\r
224/*++\r
225\r
226Routine Description:\r
227\r
228 TODO: Add function description\r
229\r
230Arguments:\r
231\r
232 This - TODO: add argument description\r
233 String - TODO: add argument description\r
234\r
235Returns:\r
236\r
237 EFI_SUCCESS - TODO: Add description for return value\r
238\r
239--*/\r
240{\r
241 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
242\r
243 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
244\r
245 //\r
246 // BugBug: The correct answer would be a function of what code pages\r
247 // are currently loaded? For now we will just return success.\r
248 //\r
249 return EFI_SUCCESS;\r
250}\r
251\r
252EFI_STATUS\r
253EFIAPI\r
254UnixSimpleTextOutQueryMode (\r
255 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
256 IN UINTN ModeNumber,\r
257 OUT UINTN *Columns,\r
258 OUT UINTN *Rows\r
259 )\r
260/*++\r
261\r
262Routine Description:\r
263\r
264 TODO: Add function description\r
265\r
266Arguments:\r
267\r
268 This - TODO: add argument description\r
269 ModeNumber - TODO: add argument description\r
270 Columns - TODO: add argument description\r
271 Rows - TODO: add argument description\r
272\r
273Returns:\r
274\r
275 EFI_INVALID_PARAMETER - TODO: Add description for return value\r
276 EFI_SUCCESS - TODO: Add description for return value\r
277\r
278--*/\r
279{\r
280 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
281\r
282 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
283\r
284 if (ModeNumber > MAX_SIMPLE_TEXT_OUT_MODE) {\r
285 return EFI_INVALID_PARAMETER;\r
286 }\r
287\r
288 *Columns = mUnixSimpleTextOutSupportedModes[ModeNumber].ColumnsX;\r
289 *Rows = mUnixSimpleTextOutSupportedModes[ModeNumber].RowsY;\r
290\r
291 return EFI_SUCCESS;\r
292}\r
293\r
294EFI_STATUS\r
295EFIAPI\r
296UnixSimpleTextOutSetMode (\r
297 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
298 IN UINTN ModeNumber\r
299 )\r
300/*++\r
301\r
302Routine Description:\r
303\r
304 TODO: Add function description\r
305\r
306Arguments:\r
307\r
308 This - TODO: add argument description\r
309 ModeNumber - TODO: add argument description\r
310\r
311Returns:\r
312\r
313 EFI_INVALID_PARAMETER - TODO: Add description for return value\r
314 EFI_SUCCESS - TODO: Add description for return value\r
315\r
316--*/\r
317{\r
318 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
319\r
320 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
321\r
322 if (ModeNumber > MAX_SIMPLE_TEXT_OUT_MODE) {\r
323 return EFI_INVALID_PARAMETER;\r
324 }\r
325\r
326\r
327 This->Mode->Mode = (INT32) ModeNumber;\r
328\r
329 This->EnableCursor (This, TRUE);\r
330 This->ClearScreen (This);\r
331 return EFI_SUCCESS;\r
332}\r
333\r
334EFI_STATUS\r
335EFIAPI\r
336UnixSimpleTextOutSetAttribute (\r
337 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
338 IN UINTN Attribute\r
339 )\r
340/*++\r
341\r
342Routine Description:\r
343\r
344 TODO: Add function description\r
345\r
346Arguments:\r
347\r
348 This - TODO: add argument description\r
349 Attribute - TODO: add argument description\r
350\r
351Returns:\r
352\r
353 EFI_SUCCESS - TODO: Add description for return value\r
354\r
355--*/\r
356{\r
357 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
358\r
359 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
360\r
361#if 0\r
362 Private->Attribute = (WORD) Attribute;\r
363#endif\r
364 This->Mode->Attribute = (INT32) Attribute;\r
365\r
366 return EFI_SUCCESS;\r
367}\r
368\r
369EFI_STATUS\r
370EFIAPI\r
371UnixSimpleTextOutClearScreen (\r
372 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This\r
373 )\r
374/*++\r
375\r
376Routine Description:\r
377\r
378 TODO: Add function description\r
379\r
380Arguments:\r
381\r
382 This - TODO: add argument description\r
383\r
384Returns:\r
385\r
386 EFI_SUCCESS - TODO: Add description for return value\r
387\r
388--*/\r
389{\r
390 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
391 // DWORD ConsoleWindow;\r
392\r
393 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
394\r
395 This->SetCursorPosition (This, 0, 0);\r
396 Private->UnixThunk->Write (1, "\e[2J", 4);\r
397\r
398\r
399#if 0\r
400 Private->UnixThunk->FillConsoleOutputCharacter (\r
401 Private->NtOutHandle,\r
402 ' ',\r
403 Private->MaxScreenSize.X * Private->MaxScreenSize.Y,\r
404 Private->Possition,\r
405 &ConsoleWindow\r
406 );\r
407 Private->UnixThunk->FillConsoleOutputAttribute (\r
408 Private->NtOutHandle,\r
409 Private->Attribute,\r
410 Private->MaxScreenSize.X * Private->MaxScreenSize.Y,\r
411 Private->Possition,\r
412 &ConsoleWindow\r
413 );\r
414#endif\r
415\r
416 return EFI_SUCCESS;\r
417}\r
418\r
419EFI_STATUS\r
420EFIAPI\r
421UnixSimpleTextOutSetCursorPosition (\r
422 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
423 IN UINTN Column,\r
424 IN UINTN Row\r
425 )\r
426/*++\r
427\r
428Routine Description:\r
429\r
430 TODO: Add function description\r
431\r
432Arguments:\r
433\r
434 This - TODO: add argument description\r
435 Column - TODO: add argument description\r
436 Row - TODO: add argument description\r
437\r
438Returns:\r
439\r
440 EFI_SUCCESS - TODO: Add description for return value\r
441\r
442--*/\r
443{\r
444 char buf[12];\r
445 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
446\r
447 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
448\r
449#if 0\r
450 Private->Position.X = (WORD) Column;\r
451#endif\r
452 This->Mode->CursorColumn = (INT32) Column;\r
453\r
454#if 0\r
455 Private->Position.Y = (WORD) Row;\r
456#endif\r
457 This->Mode->CursorRow = (INT32) Row;\r
458#if 0\r
459 Private->UnixThunk->SetConsoleCursorPosition (Private->NtOutHandle, Private->Possition);\r
460#endif\r
461\r
462 buf[0] = '\e';\r
463 buf[1] = '[';\r
464 buf[2] = '0' + ((Row / 100) % 10);\r
465 buf[3] = '0' + ((Row / 10) % 10);\r
466 buf[4] = '0' + ((Row / 1) % 10);\r
467 buf[5] = ';';\r
468 buf[6] = '0' + ((Column / 100) % 10);\r
469 buf[7] = '0' + ((Column / 10) % 10);\r
470 buf[8] = '0' + ((Column / 1) % 10);\r
471 buf[9] = 'H';\r
472 Private->UnixThunk->Write (1, buf, 10);\r
473\r
474 return EFI_SUCCESS;\r
475}\r
476\r
477EFI_STATUS\r
478EFIAPI\r
479UnixSimpleTextOutEnableCursor (\r
480 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
481 IN BOOLEAN Enable\r
482 )\r
483/*++\r
484\r
485Routine Description:\r
486\r
487 TODO: Add function description\r
488\r
489Arguments:\r
490\r
491 This - TODO: add argument description\r
492 Enable - TODO: add argument description\r
493\r
494Returns:\r
495\r
496 EFI_SUCCESS - TODO: Add description for return value\r
497\r
498--*/\r
499{\r
500 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
501#if 0\r
502 CONSOLE_CURSOR_INFO Info;\r
503#endif\r
504\r
505 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
506 Private->CursorEnable = Enable;\r
507 This->Mode->CursorVisible = Enable;\r
508\r
509#if 0\r
510 Private->UnixThunk->GetConsoleCursorInfo (Private->NtOutHandle, &Info);\r
511 Info.bVisible = Enable;\r
512 Private->UnixThunk->SetConsoleCursorInfo (Private->NtOutHandle, &Info);\r
513#endif\r
514\r
515 return EFI_SUCCESS;\r
516}\r
517\r
518EFI_STATUS\r
519UnixSimpleTextOutOpenWindow (\r
520 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private\r
521 )\r
522/*++\r
523\r
524Routine Description:\r
525\r
526 TODO: Add function description\r
527\r
528Arguments:\r
529\r
530 Private - TODO: add argument description\r
531\r
532Returns:\r
533\r
534 TODO: add return values\r
535\r
536--*/\r
537{\r
538 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut;\r
539 CHAR16 *WindowName;\r
540\r
541 //WindowName = Private->UnixIo->EnvString;\r
542#if 0\r
543 Private->Attribute = FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY;\r
544 if (*WindowName == '?') {\r
545 Private->Attribute = BACKGROUND_RED | FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN;\r
546 WindowName = L"EFI Emulator Error Console";\r
547 }\r
548#endif\r
549 WindowName = L"EFI Emulator Error Console";\r
550\r
551 AddUnicodeString (\r
552 "eng",\r
553 gUnixConsoleComponentName.SupportedLanguages,\r
554 &Private->ControllerNameTable,\r
555 WindowName\r
556 );\r
557\r
558 //\r
559 // Fill in protocol member functions\r
560 //\r
561 SimpleTextOut = &Private->SimpleTextOut;\r
562 SimpleTextOut->Reset = UnixSimpleTextOutReset;\r
563 SimpleTextOut->OutputString = UnixSimpleTextOutOutputString;\r
564 SimpleTextOut->TestString = UnixSimpleTextOutTestString;\r
565 SimpleTextOut->QueryMode = UnixSimpleTextOutQueryMode;\r
566 SimpleTextOut->SetMode = UnixSimpleTextOutSetMode;\r
567 SimpleTextOut->SetAttribute = UnixSimpleTextOutSetAttribute;\r
568 SimpleTextOut->ClearScreen = UnixSimpleTextOutClearScreen;\r
569 SimpleTextOut->SetCursorPosition = UnixSimpleTextOutSetCursorPosition;\r
570 SimpleTextOut->EnableCursor = UnixSimpleTextOutEnableCursor;\r
571\r
572 //\r
573 // Initialize SimpleTextOut protocol mode structure\r
574 //\r
575 SimpleTextOut->Mode = &Private->SimpleTextOutMode;\r
576 SimpleTextOut->Mode->MaxMode = MAX_SIMPLE_TEXT_OUT_MODE;\r
577 SimpleTextOut->Mode->Attribute = 0; //FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY;\r
578\r
579#if 0\r
580 //\r
581 // Open the window an initialize it!\r
582 //\r
583 Private->NtOutHandle = Private->UnixThunk->CreateConsoleScreenBuffer (\r
584 GENERIC_WRITE | GENERIC_READ,\r
585 FILE_SHARE_WRITE | FILE_SHARE_READ,\r
586 NULL,\r
587 CONSOLE_TEXTMODE_BUFFER,\r
588 NULL\r
589 );\r
590 Private->UnixThunk->SetConsoleTitle (WindowName);\r
591#endif\r
592\r
593 return SimpleTextOut->SetMode (SimpleTextOut, 0);\r
594}\r
595\r
596EFI_STATUS\r
597UnixSimpleTextOutCloseWindow (\r
598 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console\r
599 )\r
600/*++\r
601\r
602Routine Description:\r
603\r
604 TODO: Add function description\r
605\r
606Arguments:\r
607\r
608 Console - TODO: add argument description\r
609\r
610Returns:\r
611\r
612 EFI_SUCCESS - TODO: Add description for return value\r
613\r
614--*/\r
615{\r
616#if 0\r
617 Console->UnixThunk->CloseHandle (Console->NtOutHandle);\r
618#endif\r
619 return EFI_SUCCESS;\r
620}\r