[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Minios-devel] [UNIKRAFT PATCH v3 22/23] lib/vfscore: re-implement stdio and enable new code



Signed-off-by: Yuri Volchkov <yuri.volchkov@xxxxxxxxx>
---
 lib/vfscore/Config.uk              |  1 +
 lib/vfscore/Makefile.uk            |  9 ++++
 lib/vfscore/exportsyms.uk          | 27 +++++++++++
 lib/vfscore/file.c                 | 61 +------------------------
 lib/vfscore/include/vfscore/file.h |  2 +-
 lib/vfscore/stdio.c                | 73 +++++++++++++++++++-----------
 6 files changed, 85 insertions(+), 88 deletions(-)

diff --git a/lib/vfscore/Config.uk b/lib/vfscore/Config.uk
index 49d6daa1..6cf6c63a 100644
--- a/lib/vfscore/Config.uk
+++ b/lib/vfscore/Config.uk
@@ -3,3 +3,4 @@ config LIBVFSCORE
        default n
        select LIBNOLIBC if !HAVE_LIBC
        select LIBUKDEBUG
+       select LIBUKLOCK
diff --git a/lib/vfscore/Makefile.uk b/lib/vfscore/Makefile.uk
index 06933d96..1fd35858 100644
--- a/lib/vfscore/Makefile.uk
+++ b/lib/vfscore/Makefile.uk
@@ -5,5 +5,14 @@ CINCLUDES-y += -I$(LIBVFSCORE_BASE)/include
 LIBVFSCORE_SRCS-y += $(LIBVFSCORE_BASE)/fd.c
 LIBVFSCORE_SRCS-y += $(LIBVFSCORE_BASE)/file.c
 LIBVFSCORE_SRCS-y += $(LIBVFSCORE_BASE)/stdio.c
+LIBVFSCORE_SRCS-y += $(LIBVFSCORE_BASE)/mount.c
+LIBVFSCORE_SRCS-y += $(LIBVFSCORE_BASE)/vnode.c
+LIBVFSCORE_SRCS-y += $(LIBVFSCORE_BASE)/dentry.c
+LIBVFSCORE_SRCS-y += $(LIBVFSCORE_BASE)/syscalls.c
+LIBVFSCORE_SRCS-y += $(LIBVFSCORE_BASE)/main.c
+LIBVFSCORE_SRCS-y += $(LIBVFSCORE_BASE)/task.c
+LIBVFSCORE_SRCS-y += $(LIBVFSCORE_BASE)/lookup.c
+LIBVFSCORE_SRCS-y += $(LIBVFSCORE_BASE)/fops.c
+LIBVFSCORE_SRCS-y += $(LIBVFSCORE_BASE)/subr_uio.c
 
 EXTRA_LD_SCRIPT-$(CONFIG_LIBVFSCORE) += $(LIBVFSCORE_BASE)/extra.ld
\ No newline at end of file
diff --git a/lib/vfscore/exportsyms.uk b/lib/vfscore/exportsyms.uk
index 9e229a11..5438a64c 100644
--- a/lib/vfscore/exportsyms.uk
+++ b/lib/vfscore/exportsyms.uk
@@ -5,3 +5,30 @@ vfscore_get_file
 close
 write
 read
+sys_mount
+vfscore_nullop
+vfscore_release_mp_dentries
+vfscore_vget
+vfscore_uiomove
+vfscore_vop_nullop
+vfscore_vop_einval
+vfscore_vop_eperm
+vfscore_vop_erofs
+open
+write
+close
+read
+mkdir
+fsync
+fstat
+stat
+chmod
+dup
+dup2
+dup3
+vfscore_uiomove
+sys_sync
+vfscore_mount_dump
+sys_umount
+sys_umount2
+unlink
diff --git a/lib/vfscore/file.c b/lib/vfscore/file.c
index 0f6dfa93..e56f16dc 100644
--- a/lib/vfscore/file.c
+++ b/lib/vfscore/file.c
@@ -38,66 +38,7 @@
 #include <uk/print.h>
 #include <vfscore/file.h>
 #include <uk/assert.h>
-#include <uk/arch/atomic.h>
-
-int close(int fd)
-{
-       struct vfscore_file *file = vfscore_get_file(fd);
-
-       if (!file) {
-               uk_pr_warn("no such file descriptor: %d\n", fd);
-               errno = EBADF;
-               return -1;
-       }
-
-       if (!file->fops->close) {
-               errno = EIO;
-               return -1;
-       }
-
-       return file->fops->close(file);
-}
-
-ssize_t write(int fd, const void *buf, size_t count)
-{
-       struct vfscore_file *file = vfscore_get_file(fd);
-
-       if (!file) {
-               uk_pr_warn("no such file descriptor: %d\n", fd);
-               errno = EBADF;
-               return -1;
-       }
-
-       if (!file->fops->write) {
-               uk_pr_warn("file does not have write op: %d\n", fd);
-               errno = EINVAL;
-               return -1;
-       }
-
-       return file->fops->write(file, buf, count);
-}
-
-ssize_t read(int fd, void *buf, size_t count)
-{
-       struct vfscore_file *file = vfscore_get_file(fd);
-
-       if (!file) {
-               uk_pr_warn("no such file descriptor: %d\n", fd);
-               errno = EBADF;
-               return -1;
-       }
-
-       if (!file->fops->read) {
-               uk_pr_warn("file does not have read op: %d\n", fd);
-               errno = EINVAL;
-               return -1;
-       }
-
-       return file->fops->read(file, buf, count);
-}
-
-/* TODO: remove stub */
-#define vfs_close(fp) (0)
+#include "vfs.h"
 
 int fdrop(struct vfscore_file *fp)
 {
diff --git a/lib/vfscore/include/vfscore/file.h 
b/lib/vfscore/include/vfscore/file.h
index b7320cc1..7f45ca78 100644
--- a/lib/vfscore/include/vfscore/file.h
+++ b/lib/vfscore/include/vfscore/file.h
@@ -38,6 +38,7 @@
 
 #include <stdint.h>
 #include <sys/types.h>
+#include <vfscore/dentry.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -58,7 +59,6 @@ struct vfscore_file {
        off_t           f_offset;       /* current position in file */
        void            *f_data;        /* file descriptor specific data */
        struct dentry   *f_dentry;
-       const struct vfscore_fops *fops;
 };
 
 int vfscore_alloc_fd(void);
diff --git a/lib/vfscore/stdio.c b/lib/vfscore/stdio.c
index a9bdfd61..5f15ef2a 100644
--- a/lib/vfscore/stdio.c
+++ b/lib/vfscore/stdio.c
@@ -34,23 +34,37 @@
  */
 
 #include <vfscore/file.h>
+#include <vfscore/fs.h>
 #include <uk/plat/console.h>
 #include <uk/essentials.h>
 #include <termios.h>
+#include <vfscore/vnode.h>
+#include <unistd.h>
 
 /* One function for stderr and stdout */
-static ssize_t stdout_write(struct vfscore_file *vfscore_file __unused,
-                           const void *buf, size_t count)
+static ssize_t stdio_write(struct vnode *vp __unused,
+                          struct uio *uio,
+                          int ioflag __unused)
 {
-       return ukplat_coutk(buf, count);
+       UK_ASSERT(!uio->uio_offset);
+       UK_ASSERT(uio->uio_iovcnt == 1);
+       return ukplat_coutk(uio->uio_iov->iov_base, uio->uio_iov->iov_len);
 }
 
-static ssize_t stdin_read(struct vfscore_file *vfscore_file __unused,
-                         void *_buf, size_t count)
+static ssize_t stdio_read(struct vnode *vp __unused,
+                     struct vfscore_file *file __unused,
+                     struct uio *uio,
+                     int ioflag __unused)
 {
        int bytes_read;
-       size_t bytes_total = 0;
-       char *buf = (char *)_buf;
+       size_t bytes_total = 0, count;
+       char *buf;
+
+       UK_ASSERT(!uio->uio_offset);
+       UK_ASSERT(uio->uio_iovcnt == 1);
+
+       buf = uio->uio_iov->iov_base;
+       count = uio->uio_iov->iov_len;
 
        do {
                while ((bytes_read = ukplat_cink(buf,
@@ -61,8 +75,8 @@ static ssize_t stdin_read(struct vfscore_file *vfscore_file 
__unused,
                *(buf - 1) = *(buf - 1) == '\r' ?
                                        '\n' : *(buf - 1);
 
-               stdout_write(vfscore_file, (buf - bytes_read),
-                               bytes_read);
+               /* Echo the input */
+               ukplat_coutk(buf - bytes_read, bytes_read);
                bytes_total += bytes_read;
 
        } while (bytes_total < count && *(buf - 1) != '\n'
@@ -71,33 +85,38 @@ static ssize_t stdin_read(struct vfscore_file *vfscore_file 
__unused,
        return bytes_total;
 }
 
-static struct vfscore_fops stdin_fops = {
-       .read = stdin_read,
-};
 
-static struct vfscore_fops stdout_fops = {
-       .write = stdout_write,
+static struct vnops stdio_vnops = {
+       .vop_write = stdio_write,
+       .vop_read = stdio_read,
 };
 
-static struct vfscore_file  stdin_file = {
-       .fd = 0,
-       .fops = &stdin_fops,
+static struct vnode stdio_vnode = {
+       .v_ino = 1,
+       .v_op = &stdio_vnops,
+       .v_lock = UK_MUTEX_INITIALIZER(stdio_vnode.v_lock),
+       .v_refcnt = 1,
 };
 
-static struct vfscore_file  stdout_file = {
-       .fd = 1,
-       .fops = &stdout_fops,
+static struct dentry stdio_dentry = {
+       .d_vnode = &stdio_vnode,
 };
 
-static struct vfscore_file  stderr_file = {
-       .fd = 2,
-       .fops = &stdout_fops,
+static struct vfscore_file  stdio_file = {
+       .fd = 1,
+       .f_flags = FWRITE | FREAD,
+       .f_dentry = &stdio_dentry,
+       /* reference count is 2 because close(0) is a valid
+        * operation. However it is not properly handled in the
+        * current implementation. */
+       .f_count = 2,
 };
 
-
 void init_stdio(void)
 {
-       vfscore_install_fd(0, &stdin_file);
-       vfscore_install_fd(1, &stdout_file);
-       vfscore_install_fd(2, &stderr_file);
+       vfscore_install_fd(0, &stdio_file);
+       if (dup2(0, 1) != 1)
+               uk_pr_err("failed to dup to stdin\n");
+       if (dup2(0, 2) != 2)
+               uk_pr_err("failed to dup to stderr\n");
 }
-- 
2.19.2


_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.