socsvn commit: r289487 - soc2013/def/crashdump-head/sys/kern

def at FreeBSD.org def at FreeBSD.org
Sun Aug 9 22:38:31 UTC 2015


Author: def
Date: Sun Aug  9 22:38:29 2015
New Revision: 289487
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=289487

Log:
  Add a generic function to dump raw data.

Modified:
  soc2013/def/crashdump-head/sys/kern/kern_shutdown.c

Modified: soc2013/def/crashdump-head/sys/kern/kern_shutdown.c
==============================================================================
--- soc2013/def/crashdump-head/sys/kern/kern_shutdown.c	Sun Aug  9 21:32:05 2015	(r289486)
+++ soc2013/def/crashdump-head/sys/kern/kern_shutdown.c	Sun Aug  9 22:38:29 2015	(r289487)
@@ -1001,6 +1001,22 @@
 	return (0);
 }
 
+static int
+dump_check_bounds(struct dumperinfo *di, off_t offset, size_t length)
+{
+
+	if (length != 0 && (offset < di->mediaoffset ||
+	    offset - di->mediaoffset + length > di->mediasize)) {
+		printf("Attempt to write outside dump device boundaries.\n"
+	    "offset(%jd), mediaoffset(%jd), length(%ju), mediasize(%jd).\n",
+		    (intmax_t)offset, (intmax_t)di->mediaoffset,
+		    (uintmax_t)length, (intmax_t)di->mediasize);
+		return (ENOSPC);
+	}
+
+	return (0);
+}
+
 #ifdef EKCD
 /* Encrypt data and call dumper. */
 static int
@@ -1015,6 +1031,10 @@
 	kdc = di->kdc;
 	kdk = di->kdk;
 
+	error = dump_check_bounds(di, offset, length);
+	if (error != 0)
+		return (error);
+
 	/* Data have to be aligned to block size. */
 	if ((length % KERNELDUMP_BLOCK_SIZE) != 0)
 		return (EINVAL);
@@ -1059,32 +1079,24 @@
 }
 #endif
 
+/* Call dumper with bounds checking. */
 static int
-dump_check_bounds(struct dumperinfo *di, off_t offset, size_t length)
+dump_raw_write(struct dumperinfo *di, void *virtual, vm_offset_t physical,
+    off_t offset, size_t length)
 {
+	int error;
 
-	if (length != 0 && (offset < di->mediaoffset ||
-	    offset - di->mediaoffset + length > di->mediasize)) {
-		printf("Attempt to write outside dump device boundaries.\n"
-	    "offset(%jd), mediaoffset(%jd), length(%ju), mediasize(%jd).\n",
-		    (intmax_t)offset, (intmax_t)di->mediaoffset,
-		    (uintmax_t)length, (intmax_t)di->mediasize);
-		return (ENOSPC);
-	}
+	error = dump_check_bounds(di, offset, length);
+	if (error != 0)
+		return (error);
 
-	return (0);
+	return (di->dumper(di->priv, virtual, physical, offset, length));
 }
 
-/* Call dumper with bounds checking. */
 int
 dump_write(struct dumperinfo *di, void *virtual, vm_offset_t physical,
     off_t offset, size_t length)
 {
-	int error;
-
-	error = dump_check_bounds(di, offset, length);
-	if (error != 0)
-		return (error);
 
 #ifdef EKCD
 	if (di->kdc->kdc_enable == 1) {
@@ -1093,56 +1105,24 @@
 	}
 #endif
 
-	return (di->dumper(di->priv, virtual, physical, offset, length));
+	return (dump_raw_write(di, virtual, physical, offset, length));
 }
 
 int
 dump_write_header(struct dumperinfo *di, struct kerneldumpheader *kdh,
     vm_offset_t physical, off_t offset)
 {
-	int error;
 
-	error = dump_check_bounds(di, offset, sizeof(*kdh));
-	if (error != 0)
-		return (error);
-
-	error = di->dumper(di->priv, kdh, physical, offset, sizeof(*kdh));
-	if (error != 0)
-		return (error);
-
-#ifdef EKCD
-	if (di->kdc->kdc_enable == 1) {
-		di->kdc->kdc_lastoffset = offset;
-		di->kdc->kdc_lastlength = sizeof(*kdh);
-	}
-#endif
-
-	return (0);
+	return (dump_raw_write(di, kdh, physical, offset, sizeof(*kdh)));
 }
 
 int
 dump_write_key(struct dumperinfo *di, struct kerneldumpkey *kdk,
     vm_offset_t physical, off_t offset)
 {
-	int error;
 
-	error = dump_check_bounds(di, offset, kerneldumpkey_size(kdk));
-	if (error != 0)
-		return (error);
-
-	error = di->dumper(di->priv, kdk, physical, offset,
-	    kerneldumpkey_size(kdk));
-	if (error != 0)
-		return (error);
-
-#ifdef EKCD
-	if (di->kdc->kdc_enable == 1) {
-		di->kdc->kdc_lastoffset = offset;
-		di->kdc->kdc_lastlength = kerneldumpkey_size(kdk);
-	}
-#endif
-
-	return (0);
+	return (dump_raw_write(di, kdk, physical, offset,
+	    kerneldumpkey_size(kdk)));
 }
 
 void


More information about the svn-soc-all mailing list