[PATCH] Support regular file type in _swistat for ARM

Joe Ramsay Joe.Ramsay@arm.com
Thu Jun 4 09:53:26 GMT 2020


Hi!

Previously, the implementation of _swistat() for ARM assumed all files
to be of type character device. This change adds support for stat-ing
regular files. Tested with arm-none-eabi
---
libgloss/arm/syscalls.c | 43 +++++++++++++++++++++++++++++--------------
1 file changed, 29 insertions(+), 14 deletions(-)

diff --git a/libgloss/arm/syscalls.c b/libgloss/arm/syscalls.c
index fc394f9..b4bd329 100644
--- a/libgloss/arm/syscalls.c
+++ b/libgloss/arm/syscalls.c
@@ -728,33 +728,48 @@ _sbrk (ptrdiff_t incr)
int
 _swistat (int fd, struct stat * st)
{
-  struct fdent *pfd;
-  int res;
-
-  pfd = findslot (fd);
+  struct fdent *pfd = findslot (fd);
   if (pfd == NULL)
     {
       errno = EBADF;
       return -1;
     }

-  /* Always assume a character device,
-     with 1024 byte blocks. */
-  st->st_mode |= S_IFCHR;
-  st->st_blksize = 1024;
+  int isCharDevice, flen;
#ifdef ARM_RDI_MONITOR
-  res = checkerror (do_AngelSWI (AngelSWI_Reason_FLen, &pfd->handle));
+  isCharDevice = checkerror (do_AngelSWI (AngelSWI_Reason_IsTTY, &pfd->handle));
+  flen = checkerror (do_AngelSWI (AngelSWI_Reason_FLen, &pfd->handle));
#else
   asm ("mov r0, %2; swi %a1; mov %0, r0"
-       : "=r" (res)
+       : "=r" (isCharDevice)
+       : "i" (SWI_IsTTY), "r" (pfd->handle)
+       : "r0");
+  checkerror(isCharDevice);
+  asm ("mov r0, %2; swi %a1; mov %0, r0"
+       : "=r" (flen)
        : "i" (SWI_Flen), "r" (pfd->handle)
        : "r0");
-  checkerror (res);
+  checkerror(flen);
#endif
-  if (res == -1)
+
+  if (isCharDevice != 0 && isCharDevice != 1)
+    return error(-1);
+
+  if (flen == -1)
     return -1;
-  /* Return the file size. */
-  st->st_size = res;
+
+  st->st_size = flen;
+  /* Always assume 1024 byte blocks */
+  st->st_blksize = 1024;
+
+  if (isCharDevice)
+    st->st_mode |= S_IFCHR;
+  else
+    {
+      st->st_mode |= S_IFREG;
+      st->st_blocks = (flen + 1023) / 1024;
+    }
+
   return 0;
}

--
2.7.4



More information about the Newlib mailing list