This is the mail archive of the newlib@sources.redhat.com mailing list for the newlib 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]

[PATCH] Add extra syscalls for xscale


Just a little change to add some extra syscalls for RedBoot on XScale.
Approved by J.Johnston and checked in.

Jifl
-- 
Red Hat, Rustat House, Clifton Road, Cambridge, UK. Tel: +44 (1223) 271062
--[ "You can complain because roses have thorns, or you ]--
--[  can rejoice because thorns have roses." -Lincoln   ]-- Opinions==mine
Index: newlib/ChangeLog
===================================================================
RCS file: /cvs/src/src/newlib/ChangeLog,v
retrieving revision 1.277
diff -u -5 -p -r1.277 ChangeLog
--- newlib/ChangeLog	29 Apr 2002 19:31:17 -0000	1.277
+++ newlib/ChangeLog	29 Apr 2002 21:43:01 -0000
@@ -1,5 +1,13 @@
+2002-04-29  Jonathan Larmour  <jlarmour@redhat.com>
+
+	* libc/sys/arm/syscalls.c (_rename): New function. Just a stub.
+	(_system): New function. Ditto.
+	* libc/stdlib/system.c (_system_r): Call _system if HAVE_SYSTEM.
+	* configure.host: define HAVE_SYSTEM and HAVE_RENAME for xscale
+	targets.
+
 2002-04-29  Jeff Johnston  <jjohnstn@redhat.com>
 
         *  libc/include/sys/unistd.h (pread, pwrite): Added prototypes.
         *  libc/unix/Makefile.am: Add pread.c and pwrite.c.
         *  libc/sys/linux/Makefile.am: Add pread64.c and pwrite64.c.
Index: newlib/configure.host
===================================================================
RCS file: /cvs/src/src/newlib/configure.host,v
retrieving revision 1.23
diff -u -5 -p -r1.23 configure.host
--- newlib/configure.host	19 Apr 2002 19:16:04 -0000	1.23
+++ newlib/configure.host	29 Apr 2002 21:43:02 -0000
@@ -517,10 +517,11 @@ case "${host}" in
 	;;
   xscale-*-*)
 	syscall_dir=syscalls
 	newlib_cflags="${newlib_cflags} -DABORT_PROVIDED -DHAVE_GETTIMEOFDAY"
 	newlib_cflags="${newlib_cflags} -DARM_RDI_MONITOR"
+	newlib_cflags="${newlib_cflags} -DHAVE_SYSTEM -DHAVE_RENAME"
 	;;
   thumb-*-pe)
 	syscall_dir=syscalls
 	newlib_cflags="${newlib_cflags} -DABORT_PROVIDED -DHAVE_GETTIMEOFDAY"
 # Don't use the debugging protocols just yet.
Index: newlib/libc/stdlib/system.c
===================================================================
RCS file: /cvs/src/src/newlib/libc/stdlib/system.c,v
retrieving revision 1.6
diff -u -5 -p -r1.6 system.c
--- newlib/libc/stdlib/system.c	22 Oct 2001 16:40:26 -0000	1.6
+++ newlib/libc/stdlib/system.c	29 Apr 2002 21:43:03 -0000
@@ -67,11 +67,14 @@ static int do_system ();
 int
 _system_r (ptr, s)
      struct _reent *ptr;
      _CONST char *s;
 {
-#ifdef NO_EXEC
+#if defined(HAVE_SYSTEM)
+  return _system (s);
+  ptr = ptr;
+#elif defined(NO_EXEC)
   if (s == NULL)
     return 0;
   errno = ENOSYS;
   return -1;
 #else
Index: newlib/libc/sys/arm/syscalls.c
===================================================================
RCS file: /cvs/src/src/newlib/libc/sys/arm/syscalls.c,v
retrieving revision 1.5
diff -u -5 -p -r1.5 syscalls.c
--- newlib/libc/sys/arm/syscalls.c	12 Mar 2002 21:25:12 -0000	1.5
+++ newlib/libc/sys/arm/syscalls.c	29 Apr 2002 21:43:03 -0000
@@ -13,10 +13,12 @@
 #include <errno.h>
 #include <reent.h>
 #include "swi.h"
 
 /* Forward prototypes.  */
+int     _system     _PARAMS ((const char *));
+int     _rename     _PARAMS ((const char *, const char *));
 int     isatty		_PARAMS ((int));
 clock_t _times		_PARAMS ((struct tms *));
 int     _gettimeofday	_PARAMS ((struct timeval *, struct timezone *));
 void    _raise 		_PARAMS ((void));
 int     _unlink		_PARAMS ((void));
@@ -606,6 +608,22 @@ _times (struct tms * tp)
 int
 isatty (int fd)
 {
   return 1;
   fd = fd;
+}
+
+int
+_system (const char *s)
+{
+  if (s == NULL)
+    return 0;
+  errno = ENOSYS;
+  return -1;
+}
+
+int
+_rename (const char *oldpath, const char *newpath)
+{
+  errno = ENOSYS;
+  return -1;
 }
Index: libgloss/ChangeLog
===================================================================
RCS file: /cvs/src/src/libgloss/ChangeLog,v
retrieving revision 1.31
diff -u -5 -p -r1.31 ChangeLog
--- libgloss/ChangeLog	17 Apr 2002 19:10:37 -0000	1.31
+++ libgloss/ChangeLog	29 Apr 2002 21:43:04 -0000
@@ -1,5 +1,22 @@
+2002-04-22  Jonathan Larmour  <jlarmour@redhat.com>
+
+	* arm/syscall.h: New file. To define extra syscall values for RedBoot.
+
+	* arm/redboot-syscalls.c (_close): Fix setting of errno value.
+	(_lseek): Ditto.
+	(_open): Ditto.
+	(_write): Ditto.
+	(_read): Ditto.
+	(_rename): New function.
+	(_system): Ditto.
+	(_stat): Ditto.
+	(_unlink): Call a syscall for this now.
+	(isatty): Ditto.
+	(_fstat): Ditto.
+	(_gettimeofday): Ditto.
+
 2002-04-17  Joel Sherrill <joel@OARcorp.com>
 
 	* debug.h: Change mem_err to volatile to match definition in 
 	debug.c.
 
Index: libgloss/arm/redboot-syscalls.c
===================================================================
RCS file: /cvs/src/src/libgloss/arm/redboot-syscalls.c,v
retrieving revision 1.2
diff -u -5 -p -r1.2 redboot-syscalls.c
--- libgloss/arm/redboot-syscalls.c	24 Jan 2002 13:32:46 -0000	1.2
+++ libgloss/arm/redboot-syscalls.c	29 Apr 2002 21:43:05 -0000
@@ -36,12 +36,15 @@ static int __attribute__ ((naked)) __sys
 int
 _close(int fd)
 {
     int  err;
     err = __syscall(SYS_close, fd);
-    if (err)
-	errno = err;
+    if (err<0)
+      {
+        errno = -err;
+        return -1;
+      }
     return err;
 }
 
 
 void
@@ -51,15 +54,33 @@ _exit(int stat)
         __syscall(SYS_exit, stat);
 }
 
 
 int
+_stat (const char *filename, struct stat *st)
+{
+    int err;
+    err = __syscall(SYS_stat, filename, st);
+    if (err<0)
+      {
+        errno = -err;
+        return -1;
+      }
+    return err;
+}
+
+int
 _fstat (int file, struct stat *st)
 {
-    st->st_mode = S_IFCHR;
-    st->st_blksize = 4096;
-    return 0;
+    int err;
+    err = __syscall(SYS_fstat, file, st);
+    if (err<0)
+      {
+        errno = -err;
+        return -1;
+      }
+    return err;
 }
 
 int
 _getpid(void)
 {
@@ -68,18 +89,32 @@ _getpid(void)
 
 
 int
 _gettimeofday (void * tp, void * tzp)
 {
-    return 0;
+    int err;
+    err = __syscall(SYS_gettimeofday, tp, tzp);
+    if (err<0)
+      {
+        errno = -err;
+        return -1;
+      }
+    return err;
 }
 
 
 int
 isatty(int fd)
 {
-    return (1);
+    int err;
+    err = __syscall(SYS_isatty, fd);
+    if (err<0)
+      {
+        errno = -err;
+        return -1;
+      }
+    return err;
 }
 
 
 int
 _kill(int pid, int sig)
@@ -93,35 +128,44 @@ _kill(int pid, int sig)
 off_t
 _lseek(int fd, off_t offset, int whence)
 {
     int err;
     err = __syscall(SYS_lseek, fd, offset, whence);
-    if (err)
-	errno = err;
+    if (err<0)
+      {
+        errno = -err;
+        return (off_t)-1;
+      }
     return err;
 }
 
 
 int
 _open(const char *buf, int flags, int mode)
 {
     int err ;
     err = __syscall(SYS_open, buf, flags, mode);
-    if (err)
-	errno = err;
+    if (err<0)
+      {
+        errno = -err;
+        return -1;
+      }
     return err;
 }
 
 
 int
 _write(int fd, const char *buf, int nbytes)
 {
     int err;
 
     err = __syscall(SYS_write, fd, buf, nbytes);
-    if (err)
-	errno = err;
+    if (err<0)
+      {
+        errno = -err;
+        return -1;
+      }
     return err;
 }
 
 
 void
@@ -145,12 +189,15 @@ _raise (void)
 int
 _read(int fd, char *buf, int nbytes)
 {
     int err;
     err = __syscall(SYS_read, fd, buf, nbytes);
-    if (err)
-	errno = err;
+    if (err<0)
+      {
+        errno = -err;
+        return -1;
+      }
     return err;
 }
 
 
 extern char end[];                /* end is set in the linker command file */
@@ -188,17 +235,43 @@ _times(struct tms * tp)
     }
 
     return utime;
 }
 
+int
+_rename (const char *oldpath, const char *newpath)
+{
+    int err ;
+    err = __syscall(SYS_rename, oldpath, newpath);
+    if (err<0)
+      {
+        errno = -err;
+        return -1;
+      }
+    return err;
+}
 
 int
 _unlink (const char *pathname)
 {
-  return -1;
+    int err ;
+    err = __syscall(SYS_unlink, pathname);
+    if (err<0)
+      {
+        errno = -err;
+        return -1;
+      }
+    return err;
 }
 
+int
+_system (const char *command)
+{
+    int err ;
+    err = __syscall(SYS_system, command);
+    return err;
+}
 
 #define SYS_meminfo     1001
 
 void *
 __get_memtop(void)
Index: libgloss/arm/syscall.h
===================================================================
RCS file: libgloss/arm/syscall.h
diff -N libgloss/arm/syscall.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ libgloss/arm/syscall.h	29 Apr 2002 21:43:46 -0000
@@ -0,0 +1,54 @@
+/* General use syscall.h file.
+   The more ports that use this file, the simpler sim/common/nltvals.def
+   remains.  */
+
+#ifndef LIBGLOSS_SYSCALL_H
+#define LIBGLOSS_SYSCALL_H
+
+/* Note: This file may be included by assembler source.  */
+
+/* These should be as small as possible to allow a port to use a trap type
+   instruction, which the system call # as the trap (the d10v for instance
+   supports traps 0..31).  An alternative would be to define one trap for doing
+   system calls, and put the system call number in a register that is not used
+   for the normal calling sequence (so that you don't have to shift down the
+   arguments to add the system call number).  Obviously, if these system call
+   numbers are ever changed, all of the simulators and potentially user code
+   will need to be updated.  */
+
+/* There is no current need for the following: SYS_execv, SYS_creat, SYS_wait,
+   etc. etc.  Don't add them.  */
+
+/* These are required by the ANSI C part of newlib (excluding system() of
+   course).  */
+#define	SYS_exit	1
+#define	SYS_open	2
+#define	SYS_close	3
+#define	SYS_read	4
+#define	SYS_write	5
+#define	SYS_lseek	6
+#define	SYS_unlink	7
+#define	SYS_getpid	8
+#define	SYS_kill	9
+#define SYS_fstat       10
+/*#define SYS_sbrk	11 - not currently a system call, but reserved.  */
+
+/* ARGV support.  */
+#define SYS_argvlen	12
+#define SYS_argv	13
+
+/* These are extras added for one reason or another.  */
+#define SYS_chdir	 14
+#define SYS_stat	 15
+#define SYS_chmod 	 16
+#define SYS_utime 	 17
+#define SYS_time 	 18
+#define SYS_gettimeofday 19
+#define SYS_times	 20
+#define SYS_link	 21
+/* These are additional syscalls in RedBoot. */
+#define SYS_rename       3001
+#define SYS_isatty       3002
+#define SYS_system       3003
+
+#endif

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