From patchwork Fri Apr 3 20:35:49 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Gaisler X-Patchwork-Id: 6000 X-Patchwork-Delegate: vapier@gentoo.org Received: (qmail 24482 invoked by alias); 3 Apr 2015 20:36:09 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 24456 invoked by uid 89); 3 Apr 2015 20:36:08 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.0 required=5.0 tests=AWL, BAYES_00, KAM_LAZY_DOMAIN_SECURITY, RCVD_IN_DNSWL_NONE autolearn=no version=3.3.2 X-HELO: bin-vsp-out-01.atm.binero.net Received: from vsp-authed01.binero.net (HELO bin-vsp-out-01.atm.binero.net) (195.74.38.224) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Fri, 03 Apr 2015 20:36:07 +0000 X-Halon-ID: 101e1498-da41-11e4-8277-005056917a89 Authorized-sender: jiri@gaisler.se Received: from localhost.localdomain (unknown [78.68.139.28]) by bin-vsp-out-01.atm.binero.net (Halon Mail Gateway) with ESMTPSA; Fri, 3 Apr 2015 22:36:10 +0200 (CEST) From: Jiri Gaisler To: gdb-patches@sourceware.org Cc: Jiri Gaisler Subject: [PATCH v5 2/9] sim/erc32: Use gdb callback for UART I/O when linked with gdb. Date: Fri, 3 Apr 2015 22:35:49 +0200 Message-Id: <1428093356-7296-3-git-send-email-jiri@gaisler.se> In-Reply-To: <1428093356-7296-1-git-send-email-jiri@gaisler.se> References: <1428093356-7296-1-git-send-email-jiri@gaisler.se> X-IsSubscribed: yes * erc32 (init_sim, port_init, read_uart, write_uart, flush_uart, uarta_tx, uartb_tx, uart_rx): Use gdb callbacks for console I/O. * func.c: declare host callback structure * interf.c (run_sim): add -nouartrx switch to disable UART input. * sis.c (run_sim): Add -nouartrx switch. * sis.h: declare host callback structure --- sim/erc32/erc32.c | 163 ++++++++++++++++++++++++++++++++++++----------------- sim/erc32/func.c | 3 + sim/erc32/interf.c | 5 +- sim/erc32/sis.c | 2 + sim/erc32/sis.h | 4 ++ 5 files changed, 122 insertions(+), 55 deletions(-) diff --git a/sim/erc32/erc32.c b/sim/erc32/erc32.c index 80601ef..04c40ee 100644 --- a/sim/erc32/erc32.c +++ b/sim/erc32/erc32.c @@ -22,6 +22,7 @@ /* The control space devices */ #include "config.h" +#include #include #include #include @@ -38,7 +39,7 @@ extern int32 sparclite, sparclite_board; extern int rom8,wrp,uben; extern char uart_dev1[], uart_dev2[]; -int dumbio = 0; /* normal, smart, terminal oriented IO by default */ +static int tty_setup = 1; /* default setup if not a tty */ /* MEC registers */ #define MEC_START 0x01f80000 @@ -296,12 +297,15 @@ static void store_bytes (unsigned char *mem, uint32 waddr, extern int ext_irl; +static host_callback *callback; + /* One-time init */ void init_sim() { + callback = sim_callback; port_init(); } @@ -938,44 +942,49 @@ void init_stdio() { if (dumbio) - return; /* do nothing */ - if (!ifd1) + return; /* do nothing */ + if (ifd1 == 0 && f1open) { tcsetattr(0, TCSANOW, &ioc1); - if (!ifd2) + tcflush (ifd1, TCIFLUSH); + } + if (ifd2 == 0 && f1open) { tcsetattr(0, TCSANOW, &ioc2); + tcflush (ifd2, TCIFLUSH); + } } void restore_stdio() { if (dumbio) - return; /* do nothing */ - if (!ifd1) + return; /* do nothing */ + if (ifd1 == 0 && f1open && tty_setup) tcsetattr(0, TCSANOW, &iocold1); - if (!ifd2) + if (ifd2 == 0 && f2open && tty_setup) tcsetattr(0, TCSANOW, &iocold2); } #define DO_STDIO_READ( _fd_, _buf_, _len_ ) \ - ( dumbio \ - ? (0) /* no bytes read, no delay */ \ - : read( _fd_, _buf_, _len_ ) ) - + ( dumbio || nouartrx \ + ? (0) /* no bytes read, no delay */ \ + : (_fd_) == 1 && callback ? \ + callback->read_stdin (callback, _buf_, _len_) : \ + read( _fd_, _buf_, _len_ ) ) static void port_init() { if (uben) { - f2in = stdin; - f1in = NULL; - f2out = stdout; - f1out = NULL; + f2in = stdin; + f1in = NULL; + f2out = stdout; + f1out = NULL; } else { - f1in = stdin; - f2in = NULL; - f1out = stdout; - f2out = NULL; + f1in = stdin; + f2in = NULL; + f1out = stdout; + f2out = NULL; } if (uart_dev1[0] != 0) if ((fd1 = open(uart_dev1, O_RDWR | O_NONBLOCK)) < 0) { @@ -987,23 +996,29 @@ port_init() setbuf(f1out, NULL); f1open = 1; } - if (f1in) ifd1 = fileno(f1in); + if (f1in) + ifd1 = fileno(f1in); if (ifd1 == 0) { + if (callback && !callback->isatty (callback, ifd1)) + tty_setup = 0; if (sis_verbose) printf("serial port A on stdin/stdout\n"); if (!dumbio) { - tcgetattr(ifd1, &ioc1); - iocold1 = ioc1; - ioc1.c_lflag &= ~(ICANON | ECHO); - ioc1.c_cc[VMIN] = 0; - ioc1.c_cc[VTIME] = 0; + tcgetattr (ifd1, &ioc1); + if (tty_setup) { + iocold1 = ioc1; + ioc1.c_lflag &= ~(ICANON | ECHO); + ioc1.c_cc[VMIN] = 0; + ioc1.c_cc[VTIME] = 0; + } } f1open = 1; } if (f1out) { ofd1 = fileno(f1out); - if (!dumbio && ofd1 == 1) setbuf(f1out, NULL); + if (!dumbio && tty_setup && ofd1 == 1) + setbuf (f1out, NULL); } if (uart_dev2[0] != 0) @@ -1022,17 +1037,20 @@ port_init() printf("serial port B on stdin/stdout\n"); if (!dumbio) { tcgetattr(ifd2, &ioc2); - iocold2 = ioc2; - ioc2.c_lflag &= ~(ICANON | ECHO); - ioc2.c_cc[VMIN] = 0; - ioc2.c_cc[VTIME] = 0; + if (tty_setup) { + iocold2 = ioc2; + ioc2.c_lflag &= ~(ICANON | ECHO); + ioc2.c_cc[VMIN] = 0; + ioc2.c_cc[VTIME] = 0; + } } f2open = 1; } if (f2out) { ofd2 = fileno(f2out); - if (!dumbio && ofd2 == 1) setbuf(f2out, NULL); + if (!dumbio && tty_setup && ofd2 == 1) + setbuf (f2out, NULL); } wnuma = wnumb = 0; @@ -1058,9 +1076,10 @@ read_uart(addr) mec_irq(4); return (0x700 | (uint32) aq[aind++]); } else { - if (f1open) { - anum = DO_STDIO_READ(ifd1, aq, UARTBUF); - } + if (f1open) + anum = DO_STDIO_READ(ifd1, aq, UARTBUF); + else + anum = 0; if (anum > 0) { aind = 0; if ((aind + 1) < anum) @@ -1090,9 +1109,10 @@ read_uart(addr) mec_irq(5); return (0x700 | (uint32) bq[bind++]); } else { - if (f2open) { + if (f2open) bnum = DO_STDIO_READ(ifd2, bq, UARTBUF); - } + else + bnum = 0; if (bnum > 0) { bind = 0; if ((bind + 1) < bnum) @@ -1122,9 +1142,10 @@ read_uart(addr) if (aind < anum) { Ucontrol |= 0x00000001; } else { - if (f1open) { - anum = DO_STDIO_READ(ifd1, aq, UARTBUF); - } + if (f1open) + anum = DO_STDIO_READ(ifd1, aq, UARTBUF); + else + anum = 0; if (anum > 0) { Ucontrol |= 0x00000001; aind = 0; @@ -1134,9 +1155,10 @@ read_uart(addr) if (bind < bnum) { Ucontrol |= 0x00010000; } else { - if (f2open) { + if (f2open) bnum = DO_STDIO_READ(ifd2, bq, UARTBUF); - } + else + bnum = 0; if (bnum > 0) { Ucontrol |= 0x00010000; bind = 0; @@ -1177,9 +1199,13 @@ write_uart(addr, data) if (wnuma < UARTBUF) wbufa[wnuma++] = c; else { - while (wnuma) - wnuma -= fwrite(wbufa, 1, wnuma, f1out); - wbufa[wnuma++] = c; + while (wnuma) { + if (ofd1 == 1 && callback) + wnuma -= callback->write_stdout (callback, wbufa, wnuma); + else + wnuma -= fwrite (wbufa, 1, wnuma, f1out); + } + wbufa[wnuma++] = c; } } mec_irq(4); @@ -1201,8 +1227,12 @@ write_uart(addr, data) if (wnumb < UARTBUF) wbufb[wnumb++] = c; else { - while (wnumb) - wnumb -= fwrite(wbufb, 1, wnumb, f2out); + while (wnumb) { + if (ofd1 == 1 && callback) + wnumb -= callback->write_stdout (callback, wbufb, wnumb); + else + wnumb -= fwrite (wbufb, 1, wnumb, f2out); + } wbufb[wnumb++] = c; } } @@ -1240,10 +1270,20 @@ write_uart(addr, data) static void flush_uart() { - while (wnuma && f1open) - wnuma -= fwrite(wbufa, 1, wnuma, f1out); - while (wnumb && f2open) - wnumb -= fwrite(wbufb, 1, wnumb, f2out); + while (wnuma && f1open) { + if (ofd1 == 1 && callback) { + wnuma -= callback->write_stdout (callback, wbufa, wnuma); + callback->flush_stdout (callback); + } else + wnuma -= fwrite (wbufa, 1, wnuma, f1out); + } + while (wnumb && f2open) { + if (ofd2 == 1 && callback) { + wnuma -= callback->write_stdout (callback, wbufb, wnuma); + callback->flush_stdout (callback); + } else + wnumb -= fwrite (wbufb, 1, wnumb, f2out); + } } @@ -1251,8 +1291,14 @@ flush_uart() static void uarta_tx() { - - while (f1open && fwrite(&uarta_sreg, 1, 1, f1out) != 1); + while (f1open) { + if (ofd1 == 1 && callback) + while (callback->write_stdout (callback, &uarta_sreg, 1) != 1) + continue; + else + while (fwrite (&uarta_sreg, 1, 1, f1out) != 1) + continue; + } if (uart_stat_reg & UARTA_HRE) { uart_stat_reg |= UARTA_SRE; } else { @@ -1266,7 +1312,14 @@ uarta_tx() static void uartb_tx() { - while (f2open && fwrite(&uartb_sreg, 1, 1, f2out) != 1); + while (f2open) { + if (ofd2 == 1 && callback) + while (callback->write_stdout (callback, &uarta_sreg, 1) != 1) + continue; + else + while (fwrite(&uartb_sreg, 1, 1, f2out) != 1) + continue; + } if (uart_stat_reg & UARTB_HRE) { uart_stat_reg |= UARTB_SRE; } else { @@ -1288,6 +1341,8 @@ uart_rx(arg) rsize = 0; if (f1open) rsize = DO_STDIO_READ(ifd1, &rxd, 1); + else + rsize = 0; if (rsize > 0) { uarta_data = UART_DR | rxd; if (uart_stat_reg & UARTA_HRE) @@ -1304,6 +1359,8 @@ uart_rx(arg) rsize = 0; if (f2open) rsize = DO_STDIO_READ(ifd2, &rxd, 1); + else + rsize = 0; if (rsize) { uartb_data = UART_DR | rxd; if (uart_stat_reg & UARTB_HRE) diff --git a/sim/erc32/func.c b/sim/erc32/func.c index 7bea3aa..fae4228 100644 --- a/sim/erc32/func.c +++ b/sim/erc32/func.c @@ -32,6 +32,7 @@ #define VAL(x) strtoul(x,(char **)NULL,0) +int dumbio = 0; /* normal, smart, terminal oriented IO by default */ struct disassemble_info dinfo; struct pstate sregs; extern struct estate ebase; @@ -50,6 +51,8 @@ char uart_dev1[128] = ""; char uart_dev2[128] = ""; extern int ext_irl; uint32 last_load_addr = 0; +int nouartrx = 0; +host_callback *sim_callback; #ifdef ERRINJ uint32 errcnt = 0; diff --git a/sim/erc32/interf.c b/sim/erc32/interf.c index 3e58e4c..3abfe3e 100644 --- a/sim/erc32/interf.c +++ b/sim/erc32/interf.c @@ -60,8 +60,6 @@ extern char uart_dev1[], uart_dev2[]; int sis_gdb_break = 1; -host_callback *sim_callback; - int run_sim(sregs, icount, dis) struct pstate *sregs; @@ -196,6 +194,9 @@ sim_open (kind, callback, abfd, argv) if (strcmp(argv[stat], "-dumbio") == 0) { dumbio = 1; } else + if (strcmp(argv[stat], "-nouartrx") == 0) { + nouartrx = 1; + } else if (strcmp(argv[stat], "-wrp") == 0) { wrp = 1; } else diff --git a/sim/erc32/sis.c b/sim/erc32/sis.c index 92880e1..51ba901 100644 --- a/sim/erc32/sis.c +++ b/sim/erc32/sis.c @@ -202,6 +202,8 @@ main(argc, argv) #endif } else if (strcmp(argv[stat], "-dumbio") == 0) { dumbio = 1; + } else if (strcmp(argv[stat], "-nouartrx") == 0) { + nouartrx = 1; } else if (strcmp(argv[stat], "-v") == 0) { sis_verbose += 1; } else { diff --git a/sim/erc32/sis.h b/sim/erc32/sis.h index 99ae347..11a17f1 100644 --- a/sim/erc32/sis.h +++ b/sim/erc32/sis.h @@ -206,6 +206,10 @@ extern void sys_reset (void); extern void sys_halt (void); extern int bfd_load (const char *fname); extern double get_time (void); +extern int nouartrx; +extern host_callback *sim_callback; +extern int dumbio; + /* exec.c */ extern int dispatch_instruction (struct pstate *sregs);