From d6c204c67d42a3cea9d603888ec52a8d8dacf1a3 Mon Sep 17 00:00:00 2001 From: Andreas Sandberg Date: Thu, 20 Jul 2017 11:20:17 +0100 Subject: dev: Refactor UART->Terminal interface The UART models currently assume that they are always wired to a terminal. While true at the moment, this isn't necessarily a valid assumption. This change introduces the SerialDevice class that defines the interface for serial devices. Currently, Terminal is the only class that implements this interface. Change-Id: I74fefafbbaf5ac1ec0d4ec0b5a0f4b246fdad305 Signed-off-by: Andreas Sandberg Reviewed-by: Curtis Dunham Reviewed-on: https://gem5-review.googlesource.com/4289 Reviewed-by: Gabe Black --- src/dev/virtio/VirtIOConsole.py | 3 ++- src/dev/virtio/console.cc | 12 ++++++------ src/dev/virtio/console.hh | 4 ++-- 3 files changed, 10 insertions(+), 9 deletions(-) (limited to 'src/dev/virtio') diff --git a/src/dev/virtio/VirtIOConsole.py b/src/dev/virtio/VirtIOConsole.py index cd73d6509..bce5e1de2 100644 --- a/src/dev/virtio/VirtIOConsole.py +++ b/src/dev/virtio/VirtIOConsole.py @@ -40,6 +40,7 @@ from m5.params import * from m5.proxy import * from VirtIO import VirtIODeviceBase +from Serial import SerialDevice class VirtIOConsole(VirtIODeviceBase): type = 'VirtIOConsole' @@ -48,4 +49,4 @@ class VirtIOConsole(VirtIODeviceBase): qRecvSize = Param.Unsigned(16, "Receive queue size (descriptors)") qTransSize = Param.Unsigned(16, "Transmit queue size (descriptors)") - terminal = Param.Terminal(Parent.any, "The terminal") + device = Param.SerialDevice("Serial device attached to this device") diff --git a/src/dev/virtio/console.cc b/src/dev/virtio/console.cc index e3428e951..1027925bb 100644 --- a/src/dev/virtio/console.cc +++ b/src/dev/virtio/console.cc @@ -47,7 +47,7 @@ VirtIOConsole::VirtIOConsole(Params *params) : VirtIODeviceBase(params, ID_CONSOLE, sizeof(Config), F_SIZE), qRecv(params->system->physProxy, params->qRecvSize, *this), qTrans(params->system->physProxy, params->qTransSize, *this), - term(*params->terminal), callbackDataAvail(qRecv) + device(*params->device), callbackDataAvail(qRecv) { registerQueue(qRecv); registerQueue(qTrans); @@ -55,7 +55,7 @@ VirtIOConsole::VirtIOConsole(Params *params) config.cols = 80; config.rows = 24; - term.regDataAvailCallback(&callbackDataAvail); + device.regInterfaceCallback(&callbackDataAvail); } @@ -81,11 +81,11 @@ VirtIOConsole::TermRecvQueue::trySend() // get free descriptors (i.e., there are buffers available to // send) from the guest. VirtDescriptor *d; - while (parent.term.dataAvailable() && (d = consumeDescriptor())) { + while (parent.device.dataAvailable() && (d = consumeDescriptor())) { DPRINTF(VIOConsole, "Got descriptor (len: %i)\n", d->size()); size_t len(0); - while (parent.term.dataAvailable() && len < d->size()) { - uint8_t in(parent.term.in()); + while (parent.device.dataAvailable() && len < d->size()) { + uint8_t in(parent.device.readData()); d->chainWrite(len, &in, sizeof(uint8_t)); ++len; } @@ -108,7 +108,7 @@ VirtIOConsole::TermTransQueue::onNotifyDescriptor(VirtDescriptor *desc) uint8_t data[size]; desc->chainRead(0, data, size); for (int i = 0; i < desc->size(); ++i) - parent.term.out(data[i]); + parent.device.writeData(data[i]); // Tell the guest that we are done with this descriptor. produceDescriptor(desc, 0); diff --git a/src/dev/virtio/console.hh b/src/dev/virtio/console.hh index e41ff9a65..720b60044 100644 --- a/src/dev/virtio/console.hh +++ b/src/dev/virtio/console.hh @@ -40,8 +40,8 @@ #ifndef __DEV_VIRTIO_CONSOLE_HH__ #define __DEV_VIRTIO_CONSOLE_HH__ +#include "dev/serial.hh" #include "dev/virtio/base.hh" -#include "dev/terminal.hh" struct VirtIOConsoleParams; @@ -147,7 +147,7 @@ class VirtIOConsole : public VirtIODeviceBase TermTransQueue qTrans; protected: - Terminal &term; + SerialDevice &device; MakeCallback callbackDataAvail; }; -- cgit v1.2.3