diff options
author | phk <phk@FreeBSD.org> | 1999-07-17 20:47:52 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 1999-07-17 20:47:52 +0000 |
commit | f598bb42c149f910fb757059816fcd16a67707a6 (patch) | |
tree | 53abdff536c4c39f8bd75e4a739c7a9658b2ce01 /sys/kern/kern_shutdown.c | |
parent | 6063f24ab8d9d89a4149c1e0315451a45fa07b09 (diff) | |
download | FreeBSD-src-f598bb42c149f910fb757059816fcd16a67707a6.zip FreeBSD-src-f598bb42c149f910fb757059816fcd16a67707a6.tar.gz |
Centralize dumpdev handling.
Diffstat (limited to 'sys/kern/kern_shutdown.c')
-rw-r--r-- | sys/kern/kern_shutdown.c | 61 |
1 files changed, 57 insertions, 4 deletions
diff --git a/sys/kern/kern_shutdown.c b/sys/kern/kern_shutdown.c index abbc013..755f90f 100644 --- a/sys/kern/kern_shutdown.c +++ b/sys/kern/kern_shutdown.c @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)kern_shutdown.c 8.3 (Berkeley) 1/21/94 - * $Id: kern_shutdown.c,v 1.53 1999/06/26 02:46:02 mckusick Exp $ + * $Id: kern_shutdown.c,v 1.54 1999/07/01 22:54:55 peter Exp $ */ #include "opt_ddb.h" @@ -127,6 +127,8 @@ static struct shutdown_list shutdown_lists[SHUTDOWN_FINAL + 1]; static void boot __P((int)) __dead2; static void dumpsys __P((void)); +static int setdumpdev __P((dev_t dev)); + #ifndef _SYS_SYSPROTO_H_ struct reboot_args { @@ -352,8 +354,41 @@ static u_long const dumpmag = 0x8fca0101UL; static int dumpsize = 0; /* also for savecore */ static int dodump = 1; -SYSCTL_INT(_machdep, OID_AUTO, do_dump, CTLFLAG_RW, - &dodump, 0, "Do coredump on kernel panic"); + +SYSCTL_INT(_machdep, OID_AUTO, do_dump, CTLFLAG_RW, &dodump, 0, + "Try to perform coredump on kernel panic"); + +static int +setdumpdev(dev) + dev_t dev; +{ + int maj, psize; + long newdumplo; + + if (dev == NODEV) { + dumpdev = dev; + return (0); + } + maj = major(dev); + if (bdevsw(dev) == NULL) + return (ENXIO); /* XXX is this right? */ + if (bdevsw(dev)->d_psize == NULL) + return (ENXIO); /* XXX should be ENODEV ? */ + psize = bdevsw(dev)->d_psize(dev); + if (psize == -1) + return (ENXIO); /* XXX should be ENODEV ? */ + /* + * XXX should clean up checking in dumpsys() to be more like this, + * and nuke dodump sysctl (too many knobs). + */ + newdumplo = psize - Maxmem * PAGE_SIZE / DEV_BSIZE; + if (newdumplo < 0) + return (ENOSPC); + dumpdev = dev; + dumplo = newdumplo; + return (0); +} + /* ARGSUSED */ static void dump_conf __P((void *dummy)); @@ -361,10 +396,28 @@ static void dump_conf(dummy) void *dummy; { - cpu_dumpconf(); + if (setdumpdev(dumpdev) != 0) + dumpdev = NODEV; } + SYSINIT(dump_conf, SI_SUB_DUMP_CONF, SI_ORDER_FIRST, dump_conf, NULL) +static int +sysctl_kern_dumpdev SYSCTL_HANDLER_ARGS +{ + int error; + udev_t ndumpdev; + + ndumpdev = dev2udev(dumpdev); + error = sysctl_handle_opaque(oidp, &ndumpdev, sizeof ndumpdev, req); + if (error == 0 && req->newptr != NULL) + error = setdumpdev(udev2dev(ndumpdev, 1)); + return (error); +} + +SYSCTL_PROC(_kern, KERN_DUMPDEV, dumpdev, CTLTYPE_OPAQUE|CTLFLAG_RW, + 0, sizeof dumpdev, sysctl_kern_dumpdev, "T,dev_t", ""); + /* * Doadump comes here after turning off memory management and * getting on the dump stack, either when called above, or by |