From 236963e7563be3e3f8220dac7bb4af446928e194 Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Mon, 24 Jun 2024 22:55:29 -0400 Subject: Clean out for expt Signed-off-by: Ian Moffett --- sys/fs/devfs.c | 295 --------------------------------------------------- sys/fs/initramfs.c | 262 --------------------------------------------- sys/fs/procfs.c | 206 ----------------------------------- sys/fs/procfs_subr.c | 114 -------------------- 4 files changed, 877 deletions(-) delete mode 100644 sys/fs/devfs.c delete mode 100644 sys/fs/initramfs.c delete mode 100644 sys/fs/procfs.c delete mode 100644 sys/fs/procfs_subr.c (limited to 'sys/fs') diff --git a/sys/fs/devfs.c b/sys/fs/devfs.c deleted file mode 100644 index 7fcdbad..0000000 --- a/sys/fs/devfs.c +++ /dev/null @@ -1,295 +0,0 @@ -/* - * Copyright (c) 2023-2024 Ian Marco Moffett and the Osmora Team. - * 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 Hyra 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include - -struct device_node { - struct spinlock lock; - char *name; - uint8_t is_block : 1; - dev_t major, minor; - TAILQ_ENTRY(device_node) link; -}; - -static TAILQ_HEAD(, device_node) nodes; -static bool nodelist_init = false; - -static struct device_node * -node_from_name(const char *name) -{ - struct device_node *n; - - TAILQ_FOREACH(n, &nodes, link) { - if (strcmp(n->name, name) == 0) { - return n; - } - } - - return NULL; -} - -static int -cdev_read(struct device *dev, struct device_node *node, struct sio_txn *sio) -{ - size_t n_bytes; - - spinlock_acquire(&node->lock); - n_bytes = dev->read(dev, sio); - spinlock_release(&node->lock); - return n_bytes; -} - -static int -blkdev_read(struct device *dev, struct device_node *node, struct sio_txn *sio) -{ - char *buf; - struct sio_txn dev_txn = {0}; - size_t n_blocks = __DIV_ROUNDUP(sio->len, dev->blocksize); - size_t n_bytes = n_blocks * dev->blocksize; - size_t cpy_off; - - if (dev->blocksize == 0 || sio->len == 0) { - /* Sizes can't be zero! */ - return -EIO; - } - - spinlock_acquire(&node->lock); - buf = dynalloc_memalign(n_bytes, 0x1000); - - if (buf == NULL) { - spinlock_release(&node->lock); - return -ENOMEM; - } - - dev_txn.len = n_blocks; - dev_txn.buf = buf; - dev_txn.offset = sio->offset / dev->blocksize; - dev->read(dev, &dev_txn); - spinlock_release(&node->lock); - - cpy_off = sio->offset - (dev_txn.offset * dev->blocksize); - for (size_t i = 0; i < sio->len; ++i) { - ((uint8_t *)sio->buf)[i] = buf[i + cpy_off]; - } - - dynfree(buf); - return sio->len; -} - -static int -vop_vget(struct vnode *parent, const char *name, struct vnode **vp) -{ - struct device_node *dev; - struct vnode *vnode; - int status, vtype; - - if (!nodelist_init) { - return -EIO; - } - - if ((dev = node_from_name(name)) == NULL) { - return -ENOENT; - } - - vtype = dev->is_block ? VBLK : VCHR; - if ((status = vfs_alloc_vnode(&vnode, NULL, vtype)) != 0) { - return status; - } - - vnode->parent = parent; - vnode->data = dev; - vnode->vops = &g_devfs_vops; - *vp = vnode; - return 0; -} - -static int -vop_read(struct vnode *vp, struct sio_txn *sio) -{ - struct device_node *node; - struct device *dev; - - if (vp == NULL) { - return -EIO; - } - - node = vp->data; - dev = device_fetch(node->major, node->minor); - - if (dev->blocksize > 1) - return blkdev_read(dev, node, sio); - - return cdev_read(dev, node, sio); -} - -static int -vop_open(struct vnode *vp) -{ - struct device_node *node; - struct device *dev; - - if (vp == NULL) { - return -EIO; - } - - node = vp->data; - dev = device_fetch(node->major, node->minor); - - if (dev->open == NULL) { - return -EIO; - } - - return dev->open(dev); -} - -static int -vop_close(struct vnode *vp) -{ - struct device_node *node; - struct device *dev; - - if (vp == NULL) { - return -EIO; - } - - node = vp->data; - dev = device_fetch(node->major, node->minor); - - if (dev->close == NULL) { - return -EIO; - } - - return dev->close(dev); -} - -static int -devfs_init(struct fs_info *info, struct vnode *source) -{ - if (source != NULL) - return -EINVAL; - - TAILQ_INIT(&nodes); - nodelist_init = true; - return 0; -} - -static int -devfs_make_devicenode(const char *name, struct device_node **node_out) -{ - size_t name_len = 0; - const char *p = name; - struct device_node *node; - - /* - * Only one filename, no paths. - * - * TODO: Do something better here... - */ - for (; *p; ++p, ++name_len) { - if (*p == '/') - return -EINVAL; - } - - /* Ensure this filename has valid chars */ - if (!vfs_is_valid_path(name)) { - return -EINVAL; - } - - node = dynalloc(sizeof(struct device_node)); - if (node == NULL) - return -ENOMEM; - - node->name = dynalloc(sizeof(char) * name_len); - if (node->name == NULL) - return -ENOMEM; - - memcpy(node->name, name, name_len + 1); - *node_out = node; - return 0; -} - -int -devfs_add_dev(const char *name, const struct device *dev) -{ - struct device_node *node; - int status; - - if ((status = devfs_make_devicenode(name, &node)) != 0) { - return status; - } - - node->major = dev->major; - node->minor = dev->minor; - node->is_block = dev->blocksize > 1; - TAILQ_INSERT_HEAD(&nodes, node, link); - return 0; -} - -/* - * Fetch a device descriptor from a vnode. - */ -int -devfs_get_dev(struct vnode *vp, struct device **res) -{ - struct device_node *n; - struct device *dev; - - /* Is this really a device? */ - if (vp->type != VBLK && vp->type != VCHR) { - return -ENODEV; - } - - n = vp->data; - if ((dev = device_fetch(n->major, n->minor)) == NULL) { - return -ENODEV; - } - - *res = dev; - return 0; -} - -struct vfsops g_devfs_ops = { - .init = devfs_init -}; - -struct vops g_devfs_vops = { - .vget = vop_vget, - .read = vop_read, - .open = vop_open, - .close = vop_close -}; diff --git a/sys/fs/initramfs.c b/sys/fs/initramfs.c deleted file mode 100644 index e15c00d..0000000 --- a/sys/fs/initramfs.c +++ /dev/null @@ -1,262 +0,0 @@ -/* - * Copyright (c) 2023-2024 Ian Marco Moffett and the Osmora Team. - * 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 Hyra 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include - -__MODULE_NAME("initramfs"); -__KERNEL_META("$Hyra$: initramfs.c, Ian Marco Moffett, " - "Initial ram filesystem"); - -static volatile struct limine_module_request mod_req = { - .id = LIMINE_MODULE_REQUEST, - .revision = 0 -}; - -static const char *initramfs = NULL; -static size_t initramfs_size = 0; - -#define TAR_TYPEFLAG_NORMAL '0' -#define TAR_TYPEFLAG_HARDLINK '1' -#define TAR_TYPEFLAG_DIR '5' - -struct tar_hdr { - char filename[100]; - char mode[8]; - char uid[8]; - char gid[8]; - char size[12]; - char mtime[12]; - char checksum[8]; - char type; - char link_name[100]; - char magic[6]; - char version[2]; - char uname[32]; - char gname[32]; - char dev_major[8]; - char dev_minor[8]; - char prefix[155]; -}; - -static struct tar_hdr *initramfs_from_path(struct tar_hdr *hdr, - const char *path); - -static size_t -getsize(const char *in); - -static inline char * -hdr_to_contents(struct tar_hdr *hdr) -{ - return ((char*)hdr) + 0x200; -} - -static int -vop_vget(struct vnode *parent, const char *name, struct vnode **vp) -{ - struct tar_hdr *hdr; - struct vnode *vnode; - int status; - int vtype = VREG; - - if (initramfs == NULL) { - return -EIO; - } - - hdr = initramfs_from_path((void *)initramfs, name); - - if (hdr == NULL) { - return -ENOENT; - } - - if (hdr->type == TAR_TYPEFLAG_DIR) { - vtype = VDIR; - } - - /* Allocate vnode for this file */ - if ((status = vfs_alloc_vnode(&vnode, NULL, vtype)) != 0) { - return status; - } - - vnode->parent = parent; - vnode->data = hdr; - - vnode->vops = &g_initramfs_vops; - *vp = vnode; - return 0; -} - -static int -vop_read(struct vnode *vp, struct sio_txn *sio) -{ - struct tar_hdr *hdr; - size_t size; - char *contents; - char *buf = sio->buf; - - if (vp->data == NULL) { - return -EIO; - } - - hdr = vp->data; - size = getsize(hdr->size); - contents = hdr_to_contents(hdr); - - for (size_t i = sio->offset; i < sio->len; ++i) { - if (i >= size) { - return i + 1; - } - buf[i - sio->offset] = contents[i]; - } - - return sio->len; -} - -static int -vop_getattr(struct vnode *vp, struct vattr *vattr) -{ - struct tar_hdr *hdr = vp->data; - - if (hdr == NULL) { - return -EIO; - } - - switch (hdr->type) { - case TAR_TYPEFLAG_NORMAL: - vattr->type = VREG; - break; - case TAR_TYPEFLAG_DIR: - vattr->type = VDIR; - break; - } - - vattr->size = getsize(hdr->size); - return 0; -} - -static char * -get_module(const char *path, uint64_t *size) { - for (uint64_t i = 0; i < mod_req.response->module_count; ++i) { - if (strcmp(mod_req.response->modules[i]->path, path) == 0) { - *size = mod_req.response->modules[i]->size; - return mod_req.response->modules[i]->address; - } - } - - return NULL; -} - -static size_t -getsize(const char *in) -{ - size_t size = 0, count = 1; - - for (size_t j = 11; j > 0; --j, count *= 8) { - size += (in[j-1]-'0')*count; - } - - return size; -} - -static int -initramfs_init(struct fs_info *info, struct vnode *source) -{ - if (source != NULL) - return -EINVAL; - - initramfs = get_module("/boot/initramfs.tar", &initramfs_size); - info->caps = FSCAP_FULLPATH; - - if (initramfs == NULL) { - panic("Failed to load initramfs\n"); - } - - return 0; -} - -static struct tar_hdr * -initramfs_from_path(struct tar_hdr *hdr, const char *path) -{ - - uintptr_t addr = (uintptr_t)hdr; - size_t size; - - if (*path != '/') { - return NULL; - } - ++path; - - while (strcmp(hdr->magic, "ustar") == 0) { - size = getsize(hdr->size); - - if (strcmp(hdr->filename, path) == 0) { - return hdr; - } - - addr += 512 + __ALIGN_UP(size, 512); - hdr = (struct tar_hdr *)addr; - } - - return NULL; -} - -const char * -initramfs_open(const char *path) -{ - struct tar_hdr *hdr; - - if (initramfs == NULL) { - return NULL; - } - - if (strlen(path) > 99) { - return NULL; - } - - hdr = initramfs_from_path((void *)initramfs, path); - return (hdr == NULL) ? NULL : hdr_to_contents(hdr); -} - -struct vfsops g_initramfs_ops = { - .init = initramfs_init, -}; - -struct vops g_initramfs_vops = { - .vget = vop_vget, - .read = vop_read, - .getattr = vop_getattr -}; diff --git a/sys/fs/procfs.c b/sys/fs/procfs.c deleted file mode 100644 index 3a0e2d3..0000000 --- a/sys/fs/procfs.c +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright (c) 2023-2024 Ian Marco Moffett and the Osmora Team. - * 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 Hyra 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 -#include -#include -#include -#include -#include -#include -#include - -struct proc_node { - struct spinlock lock; - struct proc_entry *entry; - char *name; - TAILQ_ENTRY(proc_node) link; -}; - -static TAILQ_HEAD(, proc_node) proc_nodes; -static bool nodelist_init = false; - -static struct proc_node * -name_to_node(const char *name) -{ - struct proc_node *n; - - TAILQ_FOREACH(n, &proc_nodes, link) { - if (strcmp(n->name, name) == 0) { - return n; - } - } - - return NULL; -} - -static int -procfs_make_node(const char *name, struct proc_node **res) -{ - size_t name_len = 0; - const char *p = name; - struct proc_node *n; - - /* Disallow paths */ - for (; *p; ++p, ++name_len) { - if (*p == '/') { - return -EINVAL; - } - } - - if (!vfs_is_valid_path(name)) - return -EINVAL; - - n = dynalloc(sizeof(struct proc_node)); - if (n == NULL) - return -ENOMEM; - - n->name = dynalloc(sizeof(char) * name_len); - if (n->name == NULL) - return -ENOMEM; - - memcpy(n->name, name, name_len + 1); - *res = n; - return 0; -} - -struct proc_entry * -procfs_alloc_entry(void) -{ - struct proc_entry *entry; - - entry = dynalloc(sizeof(*entry)); - if (entry == NULL) - return NULL; - - memset(entry, 0, sizeof(*entry)); - return entry; -} - -int -procfs_add_entry(const char *name, struct proc_entry *entry) -{ - struct proc_node *proc; - int status; - - if (name == NULL || entry == NULL) - return -EINVAL; - if ((status = procfs_make_node(name, &proc)) != 0) - return status; - - proc->entry = entry; - TAILQ_INSERT_HEAD(&proc_nodes, proc, link); - return 0; -} - -static int -procfs_init(struct fs_info *info, struct vnode *source) -{ - if (source != NULL) - return -EINVAL; - - - TAILQ_INIT(&proc_nodes); - nodelist_init = true; - procfs_populate(); - return 0; -} - -static int -procfs_rw_vnode(struct vnode *vp, struct sio_txn *sio, bool write) -{ - struct proc_node *proc; - struct proc_entry *entry; - - if (vp == NULL) - return -EIO; - - proc = vp->data; - entry = proc->entry; - - return write ? entry->write(entry, sio) - : entry->read(entry, sio); -} - -static int -vop_write(struct vnode *vp, struct sio_txn *sio) -{ - return procfs_rw_vnode(vp, sio, true); -} - -static int -vop_read(struct vnode *vp, struct sio_txn *sio) -{ - return procfs_rw_vnode(vp, sio, false); -} - -static int -vop_open(struct vnode *vp) -{ - return 0; -} - -static int -vop_close(struct vnode *vp) -{ - return 0; -} - -static int -vop_vget(struct vnode *parent, const char *name, struct vnode **vp) -{ - struct proc_node *proc; - struct vnode *vnode; - int status; - - if (!nodelist_init) - return -EIO; - if ((proc = name_to_node(name)) == NULL) - return -ENOENT; - if ((status = vfs_alloc_vnode(&vnode, NULL, VREG)) != 0) - return status; - - vnode->parent = parent; - vnode->data = proc; - vnode->vops = &g_procfs_vops; - *vp = vnode; - return 0; -} - -struct vfsops g_procfs_ops = { - .init = procfs_init -}; - -struct vops g_procfs_vops = { - .vget = vop_vget, - .read = vop_read, - .write = vop_write, - .open = vop_open, - .close = vop_close -}; diff --git a/sys/fs/procfs_subr.c b/sys/fs/procfs_subr.c deleted file mode 100644 index 8b95919..0000000 --- a/sys/fs/procfs_subr.c +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (c) 2023-2024 Ian Marco Moffett and the Osmora Team. - * 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 Hyra 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 -#include -#include -#include -#include -#include -#include - -static bool populated = false; - -static int -procfs_ver_read(struct proc_entry *p, struct sio_txn *sio) -{ - char buf[1024]; - size_t len; - - len = snprintf(buf, sizeof(buf), "Hyra/%s v%s: %s (%s)\n", - HYRA_ARCH, HYRA_VERSION, - HYRA_BUILDDATE, HYRA_BUILDBRANCH); - - /* Truncate if needed */ - if (len > sio->len) - len = sio->len; - - memcpy(sio->buf, buf, len); - return len; -} - -static int -procfs_memstat_read(struct proc_entry *p, struct sio_txn *sio) -{ - struct vm_memstat stat; - struct physmem_stat *pstat; - char buf[1024]; - size_t len; - - stat = vm_memstat(); - pstat = &stat.pmem_stat; - len = snprintf(buf, sizeof(buf), - "TotalMem: %d KiB\n" - "ReservedMem: %d KiB\n" - "AvailableMem: %d KiB\n" - "AllocatedMem: %d KiB\n" - "VMemObjCount: %d\n", - pstat->total_kib, - pstat->reserved_kib, - pstat->avl_kib, - pstat->alloc_kib, - stat.vmobj_cnt); - - /* Truncate if needed */ - if (len > sio->len) - len = sio->len; - - memcpy(sio->buf, buf, len); - return len; -} - -/* - * Populate procfs with basic misc entries - */ -void -procfs_populate(void) -{ - struct proc_entry *version; - struct proc_entry *memstat; - - if (populated) - return; - - populated = true; - - /* Kernel version */ - version = procfs_alloc_entry(); - version->read = procfs_ver_read; - procfs_add_entry("version", version); - - /* Memstat */ - memstat = procfs_alloc_entry(); - memstat->read = procfs_memstat_read; - procfs_add_entry("memstat", memstat); - - intr_init_proc(); - syslog_init_proc(); -} -- cgit v1.2.3