use new risc-v i/o abi
[akaros.git] / kern / arch / riscv / console.c
1 #include <arch/console.h>
2 #include <console.h>
3 #include <pmap.h>
4 #include <atomic.h>
5 #include <smp.h>
6 #include <kmalloc.h>
7 #include <monitor.h>
8 #include <process.h>
9
10 int cons_get_any_char(void)
11 {
12         assert(0);
13 }
14
15 void
16 cons_init(void)
17 {
18         while (mtpcr(PCR_TOHOST, 0x0180000000000000));
19 }
20
21 // `High'-level console I/O.  Used by readline and cprintf.
22
23 void
24 cputbuf(const char* str, int len)
25 {
26         for (int i = 0; i < len; i++)
27                 cputchar(str[i]);
28 }
29
30 void poll_keyboard()
31 {
32         uintptr_t fh = mtpcr(PCR_FROMHOST, 0);
33         if (fh == 0)
34                 return;
35         assert((fh >> 56) == 0x01);
36
37         char c = fh;
38         if (c == 'G')
39                 send_kernel_message(core_id(), __run_mon, 0, 0, 0, KMSG_ROUTINE);
40         else
41                 send_kernel_message(core_id(), __cons_add_char, (long)&cons_buf,
42                                     (long)c, 0, KMSG_ROUTINE);
43         cons_init();
44 }
45
46 // Low-level console I/O
47
48 void
49 cputchar(int c)
50 {
51         while (mtpcr(PCR_TOHOST, 0x0101000000000000 | (unsigned char)c));
52 }
53
54 int
55 getchar(void)
56 {
57         char c;
58         kb_get_from_buf(&cons_buf, &c, 1);
59         return c;
60 }
61
62 int
63 iscons(int fdnum)
64 {
65         // used by readline
66         return 1;
67 }