socsvn commit: r294624 - in soc2013/def/crashdump-head/sys: dev/null geom
def at FreeBSD.org
def at FreeBSD.org
Mon Nov 30 22:04:03 UTC 2015
Author: def
Date: Mon Nov 30 22:04:02 2015
New Revision: 294624
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=294624
Log:
Support DIOCSKERNELDUMPOLD I/O control only in FreeBSD 10. Copy encrypted key to kernel. Use new structures. Simplify code.
Modified:
soc2013/def/crashdump-head/sys/dev/null/null.c
soc2013/def/crashdump-head/sys/geom/geom_dev.c
Modified: soc2013/def/crashdump-head/sys/dev/null/null.c
==============================================================================
--- soc2013/def/crashdump-head/sys/dev/null/null.c Mon Nov 30 22:01:50 2015 (r294623)
+++ soc2013/def/crashdump-head/sys/dev/null/null.c Mon Nov 30 22:04:02 2015 (r294624)
@@ -30,6 +30,8 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include "opt_compat.h"
+
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/conf.h>
@@ -108,9 +110,11 @@
error = 0;
switch (cmd) {
- case DIOCSEKCD:
+#ifdef COMPAT_FREEBSD10
+ case DIOCSKERNELDUMPOLD:
error = set_dumper(NULL, NULL, td, 0, NULL, 0, NULL);
break;
+#endif
case DIOCSKERNELDUMP:
error = set_dumper(NULL, NULL, td, 0, NULL, 0, NULL);
break;
Modified: soc2013/def/crashdump-head/sys/geom/geom_dev.c
==============================================================================
--- soc2013/def/crashdump-head/sys/geom/geom_dev.c Mon Nov 30 22:01:50 2015 (r294623)
+++ soc2013/def/crashdump-head/sys/geom/geom_dev.c Mon Nov 30 22:04:02 2015 (r294624)
@@ -36,6 +36,8 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include "opt_compat.h"
+
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/malloc.h>
@@ -145,14 +147,13 @@
if (error != 0)
return (error);
- error = set_dumper(&kd.di, devtoname(dev), td, kda->kda_encrypt,
+ error = set_dumper(&kd.di, devtoname(dev), td, kda->kda_encryption,
kda->kda_key, kda->kda_encryptedkeysize,
kda->kda_encryptedkey);
- if (error != 0)
- return (error);
+ if (error == 0)
+ dev->si_flags |= SI_DUMPDEV;
- dev->si_flags |= SI_DUMPDEV;
- return (0);
+ return (error);
}
static void
@@ -468,24 +469,56 @@
case DIOCGFRONTSTUFF:
error = g_io_getattr("GEOM::frontstuff", cp, &i, data);
break;
- case DIOCSEKCD: {
- struct diocskerneldump_arg *kda;
- kda = (struct diocskerneldump_arg *)data;
- if (kda->kda_enable == 0)
- error = g_dev_setdumpdev(NULL, NULL, td);
- else
- error = g_dev_setdumpdev(dev, kda, td);
- break;
- }
- case DIOCSKERNELDUMP: {
+#ifdef COMPAT_FREEBSD10
+ case DIOCSKERNELDUMPOLD:
+ {
struct diocskerneldump_arg kda;
+
+ bzero(&kda, sizeof(kda));
+ kda.kda_encryption = KERNELDUMP_ENC_NONE;
kda.kda_enable = (uint8_t)*(u_int *)data;
if (kda.kda_enable == 0)
- error = g_dev_setdumpdev(NULL, NULL, td);
+ error = g_dev_setdumpdev(NULL, NULL, td);
else
- error = g_dev_setdumpdev(dev, &kda, td);
+ error = g_dev_setdumpdev(dev, &kda, td);
break;
- }
+ }
+#endif
+ case DIOCSKERNELDUMP:
+ {
+ struct diocskerneldump_arg *kda;
+ uint8_t *encryptedkey;
+
+ kda = (struct diocskerneldump_arg *)data;
+ if (kda->kda_enable == 0) {
+ error = g_dev_setdumpdev(NULL, NULL, td);
+ break;
+ }
+
+ if (kda->kda_encryption != KERNELDUMP_ENC_NONE) {
+ if (kda->kda_encryptedkeysize <= 0 ||
+ kda->kda_encryptedkeysize >
+ KERNELDUMP_ENCKEYLEN_MAX) {
+ return (EINVAL);
+ }
+ encryptedkey = malloc(kda->kda_encryptedkeysize, M_TEMP,
+ M_WAITOK);
+ error = copyin(kda->kda_encryptedkey, encryptedkey,
+ kda->kda_encryptedkeysize);
+ } else {
+ encryptedkey = NULL;
+ }
+ if (error == 0) {
+ kda->kda_encryptedkey = encryptedkey;
+ error = g_dev_setdumpdev(dev, kda, td);
+ }
+ if (encryptedkey != NULL) {
+ bzero(encryptedkey, kda->kda_encryptedkeysize);
+ free(encryptedkey, M_TEMP);
+ }
+ bzero(kda, sizeof(*kda));
+ break;
+ }
case DIOCGFLUSH:
error = g_io_flush(cp);
break;
More information about the svn-soc-all
mailing list