summaryrefslogtreecommitdiffstats
path: root/sys/dev/slice
diff options
context:
space:
mode:
authorjulian <julian@FreeBSD.org>1998-05-06 22:14:48 +0000
committerjulian <julian@FreeBSD.org>1998-05-06 22:14:48 +0000
commit0cb054bfeab729f000a87716a669b995215502fc (patch)
treef0dd71a43184ebf7ebaf3423df86fdafb6633e4b /sys/dev/slice
parent719d62b3b0b317b7bd93f23baf86382fc6c6969f (diff)
downloadFreeBSD-src-0cb054bfeab729f000a87716a669b995215502fc.zip
FreeBSD-src-0cb054bfeab729f000a87716a669b995215502fc.tar.gz
Add dump support to the DEVFS/slice code.
now we can actually catch our crashes :-) Submitted by: Luoqi Chen <luoqi@chen.ml.org> (the man who's everywhere)
Diffstat (limited to 'sys/dev/slice')
-rw-r--r--sys/dev/slice/disklabel.c22
-rw-r--r--sys/dev/slice/mbr.c22
-rw-r--r--sys/dev/slice/slice.h4
-rw-r--r--sys/dev/slice/slice_device.c29
4 files changed, 68 insertions, 9 deletions
diff --git a/sys/dev/slice/disklabel.c b/sys/dev/slice/disklabel.c
index ff8c6f6..2934745 100644
--- a/sys/dev/slice/disklabel.c
+++ b/sys/dev/slice/disklabel.c
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: disklabel.c,v 1.2 1998/04/22 10:25:09 julian Exp $
+ * $Id: disklabel.c,v 1.3 1998/04/22 19:27:51 julian Exp $
*/
#define BAD144
@@ -74,6 +74,7 @@ static sl_h_claim_t dkl_claim; /* upwards travelling claim */
static sl_h_revoke_t dkl_revoke;/* upwards travelling revokation */
static sl_h_verify_t dkl_verify;/* things changed, are we stil valid? */
static sl_h_upconfig_t dkl_upconfig;/* config requests from below */
+static sl_h_dump_t dkl_dump; /* core dump req downward */
static struct slice_handler slicetype = {
"disklabel",
@@ -88,7 +89,8 @@ static struct slice_handler slicetype = {
&dkl_revoke, /* revoke */
&dkl_claim, /* claim */
&dkl_verify, /* verify */
- &dkl_upconfig /* subslice manipulation */
+ &dkl_upconfig, /* subslice manipulation */
+ &dkl_dump
};
static void
@@ -828,6 +830,7 @@ dkl_upconfig(struct slice *slice, int cmd, caddr_t addr, int flag, struct proc *
case SLCIOCRESET:
return (0);
+#ifdef BAD144
case SLCIOCTRANSBAD:
{
struct private_data *pd;
@@ -838,6 +841,7 @@ dkl_upconfig(struct slice *slice, int cmd, caddr_t addr, int flag, struct proc *
*(daddr_t*)addr = dkl_transbad144(pd, *(daddr_t*)addr);
return (0);
}
+#endif
/* These don't really make sense. keep the headers for a reminder */
default:
@@ -916,3 +920,17 @@ dkcksum(lp)
}
#endif /* 0 */
+static int
+dkl_dump(void *private, int32_t blkoff, int32_t blkcnt)
+{
+ struct private_data *pd;
+ struct subdev *sdp;
+ register struct slice *slice;
+
+RR;
+ sdp = private;
+ pd = sdp->pd;
+ slice = pd->slice_down;
+ blkoff += sdp->offset;
+ return (*slice->handler_down->dump)(slice->private_down, blkoff, blkcnt);
+}
diff --git a/sys/dev/slice/mbr.c b/sys/dev/slice/mbr.c
index 5558775..08e8b35 100644
--- a/sys/dev/slice/mbr.c
+++ b/sys/dev/slice/mbr.c
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: mbr.c,v 1.2 1998/04/22 10:25:09 julian Exp $
+ * $Id: mbr.c,v 1.3 1998/04/22 19:27:51 julian Exp $
*/
#include <sys/param.h>
@@ -85,6 +85,7 @@ static sl_h_claim_t mbr_claim; /* upwards travelling claim */
static sl_h_revoke_t mbr_revoke;/* upwards travelling revokation */
static sl_h_verify_t mbr_verify;/* things changed, are we stil valid? */
static sl_h_upconfig_t mbr_upconfig;/* config request from below */
+static sl_h_dump_t mbr_dump; /* core dump req downward */
static struct slice_handler slicetype = {
"MBR",
@@ -99,7 +100,8 @@ static struct slice_handler slicetype = {
&mbr_revoke, /* revoke */
&mbr_claim, /* claim */
&mbr_verify, /* verify */
- &mbr_upconfig /* config from below */
+ &mbr_upconfig, /* config from below */
+ &mbr_dump
};
static void
@@ -839,6 +841,8 @@ mbr_upconfig(struct slice *slice, int cmd, caddr_t addr,
daddr_t blkno;
int part;
+ if (!slice->handler_up)
+ return (0);
blkno = *(daddr_t *)addr;
pd = slice->private_up;
sdp = pd->subdevs;
@@ -868,3 +872,17 @@ mbr_upconfig(struct slice *slice, int cmd, caddr_t addr,
return (0);
}
+static int
+mbr_dump(void *private, int32_t blkoff, int32_t blkcnt)
+{
+ struct private_data *pd;
+ struct subdev *sdp;
+ register struct slice *slice;
+
+RR;
+ sdp = private;
+ pd = sdp->pd;
+ slice = pd->slice_down;
+ blkoff += sdp->offset;
+ return (*slice->handler_down->dump)(slice->private_down, blkoff, blkcnt);
+}
diff --git a/sys/dev/slice/slice.h b/sys/dev/slice/slice.h
index 553bdb5..ee7cd36 100644
--- a/sys/dev/slice/slice.h
+++ b/sys/dev/slice/slice.h
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: $
+ * $Id: slice.h,v 1.1 1998/04/19 23:31:10 julian Exp $
*/
typedef struct slice_handler *sh_p;
@@ -125,6 +125,7 @@ typedef int sl_h_claim_t(struct slice * slice, struct slice * lower,
typedef int sl_h_verify_t(struct slice *slice);
typedef int sl_h_upconfig_t(struct slice *slice, int cmd, caddr_t data,
int fflag, struct proc *p);
+typedef int sl_h_dump_t(void *private, int32_t blkoff, int32_t blkcnt);
struct slice_handler {
char *name;
@@ -140,6 +141,7 @@ struct slice_handler {
sl_h_claim_t *claim; /* claim a new slice */
sl_h_verify_t *verify; /* verify that a slice as it was before */
sl_h_upconfig_t *upconf; /* config requests from slice below */
+ sl_h_dump_t *dump; /* dump the core */
};
/*
diff --git a/sys/dev/slice/slice_device.c b/sys/dev/slice/slice_device.c
index d471bd4..d5c418a 100644
--- a/sys/dev/slice/slice_device.c
+++ b/sys/dev/slice/slice_device.c
@@ -23,9 +23,10 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: slice_device.c,v 1.3 1998/04/22 19:27:52 julian Exp $
+ * $Id: slice_device.c,v 1.4 1998/04/24 07:53:55 julian Exp $
*/
#define DIAGNOSTIC 1
+#include "opt_hw_wdog.h"
#include <sys/param.h>
#include <sys/systm.h>
@@ -39,7 +40,9 @@
#include <sys/devfsext.h> /* DEVFS defintitions */
#include <dev/slice/slice.h> /* temporary location */
-
+#include <vm/vm_param.h>
+#include <machine/md_var.h>
+#include <i386/i386/cons.h>
/* Function prototypes (these should all be static except for slicenew()) */
static d_open_t slcdevopen;
@@ -369,8 +372,26 @@ static int
slcdevdump(dev_t dev)
{
sl_p slice = minor_to_slice(minor(dev));
+ static int slcdoingdump = 0;
+ int32_t num, nblocks, lo;
RR;
- if (slice == NULL)
+ if (!slice || !(slice->flags & SLF_OPEN_DEV_WR) ||
+ !slice->handler_down->dump)
return (ENXIO);
- return (0);
+
+ /* Toss any characters present prior to dump. */
+ while (cncheckc() != -1)
+ ;
+
+ if (slcdoingdump)
+ return (EFAULT);
+
+ num = (int32_t)(Maxmem * PAGE_SIZE / slice->limits.blksize);
+ nblocks = (int32_t)(slice->limits.slicesize / slice->limits.blksize);
+ lo = dumplo * DEV_BSIZE / slice->limits.blksize;
+ if (lo < 0 || lo + num > nblocks)
+ return (EINVAL);
+
+ slcdoingdump = 1;
+ return (*slice->handler_down->dump)(slice->private_down, lo, num);
}
OpenPOWER on IntegriCloud