aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libgloss/arm/crt0.S2
-rw-r--r--libgloss/arm/syscalls.c106
-rw-r--r--newlib/libc/sys/arm/arm.h2
-rw-r--r--newlib/libc/sys/arm/syscalls.c50
4 files changed, 82 insertions, 78 deletions
diff --git a/libgloss/arm/crt0.S b/libgloss/arm/crt0.S
index 3e740c6..8490bde 100644
--- a/libgloss/arm/crt0.S
+++ b/libgloss/arm/crt0.S
@@ -440,7 +440,7 @@ __change_mode:
beq .LC10
/* See whether we are scanning a string. */
- cmp r3, #'"'
+ cmp r3, #'\"'
#ifdef __thumb__
beq .LC20
cmp r3, #'\''
diff --git a/libgloss/arm/syscalls.c b/libgloss/arm/syscalls.c
index 3605e0f..fc394f9 100644
--- a/libgloss/arm/syscalls.c
+++ b/libgloss/arm/syscalls.c
@@ -18,30 +18,30 @@
#include "swi.h"
/* Forward prototypes. */
-int _system (const char *);
-int _rename (const char *, const char *);
-int _isatty (int);
+int _system (const char *);
+int _rename (const char *, const char *);
+int _isatty (int);
clock_t _times (struct tms *);
-int _gettimeofday (struct timeval *, void *);
-int _unlink (const char *);
-int _link (const char *, const char *);
-int _stat (const char *, struct stat *);
-int _fstat (int, struct stat *);
+int _gettimeofday (struct timeval *, void *);
+int _unlink (const char *);
+int _link (const char *, const char *);
+int _stat (const char *, struct stat *);
+int _fstat (int, struct stat *);
int _swistat (int fd, struct stat * st);
-void * _sbrk (ptrdiff_t);
-pid_t _getpid (void);
-int _close (int);
-clock_t _clock (void);
-int _swiclose (int);
-int _open (const char *, int, ...);
-int _swiopen (const char *, int);
-int _write (int, const void *, size_t);
-int _swiwrite (int, const void *, size_t);
-_off_t _lseek (int, _off_t, int);
-_off_t _swilseek (int, _off_t, int);
-int _read (int, void *, size_t);
-int _swiread (int, void *, size_t);
-void initialise_monitor_handles (void);
+void * _sbrk (ptrdiff_t);
+pid_t _getpid (void);
+int _close (int);
+clock_t _clock (void);
+int _swiclose (int);
+int _open (const char *, int, ...);
+int _swiopen (const char *, int);
+int _write (int, const void *, size_t);
+int _swiwrite (int, const void *, size_t);
+_off_t _lseek (int, _off_t, int);
+_off_t _swilseek (int, _off_t, int);
+int _read (int, void *, size_t);
+int _swiread (int, void *, size_t);
+void initialise_monitor_handles (void);
static int checkerror (int);
static int error (int);
@@ -143,7 +143,7 @@ initialise_monitor_handles (void)
int i;
/* Open the standard file descriptors by opening the special
- * teletype device, ":tt", read-only to obtain a descritpor for
+ * teletype device, ":tt", read-only to obtain a descriptor for
* standard input and write-only to obtain a descriptor for standard
* output. Finally, open ":tt" in append mode to obtain a descriptor
* for standard error. Since this is a write mode, most kernels will
@@ -154,7 +154,7 @@ initialise_monitor_handles (void)
#ifdef ARM_RDI_MONITOR
int volatile block[3];
-
+
block[0] = (int) ":tt";
block[2] = 3; /* length of filename */
block[1] = 0; /* mode "r" */
@@ -351,17 +351,15 @@ checkerror (int result)
len, is the length in bytes to read.
Returns the number of bytes *not* written. */
int
-_swiread (int fh,
- void * ptr,
- size_t len)
+_swiread (int fh, void * ptr, size_t len)
{
#ifdef ARM_RDI_MONITOR
int block[3];
-
+
block[0] = fh;
block[1] = (int) ptr;
block[2] = (int) len;
-
+
return checkerror (do_AngelSWI (AngelSWI_Reason_Read, block));
#else
register int r0 asm("r0");
@@ -381,9 +379,7 @@ _swiread (int fh,
Translates the return of _swiread into
bytes read. */
int __attribute__((weak))
-_read (int fd,
- void * ptr,
- size_t len)
+_read (int fd, void * ptr, size_t len)
{
int res;
struct fdent *pfd;
@@ -409,9 +405,7 @@ _read (int fd,
/* fd, is a user file descriptor. */
off_t
-_swilseek (int fd,
- off_t ptr,
- int dir)
+_swilseek (int fd, off_t ptr, int dir)
{
off_t res;
struct fdent *pfd;
@@ -447,7 +441,7 @@ _swilseek (int fd,
}
dir = SEEK_SET;
}
-
+
#ifdef ARM_RDI_MONITOR
int block[2];
if (dir == SEEK_END)
@@ -458,7 +452,7 @@ _swilseek (int fd,
return -1;
ptr += res;
}
-
+
/* This code only does absolute seeks. */
block[0] = pfd->handle;
block[1] = (int) ptr;
@@ -494,9 +488,7 @@ _swilseek (int fd,
}
off_t
-_lseek (int fd,
- off_t ptr,
- int dir)
+_lseek (int fd, off_t ptr, int dir)
{
return _swilseek (fd, ptr, dir);
}
@@ -504,18 +496,15 @@ _lseek (int fd,
/* fh, is a valid internal file handle.
Returns the number of bytes *not* written. */
int
-_swiwrite (
- int fh,
- const void * ptr,
- size_t len)
+_swiwrite (int fh, const void * ptr, size_t len)
{
#ifdef ARM_RDI_MONITOR
int block[3];
-
+
block[0] = fh;
block[1] = (int) ptr;
block[2] = (int) len;
-
+
return checkerror (do_AngelSWI (AngelSWI_Reason_Write, block));
#else
register int r0 asm("r0");
@@ -533,9 +522,7 @@ _swiwrite (
/* fd, is a user file descriptor. */
int __attribute__((weak))
-_write (int fd,
- const void * ptr,
- size_t len)
+_write (int fd, const void * ptr, size_t len)
{
int res;
struct fdent *pfd;
@@ -593,7 +580,7 @@ _swiopen (const char * path, int flags)
}
}
- /* The flags are Unix-style, so we need to convert them. */
+ /* The flags are Unix-style, so we need to convert them. */
#ifdef O_BINARY
if (flags & O_BINARY)
aflags |= 1;
@@ -611,25 +598,24 @@ _swiopen (const char * path, int flags)
if (flags & O_APPEND)
{
- /* Can't ask for w AND a; means just 'a'. */
- aflags &= ~4;
+ aflags &= ~4; /* Can't ask for w AND a; means just 'a'. */
aflags |= 8;
}
-
+
#ifdef ARM_RDI_MONITOR
block[0] = (int) path;
block[2] = strlen (path);
block[1] = aflags;
-
+
fh = do_AngelSWI (AngelSWI_Reason_Open, block);
-
+
#else
asm ("mov r0,%2; mov r1, %3; swi %a1; mov %0, r0"
: "=r"(fh)
: "i" (SWI_Open),"r"(path),"r"(aflags)
: "r0","r1");
#endif
-
+
/* Return a user file descriptor or an error. */
if (fh >= 0)
{
@@ -784,13 +770,13 @@ _stat (const char *fname, struct stat *st)
{
int fd, res;
memset (st, 0, sizeof (* st));
- /* The best we can do is try to open the file readonly.
- If it exists, then we can guess a few things about it. */
+ /* The best we can do is try to open the file readonly. If it exists,
+ then we can guess a few things about it. */
if ((fd = _open (fname, O_RDONLY)) == -1)
return -1;
st->st_mode |= S_IFREG | S_IREAD;
res = _swistat (fd, st);
- /* Not interested in the error. */
+ /* Not interested in the error. */
_close (fd);
return res;
}
@@ -880,7 +866,7 @@ _times (struct tms * tp)
tp->tms_cutime = 0; /* user time, children */
tp->tms_cstime = 0; /* system time, children */
}
-
+
return timeval;
};
diff --git a/newlib/libc/sys/arm/arm.h b/newlib/libc/sys/arm/arm.h
index dbed817..10e5b05 100644
--- a/newlib/libc/sys/arm/arm.h
+++ b/newlib/libc/sys/arm/arm.h
@@ -85,6 +85,6 @@
#define CPSR_F_MASK 0x40 /* FIQ bit. */
#define CPSR_I_MASK 0x80 /* IRQ bit. */
-#define CPSR_M_MASK 0x0F /* Mode mask except M[4] */
+#define CPSR_M_MASK 0x0F /* Mode mask except M[4]. */
#endif /* _LIBGLOSS_ARM_H */
diff --git a/newlib/libc/sys/arm/syscalls.c b/newlib/libc/sys/arm/syscalls.c
index a2997b4..1f72229 100644
--- a/newlib/libc/sys/arm/syscalls.c
+++ b/newlib/libc/sys/arm/syscalls.c
@@ -114,6 +114,16 @@ void
initialise_monitor_handles (void)
{
int i;
+
+ /* Open the standard file descriptors by opening the special
+ * teletype device, ":tt", read-only to obtain a descriptor for
+ * standard input and write-only to obtain a descriptor for standard
+ * output. Finally, open ":tt" in append mode to obtain a descriptor
+ * for standard error. Since this is a write mode, most kernels will
+ * probably return the same value as for standard output, but the
+ * kernel can differentiate the two using the mode flag and return a
+ * different descriptor for standard error.
+ */
#ifdef ARM_RDI_MONITOR
int volatile block[3];
@@ -163,11 +173,12 @@ get_errno (void)
return do_AngelSWI (AngelSWI_Reason_Errno, NULL);
#else
register int r0 asm("r0");
- asm ("swi %a1" : "=r"(r0): "i" (SWI_GetErrno));
+ asm ("swi %a1" : "=r"(r0) : "i" (SWI_GetErrno));
return r0;
#endif
}
+/* Set errno and return result. */
static int
error (int result)
{
@@ -183,7 +194,10 @@ wrap (int result)
return result;
}
-/* Returns # chars not! written. */
+/* file, is a valid user file handle.
+ ptr, is a null terminated string.
+ len, is the length in bytes to read.
+ Returns the number of bytes *not* written. */
int
_swiread (int file, void * ptr, size_t len)
{
@@ -207,6 +221,9 @@ _swiread (int file, void * ptr, size_t len)
#endif
}
+/* file, is a valid user file handle.
+ Translates the return of _swiread into
+ bytes read. */
int __attribute__((weak))
_read (int file, void * ptr, size_t len)
{
@@ -223,15 +240,13 @@ _read (int file, void * ptr, size_t len)
return len - x;
}
+/* file, is a user file descriptor. */
off_t
_swilseek (int file, off_t ptr, int dir)
{
_off_t res;
int fh = remap_handle (file);
int slot = findslot (fh);
-#ifdef ARM_RDI_MONITOR
- int block[2];
-#endif
if (dir == SEEK_CUR)
{
@@ -249,6 +264,7 @@ _swilseek (int file, off_t ptr, int dir)
}
#ifdef ARM_RDI_MONITOR
+ int block[2];
if (dir == SEEK_END)
{
block[0] = fh;
@@ -294,7 +310,8 @@ _lseek (int file, off_t ptr, int dir)
return wrap (_swilseek (file, ptr, dir));
}
-/* Returns #chars not! written. */
+/* file, is a valid internal file handle.
+ Returns the number of bytes *not* written. */
int
_swiwrite (int file, const void * ptr, size_t len)
{
@@ -319,6 +336,7 @@ _swiwrite (int file, const void * ptr, size_t len)
#endif
}
+/* file, is a user file descriptor. */
int __attribute__((weak))
_write (int file, const void * ptr, size_t len)
{
@@ -366,7 +384,7 @@ _swiopen (const char * path, int flags)
if (flags & O_APPEND)
{
- aflags &= ~4; /* Can't ask for w AND a; means just 'a'. */
+ aflags &= ~4; /* Can't ask for w AND a; means just 'a'. */
aflags |= 8;
}
@@ -527,7 +545,7 @@ _sbrk (ptrdiff_t incr)
extern void memset (struct stat *, int, unsigned int);
-int
+int __attribute__((weak))
_fstat (int file, struct stat * st)
{
memset (st, 0, sizeof (* st));
@@ -537,7 +555,8 @@ _fstat (int file, struct stat * st)
file = file;
}
-int _stat (const char *fname, struct stat *st)
+int __attribute__((weak))
+_stat (const char *fname, struct stat *st)
{
int file;
@@ -553,20 +572,19 @@ int _stat (const char *fname, struct stat *st)
return 0;
}
-int
-_link (const char *__path1 __attribute__ ((unused)),
- const char *__path2 __attribute__ ((unused)))
+int __attribute__((weak))
+_link (const char *__path1 __attribute__ ((unused)), const char *__path2 __attribute__ ((unused)))
{
errno = ENOSYS;
return -1;
}
int
-_unlink (const char *path __attribute__ ((unused)))
+_unlink (const char *path)
{
#ifdef ARM_RDI_MONITOR
int block[2];
- block[0] = (int) path;
+ block[0] = (int)path;
block[1] = strlen(path);
return wrap (do_AngelSWI (AngelSWI_Reason_Remove, block)) ? -1 : 0;
#else
@@ -659,13 +677,13 @@ _system (const char *s)
meaning to its return value. Try to do something reasonable.... */
if (!s)
return 1; /* maybe there is a shell available? we can hope. :-P */
- block[0] = (int) s;
+ block[0] = (int)s;
block[1] = strlen (s);
e = wrap (do_AngelSWI (AngelSWI_Reason_System, block));
if ((e >= 0) && (e < 256))
{
/* We have to convert e, an exit status to the encoded status of
- the command. To avoid hard coding the exit status, we simply
+ the command. To avoid hard coding the exit status, we simply
loop until we find the right position. */
int exit_code;