diff --git a/newlib/libc/sys/arm/syscalls.c b/newlib/libc/sys/arm/syscalls.c
index 68f1185..e0cf0ac 100644
--- a/newlib/libc/sys/arm/syscalls.c
+++ b/newlib/libc/sys/arm/syscalls.c
@@ -18,37 +18,37 @@
 #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 *);
-void    _raise 		(void);
-int     _unlink		(const char *);
-int     _link 		(void);
-int     _stat 		(const char *, struct stat *);
-int     _fstat 		(int, struct stat *);
-caddr_t _sbrk		(int);
-int     _getpid		(int);
-int     _kill		(int, int);
-void    _exit		(int);
-int     _close		(int);
-int     _swiclose	(int);
-int     _open		(const char *, int, ...);
-int     _swiopen	(const char *, int);
-int     _write 		(int, char *, int);
-int     _swiwrite	(int, char *, int);
-int     _lseek		(int, int, int);
-int     _swilseek	(int, int, int);
-int     _read		(int, char *, int);
-int     _swiread	(int, char *, int);
-void    initialise_monitor_handles (void);
+int	_gettimeofday	(struct timeval *, void *);
+void	_raise		(void);
+int	_unlink		(const char *);
+int	_link		(const char *, const char *);
+int	_stat		(const char *, struct stat *);
+int	_fstat		(int, struct stat *);
+void *	_sbrk		(ptrdiff_t);
+pid_t	_getpid		(void);
+int	_kill		(int, int);
+void	_exit		(int);
+int	_close		(int);
+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	wrap		(int);
 static int	error		(int);
 static int	get_errno	(void);
 static int	remap_handle	(int);
-static int 	findslot	(int);
+static int	findslot	(int);
 
 /* Register name faking - works in collusion with the linker.  */
 register char * stack_ptr asm ("sp");
@@ -113,10 +113,10 @@ void
 initialise_monitor_handles (void)
 {
   int i;
-  
+
 #ifdef ARM_RDI_MONITOR
   int volatile block[3];
-  
+
   block[0] = (int) ":tt";
   block[2] = 3;     /* length of filename */
   block[1] = 0;     /* mode "r" */
@@ -125,7 +125,8 @@ initialise_monitor_handles (void)
   block[0] = (int) ":tt";
   block[2] = 3;     /* length of filename */
   block[1] = 4;     /* mode "w" */
-  monitor_stdout = monitor_stderr = do_AngelSWI (AngelSWI_Reason_Open, (void *) block);
+  monitor_stdout = monitor_stderr
+    = do_AngelSWI (AngelSWI_Reason_Open, (void *) block);
 #else
   int fh;
   const char * name;
@@ -160,7 +161,9 @@ get_errno (void)
 #ifdef ARM_RDI_MONITOR
   return do_AngelSWI (AngelSWI_Reason_Errno, NULL);
 #else
-  asm ("swi %a0" :: "i" (SWI_GetErrno));
+  register int r0 asm("r0");
+  asm ("swi %a1" : "=r"(r0): "i" (SWI_GetErrno));
+  return r0;
 #endif
 }
 
@@ -181,31 +184,30 @@ wrap (int result)
 
 /* Returns # chars not! written.  */
 int
-_swiread (int file,
-	  char * ptr,
-	  int len)
+_swiread (int file, void * ptr, size_t len)
 {
   int fh = remap_handle (file);
 #ifdef ARM_RDI_MONITOR
   int block[3];
-  
+
   block[0] = fh;
   block[1] = (int) ptr;
-  block[2] = len;
-  
+  block[2] = (int) len;
+
   return do_AngelSWI (AngelSWI_Reason_Read, block);
 #else
-  asm ("mov r0, %1; mov r1, %2;mov r2, %3; swi %a0"
-       : /* No outputs */
-       : "i"(SWI_Read), "r"(fh), "r"(ptr), "r"(len)
-       : "r0","r1","r2");
+  register int r0 asm("r0") = fh;
+  register int r1 asm("r1") = (int) ptr;
+  register int r2 asm("r2") = (int) len;
+  asm ("swi %a4"
+       : "=r" (r0)
+       : "0"(r0), "r"(r1), "r"(r2), "i"(SWI_Read));
+  return r0;
 #endif
 }
 
 int __attribute__((weak))
-_read (int file,
-       char * ptr,
-       int len)
+_read (int file, void * ptr, size_t len)
 {
   int slot = findslot (remap_handle (file));
   int x = _swiread (file, ptr, len);
@@ -220,12 +222,10 @@ _read (int file,
   return len - x;
 }
 
-int
-_swilseek (int file,
-	   int ptr,
-	   int dir)
+off_t
+_swilseek (int file, off_t ptr, int dir)
 {
-  int res;
+  _off_t res;
   int fh = remap_handle (file);
   int slot = findslot (fh);
 #ifdef ARM_RDI_MONITOR
@@ -239,33 +239,38 @@ _swilseek (int file,
       ptr = openfiles[slot].pos + ptr;
       dir = SEEK_SET;
     }
-  
+
 #ifdef ARM_RDI_MONITOR
   if (dir == SEEK_END)
     {
       block[0] = fh;
       ptr += do_AngelSWI (AngelSWI_Reason_FLen, block);
     }
-  
+
   /* This code only does absolute seeks.  */
   block[0] = remap_handle (file);
   block[1] = ptr;
   res = do_AngelSWI (AngelSWI_Reason_Seek, block);
 #else
+  register int r0 asm("r0");
+  register int r1 asm("r1");
   if (dir == SEEK_END)
     {
-      asm ("mov r0, %2; swi %a1; mov %0, r0"
-	   : "=r" (res)
-	   : "i" (SWI_Flen), "r" (fh)
-	   : "r0");
+      r0 = (int) fh;
+      asm ("swi %a2"
+	   : "=r" (r0)
+	   : "0"(r0), "i" (SWI_Flen));
+      res = r0;
       ptr += res;
     }
 
   /* This code only does absolute seeks.  */
-  asm ("mov r0, %2; mov r1, %3; swi %a1; mov %0, r0"
-       : "=r" (res)
-       : "i" (SWI_Seek), "r" (fh), "r" (ptr)
-       : "r0", "r1");
+  r0 = (int) fh;
+  r1 = (int) ptr;
+  asm ("swi %a3"
+       : "=r" (r0)
+       : "0"(r0), "r"(r1), "i" (SWI_Seek));
+  res = r0;
 #endif
 
   if (slot != MAX_OPEN_FILES && res == 0)
@@ -275,68 +280,64 @@ _swilseek (int file,
   return res == 0 ? ptr : -1;
 }
 
-int
-_lseek (int file,
-	int ptr,
-	int dir)
+off_t
+_lseek (int file, off_t ptr, int dir)
 {
   return wrap (_swilseek (file, ptr, dir));
 }
 
 /* Returns #chars not! written.  */
 int
-_swiwrite (
-	   int    file,
-	   char * ptr,
-	   int    len)
+_swiwrite (int file, const void * ptr, size_t len)
 {
   int fh = remap_handle (file);
 #ifdef ARM_RDI_MONITOR
   int block[3];
-  
+
   block[0] = fh;
   block[1] = (int) ptr;
-  block[2] = len;
-  
+  block[2] = (int) len;
+
   return do_AngelSWI (AngelSWI_Reason_Write, block);
 #else
-  asm ("mov r0, %1; mov r1, %2;mov r2, %3; swi %a0"
-       : /* No outputs */
-       : "i"(SWI_Write), "r"(fh), "r"(ptr), "r"(len)
-       : "r0","r1","r2");
+  register int r0 asm("r0") = fh;
+  register int r1 asm("r1") = (int) ptr;
+  register int r2 asm("r2") = (int) len;
+
+  asm ("swi %a4"
+       : "=r" (r0)
+       : "0"(fh), "r"(r1), "r"(r2), "i"(SWI_Write));
+  return r0;
 #endif
 }
 
 int __attribute__((weak))
-_write (int    file,
-	char * ptr,
-	int    len)
+_write (int file, const void * ptr, size_t len)
 {
   int slot = findslot (remap_handle (file));
-  int x = _swiwrite (file, ptr,len);
+  int x = _swiwrite (file, ptr, len);
 
   if (x == -1 || x == len)
     return error (-1);
-  
+
   if (slot != MAX_OPEN_FILES)
     openfiles[slot].pos += len - x;
-  
+
   return len - x;
 }
 
 extern int strlen (const char *);
 
 int
-_swiopen (const char * path,
-	  int          flags)
+_swiopen (const char * path, int flags)
 {
   int aflags = 0, fh;
 #ifdef ARM_RDI_MONITOR
   int block[3];
 #endif
-  
+
   int i = findslot (-1);
-  
+
   if (i == MAX_OPEN_FILES)
     return -1;
 
@@ -360,21 +361,23 @@ _swiopen (const char * path,
       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");
+  register int r0 asm("r0") = (int) path;
+  register int r1 asm("r1") = (int) aflags;;
+  asm ("swi %a3"
+       : "=r"(r0)
+       : "0"(r0), "r"(r1), "i" (SWI_Open));
+  fh = r0;
 #endif
-  
+
   if (fh >= 0)
     {
       openfiles[i].handle = fh;
@@ -385,9 +388,7 @@ _swiopen (const char * path,
 }
 
 int
-_open (const char * path,
-       int          flags,
-       ...)
+_open (const char * path, int flags, ...)
 {
   return wrap (_swiopen (path, flags));
 }
@@ -397,14 +398,16 @@ _swiclose (int file)
 {
   int myhan = remap_handle (file);
   int slot = findslot (myhan);
-  
+
   if (slot != MAX_OPEN_FILES)
     openfiles[slot].handle = -1;
 
 #ifdef ARM_RDI_MONITOR
   return do_AngelSWI (AngelSWI_Reason_Close, & myhan);
 #else
-  asm ("mov r0, %1; swi %a0" :: "i" (SWI_Close),"r"(myhan):"r0");
+  register int r0 asm("r0") = myhan;
+  asm ("swi %a2" : "=r"(r0): "0"(r0), "i" (SWI_Close));
+  return r0;
 #endif
 }
 
@@ -444,15 +447,14 @@ _exit (int status)
   _kill(status, -1);
 }
 
-int
-_getpid (int n)
+pid_t
+_getpid (void)
 {
-  return 1;
-  n = n;
+  return (pid_t)1;
 }
 
-caddr_t __attribute__((weak))
-_sbrk (int incr)
+void * __attribute__((weak))
+_sbrk (ptrdiff_t incr)
 {
   extern char   end asm ("end");	/* Defined by the linker.  */
   static char * heap_end;
@@ -460,9 +462,9 @@ _sbrk (int incr)
 
   if (heap_end == NULL)
     heap_end = & end;
-  
+
   prev_heap_end = heap_end;
-  
+
   if (heap_end + incr > stack_ptr)
     {
       /* Some of the libstdc++-v3 tests rely upon detecting
@@ -471,17 +473,17 @@ _sbrk (int incr)
       extern void abort (void);
 
       _write (1, "_sbrk: Heap and stack collision\n", 32);
-      
+
       abort ();
 #else
       errno = ENOMEM;
-      return (caddr_t) -1;
+      return (void *) -1;
 #endif
     }
-  
+
   heap_end += incr;
 
-  return (caddr_t) prev_heap_end;
+  return (void *) prev_heap_end;
 }
 
 extern void memset (struct stat *, int, unsigned int);
@@ -513,20 +515,23 @@ int _stat (const char *fname, struct stat *st)
 }
 
 int
-_link (void)
+_link (const char *__path1 __attribute__ ((unused)),
+       const char *__path2 __attribute__ ((unused)))
 {
+  errno = ENOSYS;
   return -1;
 }
 
 int
-_unlink (const char *path)
+_unlink (const char *path __attribute__ ((unused)))
 {
 #ifdef ARM_RDI_MONITOR
   int block[2];
   block[0] = path;
   block[1] = strlen(path);
   return wrap (do_AngelSWI (AngelSWI_Reason_Remove, block)) ? -1 : 0;
-#else  
+#else
+  errno = ENOSYS;
   return -1;
 #endif
 }
@@ -548,9 +553,9 @@ _gettimeofday (struct timeval * tp, void * tzvp)
       tp->tv_sec = do_AngelSWI (AngelSWI_Reason_Time,NULL);
 #else
       {
-        int value;
-        asm ("swi %a1; mov %0, r0" : "=r" (value): "i" (SWI_Time) : "r0");
-        tp->tv_sec = value;
+	register int r0 asm("r0");
+	asm ("swi %a1" : "=r" (r0): "i" (SWI_Time));
+	tp->tv_sec = r0;
       }
 #endif
       tp->tv_usec = 0;
@@ -567,15 +572,17 @@ _gettimeofday (struct timeval * tp, void * tzvp)
 }
 
 /* Return a clock that ticks at 100Hz.  */
-clock_t 
+clock_t
 _times (struct tms * tp)
 {
   clock_t timeval;
 
 #ifdef ARM_RDI_MONITOR
-  timeval = do_AngelSWI (AngelSWI_Reason_Clock,NULL);
+  timeval = do_AngelSWI (AngelSWI_Reason_Clock, NULL);
 #else
-  asm ("swi %a1; mov %0, r0" : "=r" (timeval): "i" (SWI_Clock) : "r0");
+  register int r0 asm("r0");
+  asm ("swi %a1" : "=r" (r0): "i" (SWI_Clock));
+  timeval = (clock_t) r0;
 #endif
 
   if (tp)
@@ -585,7 +592,7 @@ _times (struct tms * tp)
       tp->tms_cutime = 0;	/* user time, children */
       tp->tms_cstime = 0;	/* system time, children */
     }
-  
+
   return timeval;
 };
 
@@ -619,7 +626,7 @@ _system (const char *s)
   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;
 
@@ -645,7 +652,7 @@ _rename (const char * oldpath, const char * newpath)
   block[2] = newpath;
   block[3] = strlen(newpath);
   return wrap (do_AngelSWI (AngelSWI_Reason_Rename, block)) ? -1 : 0;
-#else  
+#else
   errno = ENOSYS;
   return -1;
 #endif
