Initial import of binutils 2.22 on the new vendor branch
[dragonfly.git] / sys / boot / efi / libefi / efi_console.c
1 /*-
2  * Copyright (c) 2000 Doug Rabson
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  * $DragonFly: src/sys/boot/efi/libefi/efi_console.c,v 1.1 2003/11/10 06:08:33 dillon Exp $
27  */
28
29 #include <efi.h>
30 #include <efilib.h>
31
32 #include "bootstrap.h"
33
34 static SIMPLE_TEXT_OUTPUT_INTERFACE     *conout;
35 static SIMPLE_INPUT_INTERFACE           *conin;
36
37 static void
38 efi_cons_probe(struct console *cp)
39 {
40         conout = ST->ConOut;
41         conin = ST->ConIn;
42         cp->c_flags |= C_PRESENTIN | C_PRESENTOUT;
43 }
44
45 static int
46 efi_cons_init(int arg)
47 {
48         return 0;
49 }
50
51 void
52 efi_cons_putchar(int c)
53 {
54         CHAR16 buf[2];
55
56         if (c == '\n')
57                 efi_cons_putchar('\r');
58
59         buf[0] = c;
60         buf[1] = 0;
61
62         conout->OutputString(conout, buf);
63 }
64
65 int
66 efi_cons_getchar()
67 {
68         EFI_INPUT_KEY key;
69         EFI_STATUS status;
70         UINTN junk;
71
72         /* Try to read a key stroke. We wait for one if none is pending. */
73         status = conin->ReadKeyStroke(conin, &key);
74         if (status == EFI_NOT_READY) {
75                 BS->WaitForEvent(1, &conin->WaitForKey, &junk);
76                 status = conin->ReadKeyStroke(conin, &key);
77         }
78         return (key.UnicodeChar);
79 }
80
81 int
82 efi_cons_poll()
83 {
84         /* This can clear the signaled state. */
85         return (BS->CheckEvent(conin->WaitForKey) == EFI_SUCCESS);
86 }
87
88 struct console efi_console = {
89         "efi",
90         "EFI console",
91         0,
92         efi_cons_probe,
93         efi_cons_init,
94         efi_cons_putchar,
95         efi_cons_getchar,
96         efi_cons_poll
97 };