[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