Re: [PATCH] Support regular file type in _swistat for ARM

Jeff Johnston via Newlib <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <CAOox84tDn9+v-+V9hDbOKbxoDVusqKmXceXDv=Y8tJC=WJD+7g@mail.gmail.com>
cc'ing Richard.

On Thu, Jun 4, 2020 at 5:53 AM Joe Ramsay <[email protected]> wrote:

> 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
>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.