diff options
author | Mark Alexander <marka@cygnus> | 1998-01-27 02:04:21 +0000 |
---|---|---|
committer | Mark Alexander <marka@cygnus> | 1998-01-27 02:04:21 +0000 |
commit | d8365eee42670de07dfd117e0f0566f5ec3a5a02 (patch) | |
tree | 87be1e51b806cfb8b1e29b816e6e0c6c7b7d607d /gdb/dve3900-rom.c | |
parent | f73062614b14adb4ed4b9491dfc2f6aa4e6dbe1e (diff) | |
download | gdb-d8365eee42670de07dfd117e0f0566f5ec3a5a02.zip gdb-d8365eee42670de07dfd117e0f0566f5ec3a5a02.tar.gz gdb-d8365eee42670de07dfd117e0f0566f5ec3a5a02.tar.bz2 |
* dve3900-rom.c: Improve performance by using memory commands
that print less fluff. Minor cosmetic changes.
Eliminate compiler warnings.
Diffstat (limited to 'gdb/dve3900-rom.c')
-rw-r--r-- | gdb/dve3900-rom.c | 61 |
1 files changed, 46 insertions, 15 deletions
diff --git a/gdb/dve3900-rom.c b/gdb/dve3900-rom.c index c8752f6..9a89970 100644 --- a/gdb/dve3900-rom.c +++ b/gdb/dve3900-rom.c @@ -28,6 +28,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "gdb_string.h" #include <time.h> +/* Type of function passed to bfd_map_over_sections. */ + +typedef void (*section_map_func) PARAMS ((bfd *abfd, asection *sect, PTR obj)); + /* Packet escape character used by Densan monitor. */ #define PESC 0xdc @@ -187,6 +191,7 @@ static struct bit_field status_fields [] = }; +#if 0 /* FIXME: Enable when we add support for modifying cache register. */ static struct bit_field cache_fields [] = { /* Status register portion (dummy for parsing only) */ @@ -214,6 +219,8 @@ static struct bit_field cache_fields [] = { NULL, NULL, NULL, 0, 0 } /* end of table marker */ }; +#endif + static struct bit_field cause_fields[] = { @@ -272,6 +279,7 @@ r3900_supply_register (regname, regnamelen, val, vallen) monitor_supply_register (regno, valbuf); } + /* Fetch the BadVaddr register. Unlike the other registers, this one can't be modified, and the monitor won't even prompt to let you modify it. */ @@ -315,6 +323,7 @@ fetch_fields (bf) return val; } + static void fetch_bitmapped_register (regno, bf) int regno; @@ -335,10 +344,11 @@ fetch_bitmapped_register (regno, bf) } + /* Fetch all registers (if regno is -1), or one register from the monitor. For most registers, we can use the generic monitor_ monitor_fetch_registers function. But others are displayed in - very unusual fashion and must be handled specially. */ + a very unusual fashion by the monitor, and must be handled specially. */ static void r3900_fetch_registers (regno) @@ -394,6 +404,7 @@ store_bitmapped_register (regno, bf) monitor_expect_prompt (NULL, 0); } + static void r3900_store_registers (regno) int regno; @@ -442,7 +453,7 @@ write_long_le (buf, n) /* Read a character from the monitor. If remote debugging is on, print the received character. If HEX is non-zero, print the - character in hexadecimal; otherwise, print it in ascii. */ + character in hexadecimal; otherwise, print it in ASCII. */ static int debug_readchar (hex) @@ -501,6 +512,9 @@ debug_write (buf, buflen) length (low byte) length (high byte) data (length bytes) + + The last two bytes of the data field are a checksum, but we don't + bother to verify it. */ static void @@ -535,7 +549,12 @@ ignore_packet () } -/* Send a packet to the monitor. */ +/* Encapsulate some data into a packet and send it to the monitor. + + The 'p' packet is a special case. This is a packet we send + in response to a read ('r') packet from the monitor. This function + appends a one-byte sequence number to the data field of such a packet. +*/ static void send_packet (type, buf, buflen, seq) @@ -603,7 +622,15 @@ send_packet (type, buf, buflen, seq) /* Respond to an expected read request from the monitor by sending - data in chunks. Handle all acknowledgements and handshaking packets. */ + data in chunks. Handle all acknowledgements and handshaking packets. + + The monitor expects a response consisting of a one or more 'p' packets, + each followed by a portion of the data requested. The 'p' packet + contains only a four-byte integer, the value of which is the number + of bytes of data we are about to send. Following the 'p' packet, + the monitor expects the data bytes themselves in raw, unpacketized, + form, without even a checksum. + */ static void process_read_request (buf, buflen) @@ -614,13 +641,13 @@ process_read_request (buf, buflen) int i, chunk; unsigned char seq; - /* Discard the read request. We have to hope it's for - the exact number of bytes we want to send. */ + /* Discard the read request. FIXME: we have to hope it's for + the exact number of bytes we want to send; should check for this. */ ignore_packet (); for (i = chunk = 0, seq = 0; i < buflen; i += chunk, seq++) { - /* Don't send more than 256 bytes at a time. */ + /* Don't send more than MAXPSIZE bytes at a time. */ chunk = buflen - i; if (chunk > MAXPSIZE) chunk = MAXPSIZE; @@ -769,7 +796,8 @@ r3900_load (filename, from_tty) send_packet ('a', "", 0, 0); /* Output the fast load header (number of sections and starting address). */ - bfd_map_over_sections ((bfd *) abfd, count_section, §ion_count); + bfd_map_over_sections ((bfd *) abfd, (section_map_func) count_section, + §ion_count); write_long (&buffer[0], (long)section_count); if (exec_bfd) write_long (&buffer[4], (long)bfd_get_start_address (exec_bfd)); @@ -779,7 +807,7 @@ r3900_load (filename, from_tty) /* Output the section data. */ start_time = time (NULL); - bfd_map_over_sections (abfd, load_section, &data_count); + bfd_map_over_sections (abfd, (section_map_func) load_section, &data_count); end_time = time (NULL); /* Acknowledge the close packet and put the monitor back into @@ -790,7 +818,7 @@ r3900_load (filename, from_tty) monitor_printf ("vconsx\r"); monitor_expect_prompt (NULL, 0); - /* Print download performance information. */ + /* Print start address and download performance information. */ printf_filtered ("Start address 0x%lx\n", (long)bfd_get_start_address (abfd)); report_transfer_performance (data_count, start_time, end_time); @@ -806,16 +834,13 @@ r3900_load (filename, from_tty) Another way to do this might be to call normal_stop, except that the stack may not be valid, and things would get horribly confused... */ - clear_symtab_users (); } -static struct target_ops r3900_ops; - /* Commands to send to the monitor when first connecting: * The bare carriage return forces a prompt from the monitor - (monitor doesn't prompt after a reset). + (monitor doesn't prompt immediately after a reset). * The "vconsx" switches the monitor back to interactive mode in case an aborted download had left it in packet mode. * The "Xtr" command causes subsequent "t" (trace) commands to display @@ -828,6 +853,7 @@ static struct target_ops r3900_ops; static char *r3900_inits[] = {"\r", "vconsx\r", "Xtr\r", "Xxr\r", "bx\r", NULL}; static char *dummy_inits[] = { NULL }; +static struct target_ops r3900_ops; static struct monitor_ops r3900_cmds; static void @@ -869,6 +895,7 @@ _initialize_r3900_rom () r3900_cmds.flags = MO_NO_ECHO_ON_OPEN | MO_ADDR_BITS_REMOVE | MO_CLR_BREAK_USES_ADDR | + MO_GETMEM_READ_SINGLE | MO_PRINT_PROGRAM_OUTPUT; r3900_cmds.init = dummy_inits; @@ -882,8 +909,12 @@ _initialize_r3900_rom () r3900_cmds.setmem.cmdw = "sh %Lx %x\r"; /* COREADDR, val */ r3900_cmds.setmem.cmdl = "sw %Lx %x\r"; /* COREADDR, val */ - r3900_cmds.getmem.cmdb = "dx %Lx s %x\r"; /* COREADDR, len */ + r3900_cmds.getmem.cmdb = "sx %Lx\r"; /* COREADDR */ + r3900_cmds.getmem.cmdw = "sh %Lx\r"; /* COREADDR */ + r3900_cmds.getmem.cmdl = "sw %Lx\r"; /* COREADDR */ r3900_cmds.getmem.resp_delim = " : "; + r3900_cmds.getmem.term = " "; + r3900_cmds.getmem.term_cmd = ".\r"; r3900_cmds.setreg.cmd = "x%s %x\r"; /* regname, val */ |