From owner-svn-soc-all@freebsd.org Mon Nov 30 22:04:03 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id A6CC7A3D03E for ; Mon, 30 Nov 2015 22:04:03 +0000 (UTC) (envelope-from def@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 91AE71FE2 for ; Mon, 30 Nov 2015 22:04:03 +0000 (UTC) (envelope-from def@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id tAUM43IT070479 for ; Mon, 30 Nov 2015 22:04:03 GMT (envelope-from def@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id tAUM42lS070419 for svn-soc-all@FreeBSD.org; Mon, 30 Nov 2015 22:04:02 GMT (envelope-from def@FreeBSD.org) Date: Mon, 30 Nov 2015 22:04:02 GMT Message-Id: <201511302204.tAUM42lS070419@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to def@FreeBSD.org using -f From: def@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r294624 - in soc2013/def/crashdump-head/sys: dev/null geom MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 30 Nov 2015 22:04:03 -0000 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 __FBSDID("$FreeBSD$"); +#include "opt_compat.h" + #include #include #include @@ -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 __FBSDID("$FreeBSD$"); +#include "opt_compat.h" + #include #include #include @@ -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;