/* Low level interface to simulators, for the remote server for GDB.
Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-This file is part of GDB.
+ 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 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.
+ 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. */
+ 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. */
#include "defs.h"
#include "bfd.h"
#include "server.h"
-#include "callback.h" /* GDB simulator callback interface */
-#include "remote-sim.h" /* GDB simulator interface */
+#include "callback.h" /* GDB simulator callback interface */
+#include "remote-sim.h" /* GDB simulator interface */
+
+extern int remote_debug;
extern host_callback default_callback; /* in sim/common/callback.c */
-char registers[REGISTER_BYTES];
+static char my_registers[REGISTER_BYTES] __attribute__ ((aligned));
+char * registers = my_registers;
-int target_byte_order; /* used by simulator */
+int target_byte_order; /* used by simulator */
/* We record the result of sim_open so we can pass it
back to the other sim_foo routines. */
static void
generic_load (loadfile_bfd)
- bfd *loadfile_bfd;
+ bfd *loadfile_bfd;
{
asection *s;
- for (s = loadfile_bfd->sections; s; s = s->next)
+ for (s = loadfile_bfd->sections; s; s = s->next)
{
- if (s->flags & SEC_LOAD)
+ if (s->flags & SEC_LOAD)
{
bfd_size_type size;
if (size > 0)
{
char *buffer;
- bfd_vma vma;
+ bfd_vma lma; /* use load address, not virtual address */
buffer = xmalloc (size);
- vma = bfd_get_section_vma (loadfile_bfd, s);
+ lma = s->lma;
/* Is this really necessary? I guess it gives the user something
- to look at during a long download. */
- fprintf (stderr, "Loading section %s, size 0x%lx vma 0x%lx\n",
- bfd_get_section_name (loadfile_bfd, s),
- (unsigned long) size,
- (unsigned long) vma); /* chops high 32 bits. FIXME!! */
+ to look at during a long download. */
+ printf ("Loading section %s, size 0x%lx lma 0x%lx\n",
+ bfd_get_section_name (loadfile_bfd, s),
+ (unsigned long) size,
+ (unsigned long) lma); /* chops high 32 bits. FIXME!! */
bfd_get_section_contents (loadfile_bfd, s, buffer, 0, size);
- write_inferior_memory (vma, buffer, size);
+ write_inferior_memory (lma, buffer, size);
free (buffer);
}
}
}
- fprintf (stderr, "Start address 0x%lx\n",
- (unsigned long)loadfile_bfd->start_address);
+ printf ("Start address 0x%lx\n",
+ (unsigned long) loadfile_bfd->start_address);
/* We were doing this in remote-mips.c, I suspect it is right
for other targets too. */
- /* write_pc (loadfile_bfd->start_address); */ /* FIXME!! */
+ /* write_pc (loadfile_bfd->start_address); *//* FIXME!! */
}
int
#endif
abfd = bfd_openr (program, 0);
- if (!abfd)
+ if (!abfd)
{
- fprintf (stderr, "gdbserver: can't open %s: %s\n",
+ fprintf (stderr, "gdbserver: can't open %s: %s\n",
program, bfd_errmsg (bfd_get_error ()));
exit (1);
}
new_argv = alloca (sizeof (char *) * (nargs + 3)); /* allocate new args */
for (nargs = 0; argv[nargs] != NULL; nargs++) /* copy old to new */
new_argv[nargs] = argv[nargs];
- new_args[nargs] = "-E";
- new_args[nargs + 1] = bfd_big_endian (abfd) ? "big" : "little";
- new_args[nargs + 2] = NULL;
- argv = new_args;
+ new_argv[nargs] = "-E";
+ new_argv[nargs + 1] = bfd_big_endian (abfd) ? "big" : "little";
+ new_argv[nargs + 2] = NULL;
+ argv = new_argv;
#endif
/* Create an instance of the simulator. */
default_callback.init (&default_callback);
- gdbsim_desc = sim_open (SIM_OPEN_STANDALONE, &default_callback, argv);
+ gdbsim_desc = sim_open (SIM_OPEN_STANDALONE, &default_callback, abfd, argv);
if (gdbsim_desc == 0)
exit (1);
/* Load the program into the simulator. */
- if (sim_load (gdbsim_desc, program, NULL, 0) == SIM_RC_FAIL)
- generic_load (abfd);
+ if (abfd)
+ if (sim_load (gdbsim_desc, program, NULL, 0) == SIM_RC_FAIL)
+ generic_load (abfd);
/* Create an inferior process in the simulator. This initializes SP. */
- sim_create_inferior (gdbsim_desc, argv, /* env */ NULL);
-
+ sim_create_inferior (gdbsim_desc, abfd, argv, /* env */ NULL);
+ sim_resume (gdbsim_desc, 1, 0); /* execute one instr */
return pid;
}
fetch_register (regno)
int regno;
{
- sim_fetch_register (gdbsim_desc, regno, ®isters[REGISTER_BYTE (regno)]);
+ sim_fetch_register (gdbsim_desc, regno, ®isters[REGISTER_BYTE (regno)],
+ REGISTER_RAW_SIZE (regno));
}
/* Fetch all registers, or just one, from the child process. */
int regno;
{
if (regno == -1 || regno == 0)
- for (regno = 0; regno < NUM_REGS/*-NUM_FREGS*/; regno++)
+ for (regno = 0; regno < NUM_REGS /*-NUM_FREGS*/ ; regno++)
fetch_register (regno);
else
fetch_register (regno);
store_inferior_registers (regno)
int regno;
{
- if (regno == -1)
+ if (regno == -1)
{
for (regno = 0; regno < NUM_REGS; regno++)
store_inferior_registers (regno);
}
else
- sim_store_register (gdbsim_desc, regno, ®isters[REGISTER_BYTE (regno)]);
+ sim_store_register (gdbsim_desc, regno, ®isters[REGISTER_BYTE (regno)],
+ REGISTER_RAW_SIZE (regno));
}
/* Return nonzero if the given thread is still alive. */
switch (reason)
{
case sim_exited:
- fprintf (stderr, "\nChild exited with retcode = %x \n", sigrc);
+ if (remote_debug)
+ printf ("\nChild exited with retcode = %x \n", sigrc);
*status = 'W';
return sigrc;
#if 0
case sim_stopped:
- fprintf (stderr, "\nChild terminated with signal = %x \n", sigrc);
+ if (remote_debug)
+ printf ("\nChild terminated with signal = %x \n", sigrc);
*status = 'X';
return sigrc;
#endif
- default: /* should this be sim_signalled or sim_stopped? FIXME!! */
- fprintf (stderr, "\nChild received signal = %x \n", sigrc);
+ default: /* should this be sim_signalled or sim_stopped? FIXME!! */
+ if (remote_debug)
+ printf ("\nChild received signal = %x \n", sigrc);
fetch_inferior_registers (0);
*status = 'T';
return (unsigned char) sigrc;
char *myaddr;
int len;
{
- sim_write (gdbsim_desc, memaddr, myaddr, len); /* should check for error. FIXME!! */
+ sim_write (gdbsim_desc, memaddr, myaddr, len); /* should check for error. FIXME!! */
return 0;
}
-#if 0
void
-initialize ()
-{
- inferior_pid = 0;
-}
-
-int
-have_inferior_p ()
+initialize_low ()
{
- return inferior_pid != 0;
}
-#endif