diff options
author | Chris Johns <chrisj@rtems.org> | 2014-05-08 22:39:07 +1000 |
---|---|---|
committer | Chris Johns <chrisj@rtems.org> | 2014-05-08 22:39:07 +1000 |
commit | 47d652c9ff119a266ef55f16df643a988d47bb6d (patch) | |
tree | 8cc7c437105364ac6d47fed8cbfbe4542718bfab | |
parent | a35f8909b9629d2f48333f62839b4940e33e0ba1 (diff) |
gdb: Fix lm32 simulator's UART code. Builds on MinGW.
-rw-r--r-- | tools/4.11/gdb/lm32/gdb-sim-lm32uart.diff | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/tools/4.11/gdb/lm32/gdb-sim-lm32uart.diff b/tools/4.11/gdb/lm32/gdb-sim-lm32uart.diff new file mode 100644 index 0000000..bfc542f --- /dev/null +++ b/tools/4.11/gdb/lm32/gdb-sim-lm32uart.diff @@ -0,0 +1,88 @@ +--- gdb-7.7.orig/sim/lm32/dv-lm32uart.c 2014-05-08 12:07:13.000000000 +0000 ++++ gdb-7.7/sim/lm32/dv-lm32uart.c 2014-05-08 12:07:46.000000000 +0000 +@@ -1,6 +1,6 @@ + /* Lattice Mico32 UART model. + Contributed by Jon Beniston <jon@beniston.com> +- ++ + Copyright (C) 2009-2014 Free Software Foundation, Inc. + + This file is part of GDB. +@@ -22,9 +22,6 @@ + #include "hw-main.h" + #include "sim-assert.h" + +-#include <stdio.h> +-#include <sys/time.h> +- + struct lm32uart + { + unsigned base; /* Base address of this UART. */ +@@ -38,6 +35,8 @@ + unsigned char lsr; + unsigned char msr; + unsigned char div; ++ int saved_count; ++ char saved_byte; + struct hw_event *event; + }; + +@@ -83,6 +82,7 @@ + static void + do_uart_tx_event (struct hw *me, void *data) + { ++ SIM_DESC sd = hw_system (me); + struct lm32uart *uart = hw_data (me); + char c; + +@@ -115,7 +115,8 @@ + c &= 0x7f; + break; + } +- printf ("%c", c); ++ sim_io_write_stdout (sd, &c, 1); ++ sim_io_flush_stdout (sd); + } + + static unsigned +@@ -200,12 +201,11 @@ + void *dest, + int space, unsigned_word base, unsigned nr_bytes) + { ++ SIM_DESC sd = hw_system (me); + struct lm32uart *uart = hw_data (me); + int uart_reg; + int value; + unsigned char *dest_bytes = dest; +- fd_set fd; +- struct timeval tv; + + HW_TRACE ((me, "read 0x%08lx length %d", (long) base, (int) nr_bytes)); + +@@ -214,7 +214,8 @@ + switch (uart_reg) + { + case LM32_UART_RBR: +- value = getchar (); ++ value = uart->saved_byte; ++ --uart->saved_count;; + uart->lsr &= ~LM32_UART_LSR_RX_RDY; + break; + case LM32_UART_IER: +@@ -231,12 +232,10 @@ + break; + case LM32_UART_LSR: + /* Check to see if any data waiting in stdin. */ +- FD_ZERO (&fd); +- FD_SET (fileno (stdin), &fd); +- tv.tv_sec = 0; +- tv.tv_usec = 1; +- if (select (fileno (stdin) + 1, &fd, NULL, NULL, &tv)) +- uart->lsr |= LM32_UART_LSR_RX_RDY; ++ if (uart->saved_count <= 0) ++ uart->saved_count = sim_io_poll_read (sd, 0/*STDIN*/, ++ &uart->saved_byte, 1); ++ uart->lsr |= uart->saved_count ? LM32_UART_LSR_RX_RDY : 0; + value = uart->lsr; + break; + case LM32_UART_MSR: |