Fix character input by handling the character and the
authorNathan Binkert <binkertn@umich.edu>
Thu, 29 Jan 2004 21:32:03 +0000 (16:32 -0500)
committerNathan Binkert <binkertn@umich.edu>
Thu, 29 Jan 2004 21:32:03 +0000 (16:32 -0500)
special console values separately.

dev/alpha_console.cc:
    use new console specific input function

--HG--
extra : convert_revision : 08997d6115d2aac3a26cac2774b3c3fc0cd76ab0

dev/alpha_console.cc
dev/console.cc
dev/console.hh

index ccf6c33fd3582ad86112119b26604fb6b3b6c2ec..8e59db93267a9b7b24faba360676d1f0912c58ee 100644 (file)
@@ -81,7 +81,7 @@ AlphaConsole::read(MemReqPtr req, uint8_t *data)
     Addr daddr = req->paddr & addr_mask;
     switch (daddr) {
       case offsetof(AlphaAccess, inputChar):
-        val = console->in();
+        val = console->console_in();
         break;
 
       default:
index 3fa51a41425899199251fc829daff5f20fc6a244..5e7b0abf6bfe96ab06984cf4830cc47c3e1a5616 100644 (file)
@@ -228,27 +228,44 @@ SimConsole::configTerm()
 #define RECEIVE_NONE (ULL(2) << 62)
 #define RECEIVE_ERROR (ULL(3) << 62)
 
-uint64_t
-SimConsole::in()
+bool
+SimConsole::in(uint8_t &c)
 {
-    char c = 0;
-    uint64_t val = 0;
-    if (rxbuf.empty()) {
+    bool empty, ret;
+
+    empty = rxbuf.empty();
+    ret = !empty;
+    if (!empty) {
+        rxbuf.read((char *)&c, 1);
+        empty = rxbuf.empty();
+    }
+
+    if (empty)
         clearInt(ReceiveInterrupt);
-        val |= RECEIVE_NONE;
-        return 0x8;
-    } else {
-        uint64_t val;
-        rxbuf.read(&c, 1);
-        val |= RECEIVE_SUCCESS | c;
+
+    DPRINTF(ConsoleVerbose, "in: \'%c\' %#02x more: %d, return: %d\n",
+            isprint(c) ? c : ' ', c, !empty, ret);
+
+    return ret;
+}
+
+uint64_t
+SimConsole::console_in()
+{
+    uint8_t c;
+    uint64_t value;
+
+    if (in(c)) {
+        value = RECEIVE_SUCCESS | c;
         if (!rxbuf.empty())
-            val |= MORE_PENDING;
+            value  |= MORE_PENDING;
+    } else {
+        value = RECEIVE_NONE;
     }
 
-    DPRINTF(ConsoleVerbose, "in: \'%c\' %#02x retval: %#x\n",
-            isprint(c) ? c : ' ', c, val);
+    DPRINTF(ConsoleVerbose, "console_in: return: %#x\n", value);
 
-    return val;
+    return value;
 }
 
 void
index 9913fe379bc2f5ab7f49e3a2e13fa937931e6225..d2bba46123da5c5e2569364bc31240069c0c33db 100644 (file)
@@ -109,7 +109,10 @@ class SimConsole : public SimObject
     // OS interface
 
     // Get a character from the console.
-    // the return value corresponds to the console GETC return value:
+    bool in(uint8_t &value);
+
+    // get a character from the console in the console specific format
+    // corresponds to GETC:
     // retval<63:61>
     //     000: success: character received
     //     001: success: character received, more pending
@@ -118,8 +121,9 @@ class SimConsole : public SimObject
     //     111: failure: character received with error, more pending
     // retval<31:0>
     //     character read from console
+    //
     // Interrupts are cleared when the buffer is empty.
-    uint64_t in();
+    uint64_t console_in();
 
     // Send a character to the console
     void out(char c, bool raise_int = true);