Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752736AbdLEBG7 (ORCPT ); Mon, 4 Dec 2017 20:06:59 -0500 Received: from mail-by2nam01on0087.outbound.protection.outlook.com ([104.47.34.87]:63748 "EHLO NAM01-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752042AbdLEBGo (ORCPT ); Mon, 4 Dec 2017 20:06:44 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=brijesh.singh@amd.com; From: Brijesh Singh To: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, x86@kernel.org Cc: bp@alien8.de, Brijesh Singh , Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , Paolo Bonzini , =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= , Joerg Roedel , Borislav Petkov , Tom Lendacky Subject: [Part2 PATCH v9 34/38] KVM: SVM: Add support for SEV LAUNCH_SECRET command Date: Mon, 4 Dec 2017 19:06:12 -0600 Message-Id: <20171205010616.5958-5-brijesh.singh@amd.com> X-Mailer: git-send-email 2.9.5 In-Reply-To: <20171205010616.5958-1-brijesh.singh@amd.com> References: <20171205010616.5958-1-brijesh.singh@amd.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Originating-IP: [165.204.78.1] X-ClientProxiedBy: BN6PR04CA0055.namprd04.prod.outlook.com (2603:10b6:405:3b::44) To DM2PR12MB0156.namprd12.prod.outlook.com (2a01:111:e400:50ce::19) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 84b100a4-1374-4013-79d6-08d53b7c70d6 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(5600026)(4604075)(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(48565401081)(2017052603286);SRVR:DM2PR12MB0156; X-Microsoft-Exchange-Diagnostics: 1;DM2PR12MB0156;3:o4EyFGZ/dgKt0ZSLvLl5AYW4PBGlEgGseQUMpCTY7y+MIG0ZLx1e/zz2UevMc0akgbkcKNe9uMEX84G0imj6YZJl6OfbtfrJRf0yjJE+d8MBYMfHDc/LRTwgFXw61Jl6WU6utQq61XA5qsXF8bbafz+e05Vj/7+WeEr2PZKOZ/lmhpGY1NH8j2hQG4AHT3IyNjxOgk2u7F/FL6Qf9estbRre1qqDoWul7QDuh11JWujbbE/dTjJ/olBjbyTRrNw4;25:/fzJbm8jYDmZKZc0QYENyApobq1b2CukF3ZYwlak/DNrjjHvV6GkHHsRRVgGQL7FwCt3LlBNWKCyggnXrGAxcM3dnwPIUTGc6OvEsHoAFfFytNoFWGyANLsoy5ZGWbaxqr2TAX6hH829bWSUq2d/twtNtR49nm5rCZOgdEq02/1zgP8QlUc9Q4vM5d+7QWve/YcDlLcgSzJrLtzM6E+S34bRk/tk8mhMgqaK6a2rQeEz4VbF5atf7KVNwyMNP87nqJpnrK0mEY2adKfZ3cGsaAbjCDVPlMe4IuB3EwytCMLzKQ/CfS9M9j5+R3qxTA15EN68LDrHvZlZL56DI9GLoA==;31:tGdhC75SmnMTJDYXjsgutwQSRGnHRVrofnmY9xB+inYFnlMJhwL23wxoA+Qq+jyXizzyz2VCNPGd4nuMfKDQYlEtiNCLYnCxSrQUCuSqi5XFtxY+JqZNJ1RZyju2UaxZHNfrCUHX0OZpEDh463DYZGjL+5s6vo/q10hb/+9AyjWK8It1bFrM8HLuwl/KMEi94me6hoxqBEnmZFpvlKZlBvLfhnDIFb6a9A3wWfprNMM= X-MS-TrafficTypeDiagnostic: DM2PR12MB0156: X-Microsoft-Exchange-Diagnostics: 1;DM2PR12MB0156;20:1R4u2AeHSr1zpwDuMkzJkblIAk8Bc0B34itEBO98r0jY+ga74SsUv1ZKKYwHXMxrMPtWC0vt+1ysQPJUwLpaxTS9SwqGQR9Lfi6YZsFSh1FRpN+FcBUnNvjSx2ZPRLbkrARVxYrL3P13paKgG6eglCwKjiVAiAXPPC20pZRTQlTwI1d6NYpOTDzvsxdDXLv+cuyE9jfCJfHsdigIvrQ5oYtGGxTnqaZDau84V0TC2fmbgfHzM3QMTCQ5YDNU367kgM4hvMO5e3weKdFoZPmPT8JJfrNL0ZCvTj5PVdQmfr9F6YacYVFyD2tr1qC5KtYwJbdoTv77g7OB68xpHYix0+K6fVoMqaI3z6HTaNk7tDQaRuYh9yzm3pBwExxBfgqmreeaVHru1xg97r8jPBuCCSzDWqAFk1GncrWo0TdyZAR8zPWNRiNdhcYa3LOuzFRR0sCYL8W2BLHfoiX5UXHAYvWsVXBVNJikoeEeXWbIwHp+uCdoJqin4QpugwL7uVyx;4:RPQncsCsmE69tnx1CdUlBH21cB6N2NO6zY7+TaWH7oJkltx4mm6hIlEHoIMnuancPMuO61Ek5mz9AAD9O/467gfvfug8p2194HNwJT97wHHhDAROIktlOWcpkVPGjh0QTQvWLGdL8tU+S77rP6FYsjYjbW/xgtbDF/hGhVm6iZk4/SZeELNwr544yOBcWVGfZfuaWzaqSDJAmKyBuku7PM1fUYtANcaPGUx/QWB0LMADxu4jFDXoAvu8Eg+D4GDnyW+JOZZVN5wjtnrbrvYqxXvcinfi9tpZNh41AkEjhyNKb8Y6iCdJSjyvzIizYF5cujTJn+XYfjPFePPE0XCRtQ== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(9452136761055)(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040450)(2401047)(5005006)(8121501046)(10201501046)(93006095)(93001095)(3002001)(3231022)(6055026)(6041248)(20161123562025)(20161123560025)(20161123558100)(20161123555025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123564025)(6072148)(201708071742011);SRVR:DM2PR12MB0156;BCL:0;PCL:0;RULEID:(100000803101)(100110400095);SRVR:DM2PR12MB0156; X-Forefront-PRVS: 0512CC5201 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(6009001)(376002)(346002)(39860400002)(366004)(189002)(199003)(316002)(66066001)(50466002)(23676004)(47776003)(25786009)(54906003)(86362001)(53416004)(7696005)(76176011)(16526018)(36756003)(8936002)(81166006)(6486002)(81156014)(305945005)(50226002)(7736002)(53936002)(5660300001)(52116002)(2950100002)(6666003)(33646002)(4326008)(101416001)(8676002)(478600001)(2906002)(7416002)(2870700001)(1076002)(189998001)(106356001)(6116002)(3846002)(68736007)(97736004)(105586002)(219293001);DIR:OUT;SFP:1101;SCL:1;SRVR:DM2PR12MB0156;H:wsp141597wss.amd.com;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtETTJQUjEyTUIwMTU2OzIzOkFaSUxBWFJUdk5QTGxKSUZEUVBlNWc4VnhZ?= =?utf-8?B?UEZlSitqU1pHdVhBWjE0M0hTUDcyUEZKSWF5Q3VxUGQ3ZGdHRWk5SXYxUHly?= =?utf-8?B?TkdIbWtqS2pJZVlIUmQ5WEovd1lDKzdvYXJDdVpPQjR2eWpZYmZQN3ZlMW5p?= =?utf-8?B?MkEwUnZkbmw3V2xrVWNVS1JhdFJVUWprZms4ZmMva2Z6N0x6VUlabXlBKzFt?= =?utf-8?B?bzd1Tk1GTWZ0bjBtaUVETkVwMDFrQVIwRXArSklxWHIzelNzcytqSXVvbTR1?= =?utf-8?B?dll1Ynl1a3FiRysxNjY4OXpyZy9lU3l0bktpb25EeloyMVF0Nm1taTUxU0F3?= =?utf-8?B?alNnVWlUY0tNaG5kLzY3aENUWk1EcVNINmdtYlZWVVVSTm0zZlEzTWdtYXY3?= =?utf-8?B?R3A3N0Q2Q0MxQUVLS2NLZ3BKYXBIeEVjQVdUMDlLT0RTVFByNDlxblRBUlZE?= =?utf-8?B?MEdzR2ZtaXpCSEJzZ0dseVZ5aUh3V1RqK0lhaUhWZHRtME9zUU9VL3BIbEJy?= =?utf-8?B?VFpSVHVUT3crWjlOOE9WbVRGQWQvdXB3RVVBeTFoWHdsZm5qUmVuZ0pmVnli?= =?utf-8?B?R085eEhhZnFKNlpzN0JMVDdxQUVNM1U4OStCVmNaT0VBMXQ2T2tqZmVlTVA2?= =?utf-8?B?UUprL05ncTZrMVVtUjBXNi9FVjJWc0xnbGRraTlIaldKUjJiMEprbjFyU2Vp?= =?utf-8?B?eG9HRHF6MGdDS2lUMWJiMHQySTh4c1N6c0NkZEZEZDN4bjBzbGsxdndUZkVG?= =?utf-8?B?cDR0c3dpZzN2VDJXMmtQYW1aRXdLaDB0N3EvR0IycWpXSENGQmlWalFHbXlX?= =?utf-8?B?YklnZGlhcHV3TUFCY2RlbDVOWWsvQkx1ZWluUnVWbjJyNDA0TjVFSzMwY3g5?= =?utf-8?B?bUVzeFNsM0YzN0V3cDFCOWZxNlI1TkkzdHA5R3hXcm4yNW8wL1pmVmd3V2hS?= =?utf-8?B?N0l0dXpTTE53ZG1EMzNCclV1bjFBaUpyL3Z1ekZqVmttdFFNSmhEbFVSMkJZ?= =?utf-8?B?QmVEcUpTVk9TcXNzL0g0dGNaOFE0US9OL3FQNGpTelBVbkxEQWp5MGJCQmx0?= =?utf-8?B?WE1WRFFOZVFaa05jVFgzcXRyRit5eTQ2TVNERFFMOVVoQUd6VG5FdjBzM3hz?= =?utf-8?B?NldYRzFFdkRaVkpJa2VCYlJWbXZyWkNkQmhMQU10RXVoZDBxN2Mvem9LcXRM?= =?utf-8?B?T0xLT0lwczJodTcwVTN5TFVHOU1KaWh1K2UzdENjU244ZDBiazhUMlNKTjdS?= =?utf-8?B?dzZyTGV0dmtVN0JBYWY1b2F4MmFFRzZrc3RQMG5RUW9EdEpZZ0lIUTV5MW9C?= =?utf-8?B?clR0UFd3K0pJbzNHcmFKZ2N0SmZPUytOK3VEMzZYcmZ6Mis1eTlMSy92Sjlt?= =?utf-8?B?WTNjT2JoSURGMlE4NVRlMU8vaHJmUXRjRHcxR1ZkWERmU3hkTHRGampQTi9R?= =?utf-8?B?ejRzY1FKVXhsUGpnTi90djBqNUk2RW5BU294WnZXREhLamEwMHN2UG10ek5Y?= =?utf-8?Q?0sw4TUDQ1be9kxFVp4bEwWXndAA3sD6CpyTokDOAZ7AD2U?= X-Microsoft-Exchange-Diagnostics: 1;DM2PR12MB0156;6:NvR5qTevr6fQxwVVulpmap7tIVAYNebMhxHGfwoY7+ZJQEIGP4UshJPeFfkvdxlFZ1ODxZuQxeTln7VjQeHnFNvt8JT8drkoT1w+6YCRDKlqUTIK89xmPab1m1Xq496Z4MyFw1qZZGi3g2zg4Ba7GuCgmwRobBJZiRGgGdgJ8rvA1jTfcIq3ldIL9I7L7YErrCO7sFVSfloqZ0APLnhBrWRuOpZkAyxmv6bJJTDhZxTFQ9LkgzfRBuzgdhlNkhMuf8CHKaUGCf/BMSx7DcgIj4rorGXLhNwNHD6CGkscXYYjJE1qn/AqZusDLlye3j6NahWi08Ccc+ljM7St2NwSlW2XlLAnuafHr0f6mh/nikU=;5:Gw1J+uuylRX+EsBmDbGAlbXYv0lXqPyfMvoeFgAC6nXEWH440HaFjpmebskQ2yvKGIa+LvN5aGQ0uNKTF+hEuLnpg0Q/Cs0rHeJtJnQ5Z0sQQrtXgYqx5xCXaf+WAKmQCfo8sGRDm2F5cyZYtWnlvVEfNDPq4CHUa4NEGikWfag=;24:iXWPgX1om+VMa3m9BsMvy3aaZEw7ubIV102O9Ax161U9RlIt4TZP2uTZGonXdsHNzRPngCSQShFXv7dARtjqob3pvk8oRkQR3TnP4Z0Z9kU=;7:dwqTTBys0v4wWC44gQwnbHlK3DnBjsifYnK+SpOGoKTFI8U6iK5N/FuvQ1BS4Tkh31WwLnC1sxLzesDjHw7MVe+gipnFJEkYxieLzqYw0tJTIpCwqNZbfTjTCuZgjcNSNELeDqhixQc63oFDWxm2zQcgukxyQ7H5YyqA5M9hd8BCSSlae8px+si7wJwON+sO8MoNp0PlMUwpKMfAloVPBofBfwLTeaW0lqmPVaew4hqmqSowqe6ukjvziWwWaELK SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;DM2PR12MB0156;20:wb+a0hCkPDPv+6qr38HOPvByJx0aANnWuaWTtjnHp3ruqjRSePjr7hlQj4KqAYdHONxY1I3RK+FsBNlUbCLn6t3LKEb250u8VyQQEgM/9RUDq5Q6OrSaljM3Qe2IoiHy9bWJ/Plf8ToABZQM1zLL7gWv0fnqEN4z6ei5/yxcVD537gI1YNex12tOtFiG2iJDKrmfIFY0r9OYStMDMEWpKUhEGmp+v+hsBCaRyRfk9+8TZotBBr3uxPZQ/dL6FBPF X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Dec 2017 01:06:38.6005 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 84b100a4-1374-4013-79d6-08d53b7c70d6 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM2PR12MB0156 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2898 Lines: 107 The command is used for injecting a secret into the guest memory region. Cc: Thomas Gleixner Cc: Ingo Molnar Cc: "H. Peter Anvin" Cc: Paolo Bonzini Cc: "Radim Krčmář" Cc: Joerg Roedel Cc: Borislav Petkov Cc: Tom Lendacky Cc: x86@kernel.org Cc: kvm@vger.kernel.org Cc: linux-kernel@vger.kernel.org Signed-off-by: Brijesh Singh Reviewed-by: Borislav Petkov --- arch/x86/kvm/svm.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 11d4860997d9..8a499425bf7e 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c @@ -6397,6 +6397,71 @@ static int sev_dbg_crypt(struct kvm *kvm, struct kvm_sev_cmd *argp, bool dec) return ret; } +static int sev_launch_secret(struct kvm *kvm, struct kvm_sev_cmd *argp) +{ + struct kvm_sev_info *sev = &kvm->arch.sev_info; + struct sev_data_launch_secret *data; + struct kvm_sev_launch_secret params; + struct page **pages; + void *blob, *hdr; + unsigned long n; + int ret; + + if (!sev_guest(kvm)) + return -ENOTTY; + + if (copy_from_user(¶ms, (void __user *)(uintptr_t)argp->data, sizeof(params))) + return -EFAULT; + + pages = sev_pin_memory(kvm, params.guest_uaddr, params.guest_len, &n, 1); + if (!pages) + return -ENOMEM; + + /* + * The secret must be copied into contiguous memory region, lets verify + * that userspace memory pages are contiguous before we issue command. + */ + if (get_num_contig_pages(0, pages, n) != n) { + ret = -EINVAL; + goto e_unpin_memory; + } + + ret = -ENOMEM; + data = kzalloc(sizeof(*data), GFP_KERNEL); + if (!data) + goto e_unpin_memory; + + blob = psp_copy_user_blob(params.trans_uaddr, params.trans_len); + if (IS_ERR(blob)) { + ret = PTR_ERR(blob); + goto e_free; + } + + data->trans_address = __psp_pa(blob); + data->trans_len = params.trans_len; + + hdr = psp_copy_user_blob(params.hdr_uaddr, params.hdr_len); + if (IS_ERR(hdr)) { + ret = PTR_ERR(hdr); + goto e_free_blob; + } + data->trans_address = __psp_pa(blob); + data->trans_len = params.trans_len; + + data->handle = sev->handle; + ret = sev_issue_cmd(kvm, SEV_CMD_LAUNCH_UPDATE_SECRET, data, &argp->error); + + kfree(hdr); + +e_free_blob: + kfree(blob); +e_free: + kfree(data); +e_unpin_memory: + sev_unpin_memory(kvm, pages, n); + return ret; +} + static int svm_mem_enc_op(struct kvm *kvm, void __user *argp) { struct kvm_sev_cmd sev_cmd; @@ -6435,6 +6500,9 @@ static int svm_mem_enc_op(struct kvm *kvm, void __user *argp) case KVM_SEV_DBG_ENCRYPT: r = sev_dbg_crypt(kvm, &sev_cmd, false); break; + case KVM_SEV_LAUNCH_SECRET: + r = sev_launch_secret(kvm, &sev_cmd); + break; default: r = -EINVAL; goto out; -- 2.9.5