-/* Convex stuff for GDB.
- Copyright (C) 1990-1991 Free Software Foundation, Inc.
+/* Convex host-dependent code for GDB.
+ Copyright 1990, 1991, 1992 Free Software Foundation, Inc.
This file is part of GDB.
-GDB is free software; you can redistribute it and/or modify
+This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 1, or (at your option)
-any later version.
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
-GDB is distributed in the hope that it will be useful,
+This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
-along with GDB; see the file COPYING. If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-#include <stdio.h>
#include "defs.h"
-#include "param.h"
#include "command.h"
#include "symtab.h"
#include "value.h"
#include <sys/thread.h>
#include <sys/proc.h>
#include <sys/file.h>
-#include <sys/stat.h>
+#include "gdb_stat.h"
#include <sys/mman.h>
#include <convex/vmparam.h>
#include "gdbcmd.h"
-/* Nonzero if we are debugging an attached outside process
- rather than an inferior. */
-
-extern int attach_flag;
-
-
-
static struct type *vector_type ();
static long *read_vector_register ();
static long *read_vector_register_1 ();
static void write_vector_register ();
-static REGISTER_TYPE read_comm_register ();
+static unsigned LONGEST read_comm_register ();
static void write_comm_register ();
static void convex_cont_command ();
static void thread_continue ();
static sig_noop ();
static ptr_cmp ();
-extern char *sys_siglist[];
\f
/* Execute ptrace. Convex V7 replaced ptrace with pattach.
Allow ptrace (0) as a no-op. */
int
call_ptrace (request, pid, procaddr, buf)
- int request, pid, procaddr, buf;
+ int request, pid;
+ PTRACE_ARG3_TYPE procaddr;
+ int buf;
{
if (request == 0)
return;
/* Store our register values back into the inferior.
For Convex, do this only once, right before resuming inferior. */
+void
store_inferior_registers (regno)
int regno;
{
len -= i;
}
if (errno)
- bzero (myaddr, len);
+ memset (myaddr, '\0', len);
return errno;
}
and started up. We must do a pattach to grab it for debugging.
Also, intercept the CONT command by altering its dispatch address. */
+/* FIXME: This used to be called from a macro CREATE_INFERIOR_HOOK.
+ But now init_trace_fun is in the same place. So re-write this to
+ use the init_trace_fun (making convex a debugging target). */
create_inferior_hook (pid)
int pid;
target_mourn_inferior ();
}
-/* This is used when GDB is exiting. It gives less chance of error.*/
-
-kill_inferior_fast ()
-{
- if (inferior_pid == 0)
- return;
- ioctl (inferior_fd, PIXTERMINATE, 0);
- wait (0);
-}
-
/* Read vector register REG, and return a pointer to the value. */
static long *
ps.pi_thread = inferior_thread;
ioctl (inferior_fd, PIXRDVREGS, &ps);
if (errno)
- bzero (&vector_registers, sizeof vector_registers);
+ memset (&vector_registers, '\0', sizeof vector_registers);
}
else if (corechan >= 0)
{
static void
write_vector_register (reg, element, val)
int reg, element;
- REGISTER_TYPE val;
+ unsigned LONGEST val;
{
if (have_inferior_p ())
{
/* Return the contents of communication register NUM. */
-static REGISTER_TYPE
+static unsigned LONGEST
read_comm_register (num)
int num;
{
static void
write_comm_register (num, val)
int num;
- REGISTER_TYPE val;
+ unsigned LONGEST val;
{
if (have_inferior_p ())
{
select_thread (signal_stack->thread);
+ FIXME: need to convert from host sig.
stop_signal = signal_stack->signo;
stop_sigcode = signal_stack->subsig;
if (thread == inferior_thread)
return;
- bcopy (registers, thread_regs[inferior_thread], REGISTER_BYTES);
+ memcpy (thread_regs[inferior_thread], registers, REGISTER_BYTES);
ps.pi_thread = inferior_thread = thread;
if (have_inferior_p ())
ioctl (inferior_fd, PISETRWTID, &ps);
- bcopy (thread_regs[thread], registers, REGISTER_BYTES);
+ memcpy (registers, thread_regs[thread], REGISTER_BYTES);
}
/* Routine to set or clear a psw bit in the psw and also all psws
make_cleanup (free, filename);
if (have_inferior_p ())
- error ("To look at a core file, you must kill the inferior with \"kill\".");
+ error ("To look at a core file, you must kill the program with \"kill\".");
corechan = open (filename, O_RDONLY, 0);
if (corechan < 0)
perror_with_name (filename);
if (filename[0] == '/')
corefile = savestring (filename, strlen (filename));
else
- corefile = concat (current_directory, "/", filename);
+ corefile = concat (current_directory, "/", filename, NULL);
printf_filtered ("Program %s ", u.u_comm);
printf_filtered ("thread %d received signal %d, %s\n",
n, thread_signal[n],
- thread_signal[n] < NSIG
- ? sys_siglist[thread_signal[n]]
- : "(undocumented)");
+ safe_strsignal (thread_signal[n]));
}
/* Select an interesting thread -- also-rans died with SIGKILL,
core_aouthdr.a_magic = 0;
flush_cached_frames ();
- set_current_frame (create_new_frame (read_register (FP_REGNUM),
- read_pc ()));
select_frame (get_current_frame (), 0);
validate_files ();
- print_sel_frame (1);
+ print_stack_frame (selected_frame, selected_frame_level, -1);
}
else if (from_tty)
printf_filtered ("No core file now.\n");