summaryrefslogtreecommitdiff
path: root/src/sys
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2025-09-18 22:36:36 -0400
committerIan Moffett <ian@osmora.org>2025-09-18 22:38:44 -0400
commit70dc7ad8924cf3e30e06b02698b1294fe9553538 (patch)
treea0ae1d423e958a37e2b548d5ed7913776e9b76cc /src/sys
parentac93c35a842936a4f722b85ea3b4d3ff872123f9 (diff)
kern: vfs: Add initial vfsops, and mount code
This commit introduces the groundwork for mountpoints, filesystems and the VFS as a whole. OMAR is now initialized as its own filesystem by the VFS Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'src/sys')
-rw-r--r--src/sys/include/os/vfs.h57
-rw-r--r--src/sys/include/sys/mount.h137
-rw-r--r--src/sys/os/os_init.c6
-rw-r--r--src/sys/os/os_omar.c14
-rw-r--r--src/sys/os/vfs_init.c79
-rw-r--r--src/sys/os/vfs_mount.c119
6 files changed, 404 insertions, 8 deletions
diff --git a/src/sys/include/os/vfs.h b/src/sys/include/os/vfs.h
new file mode 100644
index 0000000..ec7eb77
--- /dev/null
+++ b/src/sys/include/os/vfs.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2025 Ian Marco Moffett and L5 engineers
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the project nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _OS_VFS_H_
+#define _OS_VFS_H_ 1
+
+#include <sys/types.h>
+#include <sys/mount.h>
+
+/*
+ * Initialize the virtual filesystem
+ * layer
+ *
+ * Returns zero on success, otherwise a less
+ * than zero value on failure.
+ */
+int vfs_init(void);
+
+/*
+ * Get a VFS file table entry by index.
+ *
+ * @index: Index to desired entry
+ * @resp: Result pointer is written here
+ *
+ * Returns zero on success and the entry being
+ * found, otherwise a less than zero failure if
+ * the entry has not been found.
+ */
+int vfs_by_index(uint16_t index, struct fs_info **resp);
+
+#endif /* !_OS_VFS_H_ */
diff --git a/src/sys/include/sys/mount.h b/src/sys/include/sys/mount.h
new file mode 100644
index 0000000..c2beb8d
--- /dev/null
+++ b/src/sys/include/sys/mount.h
@@ -0,0 +1,137 @@
+/*
+ * Copyright (c) 2025 Ian Marco Moffett and L5 engineers
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the project nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _SYS_MOUNT_H_
+#define _SYS_MOUNT_H_
+
+#include <sys/queue.h>
+#include <sys/types.h>
+#include <os/vnode.h>
+
+#if defined(_KERNEL)
+
+/*
+ * Number of bytes allowed in a filesystem
+ * name including the null termination
+ */
+#define FSNAME_MAX 16
+
+/*
+ * Mount filesystem string names
+ */
+#define MOUNT_INITRD "initrd" /* Initial ramdisk */
+
+/* Forward declarations */
+struct vfsops;
+struct mount;
+
+/* Filesystem vfsops */
+extern struct vfsops g_omar_vfsops;
+
+/*
+ * Represents a mountpoint
+ */
+struct mount {
+ struct vnode *vp;
+ const char *name;
+ TAILQ_ENTRY(mount) link;
+ TAILQ_HEAD(, mount) buckets;
+};
+
+/*
+ * Represents a list of mountpoints
+ *
+ * @i: Initialized (set if initialized)
+ */
+struct mountlist {
+ uint8_t i : 1;
+ TAILQ_HEAD(, mount) list;
+};
+/*
+ * Arguments for mount()
+ *
+ * @source: Specifies the source filesystem to mount
+ * @target: Specifies the location to mount source
+ * @fstype: File system type
+ * @data: Filesystem specific data
+ */
+struct mount_args {
+ const char *source;
+ const char *target;
+ const char *fstype;
+ const void *data;
+};
+
+/*
+ * Represents information about a filesystem
+ *
+ * @name: Filesystem type name
+ * @vfsops: VFS operations vector
+ * @refcount: Mount count of this type
+ */
+struct fs_info {
+ char name[FSNAME_MAX];
+ const struct vfsops *vfsops;
+ int refcount;
+};
+
+/*
+ * VFS operations vector
+ *
+ * @init: Initialize the filesystem
+ * @mount: Mount a filesystem
+ */
+struct vfsops {
+ int(*init)(struct fs_info *fip);
+ int(*mount)(struct fs_info *fip, struct mount_args *margs);
+};
+
+/*
+ * Mount a specific filesystem
+ *
+ * @margs: Mount arguments
+ * @flags: Mount flags
+ *
+ * Returns zero on success, otherwise a less than zero
+ * failure upon failure.
+ */
+int mount(struct mount_args *margs, uint32_t flags);
+
+/*
+ * Initialize a mountpoint to a known state
+ *
+ * @mp: Pointer to mountlist [if NULL, use root]
+ *
+ * Returns zero on success, otherwise a less than
+ * zero value on failure.
+ */
+int mountlist_init(struct mountlist *mlp);
+
+#endif /* !_KERNEL */
+#endif /* !_SYS_MOUNT_H_ */
diff --git a/src/sys/os/os_init.c b/src/sys/os/os_init.c
index 8480a3f..7628574 100644
--- a/src/sys/os/os_init.c
+++ b/src/sys/os/os_init.c
@@ -32,9 +32,11 @@
#include <sys/sysvar.h>
#include <sys/syslog.h>
#include <sys/proc.h>
+#include <sys/mount.h>
#include <sys/cpuvar.h>
#include <os/sched.h>
#include <os/elfload.h>
+#include <os/vfs.h>
#include <acpi/acpi.h>
#include <io/cons/cons.h>
#include <vm/vm.h>
@@ -73,6 +75,10 @@ main(void)
cpu_init(&g_bsp);
bsp_ap_startup();
+ /* Mount root */
+ vfs_init();
+ mountlist_init(NULL);
+
sched_init();
core = this_core();
proc_init(&g_rootproc, 0);
diff --git a/src/sys/os/os_omar.c b/src/sys/os/os_omar.c
index 63493b0..186ca57 100644
--- a/src/sys/os/os_omar.c
+++ b/src/sys/os/os_omar.c
@@ -32,6 +32,7 @@
#include <sys/errno.h>
#include <sys/bootvars.h>
#include <sys/cdefs.h>
+#include <sys/mount.h>
#include <sys/panic.h>
#include <sys/syslog.h>
#include <os/omar.h>
@@ -143,7 +144,7 @@ initrd_get_file(const char *path, struct initrd_node *res)
* Initialize the initrd
*/
static int
-initrd_init(void)
+initrd_init(struct fs_info *fip)
{
struct bootvars bootvars;
struct bootvar_io *bvio = NULL;
@@ -187,13 +188,6 @@ initrd_open(const char *path, char **res)
return -ENOENT;
}
- if (__initrd_root == NULL) {
- error = initrd_init();
- if (error < 0) {
- panic("initrd: failed to setup initrd\n");
- }
- }
-
error = initrd_get_file(path, &node);
if (error < 0) {
printf("initrd: failed to open '%s'\n", path);
@@ -203,3 +197,7 @@ initrd_open(const char *path, char **res)
*res = node.data;
return node.size;
}
+
+struct vfsops g_omar_vfsops = {
+ .init = initrd_init
+};
diff --git a/src/sys/os/vfs_init.c b/src/sys/os/vfs_init.c
new file mode 100644
index 0000000..b40b74d
--- /dev/null
+++ b/src/sys/os/vfs_init.c
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2025 Ian Marco Moffett and L5 engineers
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the project nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/types.h>
+#include <sys/errno.h>
+#include <sys/param.h>
+#include <sys/mount.h>
+#include <os/vfs.h>
+
+/*
+ * The filesystem table
+ */
+static struct fs_info fstab[] = {
+ { MOUNT_INITRD, &g_omar_vfsops, 0 }
+};
+
+/*
+ * Get entry by index
+ */
+int
+vfs_by_index(uint16_t index, struct fs_info **resp)
+{
+ if (resp == NULL) {
+ return -EINVAL;
+ }
+
+ if (index >= NELEM(fstab)) {
+ return -ENOENT;
+ }
+
+ *resp = &fstab[index];
+ return 0;
+}
+
+int
+vfs_init(void)
+{
+ const struct vfsops *vfsops;
+ struct fs_info *fip;
+ size_t nelem = NELEM(fstab);
+
+ /*
+ * Initialize each filesystem
+ */
+ for (size_t i = 0; i < nelem; ++i) {
+ fip = &fstab[i];
+ vfsops = fip->vfsops;
+ if (vfsops->init != NULL) {
+ vfsops->init(fip);
+ }
+ }
+ return 0;
+}
diff --git a/src/sys/os/vfs_mount.c b/src/sys/os/vfs_mount.c
new file mode 100644
index 0000000..f1d7ffd
--- /dev/null
+++ b/src/sys/os/vfs_mount.c
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 2025 Ian Marco Moffett and L5 engineers
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the project nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/types.h>
+#include <sys/syslog.h>
+#include <sys/errno.h>
+#include <sys/cdefs.h>
+#include <sys/mount.h>
+#include <os/vfs.h>
+#include <string.h>
+
+/*
+ * Represents the root mountlist, every other
+ * mountpoint is put here.
+ */
+static struct mountlist root;
+
+/*
+ * Mount a filesystem
+ */
+int
+mount(struct mount_args *margs, uint32_t flags)
+{
+ const struct vfsops *vfsops;
+ struct fs_info *fip = NULL;
+ int error;
+
+ if (margs == NULL) {
+ return -EINVAL;
+ }
+
+ /* XXX: Unused as of now */
+ (void)margs->source;
+ (void)margs->target;
+ (void)margs->data;
+
+ /* XXX: Requires fstype for now */
+ if (margs->fstype == NULL) {
+ return -ENOENT;
+ }
+
+ /*
+ * Now we go through each entry of the filesystem
+ * table and if it matches the filesystem type,
+ * we're good.
+ */
+ for (uint8_t i = 0;; ++i) {
+ error = vfs_by_index(i, &fip);
+ if (error != 0) {
+ return -ENOENT;
+ }
+
+ if (strcmp(fip->name, margs->fstype) == 0) {
+ break;
+ }
+ }
+
+
+ /* Sanity check */
+ if (__unlikely(fip == NULL)) {
+ printf("mount: got NULL filesystem info\n");
+ return -ENOENT;
+ }
+
+ vfsops = fip->vfsops;
+ if (__unlikely(vfsops->mount == NULL)) {
+ printf("mount: fs does not implement mount!\n");
+ return -EIO;
+ }
+
+ vfsops->mount(fip, margs);
+ return 0;
+}
+
+/*
+ * Initialize the mountlist
+ */
+int
+mountlist_init(struct mountlist *mlp)
+{
+ if (mlp == NULL) {
+ mlp = &root;
+ }
+
+ /* Don't initialize twice */
+ if (mlp->i) {
+ return -EPERM;
+ }
+
+ TAILQ_INIT(&mlp->list);
+ mlp->i = 1;
+ return 0;
+}