x86 serial input converts \r to \n
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 15 Nov 2013 00:57:31 +0000 (16:57 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 16 Jan 2014 19:38:23 +0000 (11:38 -0800)
This is probably part of an ongoing disconnect at the console level
between the kernel and userspace.

The serial port reads a \r for a newline (at least in qemu and in
minicom a while back).  Userspace in general can't handle that.  csquery
couldn't, and busybox also has issues (try rm on
/9/bin/somefile-that-exists, you'll hang on the "really remove this?"
query).

kern/arch/x86/console.c
kern/src/readline.c

index 18933ca..2522a89 100644 (file)
@@ -49,6 +49,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;
 }
 
index 7c6c66d..2df6369 100644 (file)
@@ -36,7 +36,7 @@ int readline(char *buf, size_t buf_l, const char *prompt, ...)
                        continue;
                } else if (c == '\n' || c == '\r') {
                        /* sending a \n regardless, since the serial port gives us a \r for
-                        * carriage returns. */
+                        * carriage returns. (probably won't get a \r anymore) */
                        if (echoing)
                                cputchar('\n');
                        assert(i <= buf_l - 1); /* never write to buf_l - 1 til the end */