summaryrefslogtreecommitdiff
path: root/src/dev/serial/uart8250.cc
diff options
context:
space:
mode:
authorGabe Black <gabeblack@google.com>2018-10-12 05:06:26 -0700
committerGabe Black <gabeblack@google.com>2018-10-17 20:17:44 +0000
commit2bcb2b031d4419e87337b25936a09228955dc715 (patch)
tree1da2953b4764a66bca23dfcf1656f4af205206d5 /src/dev/serial/uart8250.cc
parent2701fcb2ffe76e2cb087807e87a9114d0009b7db (diff)
downloadgem5-2bcb2b031d4419e87337b25936a09228955dc715.tar.xz
dev: Explicitly specify the endianness for packet accessors.
Generally speaking, the endianness of the data devices provide or accept is dependent on the device and not the ISA the system executes. This change makes the devices in dev pick an endianness rather than using the guest's. For the ISA bus and the UART, accesses are byte sized and so endianness doesn't matter. The ISA and PCI busses and the devices which use them are defined to be little endian. Change-Id: Ib0aa70f192e1d6f3b886d9f3ad41ae03bddb583f Reviewed-on: https://gem5-review.googlesource.com/c/13462 Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com> Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
Diffstat (limited to 'src/dev/serial/uart8250.cc')
-rw-r--r--src/dev/serial/uart8250.cc45
1 files changed, 25 insertions, 20 deletions
diff --git a/src/dev/serial/uart8250.cc b/src/dev/serial/uart8250.cc
index 43300f5e8..6b0d01980 100644
--- a/src/dev/serial/uart8250.cc
+++ b/src/dev/serial/uart8250.cc
@@ -108,9 +108,9 @@ Uart8250::read(PacketPtr pkt)
case 0x0:
if (!(LCR & 0x80)) { // read byte
if (device->dataAvailable())
- pkt->set(device->readData());
+ pkt->setRaw(device->readData());
else {
- pkt->set((uint8_t)0);
+ pkt->setRaw((uint8_t)0);
// A limited amount of these are ok.
DPRINTF(Uart, "empty read of RX register\n");
}
@@ -125,7 +125,7 @@ Uart8250::read(PacketPtr pkt)
break;
case 0x1:
if (!(LCR & 0x80)) { // Intr Enable Register(IER)
- pkt->set(IER);
+ pkt->setRaw(IER);
} else { // DLM divisor latch MSB
;
}
@@ -134,20 +134,20 @@ Uart8250::read(PacketPtr pkt)
DPRINTF(Uart, "IIR Read, status = %#x\n", (uint32_t)status);
if (status & RX_INT) /* Rx data interrupt has a higher priority */
- pkt->set(IIR_RXID);
+ pkt->setRaw(IIR_RXID);
else if (status & TX_INT) {
- pkt->set(IIR_TXID);
+ pkt->setRaw(IIR_TXID);
//Tx interrupts are cleared on IIR reads
status &= ~TX_INT;
} else
- pkt->set(IIR_NOPEND);
+ pkt->setRaw(IIR_NOPEND);
break;
case 0x3: // Line Control Register (LCR)
- pkt->set(LCR);
+ pkt->setRaw(LCR);
break;
case 0x4: // Modem Control Register (MCR)
- pkt->set(MCR);
+ pkt->setRaw(MCR);
break;
case 0x5: // Line Status Register (LSR)
uint8_t lsr;
@@ -156,13 +156,13 @@ Uart8250::read(PacketPtr pkt)
if (device->dataAvailable())
lsr = UART_LSR_DR;
lsr |= UART_LSR_TEMT | UART_LSR_THRE;
- pkt->set(lsr);
+ pkt->setRaw(lsr);
break;
case 0x6: // Modem Status Register (MSR)
- pkt->set((uint8_t)0);
+ pkt->setRaw((uint8_t)0);
break;
case 0x7: // Scratch Register (SCR)
- pkt->set((uint8_t)0); // doesn't exist with at 8250.
+ pkt->setRaw((uint8_t)0); // doesn't exist with at 8250.
break;
default:
panic("Tried to access a UART port that doesn't exist\n");
@@ -184,12 +184,13 @@ Uart8250::write(PacketPtr pkt)
Addr daddr = pkt->getAddr() - pioAddr;
- DPRINTF(Uart, " write register %#x value %#x\n", daddr, pkt->get<uint8_t>());
+ DPRINTF(Uart, " write register %#x value %#x\n", daddr,
+ pkt->getRaw<uint8_t>());
switch (daddr) {
case 0x0:
if (!(LCR & 0x80)) { // write byte
- device->writeData(pkt->get<uint8_t>());
+ device->writeData(pkt->getRaw<uint8_t>());
platform->clearConsoleInt();
status &= ~TX_INT;
if (UART_IER_THRI & IER)
@@ -200,10 +201,11 @@ Uart8250::write(PacketPtr pkt)
break;
case 0x1:
if (!(LCR & 0x80)) { // Intr Enable Register(IER)
- IER = pkt->get<uint8_t>();
+ IER = pkt->getRaw<uint8_t>();
if (UART_IER_THRI & IER)
{
- DPRINTF(Uart, "IER: IER_THRI set, scheduling TX intrrupt\n");
+ DPRINTF(Uart,
+ "IER: IER_THRI set, scheduling TX intrrupt\n");
if (curTick() - lastTxInt > 225 * SimClock::Int::ns) {
DPRINTF(Uart, "-- Interrupting Immediately... %d,%d\n",
curTick(), lastTxInt);
@@ -216,7 +218,8 @@ Uart8250::write(PacketPtr pkt)
}
else
{
- DPRINTF(Uart, "IER: IER_THRI cleared, descheduling TX intrrupt\n");
+ DPRINTF(Uart, "IER: IER_THRI cleared, "
+ "descheduling TX intrrupt\n");
if (txIntrEvent.scheduled())
deschedule(txIntrEvent);
if (status & TX_INT)
@@ -225,10 +228,12 @@ Uart8250::write(PacketPtr pkt)
}
if ((UART_IER_RDI & IER) && device->dataAvailable()) {
- DPRINTF(Uart, "IER: IER_RDI set, scheduling RX intrrupt\n");
+ DPRINTF(Uart,
+ "IER: IER_RDI set, scheduling RX intrrupt\n");
scheduleIntr(&rxIntrEvent);
} else {
- DPRINTF(Uart, "IER: IER_RDI cleared, descheduling RX intrrupt\n");
+ DPRINTF(Uart, "IER: IER_RDI cleared, "
+ "descheduling RX intrrupt\n");
if (rxIntrEvent.scheduled())
deschedule(rxIntrEvent);
if (status & RX_INT)
@@ -242,10 +247,10 @@ Uart8250::write(PacketPtr pkt)
case 0x2: // FIFO Control Register (FCR)
break;
case 0x3: // Line Control Register (LCR)
- LCR = pkt->get<uint8_t>();
+ LCR = pkt->getRaw<uint8_t>();
break;
case 0x4: // Modem Control Register (MCR)
- if (pkt->get<uint8_t>() == (UART_MCR_LOOP | 0x0A))
+ if (pkt->getRaw<uint8_t>() == (UART_MCR_LOOP | 0x0A))
MCR = 0x9A;
break;
case 0x7: // Scratch Register (SCR)