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