4
0
mirror of git://sourceware.org/git/newlib-cygwin.git synced 2025-02-08 18:19:08 +08:00
Vladimir Isaev 6d5331054e arc: libgloss: Introduce hostlink interface
There is a special interface built in ARC simulators (such as
nSIM) called MetaWare hostlink IO which can be used to implement
system calls. This commit adds support for this interface to the
ARC port of libgloss.

Here is an example of using this interface:

    $ arc-elf32-gcc -mcpu=hs -specs=hl.specs main.c -o main
    $ nsimdrv -tcf $NSIM_HOME/etc/tcf/templates/hs48_full.tcf main
    Hello, World!

Signed-off-by: Vladimir Isaev <vvisaev@gmail.com>
2024-05-22 14:25:44 -04:00

96 lines
2.7 KiB
C

/*
* hl_fstat.c -- provide _fstat().
*
* Copyright (c) 2024 Synopsys Inc.
*
* The authors hereby grant permission to use, copy, modify, distribute,
* and license this software and its documentation for any purpose, provided
* that existing copyright notices are retained in all copies and that this
* notice is included verbatim in any distributions. No written agreement,
* license, or royalty fee is required for any of the authorized uses.
* Modifications to this software may be copyrighted by their authors
* and need not follow the licensing terms described here, provided that
* the new terms are clearly indicated on the first page of each file where
* they apply.
*
*/
#include <errno.h>
#include <stdarg.h>
#include <stdint.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include "hl_toolchain.h"
#include "hl_api.h"
/* Hostlink IO version of struct stat. */
struct _hl_stat {
uint32_t hl_dev; /* ID of device containing file. */
uint16_t hl_ino; /* inode number. */
uint16_t hl_mode; /* File type and access mode. */
int16_t hl_nlink; /* Number of hard links. */
int16_t hl_uid; /* Owner's UID. */
int16_t hl_gid; /* Owner's GID. */
uint8_t hl_pad[2]; /* Padding to match simulator struct. */
uint32_t hl_rdev; /* Device ID (if special file). */
int32_t hl_size; /* Size in bytes. */
int32_t hl_atime; /* Access time. */
int32_t hl_mtime; /* Modification time. */
int32_t hl_ctime; /* Creation time. */
} __packed;
/* Map Hostlink version of stat struct into newlib's one. */
static __always_inline void
_hl_fstat_map (const struct _hl_stat *hl_stat, struct stat *stat)
{
stat->st_dev = hl_stat->hl_dev;
stat->st_ino = hl_stat->hl_ino;
stat->st_mode = hl_stat->hl_mode;
stat->st_nlink = hl_stat->hl_nlink;
stat->st_uid = hl_stat->hl_uid;
stat->st_gid = hl_stat->hl_gid;
stat->st_rdev = hl_stat->hl_rdev;
stat->st_size = hl_stat->hl_size;
stat->st_atime = hl_stat->hl_atime;
stat->st_mtime = hl_stat->hl_mtime;
stat->st_ctime = hl_stat->hl_ctime;
}
/* Get host file info. Implements HL_GNUIO_EXT_FSTAT. */
static __always_inline int
_hl_fstat (int fd, struct stat *buf)
{
struct _hl_stat hl_stat;
int32_t ret;
uint32_t host_errno;
/* Special version of hostlink - retuned values are passed
* through inargs.
*/
host_errno = _user_hostlink (HL_GNUIO_EXT_VENDOR_ID, HL_GNUIO_EXT_FSTAT,
"iii",
(uint32_t) fd,
(uint32_t) &hl_stat,
(uint32_t) &ret);
if (ret < 0)
{
errno = host_errno;
return ret;
}
_hl_fstat_map (&hl_stat, buf);
_hl_delete ();
return ret;
}
int
_fstat (int fd, struct stat *buf)
{
return _hl_fstat (fd, buf);
}