Date: Mon, 30 Nov 2015 22:04:02 GMT From: def@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r294624 - in soc2013/def/crashdump-head/sys: dev/null geom Message-ID: <201511302204.tAUM42lS070419@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201511302204.tAUM42lS070419>