Simplified VFS bindings.

git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@15791 27425a3e-05d8-49a3-a47f-9c15f0e5edd8
This commit is contained in:
Giovanni Di Sirio 2022-09-19 09:10:07 +00:00
parent c522aead9f
commit 9a75b5ff5a
3 changed files with 72 additions and 64 deletions

View File

@ -991,69 +991,93 @@ static void sb_fastc_get_frequency(struct port_extctx *ectxp) {
#if (SB_CFG_ENABLE_VFS == TRUE) || defined(__DOXYGEN__) #if (SB_CFG_ENABLE_VFS == TRUE) || defined(__DOXYGEN__)
static void sb_sysc_stdio(struct port_extctx *ectxp) { static void sb_sysc_stdio(struct port_extctx *ectxp) {
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
/* VFS support could be enabled but this specific sandbox could not have
one associated to it.*/
if (sbp->config->vfs_driver == NULL) {
ectxp->r0 = (uint32_t)CH_RET_ENOSYS;
return;
}
switch (ectxp->r0) { switch (ectxp->r0) {
case SB_POSIX_OPEN: case SB_POSIX_OPEN:
ectxp->r0 = (uint32_t)sb_posix_open((const char *)ectxp->r1, ectxp->r0 = (uint32_t)sb_posix_open(sbp,
(const char *)ectxp->r1,
(int)ectxp->r2); (int)ectxp->r2);
break; break;
case SB_POSIX_CLOSE: case SB_POSIX_CLOSE:
ectxp->r0 = (uint32_t)sb_posix_close((int)ectxp->r1); ectxp->r0 = (uint32_t)sb_posix_close(sbp,
(int)ectxp->r1);
break; break;
case SB_POSIX_DUP: case SB_POSIX_DUP:
ectxp->r0 = (uint32_t)sb_posix_dup((int)ectxp->r1); ectxp->r0 = (uint32_t)sb_posix_dup(sbp,
(int)ectxp->r1);
break; break;
case SB_POSIX_DUP2: case SB_POSIX_DUP2:
ectxp->r0 = (uint32_t)sb_posix_dup2((int)ectxp->r1, ectxp->r0 = (uint32_t)sb_posix_dup2(sbp,
(int)ectxp->r1,
(int)ectxp->r2); (int)ectxp->r2);
break; break;
case SB_POSIX_FSTAT: case SB_POSIX_FSTAT:
ectxp->r0 = (uint32_t)sb_posix_fstat((int)ectxp->r1, ectxp->r0 = (uint32_t)sb_posix_fstat(sbp,
(int)ectxp->r1,
(struct stat *)ectxp->r2); (struct stat *)ectxp->r2);
break; break;
case SB_POSIX_READ: case SB_POSIX_READ:
ectxp->r0 = (uint32_t)sb_posix_read((int)ectxp->r1, ectxp->r0 = (uint32_t)sb_posix_read(sbp,
(int)ectxp->r1,
(void *)ectxp->r2, (void *)ectxp->r2,
(size_t)ectxp->r3); (size_t)ectxp->r3);
break; break;
case SB_POSIX_WRITE: case SB_POSIX_WRITE:
ectxp->r0 = (uint32_t)sb_posix_write((int)ectxp->r1, ectxp->r0 = (uint32_t)sb_posix_write(sbp,
(int)ectxp->r1,
(const void *)ectxp->r2, (const void *)ectxp->r2,
(size_t)ectxp->r3); (size_t)ectxp->r3);
break; break;
case SB_POSIX_LSEEK: case SB_POSIX_LSEEK:
ectxp->r0 = (uint32_t)sb_posix_lseek((int)ectxp->r1, ectxp->r0 = (uint32_t)sb_posix_lseek(sbp,
(int)ectxp->r1,
(off_t)ectxp->r2, (off_t)ectxp->r2,
(int)ectxp->r3); (int)ectxp->r3);
break; break;
case SB_POSIX_GETDENTS: case SB_POSIX_GETDENTS:
ectxp->r0 = (uint32_t)sb_posix_getdents((int)ectxp->r1, ectxp->r0 = (uint32_t)sb_posix_getdents(sbp,
(int)ectxp->r1,
(void *)ectxp->r2, (void *)ectxp->r2,
(size_t)ectxp->r3); (size_t)ectxp->r3);
break; break;
case SB_POSIX_CHDIR: case SB_POSIX_CHDIR:
ectxp->r0 = (uint32_t)sb_posix_chdir((const char *)ectxp->r1); ectxp->r0 = (uint32_t)sb_posix_chdir(sbp,
(const char *)ectxp->r1);
break; break;
case SB_POSIX_GETCWD: case SB_POSIX_GETCWD:
ectxp->r0 = (uint32_t)sb_posix_getcwd((char *)ectxp->r1, ectxp->r0 = (uint32_t)sb_posix_getcwd(sbp,
(char *)ectxp->r1,
(size_t)ectxp->r2); (size_t)ectxp->r2);
break; break;
case SB_POSIX_UNLINK: case SB_POSIX_UNLINK:
ectxp->r0 = (uint32_t)sb_posix_unlink((const char *)ectxp->r1); ectxp->r0 = (uint32_t)sb_posix_unlink(sbp,
(const char *)ectxp->r1);
break; break;
case SB_POSIX_RENAME: case SB_POSIX_RENAME:
ectxp->r0 = (uint32_t)sb_posix_rename((const char *)ectxp->r1, ectxp->r0 = (uint32_t)sb_posix_rename(sbp,
(const char *)ectxp->r1,
(const char *)ectxp->r2); (const char *)ectxp->r2);
break; break;
case SB_POSIX_MKDIR: case SB_POSIX_MKDIR:
ectxp->r0 = (uint32_t)sb_posix_mkdir((const char *)ectxp->r1, ectxp->r0 = (uint32_t)sb_posix_mkdir(sbp,
(const char *)ectxp->r1,
(mode_t)ectxp->r2); (mode_t)ectxp->r2);
break; break;
case SB_POSIX_RMDIR: case SB_POSIX_RMDIR:
ectxp->r0 = (uint32_t)sb_posix_rmdir((const char *)ectxp->r1); ectxp->r0 = (uint32_t)sb_posix_rmdir(sbp,
(const char *)ectxp->r1);
break; break;
case SB_POSIX_STAT: case SB_POSIX_STAT:
ectxp->r0 = (uint32_t)sb_posix_stat((const char *)ectxp->r1, ectxp->r0 = (uint32_t)sb_posix_stat(sbp,
(const char *)ectxp->r1,
(struct stat *)ectxp->r2); (struct stat *)ectxp->r2);
break; break;
default: default:

View File

@ -70,8 +70,7 @@ static msg_t create_descriptor(sb_ioblock_t *iop,
/* Module exported functions. */ /* Module exported functions. */
/*===========================================================================*/ /*===========================================================================*/
int sb_posix_stat(const char *path, struct stat *statbuf) { int sb_posix_stat(sb_class_t *sbp, const char *path, struct stat *statbuf) {
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
msg_t ret; msg_t ret;
vfs_stat_t vstat; vfs_stat_t vstat;
@ -94,8 +93,7 @@ int sb_posix_stat(const char *path, struct stat *statbuf) {
return ret; return ret;
} }
int sb_posix_open(const char *path, int flags) { int sb_posix_open(sb_class_t *sbp, const char *path, int flags) {
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
vfs_node_c *np = NULL; vfs_node_c *np = NULL;
msg_t ret; msg_t ret;
@ -120,8 +118,7 @@ int sb_posix_open(const char *path, int flags) {
return (int)ret; return (int)ret;
} }
int sb_posix_close(int fd) { int sb_posix_close(sb_class_t *sbp, int fd) {
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
if (!sb_is_existing_descriptor(&sbp->io, fd)) { if (!sb_is_existing_descriptor(&sbp->io, fd)) {
return CH_RET_EBADF; return CH_RET_EBADF;
@ -133,8 +130,7 @@ int sb_posix_close(int fd) {
return CH_RET_SUCCESS; return CH_RET_SUCCESS;
} }
int sb_posix_dup(int fd) { int sb_posix_dup(sb_class_t *sbp, int fd) {
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
vfs_node_c *np; vfs_node_c *np;
msg_t ret; msg_t ret;
@ -156,8 +152,7 @@ int sb_posix_dup(int fd) {
return (int)ret; return (int)ret;
} }
int sb_posix_dup2(int oldfd, int newfd) { int sb_posix_dup2(sb_class_t *sbp, int oldfd, int newfd) {
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
if (!sb_is_existing_descriptor(&sbp->io, oldfd)) { if (!sb_is_existing_descriptor(&sbp->io, oldfd)) {
return CH_RET_EBADF; return CH_RET_EBADF;
@ -180,8 +175,7 @@ int sb_posix_dup2(int oldfd, int newfd) {
return (int)newfd; return (int)newfd;
} }
int sb_posix_fstat(int fd, struct stat *statbuf) { int sb_posix_fstat(sb_class_t *sbp, int fd, struct stat *statbuf) {
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
msg_t ret; msg_t ret;
vfs_stat_t vstat; vfs_stat_t vstat;
@ -204,8 +198,7 @@ int sb_posix_fstat(int fd, struct stat *statbuf) {
return ret; return ret;
} }
ssize_t sb_posix_read(int fd, void *buf, size_t count) { ssize_t sb_posix_read(sb_class_t *sbp, int fd, void *buf, size_t count) {
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
if (!sb_is_existing_descriptor(&sbp->io, fd)) { if (!sb_is_existing_descriptor(&sbp->io, fd)) {
return CH_RET_EBADF; return CH_RET_EBADF;
@ -226,8 +219,7 @@ ssize_t sb_posix_read(int fd, void *buf, size_t count) {
return vfsReadFile((vfs_file_node_c *)sbp->io.vfs_nodes[fd], buf, count); return vfsReadFile((vfs_file_node_c *)sbp->io.vfs_nodes[fd], buf, count);
} }
ssize_t sb_posix_write(int fd, const void *buf, size_t count) { ssize_t sb_posix_write(sb_class_t *sbp, int fd, const void *buf, size_t count) {
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
if (!sb_is_existing_descriptor(&sbp->io, fd)) { if (!sb_is_existing_descriptor(&sbp->io, fd)) {
return CH_RET_EBADF; return CH_RET_EBADF;
@ -248,8 +240,7 @@ ssize_t sb_posix_write(int fd, const void *buf, size_t count) {
return vfsWriteFile((vfs_file_node_c *)sbp->io.vfs_nodes[fd], buf, count); return vfsWriteFile((vfs_file_node_c *)sbp->io.vfs_nodes[fd], buf, count);
} }
off_t sb_posix_lseek(int fd, off_t offset, int whence) { off_t sb_posix_lseek(sb_class_t *sbp, int fd, off_t offset, int whence) {
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
if ((whence != SEEK_SET) || (whence == SEEK_CUR) || (whence != SEEK_END)) { if ((whence != SEEK_SET) || (whence == SEEK_CUR) || (whence != SEEK_END)) {
return CH_RET_EINVAL; return CH_RET_EINVAL;
@ -272,8 +263,7 @@ off_t sb_posix_lseek(int fd, off_t offset, int whence) {
whence);; whence);;
} }
ssize_t sb_posix_getdents(int fd, void *buf, size_t count) { ssize_t sb_posix_getdents(sb_class_t *sbp, int fd, void *buf, size_t count) {
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
vfs_shared_buffer_t *shbuf; vfs_shared_buffer_t *shbuf;
vfs_direntry_info_t *dip; vfs_direntry_info_t *dip;
msg_t ret; msg_t ret;
@ -324,8 +314,7 @@ ssize_t sb_posix_getdents(int fd, void *buf, size_t count) {
return (ssize_t)ret; return (ssize_t)ret;
} }
int sb_posix_chdir(const char *path) { int sb_posix_chdir(sb_class_t *sbp, const char *path) {
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
if (sb_check_string(sbp, (void *)path, VFS_CFG_PATHLEN_MAX + 1) == (size_t)0) { if (sb_check_string(sbp, (void *)path, VFS_CFG_PATHLEN_MAX + 1) == (size_t)0) {
return CH_RET_EFAULT; return CH_RET_EFAULT;
@ -334,8 +323,7 @@ int sb_posix_chdir(const char *path) {
return (int)vfsDrvChangeCurrentDirectory(sbp->config->vfs_driver, path); return (int)vfsDrvChangeCurrentDirectory(sbp->config->vfs_driver, path);
} }
int sb_posix_getcwd(char *buf, size_t size) { int sb_posix_getcwd(sb_class_t *sbp, char *buf, size_t size) {
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
if (!sb_is_valid_write_range(sbp, buf, size)) { if (!sb_is_valid_write_range(sbp, buf, size)) {
return CH_RET_EFAULT; return CH_RET_EFAULT;
@ -346,8 +334,7 @@ int sb_posix_getcwd(char *buf, size_t size) {
return vfsDrvGetCurrentDirectory(sbp->config->vfs_driver, buf, size); return vfsDrvGetCurrentDirectory(sbp->config->vfs_driver, buf, size);
} }
int sb_posix_unlink(const char *path) { int sb_posix_unlink(sb_class_t *sbp, const char *path) {
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
if (sb_check_string(sbp, (void *)path, VFS_CFG_PATHLEN_MAX + 1) == (size_t)0) { if (sb_check_string(sbp, (void *)path, VFS_CFG_PATHLEN_MAX + 1) == (size_t)0) {
return CH_RET_EFAULT; return CH_RET_EFAULT;
@ -356,8 +343,7 @@ int sb_posix_unlink(const char *path) {
return (int)vfsDrvUnlink(sbp->config->vfs_driver, path); return (int)vfsDrvUnlink(sbp->config->vfs_driver, path);
} }
int sb_posix_rename(const char *oldpath, const char *newpath) { int sb_posix_rename(sb_class_t *sbp, const char *oldpath, const char *newpath) {
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
if (sb_check_string(sbp, (void *)oldpath, VFS_CFG_PATHLEN_MAX + 1) == (size_t)0) { if (sb_check_string(sbp, (void *)oldpath, VFS_CFG_PATHLEN_MAX + 1) == (size_t)0) {
return CH_RET_EFAULT; return CH_RET_EFAULT;
@ -370,8 +356,7 @@ int sb_posix_rename(const char *oldpath, const char *newpath) {
return (int)vfsDrvRename(sbp->config->vfs_driver, oldpath, newpath); return (int)vfsDrvRename(sbp->config->vfs_driver, oldpath, newpath);
} }
int sb_posix_mkdir(const char *path, mode_t mode) { int sb_posix_mkdir(sb_class_t *sbp, const char *path, mode_t mode) {
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
if (sb_check_string(sbp, (void *)path, VFS_CFG_PATHLEN_MAX + 1) == (size_t)0) { if (sb_check_string(sbp, (void *)path, VFS_CFG_PATHLEN_MAX + 1) == (size_t)0) {
return CH_RET_EFAULT; return CH_RET_EFAULT;
@ -380,8 +365,7 @@ int sb_posix_mkdir(const char *path, mode_t mode) {
return (int)vfsDrvMkdir(sbp->config->vfs_driver, path, (vfs_mode_t)mode); return (int)vfsDrvMkdir(sbp->config->vfs_driver, path, (vfs_mode_t)mode);
} }
int sb_posix_rmdir(const char *path) { int sb_posix_rmdir(sb_class_t *sbp, const char *path) {
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
if (sb_check_string(sbp, (void *)path, VFS_CFG_PATHLEN_MAX + 1) == (size_t)0) { if (sb_check_string(sbp, (void *)path, VFS_CFG_PATHLEN_MAX + 1) == (size_t)0) {
return CH_RET_EFAULT; return CH_RET_EFAULT;

View File

@ -59,22 +59,22 @@
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
int sb_posix_open(const char *path, int flags); int sb_posix_open(sb_class_t *sbp, const char *path, int flags);
int sb_posix_close(int fd); int sb_posix_close(sb_class_t *sbp, int fd);
int sb_posix_dup(int fd); int sb_posix_dup(sb_class_t *sbp, int fd);
int sb_posix_dup2(int oldfd, int newfd); int sb_posix_dup2(sb_class_t *sbp, int oldfd, int newfd);
int sb_posix_fstat(int fd, struct stat *statbuf); int sb_posix_fstat(sb_class_t *sbp, int fd, struct stat *statbuf);
ssize_t sb_posix_read(int fd, void *buf, size_t count); ssize_t sb_posix_read(sb_class_t *sbp, int fd, void *buf, size_t count);
ssize_t sb_posix_write(int fd, const void *buf, size_t count); ssize_t sb_posix_write(sb_class_t *sbp, int fd, const void *buf, size_t count);
off_t sb_posix_lseek(int fd, off_t offset, int whence); off_t sb_posix_lseek(sb_class_t *sbp, int fd, off_t offset, int whence);
ssize_t sb_posix_getdents(int fd, void *buf, size_t count); ssize_t sb_posix_getdents(sb_class_t *sbp, int fd, void *buf, size_t count);
int sb_posix_chdir(const char *path); int sb_posix_chdir(sb_class_t *sbp, const char *path);
int sb_posix_getcwd(char *buf, size_t size); int sb_posix_getcwd(sb_class_t *sbp, char *buf, size_t size);
int sb_posix_unlink(const char *path); int sb_posix_unlink(sb_class_t *sbp, const char *path);
int sb_posix_rename(const char *oldpath, const char *newpath); int sb_posix_rename(sb_class_t *sbp, const char *oldpath, const char *newpath);
int sb_posix_mkdir(const char *path, mode_t mode); int sb_posix_mkdir(sb_class_t *sbp, const char *path, mode_t mode);
int sb_posix_rmdir(const char *path); int sb_posix_rmdir(sb_class_t *sbp, const char *path);
int sb_posix_stat(const char *path, struct stat *statbuf); int sb_posix_stat(sb_class_t *sbp, const char *path, struct stat *statbuf);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif