aboutsummaryrefslogtreecommitdiff
path: root/gdb/callback.c
diff options
context:
space:
mode:
authorSteve Chamberlain <sac@cygnus>1995-09-29 00:14:01 +0000
committerSteve Chamberlain <sac@cygnus>1995-09-29 00:14:01 +0000
commitdedcc91de6ec2cbcec9c14341dd4b27e39856ca0 (patch)
tree92c5eb107e36e9fca6ec8d2d36715681eed62bfc /gdb/callback.c
parentb91537be6193d1f7d9347eade8b18b0f4414a022 (diff)
downloadgdb-dedcc91de6ec2cbcec9c14341dd4b27e39856ca0.zip
gdb-dedcc91de6ec2cbcec9c14341dd4b27e39856ca0.tar.gz
gdb-dedcc91de6ec2cbcec9c14341dd4b27e39856ca0.tar.bz2
Thu Sep 28 14:32:11 1995 steve chamberlain <sac@slash.cygnus.com>
* callback.[ch]: New files. * remote-rdp.c: Support for the ARM RDP monitor. * Makefile: Update. * arm-tdep.c (arm_othernames): New. (_initialize_arm_tdep): install 'othernames' command. (arm_nullified_insn, shifted_reg_val, arm_get_next_pc): New. * configure.in: Check for termios.h, termio.h and sgtty.h. (i[345]86-*-win32*): New host. * configure: Regenerated. * inflow.c: Clean up inclusions. * main.c (main): Check for WINGDB, not WIN32. * printcmd.c (do_examine): Put QUIT test in loop. * remote-hms.c (e7000_load): Delete. (hms_ops): Point to generic_load instead. * remote-hms.c (hms_ops): Point to generic_load. * remote-sim.c (sim_callback_write_stdout): Becomes gdbsim_write_stdout. (gdbsim_load): Call generic_load. * remote-utils.c (gr_load_image): Delete. * ser-unix.c (terminal.h): Include instead of havig own #if tree. (hardwire_flush_input): Reset input buffer too. * source.c (openp): If WIN32 then open file in binary mode. * terminal.h: Configure IO mechanism using autoconf defines if available and not overriden. * utils.c (quit, pollquit, notice_quit): WIN32 check becomes WINGDB check. * config/arm/arm.mt (TDEPFILES): Add remote-rdp.o * config/arm/tm-arm.h (TARGET_BYTE_ORDER): becomes TARGET_BYTE_ORDER_SELECTABLE. (ADDR_BITS_REMOVE): New. (ORIGINAL_REGISTER_NAMES, ADDITIONAL_REGISTER_NAMES): New. (INST_xx): New (FRAME_FIND_SAVED_REGS): Pass the right argument. (arm_get_next_pc): Declare. * mswin/prebuilt/*/bfdtarget.h (SELECT_ARCHITECTURES): Need leading &.
Diffstat (limited to 'gdb/callback.c')
-rw-r--r--gdb/callback.c319
1 files changed, 319 insertions, 0 deletions
diff --git a/gdb/callback.c b/gdb/callback.c
new file mode 100644
index 0000000..60aa0a6
--- /dev/null
+++ b/gdb/callback.c
@@ -0,0 +1,319 @@
+/* Host callback routines for GDB.
+ Copyright 1995 Free Software Foundation, Inc.
+ Contributed by Cygnus Support.
+
+ This file is part of GDB.
+
+ 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 2 of the License, or
+ (at your option) any later version.
+
+ 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 this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+
+/* This file provides a standard way for targets to talk to the host OS
+ level.
+
+ This interface will probably need a bit more banging to make it
+ smooth. Currently the simulator uses this file to provide the
+ callbacks for itself when it's built standalone, which is rather
+ ugly. */
+
+#ifndef INSIDE_SIMULATOR
+#include "defs.h"
+#endif
+
+#include "ansidecl.h"
+#include "callback.h"
+#ifdef ANSI_PROTOTYPES
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+
+#include <stdio.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <time.h>
+
+
+
+/* Set the callback copy of errno from what we see now. */
+static int
+wrap (p, val)
+ host_callback *p;
+ int val;
+{
+ p->last_errno = errno;
+ return val;
+}
+
+/* Make sure the FD provided is ok. If not, return non -1
+ and set errno. */
+
+static int
+fdbad (p, fd)
+ host_callback *p;
+ int fd;
+{
+ if (fd < 0 || fd > MAX_CALLBACK_FDS || !p->fdopen[fd])
+ {
+ p->last_errno = EINVAL;
+ return -1;
+ }
+ return 0;
+}
+
+static int
+fdmap (p, fd)
+ host_callback *p;
+ int fd;
+{
+ return p->fdmap[fd];
+}
+
+int
+os_close (p, fd)
+ host_callback *p;
+ int fd;
+{
+ return fdbad (p, fd) || wrap (p, close (fdmap (p, fd)));
+}
+
+int
+os_get_errno (p)
+ host_callback *p;
+{
+ /* !!! fixme, translate from host to taget errno value */
+ return p->last_errno;
+}
+
+
+int
+os_isatty (p, fd)
+ host_callback *p;
+ int fd;
+{
+ return fdbad (p, fd) || wrap (p, isatty (fdmap (fd)));
+}
+
+int
+os_lseek (p, fd, off, way)
+ host_callback *p;
+ int fd;
+ long off;
+ int way;
+{
+ return fdbad (p, fd) || lseek (fdmap (p, fd), off, way);
+}
+
+int
+os_open (p, name, flags)
+ host_callback *p;
+ const char *name;
+ int flags;
+{
+ int i;
+ for (i = 0; i < MAX_CALLBACK_FDS; i++)
+ {
+ if (!p->fdopen[i])
+ {
+ int f = open (name, flags);
+ if (f < 0)
+ {
+ p->last_errno = errno;
+ return f;
+ }
+ p->fdopen[i] = 1;
+ p->fdmap[i] = f;
+ return i;
+ }
+ }
+ p->last_errno = EMFILE;
+ return -1;
+}
+
+int
+os_read (p, fd, buf, len)
+ host_callback *p;
+ int fd;
+ char *buf;
+ int len;
+{
+ return fdbad (p, fd) || wrap (p, read (fdmap (p, fd), buf, len));
+}
+
+int
+os_read_stdin (p, buf, len)
+ host_callback *p;
+ char *buf;
+ int len;
+{
+ return wrap (p, read (0, buf, len));
+}
+
+int
+os_write (p, fd, buf, len)
+ host_callback *p;
+ int fd;
+ const char *buf;
+ int len;
+{
+ return fdbad (p, fd) || wrap (p, write (fdmap (p, fd), buf, len));
+}
+
+/* ignore the grossness of INSIDE_SIMULATOR, it will go away one day. */
+int
+os_write_stdout (p, buf, len)
+ host_callback *p;
+ const char *buf;
+ int len;
+{
+#ifdef INSIDE_SIMULATOR
+ return os_write (1, buf, len);
+#else
+ int i;
+ char b[2];
+ for (i = 0; i< len; i++)
+ {
+ b[0] = buf[i];
+ b[1] = 0;
+ if (target_output_hook)
+ target_output_hook (b);
+ else
+ fputs_filtered (b, gdb_stdout);
+ }
+ return len;
+#endif
+}
+
+int
+os_rename (p, f1, f2)
+ host_callback *p;
+ const char *f1;
+ const char *f2;
+{
+ return wrap (p, rename (f1, f2));
+}
+
+
+int
+os_system (p, s)
+ host_callback *p;
+ const char *s;
+{
+ return wrap (p, system (s));
+}
+
+long
+os_time (p, t)
+ host_callback *p;
+ long *t;
+{
+ return wrap (p, time (t));
+}
+
+
+int
+os_unlink (p, f1)
+ host_callback *p;
+ const char *f1;
+{
+ return wrap (p, unlink (f1));
+}
+
+
+int
+os_shutdown (p)
+host_callback *p;
+{
+ int i;
+ for (i = 0; i < MAX_CALLBACK_FDS; i++)
+ {
+ if (p->fdopen[i] && !p->alwaysopen[i]) {
+ close (p->fdmap[i]);
+ p->fdopen[i] = 0;
+ }
+ }
+ return 1;
+}
+
+int os_init(p)
+host_callback *p;
+{
+ int i;
+ os_shutdown (p);
+ for (i= 0; i < 3; i++)
+ {
+ p->fdmap[i] = i;
+ p->fdopen[i] = 1;
+ p->alwaysopen[i] = 1;
+ }
+ return 1;
+}
+
+
+/* !!fixme!!
+ This bit is ugly. When the interface has settled down I'll
+ move the whole file into sim/common and remove this bit. */
+
+/* VARARGS */
+void
+#ifdef ANSI_PROTOTYPES
+os_printf_filtered (host_callback *p, char *format, ...)
+#else
+os_printf_filtered (p, va_alist)
+ host_callback *p;
+ va_dcl
+#endif
+{
+ va_list args;
+#ifdef ANSI_PROTOTYPES
+ va_start (args, format);
+#else
+ char *format;
+
+ va_start (args);
+ format = va_arg (args, char *);
+#endif
+
+#ifdef INSIDE_SIMULATOR
+ vprintf (format, args);
+#else
+ vfprintf_filtered (stdout, format, args);
+#endif
+
+ va_end (args);
+}
+
+host_callback default_callback =
+{
+ os_close,
+ os_get_errno,
+ os_isatty,
+ os_lseek,
+ os_open,
+ os_read,
+ os_read_stdin,
+ os_rename,
+ os_system,
+ os_time,
+ os_unlink,
+ os_write,
+ os_write_stdout,
+
+ os_shutdown,
+ os_init,
+
+ os_printf_filtered,
+
+ 0, /* last errno */
+};