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