Config option to turn off backspace for printk
[akaros.git] / kern / arch / riscv / console.c
1 #include <arch/console.h>
2 #include <pmap.h>
3 #include <atomic.h>
4
5 long
6 fesvr_syscall(long n, long a0, long a1, long a2, long a3)
7 {
8   static volatile uint64_t magic_mem[8];
9
10   static spinlock_t lock = SPINLOCK_INITIALIZER;
11   spin_lock_irqsave(&lock);
12
13   magic_mem[0] = n;
14   magic_mem[1] = a0;
15   magic_mem[2] = a1;
16   magic_mem[3] = a2;
17   magic_mem[4] = a3;
18
19   asm volatile ("cflush; fence");
20
21   mtpcr(PCR_TOHOST, PADDR(magic_mem));
22   while(mfpcr(PCR_FROMHOST) == 0);
23
24   long ret = magic_mem[0];
25
26   spin_unlock_irqsave(&lock);
27   return ret;
28 }
29
30 void
31 fesvr_die()
32 {
33         fesvr_syscall(FESVR_SYS_exit, 0, 0, 0, 0);
34 }
35
36 void
37 cons_init(void)
38 {
39 }
40
41 // `High'-level console I/O.  Used by readline and cprintf.
42
43 void
44 cputbuf(const char* buf, int len)
45 {
46         fesvr_syscall(FESVR_SYS_write, 1, PADDR((uintptr_t)buf), len, 0);
47 }
48
49 // Low-level console I/O
50
51 void
52 cons_putc(int c)
53 {
54         if(c == '\b' || c == 0x7F)
55         {
56         #ifdef __CONFIG_PRINTK_NO_BACKSPACE__
57                 char buf[2] = {'^', 'H'};
58                 cputbuf(buf, 2);
59         #else
60                 char buf[3] = {'\b', ' ', '\b'};
61                 cputbuf(buf, 3);
62         #endif /* __CONFIG_PRINTK_NO_BACKSPACE__ */
63         }
64         else
65         {
66                 char ch = c;
67                 cputbuf(&ch,1);
68         }
69 }
70
71 void
72 cputchar(int c)
73 {
74         char ch = c;
75         cputbuf(&ch,1);
76 }
77
78 int
79 cons_getc()
80 {
81         char ch;
82         uintptr_t paddr = PADDR((uintptr_t)&ch);
83         long ret = fesvr_syscall(FESVR_SYS_read, 0, paddr, 1, 0);
84         if(ch == 0x7F)
85                 ch = '\b';
86         return ret <= 0 ? 0 : ch;
87 }
88
89 int
90 getchar(void)
91 {
92         int c;
93
94         while ((c = cons_getc()) == 0)
95                 /* do nothing */;
96         return c;
97 }
98
99 int
100 iscons(int fdnum)
101 {
102         // used by readline
103         return 1;
104 }