x86: Remove the POLL_CONSOLE hack
[akaros.git] / kern / arch / x86 / console.c
index 18933ca..680471d 100644 (file)
@@ -9,6 +9,7 @@
 #include <assert.h>
 #include <stdio.h>
 #include <sys/queue.h>
+#include <arch/topology.h>
 
 #include <ros/memlayout.h>
 
@@ -49,6 +50,11 @@ static int __serial_get_char(int com, uint8_t *data)
        if (!(inb(com + COM_LSR) & COM_LSR_DATA))
                return -1;
        *data = inb(com + COM_RX);
+       /* serial input sends \r a lot, but we interpret them as \n later on.  this
+        * will help userspace too, which isn't expecting the \rs.  the right answer
+        * might involve telling userspace what sort of console this is. */
+       if (*data == '\r')
+               *data = '\n';
        return 0;
 }
 
@@ -144,7 +150,7 @@ static char *__serial_detect_type(int com)
 }
 
 /* Helper: attempts to initialize the serial device cdev with COM com.  If it
- * succeeds, the cdev will be on the cdev_list. */ 
+ * succeeds, the cdev will be on the cdev_list. */
 static void serial_com_init(struct cons_dev *cdev, int com)
 {
        cdev->model = __serial_detect_type(com);
@@ -243,7 +249,7 @@ lpt_putc(int c)
 
 static spinlock_t console_lock = SPINLOCK_INITIALIZER_IRQSAVE;
 
-static unsigned SREADONLY addr_6845;
+static unsigned addr_6845;
 static uint16_t *crt_buf;
 static uint16_t crt_pos;
 
@@ -258,17 +264,17 @@ cga_init(void)
        uint16_t was;
        unsigned pos;
 
-       cp = (uint16_t *COUNT(CRT_SIZE)) TC(KERNBASE + CGA_BUF);
+       cp = (uint16_t *)(KERNBASE + CGA_BUF);
        was = *cp;
        *cp = (uint16_t) 0xA55A;
        if (*cp != 0xA55A) {
-               cp = (uint16_t *COUNT(CRT_SIZE)) TC(KERNBASE + MONO_BUF);
-               addr_6845 = SINIT(MONO_BASE);
+               cp = (uint16_t *)(KERNBASE + MONO_BUF);
+               addr_6845 = MONO_BASE;
        } else {
                *cp = was;
-               addr_6845 = SINIT(CGA_BASE);
+               addr_6845 = CGA_BASE;
        }
-       
+
        /* Extract cursor location */
        outb(addr_6845, 14);
        pos = inb(addr_6845 + 1) << 8;
@@ -286,7 +292,7 @@ static void set_screen(uint8_t screen_num)
 {
        uint16_t leftovers = (scrolling_crt_pos % CRT_COLS);
        leftovers = (leftovers) ? CRT_COLS - leftovers : 0;
-       
+
        int offset = scrolling_crt_pos + leftovers - (screen_num + 1)*CRT_SIZE;
        offset = (offset > 0) ? offset : 0;
 
@@ -302,7 +308,7 @@ static void scroll_screen_up(void)
 
 static void scroll_screen_down(void)
 {
-       if(current_crt_buf > 0) 
+       if(current_crt_buf > 0)
                current_crt_buf--;
        set_screen(current_crt_buf);
 }
@@ -371,7 +377,7 @@ cga_putc(int c)
        if (scrolling_crt_pos >= SCROLLING_CRT_SIZE) {
                int i;
 
-               memcpy(scrolling_crt_buf, scrolling_crt_buf + CRT_COLS, 
+               memcpy(scrolling_crt_buf, scrolling_crt_buf + CRT_COLS,
                       (SCROLLING_CRT_SIZE - CRT_COLS) * sizeof(uint16_t));
                for (i = SCROLLING_CRT_SIZE - CRT_COLS; i < SCROLLING_CRT_SIZE; i++)
                        scrolling_crt_buf[i] = 0x0700 | ' ';
@@ -401,7 +407,7 @@ cga_putc(int c)
 
 #define E0ESC          (1<<6)
 
-static uint8_t (SREADONLY shiftcode)[256] = 
+static uint8_t shiftcode[256] =
 {
        [0x1D] CTL,
        [0x2A] SHIFT,
@@ -411,7 +417,7 @@ static uint8_t (SREADONLY shiftcode)[256] =
        [0xB8] ALT
 };
 
-static uint8_t (SREADONLY togglecode)[256] = 
+static uint8_t togglecode[256] =
 {
        [0x3A] CAPSLOCK,
        [0x45] NUMLOCK,
@@ -439,7 +445,7 @@ static uint8_t normalmap[256] =
        [0xD2] KEY_INS,         [0xD3] KEY_DEL
 };
 
-static uint8_t shiftmap[256] = 
+static uint8_t shiftmap[256] =
 {
        NO,   033,  '!',  '@',  '#',  '$',  '%',  '^',  // 0x00
        '&',  '*',  '(',  ')',  '_',  '+',  '\b', '\t',
@@ -462,13 +468,13 @@ static uint8_t shiftmap[256] =
 
 #define C(x) (x - '@')
 
-static uint8_t ctlmap[256] = 
+static uint8_t ctlmap[256] =
 {
-       NO,      NO,      NO,      NO,      NO,      NO,      NO,      NO, 
-       NO,      NO,      NO,      NO,      NO,      NO,      NO,      NO, 
+       NO,      NO,      NO,      NO,      NO,      NO,      NO,      NO,
+       NO,      NO,      NO,      NO,      NO,      NO,      NO,      NO,
        C('Q'),  C('W'),  C('E'),  C('R'),  C('T'),  C('Y'),  C('U'),  C('I'),
        C('O'),  C('P'),  NO,      NO,      '\r',    NO,      C('A'),  C('S'),
-       C('D'),  C('F'),  C('G'),  C('H'),  C('J'),  C('K'),  C('L'),  NO, 
+       C('D'),  C('F'),  C('G'),  C('H'),  C('J'),  C('K'),  C('L'),  NO,
        NO,      NO,      NO,      C('\\'), C('Z'),  C('X'),  C('C'),  C('V'),
        C('B'),  C('N'),  C('M'),  NO,      NO,      C('/'),  NO,      NO,
        [0x97] KEY_HOME,
@@ -479,7 +485,7 @@ static uint8_t ctlmap[256] =
        [0xD2] KEY_INS,         [0xD3] KEY_DEL
 };
 
-static uint8_t * COUNT(256) (SREADONLY charcode)[4] = {
+static uint8_t *charcode[4] = {
        normalmap,
        shiftmap,
        ctlmap,
@@ -528,6 +534,9 @@ kbd_proc_data(void)
                shift |= E0ESC;
                return 0;
        } else if (data & 0x80) {
+               /* TODO: need a better check for bad key releases */
+               if (data == 0xff)
+                       return -1;
                // Key released
                data = (shift & E0ESC ? data : data & 0x7F);
                shift &= ~(shiftcode[data] | E0ESC);
@@ -640,6 +649,7 @@ int cons_get_any_char(void)
 /* output a character to all console outputs (monitor and all serials) */
 void cons_putc(int c)
 {
+       void logbuf(int c);
        #ifdef CONFIG_TRACE_LOCKS
        int8_t irq_state = 0;
        disable_irqsave(&irq_state);
@@ -653,6 +663,7 @@ void cons_putc(int c)
        #endif
        //lpt_putc(c);  /* very slow on the nehalem */
        cga_putc(c);
+       logbuf(c);
 
        #ifdef CONFIG_TRACE_LOCKS
        __spin_unlock(&console_lock);
@@ -671,7 +682,7 @@ cputchar(int c)
 }
 
 void
-cputbuf(const char*COUNT(len) buf, int len)
+cputbuf(const char*buf, int len)
 {
        int i;
        for(i = 0; i < len; i++)