Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: "Steve Ellcey " <sellcey@mips.com>
To: <gdb-patches@sourceware.org>
Subject: [patch, sim, mips] Implement unlink, lseek, and stat for MIPS
Date: Wed, 10 Jul 2013 14:49:00 -0000	[thread overview]
Message-ID: <77654af0-7a94-479e-98f2-35691968037f@BAMAIL02.ba.imgtec.org> (raw)

A while back I submitted a GCC patch that allowed me to build the Fortran
compiler on a newlib based cross compiler.  While using the GNU simulator
to test that, I found that a number of tests failed due to unimplemented
system calls on the MIPS GNU simulator.  This patch implements unlink,
lseek, and stat in the GNU simulator for MIPS.  There is a second small
patch that I sent to newlib that generates the necessary functions for
the simulator to see and intercept these functions like it does others
that are already implemented such as open and close.

OK to checkin?

Steve Ellcey
sellcey@mips.com


Steve Ellcey  <sellcey@mips.com>

	* interp.c (sim_monitor): Add switch entries for unlink (13),
	lseek (14), and stat (15).


diff --git a/sim/mips/interp.c b/sim/mips/interp.c
index 032570a..766a113 100644
--- a/sim/mips/interp.c
+++ b/sim/mips/interp.c
@@ -47,6 +47,7 @@ code on the hardware.
 #include <ansidecl.h>
 #include <ctype.h>
 #include <limits.h>
+#include <byteswap.h>
 #include <math.h>
 #ifdef HAVE_STDLIB_H
 #include <stdlib.h>
@@ -1342,6 +1343,60 @@ sim_monitor (SIM_DESC sd,
 	break;
       }
 
+    case 13: /* int unlink(const char *path) */
+      {
+	char *path = fetch_str (sd, A0);
+	V0 = sim_io_unlink (sd, path);
+	free (path);
+	break;
+      }
+
+    case 14: /* int lseek(int fd, int offset, int whence) */
+      {
+	V0 = sim_io_lseek (sd, A0, A1, A2);
+	break;
+      }
+
+/* We may need to swap stat data around before passing it on to the
+   program being run.  */
+#define copy16(x) (BigEndianMem ? bswap_16(x) : (x))
+#define copy32(x) (BigEndianMem ? bswap_32(x) : (x))
+
+    case 15: /* int stat(const char *path, struct stat *buf); */
+      {
+	/* We need to put the data into the type of stat structure
+	   that MIPS uses and make sure it has the correct endianness.
+	   We are assuming that the host and MIPS agree on what the bits
+	   in st_mode mean.  That appears to be true for x86 linux and
+	   MIPS.  */
+        struct stat host_stat;
+	struct __attribute__ ((__packed__)) mips_stat {
+		short st_dev;
+		unsigned short st_ino;
+		unsigned int st_mode;
+		unsigned short st_nlink;
+		unsigned short st_uid;
+		unsigned short st_gid;
+		short st_rdev;
+		int st_size;
+	} mips_stat;
+	char *buf;
+        char *path = fetch_str (sd, A0);
+	buf = (char *) A1;
+	V0 = sim_io_stat (sd, path, &host_stat);
+	free (path);
+	mips_stat.st_dev = copy16((short) host_stat.st_dev);
+	mips_stat.st_ino = copy16((unsigned short) host_stat.st_ino);
+	mips_stat.st_mode = copy32((int) host_stat.st_mode);
+	mips_stat.st_nlink = copy16((unsigned short) host_stat.st_nlink);
+	mips_stat.st_uid = copy16((unsigned short) host_stat.st_uid);
+	mips_stat.st_gid = copy16((unsigned short) host_stat.st_gid);
+	mips_stat.st_rdev = copy16((short) host_stat.st_rdev);
+	mips_stat.st_size = copy32((int) host_stat.st_size);
+	sim_write (sd, A1, (char *) &mips_stat, 20);
+	break;
+      }
+
     case 17: /* void _exit() */
       {
 	sim_io_eprintf (sd, "sim_monitor(17): _exit(int reason) to be coded\n");


             reply	other threads:[~2013-07-10 14:49 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-07-10 14:49 Steve Ellcey  [this message]
2013-07-24 23:19 ` Steve Ellcey
2013-08-07 21:48   ` Steve Ellcey
2013-09-03  6:14     ` Mike Frysinger
2013-09-03  6:14 ` Mike Frysinger

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=77654af0-7a94-479e-98f2-35691968037f@BAMAIL02.ba.imgtec.org \
    --to=sellcey@mips.com \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox