This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

SH sim: introducing argv support


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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]