This is the mail archive of the
newlib@sources.redhat.com
mailing list for the newlib project.
[PATCH] Add extra syscalls for xscale
- From: Jonathan Larmour <jlarmour at redhat dot com>
- To: newlib at sources dot redhat dot com
- Date: Mon, 29 Apr 2002 23:08:36 +0100
- Subject: [PATCH] Add extra syscalls for xscale
- Organization: Red Hat UK Ltd.
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