From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933012AbcHVX3u (ORCPT ); Mon, 22 Aug 2016 19:29:50 -0400 Received: from mail-bl2nam02on0078.outbound.protection.outlook.com ([104.47.38.78]:32289 "EHLO NAM02-BL2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S932578AbcHVX3o (ORCPT ); Mon, 22 Aug 2016 19:29:44 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=brijesh.singh@amd.com; Subject: [RFC PATCH v1 27/28] KVM: SVM: add KVM_SEV_DEBUG_ENCRYPT command From: Brijesh Singh To: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Date: Mon, 22 Aug 2016 19:29:35 -0400 Message-ID: <147190857531.9523.10196506226671736370.stgit@brijesh-build-machine> In-Reply-To: <147190820782.9523.4967724730957229273.stgit@brijesh-build-machine> References: <147190820782.9523.4967724730957229273.stgit@brijesh-build-machine> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: BLUPR05CA0068.namprd05.prod.outlook.com (10.141.20.38) To BLUPR12MB0660.namprd12.prod.outlook.com (10.163.217.30) X-MS-Office365-Filtering-Correlation-Id: c270e3ec-0a69-4aa3-8150-08d3cae4308d X-Microsoft-Exchange-Diagnostics: 1;BLUPR12MB0660;2:iK2W77Yx2wP+3mhF/S5YIzHQL44xc6Eqmqw0VDQMKxDz+F8uIaN1B75I3qxMpCj1okxwIAZpgLtxz2Tt7yZqm0rWSvnrtksDwvcwW3xDK+XTr8deFiFrQn9wvbgPwnxuJmEW5CM6KbbL9gYIqsncZdB+M+oMdlALimKvJDtil10d2D2YMOSmNs4RgU5MC/7d;3:+ZTIsfnzkNIake2d3Ci+R9PDGsLwrSev+z/U6aC3gwie+ZwqsrcEjMmFB6i0cIa3QXG/R6jun2j/p0CMpbxgOmJ6MHQFL6VDBKE17G7Sbql02Ktcag7+c3E0uRCUqxEl;25:6o0kMoVp0eCFB2qQ5JKE/mG3rIteJFVayL9QOSxJvpZKmCQp0YA8Hs7hXoIAQVkynAL/FL5YVEZTkCgCM0EWWQsHZ1aJfFcYWHRGjzpequ3p/XUQixJcecNtpS9Xkli+TKbhRKnF2g0Y2KyQM9vdoF6nQxwL3kNJgomBi7sVjh1klzU1o0VOO/mceRM4Cauppsn6J0UXbV9YEKUowK73AbD8z36YnO/zsL4ll5SnaDX8HMBNzLw5Ctv3HqqJw/ujJzSc2SHwlQzr6wqHqqZXlgGiaUghEgZvFqeh1UAufgIDw7s26YCdX+hie3+yfEhOJCNM5O2aJR4sUySn2mXEo8iQZLgZeGbttX3hxvCxI3wSWFAx4+Ado3Q98Nwig15e2Ni8uxIpcPJ0j5OdT5k5GVuSkT1hCnaCfHistj/rEQE= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BLUPR12MB0660; X-Microsoft-Exchange-Diagnostics: 1;BLUPR12MB0660;31:errDQjXYk8XbHLU1584LcNAAQcL94HMTodP328xEnf23MXGCBk7aT1IPy6LHsa8PkLhLgRVyUmpFCfOYrixB1ZgcCmrmif/fzpYm5yAU0JxRvZ4cpIZtujkWJVaJJIjmXCXjtOtsYxpAiYdVS5AAmwtaHg5nU+CumXq5FjQu1debW6huE9ZAYoK/tEZgQso0+6nrykHyw6IWiTr02inMjQfbS3Ab5vRoyavPMu6pz00=;20:1mv3rNhv46NSxkHoSxG3dsQevrYvErxIu6axEUDSE590mtgUvrv7z12tAoCJEUbse/S/uBd3UEJ/OibnTyKj1ZV2CXbkgH7AmLGLmCgBujWu7pEyAIPVZFNPhlesVMtSEY8HmE+Q8WP3MJCfXL40xxLeDIfnaTirrSKWJLiMyM3i0YWIHs9Jp4ACGb7xtVwHei8ohrSYX6oxLa6wKlh0V/RscqyuhvvKSQBiX/foNxgXfsW0kKWR3zXb3eVfuKwlIDdqsgC6MP6sWdwqE5hq0fYYmZPXHvLcEOq/KLSK39Q5kPOtwwsqzxj2+hpr4yjtZZSXMPXpTpMrXEIKbZ+EufbY7ivDeUAPl0cEvDhvi7IKVZt94nllMzzIzlLjaSDJtD/1fEFc9iVvAT4Ec0OCgQsFJABSvCZictQNen+szGYadB/4UZqfsKS/wo6XCl1A6rMyIaj5LS9EAUBEAFOYQ5mH815dLrJbKHIGwI/ngxf4fFtJcqQntC4UIufZu4We X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040176)(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046)(6055026);SRVR:BLUPR12MB0660;BCL:0;PCL:0;RULEID:;SRVR:BLUPR12MB0660; X-Microsoft-Exchange-Diagnostics: 1;BLUPR12MB0660;4:jceEBLWgPDQcWzcm13v2ewkBVZxXViO4aHYDOgdx0fm2S1kDnOLNJKXGtn3gunigfc9+5N2GOW3kALX53xRqtT7wJu+IPAijOzOEspwNIYqBRmqV+3wXhPBx1kdOjkJC+aZgsonzC/qYwQfoKURXrDvVI3iF/pDDWRSPQ1BM8UE/W9qf36LMlNvg+Nl9Fdbnhp8onLzuhKe0fQMw3PzPP7MXu81qDoGubacFVUpKwXxE+xwWHFv8t+nwNrzmZOiH3dWUV0MF+/u31VTzeY+WXp+hMwpDGIcank0xqYYJhZhrbXoHZWLXhYKE0XDos9k6YRD930Ky5a5fM+JXO1a6BJO9eliPZKvvJbzCkEL5X4ig19BetcfE2KJuNLZC70c02hsm6SH1QuLOwS6aXJjvgmGLiO0z4x8y6BxRL7qiaswv4/RfOijo0YqbNq2KRZJn X-Forefront-PRVS: 00429279BA X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6049001)(6009001)(7916002)(189002)(199003)(54356999)(6116002)(105586002)(7736002)(101416001)(230700001)(76176999)(3846002)(2906002)(9686002)(66066001)(5660300001)(7846002)(103116003)(33716001)(50986999)(305945005)(4001350100001)(92566002)(2950100001)(23676002)(33646002)(8676002)(81156014)(77096005)(7416002)(7406005)(15975445007)(97736004)(19580395003)(5001770100001)(42186005)(47776003)(106356001)(19580405001)(86362001)(189998001)(50466002)(107886002)(229853001)(81166006)(2201001)(68736007)(586003)(83506001)(921003)(1121003)(83996005)(2101003)(217873001);DIR:OUT;SFP:1101;SCL:1;SRVR:BLUPR12MB0660;H:[127.0.1.1];FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtCTFVQUjEyTUIwNjYwOzIzOlJHcDFFRjh3TWdCemlRMjVpeXp5RFlTRHRB?= =?utf-8?B?M2NuQWVheE11MDR4Q2Q3cGFlbWovZGIzbEgyMVlCdm9uSHlUeWdlUXdNaFo0?= =?utf-8?B?eUV2UmNBNGVPN1duL3JuS0VYeXFkZlJXRWtDYUMwR2p1Yk9HVlUyMVNCZkhW?= =?utf-8?B?VVl6Vyt5WHVrTEcvZEhiSkRzbVBvQUVFbzZjQVRyQURpT1VjT2VNMy90ajNu?= =?utf-8?B?b0pkaEtBaERWMkdrRmMwajMvMXBFb3JrQ28vUmpuN2FidE8rOGk0MHZsdi9p?= =?utf-8?B?UGF5ejlZNVFWZUtHUFVXT2RRNmorbEw3SUNMSURLMHBBQ1ZTckR2ZElSY2kv?= =?utf-8?B?RERwazZodUpVSEgrNCtWYlo3ZTRKT2IwWURnUVYybzd0TWIwR2lnMUFreGxT?= =?utf-8?B?NkVxbWsyOUdUKy9zS2Ewbnl5a2UvKzBuSmNERldUMDk1ZVFVZmVBcXNQMGFB?= =?utf-8?B?Kzh5VER0a1dqL2diNU5ocXVGNm5sSkkxUWFRVlVUYXJYaUFrVFBUNXRMY1cw?= =?utf-8?B?a3BQeVNtZ1I3elFBQi90R3lJUTRFVXFJREpHZkIrRUxXU1NNS1MwZFZuZ1Jn?= =?utf-8?B?T052YzZGTXZUcjBvWWNjOWFPYXhmWndRaW1aTVJrZ2kyM21YNWhoN2pTUlpL?= =?utf-8?B?dEFQdkJYTE5TT3RsQXVIUUZhSmdzTFJ0UWVkaEFoN1lJc0ZyQ3FPajh6WWxi?= =?utf-8?B?aGlRL2doZndrcXR5aGpmM1VZVFhPRHl1ZWk5OUxIdFVITGxNUFJZMnE2Q2I0?= =?utf-8?B?SVVvVUZnLzhYS001ZTA2UzRER1B3SnV1L2pkYko1TEIyTXdqWnhYYXEzMmx5?= =?utf-8?B?S2thdGRmS3RndFZQdmcyVXltc3Jqd1NlaUpBNHhpeDlBdGRoZVA1cjJjeC9q?= =?utf-8?B?b1h2ZTMrQWtLczFZMGk3aVgyUlVvVzh6YnpYVENGRnpGenNWVWJCNGpsQ2to?= =?utf-8?B?a1MybzNhS3dhYXNFQ0VlbllOUkR1cDBkN1NJNnk0bUF3SlE3ZlQvbTRrTU9Q?= =?utf-8?B?bjRRS3dPL1R6Z05OT3pXZGxFcDVYSjRQRC9udUVpUkJwZmNUQkc0NFJBZHdz?= =?utf-8?B?Q2UxUmtJQVBvMHErY2RtV25HcWZudVRjeS9pMnl2RisvUzNWV3RZamYyUlRy?= =?utf-8?B?UkpQZTM0OUtuNDhmMmVlT0V2SmZmY3NSeDVuQyt0eEVLRkNnTWsyZGtZNVVI?= =?utf-8?B?dVQzcW42a0gzTDBtRTdDeTJFalRQejQ4eW9uVTdOcnFaUUsxUkRpcWZROXhr?= =?utf-8?B?Y0M0RHp4emgrbzExVXZLckE2Y2RQNkVjVmphUkNlY1FXMGxTcDZWWXpGWXZG?= =?utf-8?B?Q3hNcUwxL0RJZnZ5bklyNTh0SzRrcjVGb3FZR1BsV1ZpZy8va0Q1dG1ONVgw?= =?utf-8?B?Q2ZzUjY0Mm9Yd2kxNGVQZEx2OWpWbHo0eVEwaGkycG1HaGM3M21ZeTVoOXc2?= =?utf-8?B?VkpyQmI4WUtsS1ROUFBJeHZvMGhIcXUvQ0tlM1JqOWJhc3dHSnM1aGtZTUJ6?= =?utf-8?B?dG9VZzV6UFdYWFJDd1g5VldFWDhUb0tOTmFINHFKNkxJb2V5bGdUQjQxRFZ1?= =?utf-8?B?ZzNhM09yVkZlSXd0RUhzTUJlYjI1UVhyQm1FeFpjSnlOMXlhWXBKOEtOVk5M?= =?utf-8?B?c1hnaU41bFA4RmZCQlU1NTQrTnJ2d0d6TW0vcXpPWi9IVUdnbkE0djcvbEpZ?= =?utf-8?B?bFVUbXFLQ0F5cm1xaitYNXVQd09LM0JXQnIraWd0UzY5S2tPQzlENXFiU0pp?= =?utf-8?B?SU1TOWF4ZERhRXA5dDIzSlFtNWNqMXhvY3B3bG5sVklHa2ZEenVUdWt5Ungy?= =?utf-8?B?Y1Z1TFM4WXYxZ0RLYVdOdEJrd3V4aVBWaUU0cngxL2Z4cituNGZIN1dHaWlV?= =?utf-8?Q?x2YWbI+hF7s=3D?= X-Microsoft-Exchange-Diagnostics: 1;BLUPR12MB0660;6:aZgTIBZa9kHDIdkk9vuNaVApxBI4g6DlkSlVtpZCysKqGukqm2tJEVhJY5dZ1LQkzdC9iaz41WobkVKutWFeepO7+JG8GWOdmocmPfLf+qb1fimppYJ7sIJGfyUb3ZtkXuvui2yOa4MI0WWL/afcCKW27x5ZRUvxe2wpMI92rzGTLInI0KuYWP7RcevbS7VMViQrRT5eJypzaswDnILMn5Ygct2AVRGFj1SgQ9WqJXmmrqFoNSBhJk2brG9F5fkLF1pbWgyEJLzbQcNW+TOehuTgmtwC+VvUada2xIQn821zYLfts1omVt/Boo7D36QkkpUEYgBynBAjCFxwg7lV6A==;5:tuzqPpt5tBgoLXiDILmvp/vsVwopCJwdSUKYj+A5ZiP+zQkbj2MrbFSD7AT4ePfDbF40RF6Jn8Fe6jWbhCwWDnXocd0VTBkYR+mvEyWSwx/CQKQpXBTFxNeOrxeJLcpSvU7JLKlvlGP+YmiANcRMfA==;24:A6vNnd9y2TWE+0o+b+j4d3WCKSn7yER9XsITHx4VfQHCEZcwT4/PI9RTx0kKpHXvCC53TPcmbwVEE2JfwpH2fSeJ8ez0GPK71Yw7veycg8A=;7:BKANH2SWO5w8qNInSSrUVICi7ejO6UeAv4GfK2xGivSHELIbkCD3V4tOj9iV7oQvpcokqPtT90GDiV5aRr/vqBvaE+PaEzOzimv4tqxS+B/uE9EebWB8BSn3KSwclCVoPD04lpBxoYYNRw7Ex/KUx2j03yuv5iwTEwL5WPGM7cjU+16g9K4RAtsgoyo0k640Lh4yOlEfPRJ19PsLnnHU+dmy8krYddZDiL82oyRYgVQMWq03sZ+OwVO8EQ8MUkW6 SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;BLUPR12MB0660;20:6vWGfwLdD8pGXorA22ensKGs96gM5jVdEKEcxwyHE274j+z/wx0LGyyIxskOkV6WOi/ad5umVYLhsOMRz/uAF65T31hXHGyQ8KWdkmRtHmG1vuebSj91z5Xd1rns8MHAmSxK7H9/ieRf8tMOVSMG6lVRQ7f76CjAN2OgR0YTtlFSkfmvrO9JZkrWS/Oc2QkYGLqAF85tgfe+uEAX+sTjI9qUuk1y6srivcIxpjDAie2yZds0NOtJRUOl//8MxQFN X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Aug 2016 23:29:38.5738 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLUPR12MB0660 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The command encrypts a region of guest memory for debugging purposes. For more information see [1], section 7.2 [1] http://support.amd.com/TechDocs/55766_SEV-KM%20API_Spec.pdf Signed-off-by: Brijesh Singh --- arch/x86/kvm/svm.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index b383bc7..4af195d 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c @@ -5684,6 +5684,101 @@ err_1: return ret; } +static int sev_dbg_encrypt(struct kvm *kvm, + struct kvm_sev_dbg_encrypt __user *argp, + int *psp_ret) +{ + void *data; + int len, ret, d_off; + struct page **inpages; + struct psp_data_dbg *encrypt; + struct kvm_sev_dbg_encrypt debug; + unsigned long src_addr, dst_addr; + + if (!kvm_sev_guest()) + return -ENOTTY; + + if (copy_from_user(&debug, argp, sizeof(*argp))) + return -EFAULT; + + if (debug.length > PAGE_SIZE) + return -EINVAL; + + len = debug.length; + src_addr = debug.src_addr; + dst_addr = debug.dst_addr; + + inpages = kzalloc(1 * sizeof(struct page *), GFP_KERNEL); + if (!inpages) + return -ENOMEM; + + /* pin the guest destination virtual address */ + down_read(¤t->mm->mmap_sem); + ret = get_user_pages(dst_addr, 1, 1, 0, inpages, NULL); + up_read(¤t->mm->mmap_sem); + if (ret < 0) + goto err_1; + + encrypt = kzalloc(sizeof(*encrypt), GFP_KERNEL); + if (!encrypt) + goto err_2; + + data = (void *) get_zeroed_page(GFP_KERNEL); + if (!data) + goto err_3; + + encrypt->hdr.buffer_len = sizeof(*encrypt); + encrypt->handle = kvm_sev_handle(); + + if ((len & 15) || (dst_addr & 15)) { + /* if destination address and length are not 16-byte + * aligned then: + * a) decrypt destination page into temporary buffer + * b) copy source data into temporary buffer at correct offset + * c) encrypt temporary buffer + */ + ret = __sev_dbg_decrypt_page(kvm, dst_addr, data, psp_ret); + if (ret) + goto err_4; + + d_off = dst_addr & (PAGE_SIZE - 1); + ret = -EFAULT; + if (copy_from_user(data + d_off, + (uint8_t *)debug.src_addr, len)) + goto err_4; + + encrypt->length = PAGE_SIZE; + encrypt->src_addr = __pa(data) | sme_me_mask; + encrypt->dst_addr = __sev_page_pa(inpages[0]); + } else { + if (copy_from_user(data, (uint8_t *)debug.src_addr, len)) + goto err_4; + + d_off = dst_addr & (PAGE_SIZE - 1); + encrypt->length = len; + encrypt->src_addr = __pa(data) | sme_me_mask; + encrypt->dst_addr = __sev_page_pa(inpages[0]); + encrypt->dst_addr += d_off; + } + + ret = psp_dbg_encrypt(encrypt, psp_ret); + if (ret) + printk(KERN_ERR "SEV: DEBUG_ENCRYPT: [%#lx=>%#lx+%#x] " + "%d (%#010x)\n",src_addr, dst_addr, len, + ret, *psp_ret); + +err_4: + free_page((unsigned long)data); +err_3: + kfree(encrypt); +err_2: + release_pages(inpages, 1, 0); +err_1: + kfree(inpages); + + return ret; +} + static int amd_sev_issue_cmd(struct kvm *kvm, struct kvm_sev_issue_cmd __user *user_data) { @@ -5719,6 +5814,11 @@ static int amd_sev_issue_cmd(struct kvm *kvm, &arg.ret_code); break; } + case KVM_SEV_DBG_ENCRYPT: { + r = sev_dbg_encrypt(kvm, (void *)arg.opaque, + &arg.ret_code); + break; + } default: break; }