This is the mail archive of the gdb-patches@sourceware.org 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]
Other format: [Raw text]

Committed: add access syscall to sim/cris


The access syscall was used one way or another (perhaps it was
just in an error path) in hello-world with glibc-2.9 (eglibc).

I see it's also used in the gfortran testsuite, so this will
hopefully change a few FAILs with "Unimplemented syscall: 33
(0x3dfff...)" in the log to PASS for cris{,v32}-axis-linux-gnu
later on.

sim/testsuite:
	* sim/cris/c/access1.c: New test.
sim:
	* cris/traps.c (TARGET_SYS_access, TARGET_R_OK, TARGET_W_OK)
	(TARGET_X_OK, TARGET_F_OK): Define.
	(cris_break_13_handler) <case TARGET_SYS_access>: New case.

Index: sim/cris/c/access1.c
===================================================================
RCS file: sim/cris/c/access1.c
diff -N sim/cris/c/access1.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sim/cris/c/access1.c	3 Jan 2009 18:13:35 -0000
@@ -0,0 +1,16 @@
+/* Check access(2) trivially.  Newlib doesn't have it.
+#notarget: cris*-*-elf
+*/
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+int main (int argc, char **argv)
+{
+  if (access (argv[0], R_OK|W_OK|X_OK) == 0
+      && access ("/dev/null", R_OK|W_OK) == 0
+      && access ("/dev/null", X_OK) == -1
+      && errno == EACCES)
+    printf ("pass\n");
+  exit (0);
+}

Index: cris/traps.c
===================================================================
RCS file: /cvs/src/src/sim/cris/traps.c,v
retrieving revision 1.15
diff -p -u -r1.15 traps.c
--- cris/traps.c	30 Dec 2008 13:36:17 -0000	1.15
+++ cris/traps.c	3 Jan 2009 18:14:54 -0000
@@ -65,6 +65,7 @@ along with this program.  If not, see <h
 #define TARGET_SYS_time 13
 #define TARGET_SYS_lseek 19
 #define TARGET_SYS_getpid 20
+#define TARGET_SYS_access 33
 #define TARGET_SYS_kill 37
 #define TARGET_SYS_rename 38
 #define TARGET_SYS_pipe 42
@@ -244,6 +245,12 @@ along with this program.  If not, see <h
 /* From linux/limits.h. */
 #define TARGET_PIPE_BUF 4096
 
+/* From unistd.h.  */
+#define	TARGET_R_OK 4
+#define	TARGET_W_OK 2
+#define	TARGET_X_OK 1
+#define	TARGET_F_OK 0
+
 static const char stat_map[] =
 "st_dev,2:space,10:space,4:st_mode,4:st_nlink,4:st_uid,4"
 ":st_gid,4:st_rdev,2:space,10:st_size,8:st_blksize,4:st_blocks,4"
@@ -2648,6 +2655,56 @@ cris_break_13_handler (SIM_CPU *current_
 	    break;
 	  }
 
+	case TARGET_SYS_access:
+	  {
+	    SI path = arg1;
+	    SI mode = arg2;
+	    char *pbuf = xmalloc (SIM_PATHMAX);
+	    int i;
+	    int o = 0;
+	    int hmode = 0;
+
+	    if (sim_core_read_unaligned_1 (current_cpu, pc, 0, path) == '/')
+	      {
+		strcpy (pbuf, simulator_sysroot);
+		o += strlen (simulator_sysroot);
+	      }
+
+	    for (i = 0; i + o < SIM_PATHMAX; i++)
+	      {
+		pbuf[i + o]
+		  = sim_core_read_unaligned_1 (current_cpu, pc, 0, path + i);
+		if (pbuf[i + o] == 0)
+		  break;
+	      }
+
+	    if (i + o == SIM_PATHMAX)
+	      {
+		retval = -cb_host_to_target_errno (cb, ENAMETOOLONG);
+		break;
+	      }
+
+	    /* Assert that we don't get calls for files for which we
+	       don't have support.  */
+	    if (strncmp (pbuf + strlen (simulator_sysroot),
+			 "/proc/", 6) == 0)
+	      abort ();
+#define X_AFLAG(x) if (mode & TARGET_ ## x) hmode |= x
+	    X_AFLAG (R_OK);
+	    X_AFLAG (W_OK);
+	    X_AFLAG (X_OK);
+	    X_AFLAG (F_OK);
+#undef X_AFLAG
+
+	    if (access (pbuf, hmode) != 0)
+	      retval = -cb_host_to_target_errno (cb, errno);
+	    else
+	      retval = 0;
+
+	    free (pbuf);
+	    break;
+	  }
+
 	case TARGET_SYS_readlink:
 	  {
 	    SI path = arg1;

brgds, H-P


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