From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752013AbdISUu0 (ORCPT ); Tue, 19 Sep 2017 16:50:26 -0400 Received: from mail-by2nam01on0052.outbound.protection.outlook.com ([104.47.34.52]:32170 "EHLO NAM01-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751887AbdISUrT (ORCPT ); Tue, 19 Sep 2017 16:47:19 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=brijesh.singh@amd.com; From: Brijesh Singh To: linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: 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 Subject: [Part2 PATCH v4 22/29] KVM: SVM: Add support for SEV DEBUG_ENCRYPT command Date: Tue, 19 Sep 2017 15:46:20 -0500 Message-Id: <20170919204627.3875-23-brijesh.singh@amd.com> X-Mailer: git-send-email 2.9.5 In-Reply-To: <20170919204627.3875-1-brijesh.singh@amd.com> References: <20170919204627.3875-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: CY4PR04CA0071.namprd04.prod.outlook.com (10.171.243.164) To SN1PR12MB0158.namprd12.prod.outlook.com (10.162.3.145) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: af9602db-fe02-4fa2-b66b-08d4ff9f9a85 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(2017030254152)(48565401081)(300000503095)(300135400095)(2017052603199)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);SRVR:SN1PR12MB0158; X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0158;3:J1gLDt6nnGl1Me9BLp0d0IwuA9PYulfCcrGQVgrBSPkR33bmR2oCpAf5PCG7HjA5g5PrNLI10ZyG13RytE7spn9ldb6nWMF5+9Ufhs/BrDVZeLq6zfktRHyCU/2oGkdyxO/oiTHI8PIaHPtkk6/JLU1WIVCrxH5zTL7+Lf76JaUXB6ZNmBqQKTLiWfW1SLzJjszMn/dWguffLo9EeGBRVpxICSInHegZzLqfVQnyOvehVCSoGpPtqp/auTT11EG1;25:qrFoWra91mwJC88/1r9NN9TWP53qwMg2kXBv04vGQJ7ReZwzrsLte3zLSTN68KY1aV7JTZM+fnUgZCTDvT2XZnQoIkX0t0f68/h7nSmGXeeY1N4hpWHb0rYQNLSSsLTqqf3BlntaBgfKcWuMHZyQKOByh0jhpXChccAHA4LBcvKCK8wziTUFFI6OZQkTh/D9Z7BS7UoTv//WpKceYDIzWPHNCt/u10+9HPtDXbFO5gBCb6F/p4xV9dvEKQprdx2zBpCRfeUS4Kgl/hS7cMKul1ilIMhhAUq2CMrUEjm8P2h+12WJXRlD4m7+u6kNgPX9F2nP9fUB27OcD/+PwI8R/g==;31:aSumTOF13CxgWRofGDYj4F5+t/tX+VAJEjxVZzGwdg99WyTI0DMPFJSK5nf5WYJQpgdGjfZ9Jka1JN5iBZQnPJgss6zo6LX9qCGUUy3x6SGI3zSvVTAvDAV+fGJs9HxfEr1VotXJxSbZv6QGACw/Ov/KQhWfvWMY3wNQbQmmv2xq8y3DLYKXxKZO5jTwJ+O7pCVLZPONImuvHUdCHTB1pNWd6R9b3CaAPGhHVly8YAQ= X-MS-TrafficTypeDiagnostic: SN1PR12MB0158: X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0158;20:9ZZqn5OxTANdIc48FJBIHkw9M2Pfn4ipctU6YPRm1Nvw6ykBzVA33c1eG4wxhG1wMHPI4+LetLKzqZtBdKIDhJfy0+RzarFtptlv/4ak8WbG8Yg5AxPEt7ZVEuHEERDACffQZ6cAtiUzc8N2o3C6yOaVEukZeFUAmzsA/xp5ZIX+WD55jha75G4k3H1ZupiJIaspkgvY5Knb0baRgPIzup/pJMp9jrsNUVxkjPi+BLLf4nT2OYCCJLZFazXG9nBCtBNXeYo9Nm8gvbh2h5AD0nz8eNSe4Vzt0fMXpTSM8Nd0NwAmbxVaRnxSaMLnWW8rFO18gYPZoy4vGfVZQ2iW/rME4AOSHiVT/izlysblQ9wm0yucrZVDZB2ef2eYguibPrDV9nGlcrIAiZdnS98G+1UeJs7O+HWHquV+Dn/Que/hpESlwtcrq9tu92zt98UnoQ1+qnwEZfMbPMB08tIh0LWDfYqFN3iM5t9fw5cSz86asizc1FdGXaAojIMudZtN;4:hwHkq8qw83QoW67ussWhqS7yJFWMHW9Sf0vs27bcOauv3Evpz6m4S87DokiZ2gTaOTJ81fjuylzC9nCLWafrRxko0ug213J5wwYUSL8ZjW1OxIeLxvJ0sft8AHG0ufdFro6seQ0lvG1oinJPeRs7xA1V8bXqtF1spV13Gkf4PEPSG8O0hG/Z2YSsxrB5N9e9/CbfK45KZrb2orim3TwSVIvTwAa3VBznNZIkkEFIjQkpMKRBpuDV/O6g0We3LlgOgTcUH/4z21Qc5wGTncFnrFQ0LJbEDsJVafQaAYxDFCrXg3wQn6eOHao9SwlEGEBbCdugUSUjaBNvyUEWFHHUAA== 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)(93006095)(93001095)(100000703101)(100105400095)(3002001)(10201501046)(6055026)(6041248)(20161123560025)(20161123558100)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123555025)(20161123562025)(20161123564025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:SN1PR12MB0158;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:SN1PR12MB0158; X-Forefront-PRVS: 04359FAD81 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(6009001)(346002)(376002)(39860400002)(199003)(189002)(86362001)(50466002)(8936002)(97736004)(6116002)(3846002)(7416002)(81156014)(8676002)(50226002)(2950100002)(81166006)(316002)(478600001)(16526017)(6666003)(7736002)(66066001)(305945005)(47776003)(6486002)(189998001)(53416004)(25786009)(101416001)(2870700001)(50986999)(76176999)(53936002)(2906002)(68736007)(36756003)(106356001)(1076002)(4326008)(5660300001)(105586002)(33646002)(23676002)(54906003);DIR:OUT;SFP:1101;SCL:1;SRVR:SN1PR12MB0158;H:ubuntu-010236106000.amd.com;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtTTjFQUjEyTUIwMTU4OzIzOnhTMFpPVXVvdTNsaDBnRHY3T1pkSEtabW82?= =?utf-8?B?OFNrS2kyVk1VR2ZYR3ptY1NhcXBYclVxSU1PeCtYSmlucDFuSTR2dW1weCt1?= =?utf-8?B?UGNCQnNRSjdRYVVoa29CQzQzSmNBeXlHbm1ZSWUyakduMGZPc2xyeE1jeFZ4?= =?utf-8?B?U1M4c0JQb0FDMytJdDdZdkloWmFMSCtXdm1jN0l1RDJ4Zy9PQS9UVGpPelps?= =?utf-8?B?UjY5UGFML0hKaUoyVGtuTXI5YnpDUGcvV3NjVStFL2tTREF1bVY3UE5IUUJS?= =?utf-8?B?T2krUXllZjRKSGdvUlIvV1UzbWVqdkxjcVlISW9zeklPU2IxcUJxcHZLdVp2?= =?utf-8?B?U0JpV3lraERNMW5TVk5xaVBtOTNMYThLZlFBQWk2MjRHTmV3Mmg5ZjN4elZn?= =?utf-8?B?OEFzNDZYa3ZwYjJVbXgxSlMxVWtjdUdHVENERGhHNVRpOXlaeUVkdWk5Um5K?= =?utf-8?B?SG42OUtUTm5ic2FwNXdYZ2dhTU9MNDFSSVgzQXZsZ2NQM2xkbkdudThNWkFL?= =?utf-8?B?bUE1K1hSVkRpL01MeVRPSkVxYW5PajFqdU5nNGlDVGFuTjF1WUFma3JZSFAy?= =?utf-8?B?NTNzb1ZjTHQwMEh2T2JueGNVbGpWN3h1c2hPODFOZHlSbEFrbnN6ODJNa2pm?= =?utf-8?B?eGRubVM1d1BwbnBWN1RpNHkxb09RMW5pbnVoeE1PSGRpNzZkODBoOUhhYUs1?= =?utf-8?B?Rzhyc2JpT2lnL1Z2QmFXRVJqOGhqYndzRTlDYmRaUGpjVXlJRjEyTDF4SFU4?= =?utf-8?B?d0RCY3ZlZGMvQTFOQUYrT3JTclQrdFhtTUFjbkk4alRVUmdFS2lYZXcxSmJG?= =?utf-8?B?OTdkVUdJTkVyUDdCQ3h2NEJhNnNlcUNzVTFBemtydUxPRXUvT2lMWTlBVUhX?= =?utf-8?B?WjUvRUZrVkp5NUZHeGQ4dncxOFV0aTMwdWdkK0VUMlJZOVFlcDRRMEZRcnFt?= =?utf-8?B?MHZXckIvc25nZmdXa1pwQzlHK05PUmhJZnVaeXJadDhlWlVxU0hVc29JcFhZ?= =?utf-8?B?Q0NsNk5qQ2hyWUlUWHRrUldjV1duUEZNRCtjME52cC9TaHJrYVlUdU1Xa1Mv?= =?utf-8?B?aXE1M25IbWV6T1RVSlJOM1p3dGRoTnlocWlSRzhUdVdFNDlydll3cndmdE5t?= =?utf-8?B?OTVYM2xWK0hIUkVld1pQV0ROR1VscG41OXo2ZTNMZ2RlVzBkbm1TbndRVE1J?= =?utf-8?B?ZWljUndsZG90dEJxK3NFWHA1ZmhnOVYreUhsdldTemRCMlRuYzB6ZERXTmNx?= =?utf-8?B?eXR3VHhHK2laSngrL3NkclFpUFVyV2ZlWjF6VUVPYStQRGlkQVN3VHVOZUw4?= =?utf-8?B?TDlyc0pkK1A4aHQzeFFRRllRV0pReE1ZRHk2aGszRkwrOXlYODNZWmVMR0Z2?= =?utf-8?B?YTVyMER3dFZjUGVmY0VNM29lS1ZTb2I3SG9iMk1CdC9sTVc0UHBqQmg5THVM?= =?utf-8?Q?2KS3etRyEk8lBYB2Cr6/slSDepF?= X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0158;6:gDq9hyirIs2Ds1+bTTv7wPK8zXf8/97MzBwWG9MIjcdRtFzcnXxJ+W937oBN74TsruRIYrd1cLzngmcrwnu/QbJZmedjfRvfb2rcdLCfn0bfsMhh2+8BEPgjKMe1NRC8D09GDSTmqo+JkFFNwt3Irv8uXjpez1AO5y4jXClJPWN+UiFMoXSMvn7WE0alZjVoMOEPmyr+DNrRr3ehMAK+y/uDJDJV4Hq+5vixkx/HTjVHn4JXV1UjVf3oTEvtkGb9HQMskazIu96GJUk4NY+PkQt4Gv7Q/n85B1wY8AE/eiiB2u7DHS/77I3UT2N5f3LPfoVxbdyYGnqDU57oXqDRWg==;5:JlZWXrPIoWeVECp816do4J6Q6YMIwrMHEHaS3M9bdfCyNPSopi2KlgTEOUunX3b/BfpVuObF0MG7i0WMOGK74QwX4j3VleTwmbqQkwsQQ/aA0Smu/m010gb/0ZL/DnZIEouN10YtAKsejneO1f1S/w==;24:bbLVGImHMeuD2na0Vq8zuVi6Gh3nTG0wDUZzCehBfz1EUzvCldEPqdMZyQsF1k9pXj74bHy1YWXiXj22w2MXSZPzAawmc4jJdGBAAa+re9A=;7:yLJWgDIpvUXz0PS6C8A5lMoJIC11fA5t4Nyy9L5QAq+S58b4xbwl2B5aHbWvAxZ9/V4NP7RwQ6jFM9Rx+2vUObOZVS9VKp7RO6flau4e/2HrlCOomZXCLXoguIttlSj0rJ7pXf25POEkctBtaFmT3S4AG4KwTO043yquVeAm8wCcVJRreHPzgDDqzO4YhY/mWGOYr/P5v93UpTdEnWKMMJDLl5NPm8I5h+uZanLcinM= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0158;20:VlM+icIt3CH1lZyp/IjjHJmkvmAgkDbCcLB2A63O/4RiV+lOcIzRiSpbbOyF5YrMaInUZ3THaXEhG5mRchYjCWWslI9Mn+iFFkT/n4BsMQMqBpmpA2Yc7zUSiCP18H6vgSp7IaenHo5vDJBaS+Ydt5qp7faE4q3KoqTwGG9Gm/E+ty+VppQbFNk2UE6pETHlg1f2IiUe7wDXPUZQ/iOeUPBMdmyTnto7erLXXUtMSdTq5ohR4GPmtHIamRAn73Xj X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Sep 2017 20:47:11.4671 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR12MB0158 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 | 132 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 124 insertions(+), 8 deletions(-) diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 4d51ccb462db..16b338d9dc87 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c @@ -6203,6 +6203,104 @@ 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); + + /* flush the caches to ensure that DRAM has recent contents */ + 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); + + /* + * Cache accesses between x86 and PSP are not coherent. Lets + * flush the caches to ensure that we can get the updated contents. + */ + 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; @@ -6240,9 +6338,10 @@ static int sev_dbg_crypt(struct kvm *kvm, struct kvm_sev_cmd *argp, bool dec) } /* - * Cache access between te PSP and x86 are not coherent, hence we - * flush the caches to buffers shared with PSP to ensure that we - * will be able to see the PSP updates. + * PSP will access the guest memory range with C=1, but hypervisor + * cache may still be looking the memory with C=0, lets make sure + * we flush the caches so that data gets accessed with correct C-bit + * on both PSP and x86 side. */ sev_clflush_pages(src_p, 1); sev_clflush_pages(dst_p, 1); @@ -6255,11 +6354,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); @@ -6280,6 +6387,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; @@ -6319,6 +6431,10 @@ static int svm_mem_enc_op(struct kvm *kvm, void __user *argp) r = sev_dbg_decrypt(kvm, &sev_cmd); break; } + case KVM_SEV_DBG_ENCRYPT: { + r = sev_dbg_encrypt(kvm, &sev_cmd); + break; + } default: break; } -- 2.9.5