1 /* Remote debugging interface for Hitachi HMS Monitor Version 1.0
2 Copyright 1992, 1993, 1994 Free Software Foundation, Inc.
3 Contributed by Cygnus Support. Written by Steve Chamberlain
6 This file is part of GDB.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
37 /* External data declarations */
38 extern int stop_soon_quietly; /* for wait_for_inferior */
40 /* Forward data declarations */
41 extern struct target_ops hms_ops; /* Forward declaration */
43 /* Forward function declarations */
44 static void hms_fetch_registers ();
45 static int hms_store_registers ();
46 static void hms_close ();
47 static int hms_clear_breakpoints ();
49 extern struct target_ops hms_ops;
50 static void hms_drain ();
51 static void add_commands ();
52 static void remove_commands ();
54 static int quiet = 1; /* FIXME - can be removed after Dec '94 */
59 /***********************************************************************/
60 /* Caching stuff stolen from remote-nindy.c */
62 /* The data cache records all the data read from the remote machine
63 since the last time it stopped.
65 Each cache block holds LINE_SIZE bytes of data
66 starting at a multiple-of-LINE_SIZE address. */
68 #define LINE_SIZE_POWER 4
69 #define LINE_SIZE (1<<LINE_SIZE_POWER) /* eg 1<<3 == 8 */
70 #define LINE_SIZE_MASK ((LINE_SIZE-1)) /* eg 7*2+1= 111*/
71 #define DCACHE_SIZE 64 /* Number of cache blocks */
72 #define XFORM(x) ((x&LINE_SIZE_MASK)>>2)
75 struct dcache_block *next, *last;
76 unsigned int addr; /* Address for which data is recorded. */
77 int data[LINE_SIZE / sizeof (int)];
80 struct dcache_block dcache_free, dcache_valid;
82 /* Free all the data cache blocks, thus discarding all cached data. */
87 register struct dcache_block *db;
89 while ((db = dcache_valid.next) != &dcache_valid)
92 insque (db, &dcache_free);
97 * If addr is present in the dcache, return the address of the block
101 struct dcache_block *
105 register struct dcache_block *db;
110 /* Search all cache blocks for one that is at this address. */
111 db = dcache_valid.next;
112 while (db != &dcache_valid)
114 if ((addr & ~LINE_SIZE_MASK) == db->addr)
121 /* Return the int data at address ADDR in dcache block DC. */
124 dcache_value (db, addr)
125 struct dcache_block *db;
130 return (db->data[XFORM (addr)]);
133 /* Get a free cache block, put or keep it on the valid list,
134 and return its address. The caller should store into the block
135 the address and data that it describes, then remque it from the
136 free list and insert it into the valid list. This procedure
137 prevents errors from creeping in if a ninMemGet is interrupted
138 (which used to put garbage blocks in the valid list...). */
140 struct dcache_block *
143 register struct dcache_block *db;
145 if ((db = dcache_free.next) == &dcache_free)
147 /* If we can't get one from the free list, take last valid and put
148 it on the free list. */
149 db = dcache_valid.last;
151 insque (db, &dcache_free);
155 insque (db, &dcache_valid);
159 /* Return the contents of the word at address ADDR in the remote machine,
160 using the data cache. */
166 register struct dcache_block *db;
168 db = dcache_hit (addr);
171 db = dcache_alloc ();
173 hms_read_inferior_memory (addr & ~LINE_SIZE_MASK, (unsigned char *) db->data, LINE_SIZE);
175 db->addr = addr & ~LINE_SIZE_MASK;
176 remque (db); /* Off the free list */
177 insque (db, &dcache_valid); /* On the valid list */
179 return (dcache_value (db, addr));
182 /* Write the word at ADDR both in the data cache and in the remote machine. */
184 dcache_poke (addr, data)
188 register struct dcache_block *db;
190 /* First make sure the word is IN the cache. DB is its cache block. */
191 db = dcache_hit (addr);
194 db = dcache_alloc ();
196 hms_write_inferior_memory (addr & ~LINE_SIZE_MASK, (unsigned char *) db->data, LINE_SIZE);
198 db->addr = addr & ~LINE_SIZE_MASK;
199 remque (db); /* Off the free list */
200 insque (db, &dcache_valid); /* On the valid list */
203 /* Modify the word in the cache. */
204 db->data[XFORM (addr)] = data;
206 /* Send the changed word. */
208 hms_write_inferior_memory (addr, (unsigned char *) &data, 4);
212 /* The cache itself. */
213 struct dcache_block the_cache[DCACHE_SIZE];
215 /* Initialize the data cache. */
220 register struct dcache_block *db;
223 dcache_free.next = dcache_free.last = &dcache_free;
224 dcache_valid.next = dcache_valid.last = &dcache_valid;
225 for (i = 0; i < DCACHE_SIZE; i++, db++)
226 insque (db, &dcache_free);
229 /***********************************************************************
230 * I/O stuff stolen from remote-eb.c
231 ***********************************************************************/
233 static int timeout = 2;
235 static const char *dev_name;
237 /* Descriptor for I/O to remote machine. Initialize it to -1 so that
238 hms_open knows that we don't have a file open when the program
241 static int before = 0xdead;
242 static int is_open = 0;
243 static int after = 0xdead;
252 error ("remote device not open");
259 /* Read a character from the remote system, doing all the fancy
266 buf = SERIAL_READCHAR (desc, timeout);
268 if (buf == SERIAL_TIMEOUT)
270 hms_write (".\r\n", 3);
271 error ("Timeout reading from remote system.");
273 if (buf == SERIAL_ERROR)
275 error ("Serial port error!");
278 if (!quiet || remote_debug)
279 printf_unfiltered ("%c", buf);
288 int b = SERIAL_READCHAR (desc, 0);
289 if (b == SERIAL_TIMEOUT)
299 buf = SERIAL_READCHAR (desc, timeout);
300 if (buf == SERIAL_TIMEOUT)
302 if (!quiet || remote_debug)
303 printf_unfiltered ("%c", buf);
309 /* Keep discarding input from the remote system, until STRING is found.
310 Let the user break out immediately. */
339 /* Keep discarding input until we see the hms prompt.
341 The convention for dealing with the prompt is that you
343 o *then* wait for the prompt.
345 Thus the last thing that a procedure does with the serial line
346 will be an expect_prompt(). Exception: hms_resume does not
347 wait for the prompt, because the terminal is being handed over
348 to the inferior. However, the next thing which happens after that
349 is a hms_wait which does wait for the prompt.
350 Note that this includes abnormal exit, e.g. error(). This is
351 necessary to prevent getting into states from which we can't
359 /* Get a hex digit from the remote system & return its value.
360 If ignore_space is nonzero, ignore spaces (not newline, tab, etc). */
362 get_hex_digit (ignore_space)
370 if (ch >= '0' && ch <= '9')
372 else if (ch >= 'A' && ch <= 'F')
373 return ch - 'A' + 10;
374 else if (ch >= 'a' && ch <= 'f')
375 return ch - 'a' + 10;
376 else if (ch == ' ' && ignore_space)
381 error ("Invalid hex digit from remote system.");
386 /* Get a byte from hms_desc and put it in *BYT. Accept any number
394 val = get_hex_digit (1) << 4;
395 val |= get_hex_digit (0);
399 /* Read a 32-bit hex word from the hms, preceded by a space */
407 for (j = 0; j < 8; j++)
408 val = (val << 4) + get_hex_digit (j == 0);
412 /* Called when SIGALRM signal sent due to alarm() timeout. */
414 /* Number of SIGTRAPs we need to simulate. That is, the next
415 NEED_ARTIFICIAL_TRAP calls to hms_wait should just return
416 SIGTRAP without actually waiting for anything. */
418 static int need_artificial_trap = 0;
421 hms_kill (arg, from_tty)
428 /* This is called not only when we first attach, but also when the
429 user types "run" after having attached. */
431 hms_create_inferior (execfile, args, env)
440 error ("Can't pass arguments to remote hms process.");
442 if (execfile == 0 || exec_bfd == 0)
443 error ("No exec file specified");
445 entry_pt = (int) bfd_get_start_address (exec_bfd);
448 hms_kill (NULL, NULL);
449 hms_clear_breakpoints ();
450 init_wait_for_inferior ();
454 insert_breakpoints (); /* Needed to get correct instruction in cache */
455 proceed (entry_pt, TARGET_SIGNAL_DEFAULT, 0);
458 /* Open a connection to a remote debugger.
459 NAME is the filename used for communication, then a space,
467 while (*s && !isspace (*s))
488 while (*s && !isspace (*s))
494 copy = xmalloc (len + 1);
495 memcpy (copy, word, len);
501 static int baudrate = 9600;
508 /* Put this port into NORMAL mode, send the 'normal' character */
510 hms_write ("\001", 1); /* Control A */
511 hms_write ("\r\n", 2); /* Cr */
515 ok = SERIAL_READCHAR (desc, timeout);
522 if (readchar_nofail () == 'r')
525 /* Not the right baudrate, or the board's not on */
531 if (!SERIAL_SETBAUDRATE (desc, baudrate))
532 error ("Can't set baudrate");
537 hms_open (name, from_tty)
550 dev_name = strdup (name);
552 if (!(desc = SERIAL_OPEN (dev_name)))
553 perror_with_name ((char *) dev_name);
557 push_target (&hms_ops);
560 /* Hello? Are you there? */
561 SERIAL_WRITE (desc, "\r\n", 2);
564 /* Clear any break points */
565 hms_clear_breakpoints ();
567 printf_filtered ("Connected to remote board running HMS monitor.\n");
572 /* Close out all files and local state before this target loses control. */
578 /* Clear any break points */
580 hms_clear_breakpoints ();
581 sleep (1); /* Let any output make it all the way back */
584 SERIAL_WRITE (desc, "R\r\n", 3);
590 /* Terminate the open connection to the remote debugger. Use this
591 when you want to detach and do something else with your gdb. */ void
592 hms_detach (args, from_tty)
598 hms_clear_breakpoints ();
601 pop_target (); /* calls hms_close to do the real work
604 printf_filtered ("Ending remote %s debugging\n",
608 /* Tell the remote machine to resume. */
611 hms_resume (pid, step, sig)
623 /* Force the next hms_wait to return a trap. Not doing anything
624 about I/O from the target means that the user has to type "continue"
625 to see any. FIXME, this should be fixed. */
626 need_artificial_trap = 1;
635 /* Wait until the remote machine stops, then return, storing status in
636 STATUS just as `wait' would. */
639 hms_wait (pid, status)
641 struct target_waitstatus *status;
643 /* Strings to look for. '?' means match any single character. Note
644 that with the algorithm we use, the initial character of the string
645 cannot recur in the string, or we will not find some cases of the
646 string in the input. */
648 static char bpt[] = "At breakpoint:";
650 /* It would be tempting to look for "\n[__exit + 0x8]\n" but that
651 requires loading symbols with "yc i" and even if we did do that we
652 don't know that the file has symbols. */
653 static char exitmsg[] = "HMS>";
657 /* Large enough for either sizeof (bpt) or sizeof (exitmsg) chars.
661 /* Current position in swallowed. */
662 char *swallowed_p = swallowed;
666 int old_timeout = timeout;
668 old_immediate_quit = immediate_quit;
669 int swallowed_cr = 0;
671 status->kind = TARGET_WAITKIND_EXITED;
672 status->value.integer = 0;
674 if (need_artificial_trap != 0)
677 TARGET_WAITKIND_STOPPED;
678 status->value.sig = TARGET_SIGNAL_TRAP;
679 need_artificial_trap--;
683 timeout = 5; /* Don't time out for a while - user program is running.
685 immediate_quit = 1; /* Helps ability to QUIT */
688 QUIT; /* Let user quit and leave process running */
705 (ch == *ep || *ep == '?')
725 /* Print out any characters which have been swallowed. */
726 for (p = swallowed; p < swallowed_p; ++p)
727 putc_unfiltered (*p);
728 swallowed_p = swallowed;
730 if ((ch != '\r' && ch != '\n') || swallowed_cr > 10)
732 putc_unfiltered (ch);
741 status->kind = TARGET_WAITKIND_STOPPED;
742 status->value.sig = TARGET_SIGNAL_TRAP;
747 status->kind = TARGET_WAITKIND_EXITED;
748 status->value.integer =
752 timeout = old_timeout;
753 immediate_quit = old_immediate_quit;
758 /* Return the name of register number REGNO in the form input and
761 Returns a pointer to a static buffer containing the answer. */
772 /* Read the remote registers. */
775 gethex (length, start, ok)
785 if (*start >= 'a' && *start <= 'f')
787 result += *start - 'a' + 10;
789 else if (*start >= 'A' &&
792 result += *start - 'A' + 10;
795 (*start >= '0' && *start <= '9')
797 result += *start - '0';
807 timed_read (buf, n, timeout)
834 SERIAL_WRITE (desc, a, l);
836 if (!quiet || remote_debug)
838 printf_unfiltered ("<");
839 for (i = 0; i < l; i++)
841 printf_unfiltered ("%c", a[i]);
843 printf_unfiltered (">");
850 hms_write (s, strlen (s));
851 hms_write ("\r\n", 2);
854 #ifdef GDB_TARGET_IS_H8500
856 /* H8/500 monitor reg dump looks like:
859 PC:8000 SR:070C .7NZ.. CP:00 DP:00 EP:00 TP:00 BR:00
860 R0-R7: FF5A 0001 F4FE F500 0000 F528 F528 F4EE
866 supply_val (n, size, ptr, segptr)
877 raw[0] = gethex (2, ptr, &ok);
878 raw[1] = gethex (2, ptr + 2, &ok);
879 supply_register (n, raw);
882 raw[0] = gethex (2, ptr, &ok);
883 supply_register (n, raw);
887 int v = gethex (4, ptr, &ok);
888 v |= gethex (2, segptr, &ok) << 16;
890 raw[1] = (v >> 16) & 0xff;
891 raw[2] = (v >> 8) & 0xff;
892 raw[3] = (v >> 0) & 0xff;
893 supply_register (n, raw);
899 hms_fetch_register (dummy)
902 #define REGREPLY_SIZE 108
903 char linebuf[REGREPLY_SIZE + 1];
908 LONGEST reg[NUM_REGS];
916 s = timed_read (linebuf + 1, REGREPLY_SIZE, 1);
918 linebuf[REGREPLY_SIZE] = 0;
920 if (linebuf[3] == 'P' &&
923 linebuf[105] == 'H' &&
924 linebuf[106] == 'M' &&
931 -------1---------2---------3---------4---------5-----
932 345678901234567890123456789012345678901234567890123456
933 PC:8000 SR:070C .7NZ.. CP:00 DP:00 EP:00 TP:00 BR:00**
934 ---6---------7---------8---------9--------10----
935 789012345678901234567890123456789012345678901234
936 R0-R7: FF5A 0001 F4FE F500 0000 F528 F528 F4EE**
944 supply_val (PC_REGNUM, 4, linebuf + 6, linebuf + 29);
946 supply_val (CCR_REGNUM, 2, linebuf + 14);
947 supply_val (SEG_C_REGNUM, 1, linebuf + 29);
948 supply_val (SEG_D_REGNUM, 1, linebuf + 35);
949 supply_val (SEG_E_REGNUM, 1, linebuf + 41);
950 supply_val (SEG_T_REGNUM, 1, linebuf + 47);
951 for (i = 0; i < 8; i++)
958 char *src = linebuf + 64 + 5 * i;
959 char *segsrc = linebuf + sr[i];
960 supply_val (R0_REGNUM + i, 2, src);
961 supply_val (PR0_REGNUM + i, 4, src, segsrc);
974 #ifdef GDB_TARGET_IS_H8300
976 hms_fetch_register (dummy)
979 #define REGREPLY_SIZE 79
980 char linebuf[REGREPLY_SIZE + 1];
985 unsigned LONGEST reg[NUM_REGS];
993 s = timed_read (linebuf, 1, 1);
995 while (linebuf[0] != 'r')
996 s = timed_read (linebuf, 1, 1);
998 s = timed_read (linebuf + 1, REGREPLY_SIZE - 1, 1);
1000 linebuf[REGREPLY_SIZE] = 0;
1002 if (linebuf[0] == 'r' &&
1003 linebuf[3] == 'P' &&
1004 linebuf[4] == 'C' &&
1005 linebuf[5] == '=' &&
1006 linebuf[75] == 'H' &&
1007 linebuf[76] == 'M' &&
1011 PC=XXXX CCR=XX:XXXXXXXX R0-R7= XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
1012 5436789012345678901234567890123456789012345678901234567890123456789012
1017 reg[PC_REGNUM] = gethex (4, linebuf + 6, &gottok);
1018 reg[CCR_REGNUM] = gethex (2, linebuf + 15, &gottok);
1019 for (i = 0; i < 8; i++)
1021 reg[i] = gethex (4, linebuf + 34 + 5 * i, &gottok);
1026 for (i = 0; i < NUM_REGS; i++)
1030 swapped[1] = reg[i];
1031 swapped[0] = (reg[i]) >> 8;
1033 supply_register (i, swapped);
1037 /* Store register REGNO, or all if REGNO == -1.
1038 Return errno value. */
1040 hms_store_register (regno)
1045 for (regno = 0; regno < NUM_REGS; regno++)
1047 hms_store_register (regno);
1052 char *name = get_reg_name (regno);
1054 /* Some regs dont really exist */
1055 if (!(name[0] == 'p' && name[1] == 'r')
1056 && !(name[0] == 'c' && name[1] == 'y')
1057 && !(name[0] == 't' && name[1] == 'i')
1058 && !(name[0] == 'i' && name[1] == 'n'))
1060 sprintf (buffer, "r %s=%x", name, read_register (regno));
1061 hms_write_cr (buffer);
1068 /* Get ready to modify the registers array. On machines which store
1069 individual registers, this doesn't need to do anything. On machines
1070 which store all the registers in one fell swoop, this makes sure
1071 that registers contains all the registers from the program being
1075 hms_prepare_to_store ()
1077 /* Do nothing, since we can store individual regs */
1081 translate_addr (addr)
1089 /* Read a word from remote address ADDR and return it.
1090 * This goes through the data cache.
1093 hms_fetch_word (addr)
1096 return dcache_fetch (addr);
1099 /* Write a word WORD into remote address ADDR.
1100 This goes through the data cache. */
1103 hms_store_word (addr, word)
1107 dcache_poke (addr, word);
1111 hms_xfer_inferior_memory (memaddr, myaddr, len, write, target)
1116 struct target_ops *target; /* ignored */
1120 /* Round starting address down to longword boundary. */
1121 register CORE_ADDR addr;
1123 /* Round ending address up; get number of longwords that makes. */
1126 /* Allocate buffer of that many longwords. */
1127 register int *buffer;
1130 addr = memaddr & -sizeof (int);
1131 count = (((memaddr + len) - addr) + sizeof (int) - 1) / sizeof (int);
1133 buffer = (int *) alloca (count * sizeof (int));
1137 /* Fill start and end extra bytes of buffer with existing memory data. */
1139 if (addr != memaddr || len < (int) sizeof (int))
1141 /* Need part of initial word -- fetch it. */
1142 buffer[0] = hms_fetch_word (addr);
1145 if (count > 1) /* FIXME, avoid if even boundary */
1148 = hms_fetch_word (addr + (count - 1) * sizeof (int));
1151 /* Copy data to be written over corresponding part of buffer */
1153 memcpy ((char *) buffer + (memaddr & (sizeof (int) - 1)), myaddr, len);
1155 /* Write the entire buffer. */
1157 for (i = 0; i < count; i++, addr += sizeof (int))
1160 hms_store_word (addr, buffer[i]);
1170 /* Read all the longwords */
1171 for (i = 0; i < count; i++, addr += sizeof (int))
1174 buffer[i] = hms_fetch_word (addr);
1182 /* Copy appropriate bytes out of the buffer. */
1183 memcpy (myaddr, (char *) buffer + (memaddr & (sizeof (int) - 1)), len);
1190 hms_write_inferior_memory (memaddr, myaddr, len)
1192 unsigned char *myaddr;
1208 thisgo = len - done;
1212 sprintf (ptr, "M.B %4x =", memaddr + done);
1214 for (idx = 0; idx < thisgo; idx++)
1216 sprintf (ptr, "%2x ", myaddr[idx + done]);
1219 hms_write_cr (buffer);
1228 char *file = "nothing";
1231 file = bfd_get_filename (exec_bfd);
1235 printf_filtered ("\tAttached to DOS asynctsr and running program %s\n", file);
1237 printf_filtered ("\tAttached to %s at %d baud and running program %s\n", dev_name, baudrate, file);
1239 printf_filtered ("\ton an H8/300 processor.\n");
1242 /* Copy LEN bytes of data from debugger memory at MYADDR
1243 to inferior's memory at MEMADDR. Returns errno value.
1244 * sb/sh instructions don't work on unaligned addresses, when TU=1.
1247 /* Read LEN bytes from inferior memory at MEMADDR. Put the result
1248 at debugger address MYADDR. Returns errno value. */
1250 hms_read_inferior_memory (memaddr, myaddr, len)
1255 /* Align to nearest low 16 bits */
1258 CORE_ADDR start = memaddr;
1259 CORE_ADDR end = memaddr + len - 1;
1264 AAAA: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX '................'
1265 012345678901234567890123456789012345678901234567890123456789012345
1275 sprintf (buffer, "m %4x %4x", start & 0xffff, end & 0xffff);
1278 hms_write_cr (buffer);
1279 /* drop the echo and newline*/
1280 for (i = 0; i < 13; i++)
1283 /* Grab the lines as they come out and fill the area */
1294 buffer[0] = readchar ();
1295 while (buffer[0] == '\r'
1296 || buffer[0] == '\n')
1297 buffer[0] = readchar ();
1299 if (buffer[0] == 'M')
1302 for (i = 1; i < 50; i++) {
1303 buffer[i] = readchar ();
1305 /* sometimes we loose characters in the ascii representation of the
1306 data. I don't know where. So just scan for the end of line */
1308 while (i != '\n' && i != '\r')
1311 /* Now parse the line */
1313 addr = gethex (4, buffer, &ok);
1315 for (p = 0; p < 16; p += 2)
1317 byte[p] = gethex (2, buffer + idx, &ok);
1318 byte[p + 1] = gethex (2, buffer + idx + 2, &ok);
1322 for (p = 0; p < 16; p++)
1324 if (addr + p >= memaddr &&
1325 addr + p < memaddr + len)
1327 myaddr[(addr + p) - memaddr] = byte[p];
1333 #ifdef GDB_TARGET_IS_H8500
1336 #ifdef GDB_TARGET_IS_H8300
1347 #define MAX_BREAKS 16
1348 static int num_brkpts = 0;
1350 hms_insert_breakpoint (addr, save)
1352 char *save; /* Throw away, let hms save instructions */
1356 if (num_brkpts < MAX_BREAKS)
1361 sprintf (buffer, "b %x", addr & 0xffff);
1362 hms_write_cr (buffer);
1368 fprintf_filtered (gdb_stderr,
1369 "Too many break points, break point not installed\n");
1375 hms_remove_breakpoint (addr, save)
1377 char *save; /* Throw away, let hms save instructions */
1384 sprintf (buffer, "b - %x", addr & 0xffff);
1385 hms_write_cr (buffer);
1392 /* Clear the hmss notion of what the break points are */
1394 hms_clear_breakpoints ()
1399 hms_write_cr ("b -");
1407 hms_clear_breakpoints ();
1408 unpush_target (&hms_ops);
1409 generic_mourn_inferior ();
1412 /* Put a command string, in args, out to the hms. The hms is assumed to
1413 be in raw mode, all writing/reading done through desc.
1414 Ouput from the hms is placed on the users terminal until the
1415 prompt from the hms is seen.
1416 FIXME: Can't handle commands that take input. */
1419 hms_com (args, fromtty)
1428 /* Clear all input so only command relative output is displayed */
1430 hms_write_cr (args);
1431 /* hms_write ("\030", 1);*/
1435 /* Define the target subroutine names */
1437 struct target_ops hms_ops =
1439 "hms", "Remote HMS monitor",
1440 "Use the H8 evaluation board running the HMS monitor connected\n\
1443 hms_open, hms_close,
1444 0, hms_detach, hms_resume, hms_wait, /* attach */
1445 hms_fetch_register, hms_store_register,
1446 hms_prepare_to_store,
1447 hms_xfer_inferior_memory,
1449 hms_insert_breakpoint, hms_remove_breakpoint, /* Breakpoints */
1450 0, 0, 0, 0, 0, /* Terminal handling */
1451 hms_kill, /* FIXME, kill */
1453 0, /* lookup_symbol */
1454 hms_create_inferior, /* create_inferior */
1455 hms_mourn, /* mourn_inferior FIXME */
1457 0, /* notice_signals */
1459 process_stratum, 0, /* next */
1460 1, 1, 1, 1, 1, /* all mem, mem, stack, regs, exec */
1461 0, 0, /* Section pointers */
1462 OPS_MAGIC, /* Always the last thing */
1465 hms_quiet () /* FIXME - this routine can be removed after Dec '94 */
1469 printf_filtered ("Snoop disabled\n");
1471 printf_filtered ("Snoop enabled\n");
1473 printf_filtered("`snoop' is obsolete, please use `set remotedebug'.\n");
1481 dev_name = get_word (&s);
1494 int newrate = atoi (s);
1497 if (SERIAL_SETBAUDRATE (desc, newrate))
1498 error ("Can't use %d baud\n", newrate);
1500 printf_filtered ("Checking target is in sync\n");
1502 printf_filtered ("Sending commands to set target to %d\n",
1505 sprintf (buffer, "tm %d. N 8 1", baudrate);
1506 hms_write_cr (buffer);
1510 /***********************************************************************/
1513 hms_drain (args, fromtty)
1520 c = SERIAL_READCHAR (desc, 1);
1521 if (c == SERIAL_TIMEOUT)
1523 if (c == SERIAL_ERROR)
1525 if (c > ' ' && c < 127)
1526 printf ("%c", c & 0xff);
1528 printf ("<%x>", c & 0xff);
1536 add_com ("hms_drain", class_obscure, hms_drain,
1537 "Drain pending hms text buffers.");
1543 extern struct cmd_list_element *cmdlist;
1544 delete_cmd ("hms-drain", &cmdlist);
1548 _initialize_remote_hms ()
1550 add_target (&hms_ops);
1552 add_com ("hms <command>", class_obscure, hms_com,
1553 "Send a command to the HMS monitor.");
1555 /* FIXME - hms_quiet and `snoop' can be removed after Dec '94 */
1556 add_com ("snoop", class_obscure, hms_quiet,
1557 "Show what commands are going to the monitor (OBSOLETE - see 'set remotedebug')");
1559 add_com ("device", class_obscure, hms_device,
1560 "Set the terminal line for HMS communications");
1562 add_com ("speed", class_obscure, hms_speed,
1563 "Set the terminal line speed for HMS communications");