This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
SH sim: introducing argv support
- To: gdb-patches at sources dot redhat dot com
- Subject: SH sim: introducing argv support
- From: Alexandre Oliva <aoliva at redhat dot com>
- Date: 25 Jan 2001 20:51:59 -0200
- Organization: GCC Team, Red Hat
Ben asked me to contribute this patch while he enjoys in Australian
holiday. Corresponding changes in newlib and GCC to take advantage of
it will be contributed shortly. Ok to install?
Index: sim/sh/ChangeLog
from Ben Elliston <bje@redhat.com>
* interp.c (sim_create_inferior): Record program arguments for
later inspection by the trap handler.
(count_argc): New function.
(prog_argv): Declare static.
(sim_write): Declare.
(trap): Implement argc, argnlen and argn system calls. Do not
abort on unknown system calls--simply return -1.
* syscall.h (SYS_argc, SYS_argnlen, SYS_argn): Define.
Index: sim/sh/interp.c
===================================================================
RCS file: /cvs/src/src/sim/sh/interp.c,v
retrieving revision 1.3
diff -u -p -r1.3 interp.c
--- sim/sh/interp.c 2001/01/24 13:17:01 1.3
+++ sim/sh/interp.c 2001/01/25 22:50:31
@@ -54,6 +54,8 @@
extern unsigned char sh_jump_table[], sh_dsp_table[0x1000], ppi_table[];
+int sim_write (SIM_DESC sd, SIM_ADDR addr, unsigned char *buffer, int size);
+
#define O_RECOMPILE 85
#define DEFINE_TABLE
#define DISASSEMBLER_TABLE
@@ -162,6 +164,7 @@ static int target_little_endian;
static int global_endianw, endianb;
static int target_dsp;
static int host_little_endian;
+static char **prog_argv;
#if 1
static int maskw = 0;
@@ -264,6 +267,20 @@ do { \
#define FPSCR_SZ ((GET_FPSCR() & FPSCR_MASK_SZ) != 0)
#define FPSCR_PR ((GET_FPSCR() & FPSCR_MASK_PR) != 0)
+/* Count the number of arguments in an argv. */
+static int
+count_argc (char **argv)
+{
+ int i;
+
+ if (! argv)
+ return -1;
+
+ for (i = 0; argv[i] != NULL; ++i)
+ continue;
+ return i;
+}
+
static void
set_fpscr1 (x)
int x;
@@ -1102,11 +1119,31 @@ trap (i, regs, memory, maskl, maskw, end
strnswap (regs[5], len);
break;
}
+ case SYS_argc:
+ regs[0] = count_argc (prog_argv);
+ break;
+ case SYS_argnlen:
+ if (regs[5] < count_argc (prog_argv))
+ regs[0] = strlen (prog_argv[regs[5]]);
+ else
+ regs[0] = -1;
+ break;
+ case SYS_argn:
+ if (regs[5] < count_argc (prog_argv))
+ {
+ /* Include the termination byte. */
+ int i = strlen (prog_argv[regs[5]]) + 1;
+ regs[0] = sim_write (0, regs[6], prog_argv[regs[5]], i);
+ }
+ else
+ regs[0] = -1;
+ break;
case SYS_time:
regs[0] = get_now ();
break;
default:
- abort ();
+ regs[0] = -1;
+ break;
}
regs[1] = callback->get_errno (callback);
errno = perrno;
@@ -2146,12 +2183,17 @@ sim_create_inferior (sd, prog_bfd, argv,
char **argv;
char **env;
{
- /* clear the registers */
+ /* Clear the registers. */
memset (&saved_state, 0,
(char*)&saved_state.asregs.end_of_registers - (char*)&saved_state);
- /* set the PC */
+
+ /* Set the PC. */
if (prog_bfd != NULL)
saved_state.asregs.pc = bfd_get_start_address (prog_bfd);
+
+ /* Record the program's arguments. */
+ prog_argv = argv;
+
return SIM_RC_OK;
}
Index: sim/sh/syscall.h
===================================================================
RCS file: /cvs/src/src/sim/sh/syscall.h,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 syscall.h
--- sim/sh/syscall.h 1999/04/16 01:35:12 1.1.1.1
+++ sim/sh/syscall.h 2001/01/25 22:50:31
@@ -27,7 +27,8 @@
#define SYS_stat 38
#define SYS_pipe 42
#define SYS_execve 59
+#define SYS_argc 172
+#define SYS_argnlen 173
+#define SYS_argn 174
#define SYS_utime 201 /* not really a system call */
#define SYS_wait 202 /* nor is this */
-
-
--
Alexandre Oliva Enjoy Guarana', see http://www.ic.unicamp.br/~oliva/
Red Hat GCC Developer aoliva@{cygnus.com, redhat.com}
CS PhD student at IC-Unicamp oliva@{lsd.ic.unicamp.br, gnu.org}
Free Software Evangelist *Please* write to mailing lists, not to me