Thread View: gnu.gdb.bug
1 messages
1 total messages
Started by Glenn Engel
Wed, 15 Feb 1989 21:08
hp9k320 support and remote.c fixes (again)
Author: Glenn Engel
Date: Wed, 15 Feb 1989 21:08
Date: Wed, 15 Feb 1989 21:08
578 lines
14086 bytes
14086 bytes
Please, please, please include these patches. I've submitted them a number of
times over the last 9 months only to have them ignored. Is anyone home ?
Included are patches to hp9k320-dep.c, m-hp9k320.h and remote.c to support
the attach command on the hp9000/300. Patches apply to gdb3.1.
The patches to remote.c are generic bug fixes for any machine. I have
included the changes submitted by Brad Parker for timeouts and have added
fixes for machines which support TERMIO but not siginterrupt.
--
| Glenn R. Engel
| Hewlett-Packard
| (206) 335-2066
| glenne%hplsla@hplabs.hp.com
*** hp9k320-dep.c.orig Wed Feb 15 11:09:23 1989
--- hp9k320-dep.c Wed Feb 15 10:49:06 1989
***************
*** 41,46
#include <sys/stat.h>
extern int errno;
/* This function simply calls ptrace with the given arguments.
It exists so that all calls to ptrace are isolated in this
--- 41,47 -----
#include <sys/stat.h>
extern int errno;
+ extern int attach_flag;
/* This function simply calls ptrace with the given arguments.
It exists so that all calls to ptrace are isolated in this
***************
*** 94,99
perror_with_name ("ptrace");
}
}
#define INFERIOR_AR0(u) \
((ptrace \
--- 95,131 -----
perror_with_name ("ptrace");
}
}
+
+ #ifdef ATTACH_DETACH
+
+ /* Start debugging the process whose number is PID. */
+
+ attach (pid)
+ int pid;
+ {
+ errno = 0;
+ /* ptrace (PTRACE_ATTACH, pid, 0, 0); */ /* how do we do this ? */
+ if (errno)
+ perror_with_name ("ptrace");
+ attach_flag = 1;
+ return pid;
+ }
+
+ /* Stop debugging the process whose number is PID
+ and continue it with signal number SIGNAL.
+ SIGNAL = 0 means just continue it. */
+
+ void
+ detach (signal)
+ int signal;
+ {
+ errno = 0;
+ /* ptrace (PTRACE_DETACH, inferior_pid, 1, signal); */ /* how do we do this ? */
+ if (errno)
+ perror_with_name ("ptrace");
+ attach_flag = 0;
+ }
+ #endif /* ATTACH_DETACH */
#define INFERIOR_AR0(u) \
((ptrace \
***************
*** 191,202
struct user u;
register int regno;
register unsigned int ar0_offset;
!
! ar0_offset = (INFERIOR_AR0 (u));
! for (regno = 0; (regno < FP0_REGNUM); regno++)
! fetch_inferior_register (regno, (REGISTER_ADDR (ar0_offset, regno)));
! for (; (regno < NUM_REGS); regno++)
! fetch_inferior_register (regno, (FP_REGISTER_ADDR (u, regno)));
}
/* Store our register values back into the inferior.
--- 223,239 -----
struct user u;
register int regno;
register unsigned int ar0_offset;
! extern char registers[];
! if (remote_debugging)
! remote_fetch_registers (registers);
! else
! {
! ar0_offset = (INFERIOR_AR0 (u));
! for (regno = 0; (regno < FP0_REGNUM); regno++)
! fetch_inferior_register (regno, (REGISTER_ADDR (ar0_offset, regno)));
! for (; (regno < NUM_REGS); regno++)
! fetch_inferior_register (regno, (FP_REGISTER_ADDR (u, regno)));
! }
}
/* Store our register values back into the inferior.
***************
*** 208,215
{
struct user u;
register unsigned int ar0_offset;
!
! if (regno >= FP0_REGNUM)
{
store_inferior_register (regno, (FP_REGISTER_ADDR (u, regno)));
return;
--- 245,254 -----
{
struct user u;
register unsigned int ar0_offset;
! extern char registers[];
! if (remote_debugging)
! remote_store_registers (registers);
! else
{
if (regno >= FP0_REGNUM)
{
***************
*** 211,219
if (regno >= FP0_REGNUM)
{
! store_inferior_register (regno, (FP_REGISTER_ADDR (u, regno)));
! return;
! }
ar0_offset = (INFERIOR_AR0 (u));
if (regno >= 0)
--- 250,260 -----
remote_store_registers (registers);
else
{
! if (regno >= FP0_REGNUM)
! {
! store_inferior_register (regno, (FP_REGISTER_ADDR (u, regno)));
! return;
! }
ar0_offset = (INFERIOR_AR0 (u));
if (regno >= 0)
***************
*** 215,225
return;
}
! ar0_offset = (INFERIOR_AR0 (u));
! if (regno >= 0)
! {
! store_inferior_register (regno, (REGISTER_ADDR (ar0_offset, regno)));
! return;
}
for (regno = 0; (regno < FP0_REGNUM); regno++)
--- 256,272 -----
return;
}
! ar0_offset = (INFERIOR_AR0 (u));
! if (regno >= 0)
! {
! store_inferior_register (regno, (REGISTER_ADDR (ar0_offset, regno)));
! return;
! }
!
! for (regno = 0; (regno < FP0_REGNUM); regno++)
! store_inferior_register (regno, (REGISTER_ADDR (ar0_offset, regno)));
! for (; (regno < NUM_REGS); regno++)
! store_inferior_register (regno, (FP_REGISTER_ADDR (u, regno)));
}
return;
}
***************
*** 221,231
store_inferior_register (regno, (REGISTER_ADDR (ar0_offset, regno)));
return;
}
-
- for (regno = 0; (regno < FP0_REGNUM); regno++)
- store_inferior_register (regno, (REGISTER_ADDR (ar0_offset, regno)));
- for (; (regno < NUM_REGS); regno++)
- store_inferior_register (regno, (FP_REGISTER_ADDR (u, regno)));
return;
}
--- 268,273 -----
for (; (regno < NUM_REGS); regno++)
store_inferior_register (regno, (FP_REGISTER_ADDR (u, regno)));
}
return;
}
*** m-hp9k320.h.orig Wed Feb 15 11:09:30 1989
--- m-hp9k320.h Wed Feb 15 10:49:18 1989
***************
*** 248,253
? (&u.u_pcb.pcb_mc68881[FMC68881_R0 + (((regno) - FP0_REGNUM) * 3)]) \
: (&u.u_pcb.pcb_mc68881[FMC68881_C + ((regno) - FPC_REGNUM)]))) \
- ((char *) (& u)))
/* It is safe to look for symsegs on a Sun, because Sun's ld
does not screw up with random garbage at end of file. */
--- 252,261 -----
? (&u.u_pcb.pcb_mc68881[FMC68881_R0 + (((regno) - FP0_REGNUM) * 3)]) \
: (&u.u_pcb.pcb_mc68881[FMC68881_C + ((regno) - FPC_REGNUM)]))) \
- ((char *) (& u)))
+
+ /* Do implement the attach and detach commands. */
+
+ #define ATTACH_DETACH
/* It is safe to look for symsegs on a Sun, because Sun's ld
does not screw up with random garbage at end of file. */
*** remote.c.orig Wed Feb 15 11:09:41 1989
--- remote.c Wed Feb 15 12:38:26 1989
***************
*** 93,99
#define TERMINAL struct sgttyb
#endif
! int kiodebug;
int icache;
--- 93,100 -----
#define TERMINAL struct sgttyb
#endif
! static int kiodebug = 0;
! static int timeout = 5;
int icache;
***************
*** 108,113
static void dcache_flush ();
/* Open a connection to a remote debugger.
NAME is the filename used for communication. */
--- 109,126 -----
static void dcache_flush ();
+ /* called when SIGALRM signal sent due to alarm() timeout */
+ #ifndef HAVE_TERMIO
+ void
+ remote_timer()
+ {
+ if (kiodebug)
+ printf("[remote_timer]\n");
+
+ alarm(timeout);
+ }
+ #endif
+
/* Open a connection to a remote debugger.
NAME is the filename used for communication. */
***************
*** 127,133
ioctl (remote_desc, TIOCGETP, &sg);
#ifdef HAVE_TERMIO
! sg.c_lflag &= ~ICANON;
#else
sg.sg_flags = RAW;
#endif
--- 140,149 -----
ioctl (remote_desc, TIOCGETP, &sg);
#ifdef HAVE_TERMIO
! sg.c_cc[VMIN] = 0; /* read with timeout */
! sg.c_cc[VTIME] = timeout*10;
! sg.c_lflag &= ~(ICANON | ECHO);
!
#else
sg.sg_flags = RAW;
#endif
***************
*** 136,141
if (from_tty)
printf ("Remote debugging using %s\n", name);
remote_debugging = 1;
}
/* Convert hex digit A to a number. */
--- 152,167 -----
if (from_tty)
printf ("Remote debugging using %s\n", name);
remote_debugging = 1;
+
+ #ifndef HAVE_TERMIO
+ /* cause SIGALRM's to make reads fail */
+ if (siginterrupt(SIGALRM, 1) != 0)
+ perror("[remote_open] siginterrupt");
+
+ /* set up read timeout timer */
+ if (signal(SIGALRM, remote_timer) == (void (*))-1)
+ perror("[remote_open] signal");
+ #endif
}
/* Convert hex digit A to a number. */
***************
*** 186,192
remote_wait (status)
WAITTYPE *status;
{
! char buf[PBUFSIZ];
WSETEXIT ((*status), 0);
getpkt (buf);
--- 212,218 -----
remote_wait (status)
WAITTYPE *status;
{
! unsigned char buf[PBUFSIZ];
WSETEXIT ((*status), 0);
getpkt (buf);
***************
*** 244,249
*p++ = tohex ((regs[i] >> 4) & 0xf);
*p++ = tohex (regs[i] & 0xf);
}
remote_send (buf);
}
--- 270,276 -----
*p++ = tohex ((regs[i] >> 4) & 0xf);
*p++ = tohex (regs[i] & 0xf);
}
+ *p = '\0';
remote_send (buf);
}
***************
*** 310,315
*p++ = tohex ((myaddr[i] >> 4) & 0xf);
*p++ = tohex (myaddr[i] & 0xf);
}
remote_send (buf);
}
--- 337,343 -----
*p++ = tohex ((myaddr[i] >> 4) & 0xf);
*p++ = tohex (myaddr[i] & 0xf);
}
+ *p = '\0';
remote_send (buf);
}
***************
*** 370,375
*/
/* Send the command in BUF to the remote machine,
and read the reply into BUF.
Report an error if we get an error reply. */
--- 398,425 -----
*/
+ static int
+ readchar ()
+ {
+ char buf[1];
+
+ buf[0] = '\0';
+ #ifdef HAVE_TERMIO
+ /* termio does the timeout for us. */
+ read (remote_desc, buf, 1);
+ #else
+ alarm(timeout);
+ read (remote_desc, buf, 1);
+ alarm(0);
+ #endif
+ /*
+ if (kiodebug > 1)
+ printf("[readchar] got '%c' (0x%x)\n", buf[0] & 0x7f, buf[0] & 0x7f);
+ */
+
+ return buf[0] & 0x7f;
+ }
+
/* Send the command in BUF to the remote machine,
and read the reply into BUF.
Report an error if we get an error reply. */
***************
*** 394,400
char *buf;
{
int i;
! char csum = 0;
char buf2[500];
char buf3[1];
int cnt = strlen (buf);
--- 444,450 -----
char *buf;
{
int i;
! unsigned char csum = 0;
char buf2[500];
char buf3[1];
int cnt = strlen (buf);
***************
*** 400,408
int cnt = strlen (buf);
char *p;
- if (kiodebug)
- fprintf (stderr, "Sending packet: %s\n", buf);
-
/* Copy the packet into buffer BUF2, encapsulating it
and giving it a checksum. */
--- 450,455 -----
int cnt = strlen (buf);
char *p;
/* Copy the packet into buffer BUF2, encapsulating it
and giving it a checksum. */
***************
*** 421,426
/* Send it over and over until we get a positive ack. */
do {
write (remote_desc, buf2, p - buf2);
read (remote_desc, buf3, 1);
} while (buf3[0] != '+');
--- 468,477 -----
/* Send it over and over until we get a positive ack. */
do {
+ if (kiodebug) {
+ *p = '\0';
+ fprintf (stderr, "Sending packet: %s (%s)\n", buf2, buf);
+ }
write (remote_desc, buf2, p - buf2);
} while (readchar() != '+');
}
***************
*** 422,429
do {
write (remote_desc, buf2, p - buf2);
! read (remote_desc, buf3, 1);
! } while (buf3[0] != '+');
}
static int
--- 473,479 -----
fprintf (stderr, "Sending packet: %s (%s)\n", buf2, buf);
}
write (remote_desc, buf2, p - buf2);
! } while (readchar() != '+');
}
/* Read a packet from the remote machine, with error checking,
***************
*** 426,439
} while (buf3[0] != '+');
}
- static int
- readchar ()
- {
- char buf[1];
- while (read (remote_desc, buf, 1) != 1) ;
- return buf[0] & 0x7f;
- }
-
/* Read a packet from the remote machine, with error checking,
and store it in BUF. */
--- 476,481 -----
} while (readchar() != '+');
}
/* Read a packet from the remote machine, with error checking,
and store it in BUF. */
***************
*** 443,449
{
char *bp;
unsigned char csum;
! unsigned int c, c1, c2;
extern kiodebug;
while (1)
--- 485,492 -----
{
char *bp;
unsigned char csum;
! int c;
! unsigned char c1, c2;
extern kiodebug;
while (1)
***************
*** 466,472
c1 = fromhex (readchar ());
c2 = fromhex (readchar ());
! if (csum == (c1 << 4) + c2)
break;
printf ("Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n",
(c1 << 4) + c2, csum, buf);
--- 509,515 -----
c1 = fromhex (readchar ());
c2 = fromhex (readchar ());
! if ((csum & 0xff) == (c1 << 4) + c2)
break;
printf ("Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n",
(c1 << 4) + c2, csum & 0xff, buf);
***************
*** 469,475
if (csum == (c1 << 4) + c2)
break;
printf ("Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n",
! (c1 << 4) + c2, csum, buf);
write (remote_desc, "-", 1);
}
--- 512,519 -----
if ((csum & 0xff) == (c1 << 4) + c2)
break;
printf ("Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n",
! (c1 << 4) + c2, csum & 0xff, buf);
!
write (remote_desc, "-", 1);
}
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads