summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Hallnor <ehallnor@umich.edu>2004-01-29 20:15:54 -0500
committerErik Hallnor <ehallnor@umich.edu>2004-01-29 20:15:54 -0500
commitca11c9d3e77335b197779b5818e04bbade2a6503 (patch)
treed48522853b774be3c4a39e93ee63eb60448ddda7
parenta0932d4e99f78bb7b5f8d7345f8bbaad5d004f87 (diff)
parentcb35f819c5326b37899695345ad78e032e8d7cdf (diff)
downloadgem5-ca11c9d3e77335b197779b5818e04bbade2a6503.tar.xz
Merge ehallnor@zizzer:/bk/m5 into zazzer.eecs.umich.edu:/z/ehallnor/m5
--HG-- extra : convert_revision : a74364b249fc6164ef2752ff1e3d6e414b5ab79d
-rw-r--r--base/cprintf.cc26
-rw-r--r--base/cprintf.hh1
-rw-r--r--dev/alpha_console.cc2
-rw-r--r--dev/console.cc47
-rw-r--r--dev/console.hh8
5 files changed, 56 insertions, 28 deletions
diff --git a/base/cprintf.cc b/base/cprintf.cc
index 5796a712b..5cbf0c057 100644
--- a/base/cprintf.cc
+++ b/base/cprintf.cc
@@ -37,9 +37,20 @@ using namespace std;
namespace cp {
+ArgList::~ArgList()
+{
+ while (!objects.empty()) {
+ delete objects.front();
+ objects.pop_front();
+ }
+}
+
void
ArgList::dump(const string &format)
{
+ list_t::iterator iter = objects.begin();
+ list_t::iterator end = objects.end();
+
const char *p = format.c_str();
stream->fill(' ');
@@ -198,22 +209,19 @@ ArgList::dump(const string &format)
}
}
- if (!objects.empty())
+ if (iter != end)
{
- Base *data = objects.front();
- objects.pop_front();
-
ios::fmtflags saved_flags = stream->flags();
char old_fill = stream->fill();
int old_precision = stream->precision();
- data->process(*stream, fmt);
+ (*iter)->process(*stream, fmt);
stream->flags(saved_flags);
stream->fill(old_fill);
stream->precision(old_precision);
- delete data;
+ ++iter;
} else {
*stream << "<missing arg for format>";
}
@@ -241,11 +249,9 @@ ArgList::dump(const string &format)
}
}
- while (!objects.empty()) {
+ while (iter != end) {
*stream << "<extra arg>";
- Base *data = objects.front();
- objects.pop_front();
- delete data;
+ ++iter;
}
}
diff --git a/base/cprintf.hh b/base/cprintf.hh
index ac34cd252..ca5c08b16 100644
--- a/base/cprintf.hh
+++ b/base/cprintf.hh
@@ -89,6 +89,7 @@ class ArgList
public:
ArgList() : stream(&std::cout) {}
+ ~ArgList();
template<class T>
void append(const T &data) {
diff --git a/dev/alpha_console.cc b/dev/alpha_console.cc
index ccf6c33fd..8e59db932 100644
--- a/dev/alpha_console.cc
+++ b/dev/alpha_console.cc
@@ -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:
diff --git a/dev/console.cc b/dev/console.cc
index 3fa51a414..5e7b0abf6 100644
--- a/dev/console.cc
+++ b/dev/console.cc
@@ -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
diff --git a/dev/console.hh b/dev/console.hh
index 9913fe379..d2bba4612 100644
--- a/dev/console.hh
+++ b/dev/console.hh
@@ -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);