Module Name: src Committed By: pooka Date: Fri Oct 9 14:41:36 UTC 2009
Modified Files: src/sys/rump/include/rump: rump.h rumpuser.h src/sys/rump/librump/rumpkern: emul.c rump.c src/sys/rump/librump/rumpuser: rumpuser.c src/sys/rump/librump/rumpvfs: rump_vfs.c rump_vfs_private.h Log Message: Provide an interface for reboot. To generate a diff of this commit: cvs rdiff -u -r1.27 -r1.28 src/sys/rump/include/rump/rump.h \ src/sys/rump/include/rump/rumpuser.h cvs rdiff -u -r1.97 -r1.98 src/sys/rump/librump/rumpkern/emul.c cvs rdiff -u -r1.120 -r1.121 src/sys/rump/librump/rumpkern/rump.c cvs rdiff -u -r1.42 -r1.43 src/sys/rump/librump/rumpuser/rumpuser.c cvs rdiff -u -r1.29 -r1.30 src/sys/rump/librump/rumpvfs/rump_vfs.c cvs rdiff -u -r1.5 -r1.6 src/sys/rump/librump/rumpvfs/rump_vfs_private.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/rump/include/rump/rump.h diff -u src/sys/rump/include/rump/rump.h:1.27 src/sys/rump/include/rump/rump.h:1.28 --- src/sys/rump/include/rump/rump.h:1.27 Wed Oct 7 09:50:43 2009 +++ src/sys/rump/include/rump/rump.h Fri Oct 9 14:41:36 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: rump.h,v 1.27 2009/10/07 09:50:43 pooka Exp $ */ +/* $NetBSD: rump.h,v 1.28 2009/10/09 14:41:36 pooka Exp $ */ /* * Copyright (c) 2007 Antti Kantee. All Rights Reserved. @@ -76,6 +76,7 @@ int rump_module_fini(struct modinfo *); int rump__init(int); +void rump_reboot(int); int rump_getversion(void); struct componentname *rump_makecn(u_long, u_long, const char *, size_t, Index: src/sys/rump/include/rump/rumpuser.h diff -u src/sys/rump/include/rump/rumpuser.h:1.27 src/sys/rump/include/rump/rumpuser.h:1.28 --- src/sys/rump/include/rump/rumpuser.h:1.27 Thu Sep 24 21:30:42 2009 +++ src/sys/rump/include/rump/rumpuser.h Fri Oct 9 14:41:36 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: rumpuser.h,v 1.27 2009/09/24 21:30:42 pooka Exp $ */ +/* $NetBSD: rumpuser.h,v 1.28 2009/10/09 14:41:36 pooka Exp $ */ /* * Copyright (c) 2007 Antti Kantee. All Rights Reserved. @@ -99,8 +99,8 @@ int rumpuser_putchar(int, int *); -void rumpuser_panic(void); - +#define RUMPUSER_PANIC (-1) +void rumpuser_exit(int); void rumpuser_seterrno(int); int rumpuser_writewatchfile_setup(int, int, intptr_t, int *); Index: src/sys/rump/librump/rumpkern/emul.c diff -u src/sys/rump/librump/rumpkern/emul.c:1.97 src/sys/rump/librump/rumpkern/emul.c:1.98 --- src/sys/rump/librump/rumpkern/emul.c:1.97 Sat Oct 3 22:55:48 2009 +++ src/sys/rump/librump/rumpkern/emul.c Fri Oct 9 14:41:36 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: emul.c,v 1.97 2009/10/03 22:55:48 christos Exp $ */ +/* $NetBSD: emul.c,v 1.98 2009/10/09 14:41:36 pooka Exp $ */ /* * Copyright (c) 2007 Antti Kantee. All Rights Reserved. @@ -28,7 +28,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: emul.c,v 1.97 2009/10/03 22:55:48 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: emul.c,v 1.98 2009/10/09 14:41:36 pooka Exp $"); #include <sys/param.h> #include <sys/malloc.h> @@ -549,7 +549,7 @@ suspendsched(void) { - panic("%s: not implemented", __func__); + /* we don't control scheduling currently, can't do anything now */ } u_int @@ -731,7 +731,10 @@ cpu_reboot(int howto, char *bootstr) { - rumpuser_panic(); + rump_reboot(howto); + + /* this function is __dead, we must exit */ + rumpuser_exit(0); } /* Index: src/sys/rump/librump/rumpkern/rump.c diff -u src/sys/rump/librump/rumpkern/rump.c:1.120 src/sys/rump/librump/rumpkern/rump.c:1.121 --- src/sys/rump/librump/rumpkern/rump.c:1.120 Thu Oct 8 00:47:47 2009 +++ src/sys/rump/librump/rumpkern/rump.c Fri Oct 9 14:41:36 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: rump.c,v 1.120 2009/10/08 00:47:47 pooka Exp $ */ +/* $NetBSD: rump.c,v 1.121 2009/10/09 14:41:36 pooka Exp $ */ /* * Copyright (c) 2007 Antti Kantee. All Rights Reserved. @@ -28,7 +28,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rump.c,v 1.120 2009/10/08 00:47:47 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rump.c,v 1.121 2009/10/09 14:41:36 pooka Exp $"); #include <sys/param.h> #include <sys/atomic.h> @@ -50,6 +50,7 @@ #include <sys/once.h> #include <sys/percpu.h> #include <sys/queue.h> +#include <sys/reboot.h> #include <sys/resourcevar.h> #include <sys/select.h> #include <sys/sysctl.h> @@ -121,6 +122,8 @@ __weak_alias(rump_vfs_init,rump__unavailable); __weak_alias(rump_dev_init,rump__unavailable); +__weak_alias(rump_vfs_fini,rump__unavailable); + __weak_alias(biodone,rump__unavailable); void rump__unavailable_vfs_panic(void); @@ -178,10 +181,13 @@ struct lwp *l; int error; - /* XXX */ + /* not reentrant */ if (rump_inited) return 0; - rump_inited = 1; + else if (rump_inited == -1) + panic("rump_init: host process restart required"); + else + rump_inited = 1; /* * Seed arc4random() with a "reasonable" amount of randomness. @@ -289,6 +295,34 @@ return 0; } +/* maybe support sys_reboot some day for remote shutdown */ +void +rump_reboot(int howto) +{ + + /* dump means we really take the dive here */ + if ((howto & RB_DUMP) || panicstr) { + rumpuser_exit(RUMPUSER_PANIC); + /*NOTREACHED*/ + } + + /* try to sync */ + if (!((howto & RB_NOSYNC) || panicstr)) { + rump_vfs_fini(); + } + + /* your wish is my command */ + if (howto & RB_HALT) { + for (;;) { + uint64_t sec = 5, nsec = 0; + int error; + + rumpuser_nanosleep(&sec, &nsec, &error); + } + } + rump_inited = -1; +} + struct uio * rump_uio_setup(void *buf, size_t bufsize, off_t offset, enum rump_uiorw rw) { Index: src/sys/rump/librump/rumpuser/rumpuser.c diff -u src/sys/rump/librump/rumpuser/rumpuser.c:1.42 src/sys/rump/librump/rumpuser/rumpuser.c:1.43 --- src/sys/rump/librump/rumpuser/rumpuser.c:1.42 Wed Jun 10 18:36:33 2009 +++ src/sys/rump/librump/rumpuser/rumpuser.c Fri Oct 9 14:41:36 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: rumpuser.c,v 1.42 2009/06/10 18:36:33 pooka Exp $ */ +/* $NetBSD: rumpuser.c,v 1.43 2009/10/09 14:41:36 pooka Exp $ */ /* * Copyright (c) 2007 Antti Kantee. All Rights Reserved. @@ -30,7 +30,7 @@ #include <sys/cdefs.h> #if !defined(lint) -__RCSID("$NetBSD: rumpuser.c,v 1.42 2009/06/10 18:36:33 pooka Exp $"); +__RCSID("$NetBSD: rumpuser.c,v 1.43 2009/10/09 14:41:36 pooka Exp $"); #endif /* !lint */ /* thank the maker for this */ @@ -443,10 +443,13 @@ } void -rumpuser_panic(void) +rumpuser_exit(int rv) { - abort(); + if (rv == RUMPUSER_PANIC) + abort(); + else + exit(rv); } void Index: src/sys/rump/librump/rumpvfs/rump_vfs.c diff -u src/sys/rump/librump/rumpvfs/rump_vfs.c:1.29 src/sys/rump/librump/rumpvfs/rump_vfs.c:1.30 --- src/sys/rump/librump/rumpvfs/rump_vfs.c:1.29 Wed Oct 7 09:55:35 2009 +++ src/sys/rump/librump/rumpvfs/rump_vfs.c Fri Oct 9 14:41:36 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: rump_vfs.c,v 1.29 2009/10/07 09:55:35 pooka Exp $ */ +/* $NetBSD: rump_vfs.c,v 1.30 2009/10/09 14:41:36 pooka Exp $ */ /* * Copyright (c) 2008 Antti Kantee. All Rights Reserved. @@ -29,7 +29,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rump_vfs.c,v 1.29 2009/10/07 09:55:35 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rump_vfs.c,v 1.30 2009/10/09 14:41:36 pooka Exp $"); #include <sys/param.h> #include <sys/buf.h> @@ -120,6 +120,13 @@ } } +void +rump_vfs_fini(void) +{ + + vfs_shutdown(); +} + struct componentname * rump_makecn(u_long nameiop, u_long flags, const char *name, size_t namelen, kauth_cred_t creds, struct lwp *l) Index: src/sys/rump/librump/rumpvfs/rump_vfs_private.h diff -u src/sys/rump/librump/rumpvfs/rump_vfs_private.h:1.5 src/sys/rump/librump/rumpvfs/rump_vfs_private.h:1.6 --- src/sys/rump/librump/rumpvfs/rump_vfs_private.h:1.5 Wed Oct 7 09:17:54 2009 +++ src/sys/rump/librump/rumpvfs/rump_vfs_private.h Fri Oct 9 14:41:36 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: rump_vfs_private.h,v 1.5 2009/10/07 09:17:54 pooka Exp $ */ +/* $NetBSD: rump_vfs_private.h,v 1.6 2009/10/09 14:41:36 pooka Exp $ */ /* * Copyright (c) 2008 Antti Kantee. All Rights Reserved. @@ -31,6 +31,8 @@ #include <sys/types.h> void rump_vfs_init(void); +void rump_vfs_fini(void); + void rumpfs_init(void); #define RUMPBLK 254