From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752597AbdJTCie (ORCPT ); Thu, 19 Oct 2017 22:38:34 -0400 Received: from mail-bl2nam02on0077.outbound.protection.outlook.com ([104.47.38.77]:40268 "EHLO NAM02-BL2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752300AbdJTCfx (ORCPT ); Thu, 19 Oct 2017 22:35:53 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=brijesh.singh@amd.com; From: Brijesh Singh To: kvm@vger.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 , x86@kernel.org, linux-kernel@vger.kernel.org Subject: [Part2 PATCH v6 33/38] KVM: SVM: Add support for SEV DEBUG_ENCRYPT command Date: Thu, 19 Oct 2017 21:34:08 -0500 Message-Id: <20171020023413.122280-34-brijesh.singh@amd.com> X-Mailer: git-send-email 2.9.5 In-Reply-To: <20171020023413.122280-1-brijesh.singh@amd.com> References: <20171020023413.122280-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: MWHPR1701CA0020.namprd17.prod.outlook.com (10.172.58.30) To SN1PR12MB0157.namprd12.prod.outlook.com (10.162.3.144) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 4f6172f7-28dc-4aff-eb20-08d517634179 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(48565401081)(4534020)(4602075)(4627075)(201703031133081)(201702281549075)(2017052603199);SRVR:SN1PR12MB0157; X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0157;3:wX454UsG/urWJSWRriN5g8+ZCmiPN8np2CYkvgQqE0cItAOkXV5AwXPcHGntkBkuj9f3v0+UI5A8l+YbQkdZEuAYdUiV8WyZ3ww823zhL5XYmyF3ymnTAd+uuyPOxCgclZzH2dxZxoIvOAInRVUZsNHwBTBK8+lLFsfn40AoILEMPKzA10Vq/kg/WM1FU+F6Ck9XX3csXic0Y52brAzjw3baEOIxu7oONQkbO0JoN6I/UGbGNXB36utY8Q8D1ip5;25:TozftNCMCugrYFNyUzKtkvjg3evmREwvfW7avGnZcwr32Ero14TyD0VZ+7kk2NWZM9f8rE4A8emTedqUz9E4INnkiBMNmSkGMwuLUzIj1/j7l2gaY8403G7vK3anAh8k4GrdRkYPi0MomhSVwWyg0wH35wNyCbXgEPc4Ka1CoY2sUaEID+zLLz67SuGstAGmzh+KvvQc/6BYUyX+tqpUVz6bJLCKGFYHan7kXKSYP/tSBCTrja28wubAUpxA8MDdXz2kMN6pioR/DkU1Q5vIIAOcGZOvWxtsSXpJjPdhl/e3Q6+8+QfXfruzyQauKIjYkPZhsyKTjbylbkSMsd1mzA==;31:ZO4YW4/+pqK/3MQtMQNPahDG9k39ahgOCIo+KcdoB/UrTnm2lI3EblMnewjx2B5eG+Tnol96mbgGLklsrxL7E4AC3fSovTrfEC0t5S4uAA+jxeXB+699rp0koTG0vQTRRah2pogi7zhOnJEvi2cJ1nXPyGUxOHhtMfe75ET1H0NvUPxXkCii/SxmW/w84Bctp6O/m/a0IS8hr7JmTwXz1e253Zbv1FIfZ9a4pH41EXM= X-MS-TrafficTypeDiagnostic: SN1PR12MB0157: X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0157;20:WSxbjOBAh8OA+qWwECuPnCwlgC3CjkyOM3V2nv8/6OKwv+lsquwlNpfDWMF1IH/kAbOL6E0dw0G/X21z5BT+YPza6OUYQWNF8GUuFjeEVBm406AjQV+p0vu9t/WgkLENfIJnA/4mTL08CSFf+60ejaFiE0dONUIrGqRs6xCoLULUBjexE2zfbfCQQC+K1TWhghlh4ttibIP9wjApCUxxBFZXJD2MFbpJh0LqZuVKFZYPGpnsUWS1yTUj4+wjZOO38t3Y8Kb+I+MM9fqFh3IOvW29cpUhoN9levdue2Z9ZRdi+fb41GGpZN6+3VSdoaMMx3kecO3m3uIMbmtLCIfjkBotP9jycPAUttFSHh9ItVUghwsZTZkhcvZVvJmrumStJ2sZlVfsRplTumHtuz7+n3h/SQLFoS5YjBC3BfGeFqTB42GpO0e5CiUgY/cBYVPQxUZZaT1jhzr2YvhWdm7xUisdafPZk/bd58BhKVKB77sF28Agh0DuD2PPzFor3e/Z;4:Dd/43rAsUVo6fW0zR2p60xk7K5qEgzLfHZHpawpvL65fzV2QO/O79Ja+puNNv2ljScdeuOnOu+3OuZoy+qyMmOTkCaaBa5wafks15QWHGuCQWElcX5WQFImyNSrKvu7pqXCqnXmZS0Na6gC03IzA/9hzvYPEBsiqpKt8Snyhwl3le9+BAb0aYrOIAtMsoZuTiqpxDC+UrZ1jhw1bkRb0t1+UR49f02znmFozu3OmR3KKfD/4GbvpojMELqpOoCyLt36Z9Ra8ypm4ZUYagHxKkbWnIvGb7chDpTdKMhdgWhWKFPaBLGtrEIneTdpRuYFEMfXi0MjHiSHpnL+2Qvgz4A== X-Exchange-Antispam-Report-Test: UriScan:(9452136761055)(767451399110); X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(8121501046)(5005006)(3231020)(100000703101)(100105400095)(10201501046)(93006095)(93001095)(3002001)(6055026)(6041248)(20161123555025)(20161123564025)(20161123558100)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123562025)(20161123560025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:SN1PR12MB0157;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:SN1PR12MB0157; X-Forefront-PRVS: 0466CA5A45 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(6009001)(346002)(376002)(39860400002)(199003)(189002)(36756003)(7736002)(68736007)(50466002)(1076002)(478600001)(4326008)(16526018)(316002)(53936002)(6486002)(86362001)(305945005)(53416004)(54906003)(50226002)(2351001)(106356001)(101416001)(81166006)(105586002)(8676002)(2361001)(76176999)(2870700001)(2906002)(50986999)(6916009)(23676002)(66066001)(47776003)(6666003)(97736004)(6116002)(2950100002)(189998001)(8936002)(3846002)(33646002)(81156014)(7416002)(5660300001)(25786009);DIR:OUT;SFP:1101;SCL:1;SRVR:SN1PR12MB0157;H:ubuntu-010236106000.amd.com;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtTTjFQUjEyTUIwMTU3OzIzOkhoaE02NG5tbDlqUEl1ODJIb1pscXBNTHNt?= =?utf-8?B?RmUzT1dSaTlOMjE2SDlieGxMTGtYemRXUEhtQ21kK2hia3U4ZU4xaDhWbFho?= =?utf-8?B?cTNtbENxdkdHMHRoWXI2RnlkN2VnOWIwemd3UTllcHA1eUNSTkR1YzFxeFVD?= =?utf-8?B?T1BGTW1WK3lVWkRnOGFLSmpHUXlpYTZuL1hnL1hUTU9zZy95TVNaZEE1WWpU?= =?utf-8?B?eGRiVUl0SitTR0k0cEs3SW1MQlhMMC93L2tBU3FZNWpUSEdsN1ZlclZleEMz?= =?utf-8?B?SXpYUFBQRFJTT3ZCcE9iRnUyRkllWVBvRUJ1UXliZTBHQWQvdUxOekk0SDNQ?= =?utf-8?B?cUU3RzZNYytCNWZBZzc2eCtnb0xQd3JyVmRFbDk0SGlrMWlUUUJkUjFLVDgy?= =?utf-8?B?eDd6Y0VBdkdPY09zUGtpOEEzcTNjcC9UYzVUL2JZdDdudDFIY0hqUk5wK3FD?= =?utf-8?B?YUY0c2JpZ1YwV0dweUVXeXFPdS8wKzFIakVTMjdZd0pBTTFTc0dRT0hpb0tu?= =?utf-8?B?ekIrN0JSKzlmUVpBdTlGVFlBSURxaGJQRldkaE9XVCtUZ0VqOWxDZnJTU2JE?= =?utf-8?B?YUZwQlZ0RUQ0U25jK2dxdWN1WUVPTzJRZC9vMmtid2lqemphNThQNm5CdFdj?= =?utf-8?B?MHM1UGI2U0FHeTNld2hVdklLdWVGWW9NMm9JOGlzcmNCaDlYRG5Ybm9FNE05?= =?utf-8?B?MUd3UUd6cHNKaDFJNzB2QUxDZlFERGExZVcxd1dPd3ZqNG5vczF3R2hiRVZs?= =?utf-8?B?aDd5TFZpMm5aNnYwWmh3bnM5UUVEeXU5b09tNzF6cC9yeThIWUZ0MER5U2pn?= =?utf-8?B?RnhCeElwWFE4eHZWWjhyT3V6MFN4N1U4L1VvL2EzVnNmVjJKWEJEK1FMZkhZ?= =?utf-8?B?alZTVENXY2wwMHVQbk04OGpDV3FxL0hiaERoQVlWNlZvaWdPeTNrOGlTWEtU?= =?utf-8?B?R0N4RXZlUVJSdlBwbHF2QkhVcXJJendEYnFBOVF2Z3FoTzlvUnlBa2JuSkhU?= =?utf-8?B?SHk3bVpMZ3p3SzhSem9XOXpxRE9kNjhFempIUjRabXNPYm9JalRlbnZndkJp?= =?utf-8?B?SHl4MUc0a3BkeGQ5czhvL01aNWZkMi80THpObTlRY094V0xEZGIxSHhINmc2?= =?utf-8?B?QngzMm9FQm54UGg0eE5rQmFIeUFvSXlSaDNocXp4cXBpcUtYRnV3QjJxSGhl?= =?utf-8?B?ZEpCckhUdUNwTWpMOStoczJvVGNZMlB2SURWY2QxL3liRXpJemwvRzJEd0h1?= =?utf-8?B?VFdNRzhIelJ6ZkwwSnRHMFBjbHZaT2hPOVFoQnFieFJFNHk2dlhoVEVQb0px?= =?utf-8?B?UU9CVHhIdDV2QmdqdmhHNUNDdGhvNk1KMUdhUllSODJXNDl1aVdGV0hGcnIw?= =?utf-8?B?ODllU1pQb1Q4dXJiaitWdWJ1SXRqMjJpeWZQM2lGSi90SGpadHlFVktBSFU2?= =?utf-8?B?RXMrNmI0MEtHeGtGZVlGMWE3M05nK1NJZVlCczhSQ1dBZm11SndzdUsyVUNW?= =?utf-8?Q?Frq7Rkwwqo8mAL94oSQ+yXG+rgKdVDRsW8Lvph3uy/e4N2?= X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0157;6:whvlgBQOJdIjVoyVgVQfHf520R5OS39IUtWDbMqcIntWJCkWjgbHtOJQ01D0Tp7Kf54sdjqdtzXl6QjuU6TzDQ9VM1+APZGN6VoeH+RXLg/qjJTzrJ11ofW6mQmHWqm8It1M2d8hvq9lj124UHQxVkI5wwtdMz24sYKKxoOatxfCBgx3BX1hQWPPgQBJZ7EtEM72XDld3RWfrTlGfDG/IwEPHgnFHEw7AQFMOn+tmPflnbHcsv58Sbr50koCIIuR1lVJZjmq5I8k7qZiKkO9V5QTsPYpPYhjul6WrMOw1R5Gu7VKrsNh8NiNOd87df6FAETWtKaEFyt4Ajbq5V1wtw==;5:OTVOOtuxRZEPKnUD39ql7DN5YMuB9qI7UUiv+ppzb6+jjHkg6KvaGRDmYC+kKZYJt0X13zHH3lhDnH6qd56srORYeJPsdVNh+LBsBBHgJ14blEg73rpwhE35TWvQixySjMrjPraulRJaF+CYKmvK1w==;24:GqafOqQ1Hir3M8PTtWSiXb4LBVVPmK4SRt0NczzYRhggQfyDcty+WW+gKuy+OHT/8Y0yDN0H400s08w/XPjYG4DwN4SFUN/PFFttPNjEBpw=;7:tN4D8ADOQ1Is6kWOFe1jblzYta9GpCC+6a1ahwsfNE3TtNUe+c9bkBZbNyreYU8Pw5iE6z+h8zSjC8JCZrtwg9a2fsCdtvX/w0rnwLe5ERIHlDywiCnU3ztH+1UIJ97dL7+rqbhQ3R6nLWr9Bs3dREK+AfOXcJeOjSy02X0kApIrbORtHFW05eWLIb628Yh47i3TVMHlMXimYLNw/yWmAXjUgbpGvwrSDKbgpNbGvSI= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0157;20:bX19GRr1yIPsdHY0fziV0OnUuW+LrTIEPMpqiqVE1kpo5h4SF2vcSeucuHg2kbrJd4KX10W7dpnmUl5RT6OZfr3vmbwc9roPOuGDQXgLF4RnZ91f53xS+E/jVDcwn2Ds1uObrov1eM0u+HIUmmHhK0GKbJKFwbs1Ob1+AOPTCG/AoocKA9s+KWT7EgkhQCr/ur+cbv/tS2eV52A1BjXOEMraBofAY5wFtWRrFMVndW43g9kgJM61gQ7a2jrpaWFE X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Oct 2017 02:35:39.3471 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 4f6172f7-28dc-4aff-eb20-08d517634179 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR12MB0157 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The command copies a plaintext into guest memory and encrypts it using the VM encryption key. The command will be used for debug purposes (e.g setting breakpoints through gdbserver) 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 --- arch/x86/kvm/svm.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 114 insertions(+), 5 deletions(-) diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index f19c4fb2fdc8..a91eae7b9c80 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c @@ -6122,6 +6122,99 @@ static int __sev_dbg_decrypt(struct kvm *kvm, unsigned long paddr, return ret; } +static int __sev_dbg_encrypt(struct kvm *kvm, unsigned long __user vaddr, + unsigned long paddr, unsigned long __user dst_vaddr, + unsigned long dst_paddr, int size, int *error) +{ + struct page *src_tpage = NULL; + struct page *dst_tpage = NULL; + int ret, len = size; + + /* + * If source buffer is not 16-byte aligned then we copy the data from + * source buffer into a PAGE aligned intermediate (src_tpage) buffer + * and use this intermediate buffer as source buffer. + */ + if (!IS_ALIGNED(vaddr, 16)) { + src_tpage = alloc_page(GFP_KERNEL); + if (!src_tpage) + return -ENOMEM; + + if (copy_from_user(page_address(src_tpage), + (void __user *)(uintptr_t)vaddr, size)) { + __free_page(src_tpage); + return -EFAULT; + } + paddr = __sme_page_pa(src_tpage); + + clflush_cache_range(page_address(src_tpage), PAGE_SIZE); + } + + /* + * If destination buffer or length is not 16-byte aligned then: + * - decrypt portion of destination buffer into intermediate buffer + * (dst_tpage) + * - copy the source data into intermediate buffer + * - use the intermediate buffer as source buffer + */ + if (!IS_ALIGNED(dst_vaddr, 16) || + !IS_ALIGNED(size, 16)) { + int dst_offset; + + dst_tpage = alloc_page(GFP_KERNEL); + if (!dst_tpage) { + ret = -ENOMEM; + goto e_free; + } + + /* decrypt destination buffer into intermediate buffer */ + ret = __sev_dbg_decrypt(kvm, + round_down(dst_paddr, 16), + 0, + (unsigned long)page_address(dst_tpage), + __sme_page_pa(dst_tpage), + round_up(size, 16), + error); + if (ret) + goto e_free; + + dst_offset = dst_paddr & 15; + + /* + * modify the intermediate buffer with data from source buffer. + */ + if (src_tpage) + memcpy(page_address(dst_tpage) + dst_offset, + page_address(src_tpage), size); + else { + if (copy_from_user(page_address(dst_tpage) + dst_offset, + (void __user *)(uintptr_t)vaddr, size)) { + ret = -EFAULT; + goto e_free; + } + } + + + /* use intermediate buffer as source */ + paddr = __sme_page_pa(dst_tpage); + + clflush_cache_range(page_address(dst_tpage), PAGE_SIZE); + + /* now we have length and destination buffer aligned */ + dst_paddr = round_down(dst_paddr, 16); + len = round_up(size, 16); + } + + ret = __sev_issue_dbg_cmd(kvm, paddr, dst_paddr, len, error, true); + +e_free: + if (src_tpage) + __free_page(src_tpage); + if (dst_tpage) + __free_page(dst_tpage); + return ret; +} + static int sev_dbg_crypt(struct kvm *kvm, struct kvm_sev_cmd *argp, bool dec) { unsigned long vaddr, vaddr_end, next_vaddr; @@ -6174,11 +6267,19 @@ static int sev_dbg_crypt(struct kvm *kvm, struct kvm_sev_cmd *argp, bool dec) d_off = dst_vaddr & ~PAGE_MASK; len = min_t(size_t, (PAGE_SIZE - s_off), size); - ret = __sev_dbg_decrypt(kvm, - __sme_page_pa(src_p[0]) + s_off, - dst_vaddr, 0, - __sme_page_pa(dst_p[0]) + d_off, - len, &argp->error); + if (dec) + ret = __sev_dbg_decrypt(kvm, + __sme_page_pa(src_p[0]) + s_off, + dst_vaddr, 0, + __sme_page_pa(dst_p[0]) + d_off, + len, &argp->error); + else + ret = __sev_dbg_encrypt(kvm, + vaddr, + __sme_page_pa(src_p[0]) + s_off, + dst_vaddr, + __sme_page_pa(dst_p[0]) + d_off, + len, &argp->error); sev_unpin_memory(kvm, src_p, 1); sev_unpin_memory(kvm, dst_p, 1); @@ -6199,6 +6300,11 @@ static int sev_dbg_decrypt(struct kvm *kvm, struct kvm_sev_cmd *argp) return sev_dbg_crypt(kvm, argp, true); } +static int sev_dbg_encrypt(struct kvm *kvm, struct kvm_sev_cmd *argp) +{ + return sev_dbg_crypt(kvm, argp, false); +} + static int svm_mem_enc_op(struct kvm *kvm, void __user *argp) { struct kvm_sev_cmd sev_cmd; @@ -6234,6 +6340,9 @@ static int svm_mem_enc_op(struct kvm *kvm, void __user *argp) case KVM_SEV_DBG_DECRYPT: r = sev_dbg_decrypt(kvm, &sev_cmd); break; + case KVM_SEV_DBG_ENCRYPT: + r = sev_dbg_encrypt(kvm, &sev_cmd); + break; default: r = -EINVAL; goto out; -- 2.9.5