Module Name: src
Committed By: jmcneill
Date: Fri Aug 12 12:59:13 UTC 2011
Modified Files:
src/sys/arch/usermode/conf: GENERIC files.usermode majors.usermode
src/sys/arch/usermode/dev: cpu.c mainbus.c
src/sys/arch/usermode/include: mainbus.h thunk.h
src/sys/arch/usermode/usermode: machdep.c thunk.c
Added Files:
src/sys/arch/usermode/dev: ld_thunkbus.c
Log Message:
add a simple disk driver, pass the path to the disk image on the kernel command
line:
soundwave$ ./netbsd /tmp/test.fs
NetBSD/usermode startup
[...]
ld0 at mainbus0: /tmp/test.fs (33554432)
ld0: 32768 KB, 8322 cyl, 64 head, 63 sec, 1 bytes/sect x 33554432 sectors
boot device: ld0
root on ld0a dumps on ld0b
To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/usermode/conf/GENERIC
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/usermode/conf/files.usermode
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/usermode/conf/majors.usermode
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/usermode/dev/cpu.c
cvs rdiff -u -r0 -r1.1 src/sys/arch/usermode/dev/ld_thunkbus.c
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/usermode/dev/mainbus.c
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/usermode/include/mainbus.h \
src/sys/arch/usermode/include/thunk.h
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/usermode/usermode/machdep.c
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/usermode/usermode/thunk.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/usermode/conf/GENERIC
diff -u src/sys/arch/usermode/conf/GENERIC:1.8 src/sys/arch/usermode/conf/GENERIC:1.9
--- src/sys/arch/usermode/conf/GENERIC:1.8 Thu Aug 11 23:04:43 2011
+++ src/sys/arch/usermode/conf/GENERIC Fri Aug 12 12:59:13 2011
@@ -1,9 +1,9 @@
-# $NetBSD: GENERIC,v 1.8 2011/08/11 23:04:43 jmcneill Exp $
+# $NetBSD: GENERIC,v 1.9 2011/08/12 12:59:13 jmcneill Exp $
include "arch/usermode/conf/std.usermode"
options INCLUDE_CONFIG_FILE
-#ident "GENERIC-$Revision: 1.8 $"
+#ident "GENERIC-$Revision: 1.9 $"
maxusers 32
makeoptions DEBUG="-g3"
@@ -43,5 +43,6 @@
cpu0 at mainbus?
clock0 at mainbus?
ttycons0 at mainbus?
+ld0 at mainbus?
pseudo-device loop
Index: src/sys/arch/usermode/conf/files.usermode
diff -u src/sys/arch/usermode/conf/files.usermode:1.3 src/sys/arch/usermode/conf/files.usermode:1.4
--- src/sys/arch/usermode/conf/files.usermode:1.3 Sun Jun 12 03:35:48 2011
+++ src/sys/arch/usermode/conf/files.usermode Fri Aug 12 12:59:13 2011
@@ -1,4 +1,4 @@
-# $NetBSD: files.usermode,v 1.3 2011/06/12 03:35:48 rmind Exp $
+# $NetBSD: files.usermode,v 1.4 2011/08/12 12:59:13 jmcneill Exp $
maxpartitions 8
maxusers 8 16 64
@@ -23,6 +23,9 @@
attach ttycons at thunkbus
file arch/usermode/dev/ttycons.c ttycons
+attach ld at thunkbus with ld_thunkbus
+file arch/usermode/dev/ld_thunkbus.c ld_thunkbus
+
file arch/usermode/usermode/copy.c
file arch/usermode/usermode/machdep.c
file arch/usermode/usermode/pmap.c
@@ -33,5 +36,6 @@
file arch/usermode/usermode/vm_machdep.c
file dev/cons.c
file dev/md_root.c memory_disk_hooks
+file kern/subr_disk_mbr.c disk
include "arch/usermode/conf/majors.usermode"
Index: src/sys/arch/usermode/conf/majors.usermode
diff -u src/sys/arch/usermode/conf/majors.usermode:1.1 src/sys/arch/usermode/conf/majors.usermode:1.2
--- src/sys/arch/usermode/conf/majors.usermode:1.1 Sat Dec 29 14:38:30 2007
+++ src/sys/arch/usermode/conf/majors.usermode Fri Aug 12 12:59:13 2011
@@ -1,4 +1,4 @@
-# $NetBSD: majors.usermode,v 1.1 2007/12/29 14:38:30 jmcneill Exp $
+# $NetBSD: majors.usermode,v 1.2 2011/08/12 12:59:13 jmcneill Exp $
device-major cons char 0
device-major ctty char 1
@@ -10,3 +10,4 @@
device-major log char 7
device-major com char 8 com
device-major md char 24 block 17 md
+device-major ld char 69 block 19 ld
Index: src/sys/arch/usermode/dev/cpu.c
diff -u src/sys/arch/usermode/dev/cpu.c:1.11 src/sys/arch/usermode/dev/cpu.c:1.12
--- src/sys/arch/usermode/dev/cpu.c:1.11 Fri Aug 12 11:37:04 2011
+++ src/sys/arch/usermode/dev/cpu.c Fri Aug 12 12:59:13 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.c,v 1.11 2011/08/12 11:37:04 jmcneill Exp $ */
+/* $NetBSD: cpu.c,v 1.12 2011/08/12 12:59:13 jmcneill Exp $ */
/*-
* Copyright (c) 2007 Jared D. McNeill <[email protected]>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.11 2011/08/12 11:37:04 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.12 2011/08/12 12:59:13 jmcneill Exp $");
#include <sys/param.h>
#include <sys/conf.h>
@@ -323,8 +323,12 @@
{
device_t rdev;
- rdev = device_find_by_xname("md0");
+ rdev = device_find_by_xname("ld0");
+ if (rdev == NULL)
+ rdev = device_find_by_xname("md0");
+ aprint_normal("boot device: %s\n",
+ rdev ? device_xname(rdev) : "<unknown>");
setroot(rdev, 0);
}
Index: src/sys/arch/usermode/dev/mainbus.c
diff -u src/sys/arch/usermode/dev/mainbus.c:1.3 src/sys/arch/usermode/dev/mainbus.c:1.4
--- src/sys/arch/usermode/dev/mainbus.c:1.3 Fri Nov 27 03:23:14 2009
+++ src/sys/arch/usermode/dev/mainbus.c Fri Aug 12 12:59:13 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: mainbus.c,v 1.3 2009/11/27 03:23:14 rmind Exp $ */
+/* $NetBSD: mainbus.c,v 1.4 2011/08/12 12:59:13 jmcneill Exp $ */
/*-
* Copyright (c) 2007 Jared D. McNeill <[email protected]>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.3 2009/11/27 03:23:14 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.4 2011/08/12 12:59:13 jmcneill Exp $");
#include <sys/param.h>
#include <sys/proc.h>
@@ -50,6 +50,8 @@
CFATTACH_DECL_NEW(mainbus, sizeof(mainbus_softc_t),
mainbus_match, mainbus_attach, NULL, NULL);
+extern char *usermode_root_image_path;
+
static int
mainbus_match(device_t parent, cfdata_t match, void *opaque)
{
@@ -74,6 +76,12 @@
config_found_ia(self, "thunkbus", &taa, mainbus_print);
taa.taa_type = THUNKBUS_TYPE_TTYCONS;
config_found_ia(self, "thunkbus", &taa, mainbus_print);
+
+ if (usermode_root_image_path) {
+ taa.taa_type = THUNKBUS_TYPE_DISKIMAGE;
+ taa.u.diskimage.path = usermode_root_image_path;
+ config_found_ia(self, "thunkbus", &taa, mainbus_print);
+ }
}
static int
Index: src/sys/arch/usermode/include/mainbus.h
diff -u src/sys/arch/usermode/include/mainbus.h:1.2 src/sys/arch/usermode/include/mainbus.h:1.3
--- src/sys/arch/usermode/include/mainbus.h:1.2 Wed Oct 21 16:06:59 2009
+++ src/sys/arch/usermode/include/mainbus.h Fri Aug 12 12:59:13 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: mainbus.h,v 1.2 2009/10/21 16:06:59 snj Exp $ */
+/* $NetBSD: mainbus.h,v 1.3 2011/08/12 12:59:13 jmcneill Exp $ */
/*-
* Copyright (c) 2007 Jared D. McNeill <[email protected]>
@@ -34,6 +34,13 @@
#define THUNKBUS_TYPE_CPU 0
#define THUNKBUS_TYPE_CLOCK 1
#define THUNKBUS_TYPE_TTYCONS 2
+#define THUNKBUS_TYPE_DISKIMAGE 3
+
+ union {
+ struct {
+ const char *path;
+ } diskimage;
+ } u;
};
#endif /* !_ARCH_USERMODE_INCLUDE_MAINBUS_H */
Index: src/sys/arch/usermode/include/thunk.h
diff -u src/sys/arch/usermode/include/thunk.h:1.2 src/sys/arch/usermode/include/thunk.h:1.3
--- src/sys/arch/usermode/include/thunk.h:1.2 Fri Aug 12 11:37:04 2011
+++ src/sys/arch/usermode/include/thunk.h Fri Aug 12 12:59:13 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: thunk.h,v 1.2 2011/08/12 11:37:04 jmcneill Exp $ */
+/* $NetBSD: thunk.h,v 1.3 2011/08/12 12:59:13 jmcneill Exp $ */
/*-
* Copyright (c) 2011 Jared D. McNeill <[email protected]>
@@ -31,6 +31,8 @@
#include <sys/types.h>
#include <sys/time.h>
+#include <sys/stat.h>
+#include <sys/fcntl.h>
#include <sys/ucontext.h>
int thunk_setitimer(int, const struct itimerval *, struct itimerval *);
@@ -50,4 +52,10 @@
int thunk_execv(const char *, char * const []);
+int thunk_open(const char *, int, mode_t);
+int thunk_fstat(int, struct stat *);
+ssize_t thunk_pread(int, void *, size_t, off_t);
+ssize_t thunk_pwrite(int, const void *, size_t, off_t);
+int thunk_fsync(int);
+
#endif /* !_ARCH_USERMODE_INCLUDE_THUNK_H */
Index: src/sys/arch/usermode/usermode/machdep.c
diff -u src/sys/arch/usermode/usermode/machdep.c:1.11 src/sys/arch/usermode/usermode/machdep.c:1.12
--- src/sys/arch/usermode/usermode/machdep.c:1.11 Fri Aug 12 11:37:04 2011
+++ src/sys/arch/usermode/usermode/machdep.c Fri Aug 12 12:59:13 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.11 2011/08/12 11:37:04 jmcneill Exp $ */
+/* $NetBSD: machdep.c,v 1.12 2011/08/12 12:59:13 jmcneill Exp $ */
/*-
* Copyright (c) 2007 Jared D. McNeill <[email protected]>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.11 2011/08/12 11:37:04 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.12 2011/08/12 12:59:13 jmcneill Exp $");
#include <sys/types.h>
#include <sys/param.h>
@@ -53,6 +53,7 @@
int physmem = MEMSIZE * 1024 / PAGE_SIZE;
static char **saved_argv;
+char *usermode_root_image_path = NULL;
void main(int argc, char *argv[]);
void usermode_reboot(void);
@@ -70,6 +71,10 @@
ttycons_consinit();
for (i = 1; i < argc; i++) {
+ if (argv[i][0] != '-') {
+ usermode_root_image_path = argv[i];
+ continue;
+ }
for (j = 1; argv[i][j] != '\0'; j++) {
r = 0;
BOOT_FLAG(argv[i][j], r);
Index: src/sys/arch/usermode/usermode/thunk.c
diff -u src/sys/arch/usermode/usermode/thunk.c:1.2 src/sys/arch/usermode/usermode/thunk.c:1.3
--- src/sys/arch/usermode/usermode/thunk.c:1.2 Fri Aug 12 11:37:05 2011
+++ src/sys/arch/usermode/usermode/thunk.c Fri Aug 12 12:59:13 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: thunk.c,v 1.2 2011/08/12 11:37:05 jmcneill Exp $ */
+/* $NetBSD: thunk.c,v 1.3 2011/08/12 12:59:13 jmcneill Exp $ */
/*-
* Copyright (c) 2011 Jared D. McNeill <[email protected]>
@@ -27,11 +27,12 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: thunk.c,v 1.2 2011/08/12 11:37:05 jmcneill Exp $");
+__RCSID("$NetBSD: thunk.c,v 1.3 2011/08/12 12:59:13 jmcneill Exp $");
#include <machine/thunk.h>
#include <assert.h>
+#include <fcntl.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
@@ -116,3 +117,32 @@
return execv(path, argv);
}
+int
+thunk_open(const char *path, int flags, mode_t mode)
+{
+ return open(path, flags, mode);
+}
+
+int
+thunk_fstat(int fd, struct stat *sb)
+{
+ return fstat(fd, sb);
+}
+
+ssize_t
+thunk_pread(int d, void *buf, size_t nbytes, off_t offset)
+{
+ return pread(d, buf, nbytes, offset);
+}
+
+ssize_t
+thunk_pwrite(int d, const void *buf, size_t nbytes, off_t offset)
+{
+ return pwrite(d, buf, nbytes, offset);
+}
+
+int
+thunk_fsync(int fd)
+{
+ return fsync(fd);
+}
Added files:
Index: src/sys/arch/usermode/dev/ld_thunkbus.c
diff -u /dev/null src/sys/arch/usermode/dev/ld_thunkbus.c:1.1
--- /dev/null Fri Aug 12 12:59:14 2011
+++ src/sys/arch/usermode/dev/ld_thunkbus.c Fri Aug 12 12:59:13 2011
@@ -0,0 +1,156 @@
+/* $NetBSD: ld_thunkbus.c,v 1.1 2011/08/12 12:59:13 jmcneill Exp $ */
+
+/*-
+ * Copyright (c) 2011 Jared D. McNeill <[email protected]>
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: ld_thunkbus.c,v 1.1 2011/08/12 12:59:13 jmcneill Exp $");
+
+#include <sys/param.h>
+#include <sys/proc.h>
+#include <sys/systm.h>
+#include <sys/device.h>
+#include <sys/buf.h>
+#include <sys/disk.h>
+
+#include <dev/ldvar.h>
+
+#include <machine/mainbus.h>
+#include <machine/thunk.h>
+
+static int ld_thunkbus_match(device_t, cfdata_t, void *);
+static void ld_thunkbus_attach(device_t, device_t, void *);
+
+static int ld_thunkbus_ldstart(struct ld_softc *, struct buf *);
+static int ld_thunkbus_lddump(struct ld_softc *, void *, int, int);
+static int ld_thunkbus_ldflush(struct ld_softc *, int);
+
+struct ld_thunkbus_softc {
+ struct ld_softc sc_ld;
+
+ int sc_fd;
+ struct stat sc_st;
+};
+
+CFATTACH_DECL_NEW(ld_thunkbus, sizeof(struct ld_thunkbus_softc),
+ ld_thunkbus_match, ld_thunkbus_attach, NULL, NULL);
+
+extern int errno;
+
+static int
+ld_thunkbus_match(device_t parent, cfdata_t match, void *opaque)
+{
+ struct thunkbus_attach_args *taa = opaque;
+
+ if (taa->taa_type != THUNKBUS_TYPE_DISKIMAGE)
+ return 0;
+
+ return 1;
+}
+
+static void
+ld_thunkbus_attach(device_t parent, device_t self, void *opaque)
+{
+ struct ld_thunkbus_softc *sc = device_private(self);
+ struct ld_softc *ld = &sc->sc_ld;
+ struct thunkbus_attach_args *taa = opaque;
+ const char *path = taa->u.diskimage.path;
+
+ ld->sc_dv = self;
+
+ sc->sc_fd = thunk_open(path, O_RDWR, 0);
+ if (sc->sc_fd == -1) {
+ aprint_error(": couldn't open %s: %d\n", path, errno);
+ return;
+ }
+ if (thunk_fstat(sc->sc_fd, &sc->sc_st) == -1) {
+ aprint_error(": couldn't stat %s: %d\n", path, errno);
+ return;
+ }
+
+ aprint_naive("\n");
+ aprint_normal(": %s (%lld)\n", path, (long long)sc->sc_st.st_size);
+
+ ld->sc_flags = LDF_ENABLED;
+ ld->sc_maxxfer = sc->sc_st.st_blksize;
+ ld->sc_secsize = 1;
+ ld->sc_secperunit = sc->sc_st.st_size;
+ ld->sc_maxqueuecnt = 1;
+ ld->sc_start = ld_thunkbus_ldstart;
+ ld->sc_dump = ld_thunkbus_lddump;
+ ld->sc_flush = ld_thunkbus_ldflush;
+
+ ldattach(ld);
+}
+
+static int
+ld_thunkbus_ldstart(struct ld_softc *ld, struct buf *bp)
+{
+ struct ld_thunkbus_softc *sc = (struct ld_thunkbus_softc *)ld;
+ ssize_t len;
+
+ if (bp->b_flags & B_READ)
+ len = thunk_pread(sc->sc_fd, bp->b_data, bp->b_bcount,
+ bp->b_rawblkno);
+ else
+ len = thunk_pwrite(sc->sc_fd, bp->b_data, bp->b_bcount,
+ bp->b_rawblkno);
+
+ if (len == -1)
+ return errno;
+ else if (len != bp->b_bcount)
+ panic("%s: short xfer", __func__);
+ return 0;
+}
+
+static int
+ld_thunkbus_lddump(struct ld_softc *ld, void *data, int blkno, int blkcnt)
+{
+ struct ld_thunkbus_softc *sc = (struct ld_thunkbus_softc *)ld;
+ ssize_t len;
+
+ len = thunk_pwrite(sc->sc_fd, data, blkcnt, blkno);
+ if (len == -1)
+ return errno;
+ else if (len != blkcnt) {
+ device_printf(ld->sc_dv, "%s failed (short xfer)\n", __func__);
+ return EIO;
+ }
+
+ return 0;
+}
+
+static int
+ld_thunkbus_ldflush(struct ld_softc *ld, int flags)
+{
+ struct ld_thunkbus_softc *sc = (struct ld_thunkbus_softc *)ld;
+
+ if (thunk_fsync(sc->sc_fd) == -1)
+ return errno;
+
+ return 0;
+}
+