[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH 5/6] lib/devfs: Add /dev/null support
On 12/9/19 11:29 AM, Simon Kuenzer wrote: > On 06.12.19 14:41, Costin Lupu wrote: >> This is shamelessly copied and adapted from our implementation >> for /dev/random device support. >> >> Signed-off-by: Costin Lupu <costin.lupu@xxxxxxxxx> >> --- >> lib/devfs/Config.uk | 5 ++ >> lib/devfs/Makefile.uk | 2 + >> lib/devfs/null.c | 115 ++++++++++++++++++++++++++++++++++++++++++ >> 3 files changed, 122 insertions(+) >> create mode 100644 lib/devfs/null.c >> >> diff --git a/lib/devfs/Config.uk b/lib/devfs/Config.uk >> index 6f21c01c..3adc171e 100644 >> --- a/lib/devfs/Config.uk >> +++ b/lib/devfs/Config.uk >> @@ -8,4 +8,9 @@ if LIBDEVFS >> bool "Mount /dev during boot" >> depends on LIBVFSCORE_AUTOMOUNT_ROOTFS >> default n >> + >> + config LIBDEVS_DEV_NULL >> + bool "/dev/null" >> + depends on LIBDEVFS_AUTOMOUNT >> + default y > > Hum, the `null` device should be actually independent of the automount > option. You could always provide it because devfs can be in principle > mounted somewhere else and still provide `null`. > > Instead of adding a hard-dependency, I would set the default to yes as > soon as libdevfs automount is enabled: > > config LIBDEVS_DEV_NULL > bool "null device" > default y if LIBDEVFS_AUTOMOUNT > default n > > Of course, the default setting should be `off` in order to follow the > "default is minimal" principle. > Alright, will do in v2. I would add an observation, "default is minimal" principle may also refer to how much configuring should a user do before being able to run a vanilla application (e.g. helloworld). >> endif >> diff --git a/lib/devfs/Makefile.uk b/lib/devfs/Makefile.uk >> index c496fd56..366db677 100644 >> --- a/lib/devfs/Makefile.uk >> +++ b/lib/devfs/Makefile.uk >> @@ -3,6 +3,8 @@ $(eval $(call addlib_s,libdevfs,$(CONFIG_LIBDEVFS))) >> CINCLUDES-y += -I$(LIBDEVFS_BASE)/include >> LIBDEVFS_CFLAGS-$(call gcc_version_ge,8,0) += -Wno-cast-function-type >> +LIBDEVFS_CFLAGS-y += -Wno-unused-parameter >> LIBDEVFS_SRCS-y += $(LIBDEVFS_BASE)/device.c >> LIBDEVFS_SRCS-y += $(LIBDEVFS_BASE)/devfs_vnops.c >> +LIBDEVFS_SRCS-$(CONFIG_LIBDEVS_DEV_NULL) += $(LIBDEVFS_BASE)/null.c >> diff --git a/lib/devfs/null.c b/lib/devfs/null.c >> new file mode 100644 >> index 00000000..38d687d4 >> --- /dev/null >> +++ b/lib/devfs/null.c >> @@ -0,0 +1,115 @@ >> +/* SPDX-License-Identifier: BSD-3-Clause */ >> +/* >> + * Authors: Costin Lupu <costin.lupu@xxxxxxxxx> >> + * >> + * Copyright (c) 2019, University Politehnica of Bucharest. 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 copyright holder 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 HOLDER 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. >> + * >> + * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY. >> + */ >> + >> +#include <stdlib.h> >> +#include <string.h> >> +#include <uk/ctors.h> >> +#include <uk/print.h> >> +#include <vfscore/uio.h> >> +#include <devfs/device.h> >> + >> +#define DEV_NULL_NAME "null" >> + >> +/* TODO This can be integrated with random's fill buffer function */ >> +static ssize_t uk_null_fill_buffer(void *buf, size_t buflen) >> +{ >> + size_t step, resid, i; >> + >> + step = sizeof(unsigned long); >> + resid = buflen % step; >> + >> + for (i = 0; i < buflen - resid; i += step) >> + *(unsigned long *)((char *) buf + i) = 0; >> + >> + /* fill the remaining bytes of the buffer */ >> + for (i = 0; i < resid; i++) >> + *((char *) buf + i) = 0; > > memset() would work, too, right? It makes the implementation probably > easier and we would not need to integrate it with /dev/randmom. > However, your implementation looks like /dev/zero. /dev/null should only > return "end-of-file" and no bytes. > Ack. >> + >> + return buflen; >> +} >> + >> +int dev_null_read(struct device *dev, struct uio *uio, int flags) >> +{ >> + size_t count; >> + char *buf; >> + >> + buf = uio->uio_iov->iov_base; >> + count = uio->uio_iov->iov_len; >> + >> + uk_null_fill_buffer(buf, count); >> + >> + uio->uio_resid = 0; >> + return 0; >> +} >> + >> +int dev_null_open(struct device *device, int mode) >> +{ >> + return 0; >> +} >> + >> + >> +int dev_null_close(struct device *device) >> +{ >> + return 0; >> +} >> + >> +static struct devops null_devops = { >> + .read = dev_null_read, >> + .open = dev_null_open, >> + .close = dev_null_close, >> +}; > > You should also provide the write function. The input is just dropped. > This should be even the same for /dev/zero. > Ack. >> + >> +static struct driver drv_null = { >> + .devops = &null_devops, >> + .devsz = 0, >> + .name = DEV_NULL_NAME >> +}; >> + >> +static int devfs_register_null(void) >> +{ >> + struct device *dev; >> + >> + uk_pr_info("Register '%s' to devfs\n", DEV_NULL_NAME); >> + >> + /* register /dev/null */ >> + dev = device_create(&drv_null, DEV_NULL_NAME, D_CHR); >> + if (dev == NULL) { >> + uk_pr_err("Failed to register '%s' to devfs\n", DEV_NULL_NAME); >> + return -1; >> + } >> + >> + return 0; >> +} >> + >> +devfs_initcall(devfs_register_null); >> > > I think it is worth to provide /dev/zero, too. You have it actually > already implemented ;-). I think it would make sense to keep both: > /dev/zero and /dev/null. Ack. _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |