From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754326AbdJPPfv (ORCPT ); Mon, 16 Oct 2017 11:35:51 -0400 Received: from mail-cys01nam02on0072.outbound.protection.outlook.com ([104.47.37.72]:39104 "EHLO NAM02-CY1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754231AbdJPPfO (ORCPT ); Mon, 16 Oct 2017 11:35:14 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=brijesh.singh@amd.com; From: Brijesh Singh To: x86@kernel.org Cc: bp@alien8.de, Brijesh Singh , Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , Borislav Petkov , Paolo Bonzini , =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= , Tom Lendacky , linux-kernel@vger.kernel.org, kvm@vger.kernel.org Subject: [Part1 PATCH v6 16/17] X86/KVM: Decrypt shared per-cpu variables when SEV is active Date: Mon, 16 Oct 2017 10:34:22 -0500 Message-Id: <20171016153423.2980-17-brijesh.singh@amd.com> X-Mailer: git-send-email 2.9.5 In-Reply-To: <20171016153423.2980-1-brijesh.singh@amd.com> References: <20171016153423.2980-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: BN6PR16CA0015.namprd16.prod.outlook.com (10.172.212.153) To SN1PR12MB0158.namprd12.prod.outlook.com (10.162.3.145) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 72d9bad6-6abf-4269-49b9-08d514ab785b X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(2017030254152)(48565401081)(2017052603199)(201703131423075)(201703031133081)(201702281549075);SRVR:SN1PR12MB0158; X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0158;3:E/mllxbCDylel2e491+FnvOV8CHz4GIkrbtXdUnsZY3U7ZgOS0LHV5gwJgV/THenWheZJUxTSnNJeNL1DENlkPRcX0fjR+xFP3DAJlsw8EmCGKM0bfhDioJSQCrEF9b0B6xUSFX6Zaf58HhK2ZHNZ5TrQfW3JlKIXo3HwFXWE18rWuReFUQl+3kToXriw3cqiekPsqfw146Za9oBBG4duHliydj1lZsBpzp5H+YwgHKX3CnSIsHc16Fd9bAeCE1e;25:kU1xIEqoIuHHGNocVPshSFMrxD1wxqBm7fq3Xf6ZccCacnz1DBc4UiudMxsXceqaY8OyR2ecRSZbriqoPe+ti2U+JP7TJYFqhnlWZcW7+TtUkgkkpzVGt8HqIgJvP+xX14Zd4ARCbHAyk8Hb7bpE8DN+SBpA1oqaVDpxzRwy9RaWL9SvNZ7hMaVrns97hpaSLBdxHJaYrM0KjAp+9/UoBFiE0lJAOtGqmbBKi/9aLUm5yvqjbz2+LFxSQHW0MX5xDWfisMeSngsqRUnsZxvpPI3F5Pg3CI8GUQsvRfHWMN1gsageJelMqpLftdZNR3imyHLGMtRqUanrIQnJA1BLkg==;31:giqbqggGOqMlODY74RDrLO3VhPTbfxAG7Bs1Jf+BKOtNGYocLcmvxP+GYKPxh5IkXajMhJ4rfw+7zVAll5gp8Z200rLhST3g5VA3LNu3vbVMHcbeZw+JvEoycKzJZO4HWrkbBth9S0pK3ufwyKC/I/sPYj4KniXsCXIIbfiB97i31ZqBALeHi8zvkMEd7YVDcU6zaQZ+CmZlUvdFtwbgwCT3Eh7RFjFO9+hb0ejGNtA= X-MS-TrafficTypeDiagnostic: SN1PR12MB0158: X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0158;20:CGbCdcoT3op/Sz9YOCWi5jCgaD0/NQwCqK2IiTusG1UYBZZnDeCAcVyEJyN4YSBOvVn9taGo3jy3HMco2JWD5nFOHF++HP/cSski3Nt/6HgU4krKx2lS+ACBRAYgYaKR/ac6q29PL5dW0D73QuHxqJVzqh8Ck+FYRnhFfGVs8T3qh8PSI9PCdcMcWF/DPVCiedTmcNoDucj56zWF4BRXvmpwpkq8oJK4ku1sYZBG2ZbIRIVM1UItmEoaC/cdR/VJhO3Da+WDHaY8vMj1QN0Am36rNQxRmm3bdaH32eYv825TimQ3o8oFp7g+pVtvgkfb9WyoUiNfqVSoO0u2QjIXCDMkd2MhnB3RUX2+iuFvtCIZ8xMC/ZTZnOmDnzRWNWJ/cpJS94CH6rO/4i8cgb1Vz+pzkJ0vYWnKgnDHnjSSxfmVrVNLU+7kPsGK9LDYTj1rCxVuOVFYp5EZqVa00L5v2VpreNE9589Cgo+t6bqadgbgdFmM+o2BJdYnE9RKL8rk;4:9s1CTZG4kRTKG8lnZmFiz08jyoEv3qIPUMZn5GOZpq9BS3ZEbfSVl5DkYui/MH0COHWFCqJ0OgWpMZdYbSc0IFsVhHOm9UhjNs1oarHAsJQouNtEYp/YvO5QH0Q30EurMAg5MTTuTrRYRqcKOBGx5DCVtAL10FVCdbmA9pFzU35SzeOVvJ6eCK6IdNPgorLmVgrxLpMAP2fFVwjY6mbxksBy8PJusDGhDdWE7JKK6C+FkZJQb6PI/XVgDHbEBC87jdO4BnaN6AuFX/ApS4A5vEJQ29nce/Vf28lQIN66aMalTTf/22+hhoM4QgOSUQW+W8X91l95i28v/o34gxEU8w== 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)(20161123562025)(20161123558100)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123555025)(20161123564025)(20161123560025)(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: 0462918D61 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(6009001)(346002)(376002)(39860400002)(199003)(189002)(54906003)(7416002)(1076002)(316002)(5660300001)(68736007)(2906002)(4326008)(16526018)(7736002)(47776003)(305945005)(23676002)(6666003)(53936002)(575784001)(86362001)(33646002)(2950100002)(6916009)(66066001)(189998001)(97736004)(76176999)(106356001)(101416001)(8676002)(53416004)(105586002)(36756003)(3846002)(6486002)(6116002)(8936002)(50226002)(81166006)(81156014)(2870700001)(25786009)(478600001)(50986999)(2351001)(2361001)(50466002);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?MTtTTjFQUjEyTUIwMTU4OzIzOkpGUFgzREszQ2VRY1BGSGJpT0JyUmV1d2Zy?= =?utf-8?B?MGJ3Rmk4ZnZ2WWY5YVIxRTlma2NTcXYwNEJXbGV5MWpaSXNPVmZZTUdaVVQw?= =?utf-8?B?bVhwVHVNbjBPcGNmNFAxVTlzbHhpTFh1U0ZFRnBrM2swV0tCenUxWnMxa3hz?= =?utf-8?B?bnRiejUrdU0rM2cyU2w0S3RsdGxKNVZadVR3YmIzOG5KSUpMbEdvT0phZHhY?= =?utf-8?B?Wll6WGtRQ1RaNWpYYktwekV3ejZaM1dPYWRYY0NYTmV2TEVoUGRXZzRFTzlC?= =?utf-8?B?ZzIrMkROWEMySzdibFlKZkwrVzNoU1BqRFpNWnFoZzg4ZmI3dWJUMmVXK3o5?= =?utf-8?B?VCtOcnhwNDFweFVkQ1NTdTdhdy85RzcwN1ZmaFBQNU1tK1Y5RUo0U0NEdnUv?= =?utf-8?B?T2ZrRVMrc3RxZEV3bC92N0lHQkdTSzF6R3ltekVXR21kS1BHQ21ZLzcrbnk2?= =?utf-8?B?alZDN3BTMHpZd0t3bE9qY1IwSWdOc29kN09wcXRlVi9oR05XcjZQMWJNcm9E?= =?utf-8?B?eTdZYmxTcGdab0dIM2E3WTN0Q21ZcGpDZWRXakpHTEdORTE2eGxNcmZoRXlM?= =?utf-8?B?a3ZyYm94UDFKVXlDeHNGYTZEOFNhRVFZRVVJY0hrTFprZlhEV2FDUEFDcXU1?= =?utf-8?B?dWhvanFGbjhPR0lyR2I0eDdoc0dBVWNxcmFBZnBSV2xTY2d1VXpNWnp1cDg5?= =?utf-8?B?WDcvOUcxbXY5UW9ISHNWYkxYdUMzQXVDc1JMVk8vSERHTVRZbzMrUTNRV0Vh?= =?utf-8?B?dGV3Zm5NYkdCZ3F3dkFQcUU1UkF1VE9zbngwang3LzNDcU12N0lXWGZWVXJu?= =?utf-8?B?TDZ0dUl0WjlLK0ltR0twbklXYWlmWXZnZFYzMVhnYm14R1pESTdTMHl4a0FG?= =?utf-8?B?bWJnVElEODVKYjN6UjVTQWhHSVIvMVJad2pTWGhUWVNIV0FORm0xTDNlb2dC?= =?utf-8?B?TG85Nm8zalpDY1lMeXBoWitJbGNISUNwanRsS2pRbmkyMzRmQVYxSHh4QU9F?= =?utf-8?B?YmhwTXFFeTNGUHRrZ1pqOWVOdlBIU1BHaVF4RHhLamxKb3drdDV0SUVZZFN2?= =?utf-8?B?bi9TR3FUNnhXR0VLK2FVTU5VVkhvT0Z5dVdPc3BwU3VmVXMzT0VwQnJtUThN?= =?utf-8?B?NktsRGZKRG4zdTFqR1U0YVF1OFJHU1k3T2ZTalJDZnJlZjV3MlJpcHZod2Z2?= =?utf-8?B?K1g3QmJ5cTcybEtCbmNZdEZER3dkNVQ4cnVGclRjVEhWcXNpUXdoSFJxekp5?= =?utf-8?B?RElPYktZaHpHbS9jRmVqcGdzQTZvYTY3bGlrd3hHamJteDlXdmtySUlLa0E3?= =?utf-8?B?aFhDWEIyZlJKa25BVms0eWZFcG9yckc1OUhZYWFwODE5RXJxNXhtUDdRMzhu?= =?utf-8?B?WS9YYkYzZFBPY25KNHZUNnFwbzBnOFZlaklWMzExd2orWXlYaFZQOE9CbG1h?= =?utf-8?B?cTNwUUFRSkN2OTYxR0NocTdBWm9DejZOWC9ta3MrL2xzcjNRbzhnMC9YWmpm?= =?utf-8?B?bW5OQTFzZW56YnBPcDQ1QzM4S0FlWk5yNW92VHorRk5ZeTlRbjZrMEUwSDhv?= =?utf-8?B?cWR1WXhrdGFuOEJxcGlBTnE5ZG5ON0E9PQ==?= X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0158;6:CDu0Ifzz1uQelnSxhTNmSZBf+/lu2z9nWoL+NUFkIUPDTi6W1ac7TkQG1eRT2AmelVBN0kEbMzanzQS59ZuTVadtDxnmmaL//V715mBW/ogCpUKRTXVkrO9YYE9NtQGV0fPa0AV11iotuUidgzdZOHN+fiHTD7+E+myiADs7UDxMKNaYltyFTts3W8vHOf5dR4LveRRZs9DbMliFKGnrq4z2dyqmy8N5Gqdbi/UPtfrCkXc/AwEL9/MOkaxWLtodM0XfgVSGROzI3cVaumUiJcF9qKCZZVkuZFCB6Qq5jJx3ilhCGwIrCw1dzimaNgzLZ35GuE6tLpv7kuEEoO+S3w==;5:B7YkIXq5YKndYhipBzg9MmE9M+yl6X16NID8GE9bBFEm5Wdyrxpek05Nw37AoGxN/x8JQQHy71lIVKSMof4wCcE9NvsWfam5/IN+d8/NMYc7oSqUzXsB5uxeojO1BvtPY39F0BQ6VriTKNb8IqgRLw==;24:mdP/U1MjZotTLYz5v6qj01pNd+yMsIzW0WejcprQrYrcmRNGbxtVOza9XkaToQtcIDx7eBxBTLLaMQ2DuBiwO3JltwRvOjUVdessSzQqftc=;7:wK4Envjx7jgEf5ZRygNO4t5vqKnHyY7shc5nxHWfygBen9XlDMLZ71N7Jz6lbBHqX5uGBWUfUmjDP+bRd+16jqM+7CizJOazFX/1mwiwd0s4KojbriuGwsUvpvOoS0VqUlzu8DFzthElshWkcOESHOOIo3jfqEmfve3Q6huGPpLhtCKOH42m1iu0fgGEIfFHv+5Xyt27W4GOQlK5fQ/C7TnxXIBguTJowY2xaAR4vO8= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0158;20:5nNE9RAHS64cXy4UxQit+3/hn5DKvE+weCzF5xIDAegduB3Ky/JxT3+wDRtr8RwSkpSjLsfuPtQ+F9AJv8e88sf/R8hNrAdAzlZh7NcnuUGDhcpMsaWKNpXHHpY4Y5ppmK+JMsQP0II/4melf6SsScxgL5aLURt85xw1hjqeNC5lmZed9vYwerGBJKt+mjZkMQDC77WKPLC07C5nkeoqCC3AtvY6v2ghZd+98n960LpWpmhkyJu/q5nvT9ZUjFFA X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Oct 2017 15:35:02.4317 (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 When SEV is active, guest memory is encrypted with a guest-specific key, a guest memory region shared with the hypervisor must be mapped as decrypted before we can share it. Cc: Thomas Gleixner Cc: Ingo Molnar Cc: "H. Peter Anvin" Cc: Borislav Petkov Cc: Paolo Bonzini Cc: "Radim Krčmář" Cc: Tom Lendacky Cc: x86@kernel.org Cc: linux-kernel@vger.kernel.org Cc: kvm@vger.kernel.org Signed-off-by: Brijesh Singh --- Changes since v5: early_set_memory_decrypt() takes care of decrypting the memory contents and changing the C bit hence there is no need to use explicit call (sme_early_decrypt) to decrypt the memory contents. Boris, I removed your R-b since I was not sure if you are okay with the above changes. please let me know if you are okay with the changes. thanks arch/x86/kernel/kvm.c | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c index 8bb9594d0761..ff0f04077925 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c @@ -75,8 +75,8 @@ static int parse_no_kvmclock_vsyscall(char *arg) early_param("no-kvmclock-vsyscall", parse_no_kvmclock_vsyscall); -static DEFINE_PER_CPU(struct kvm_vcpu_pv_apf_data, apf_reason) __aligned(64); -static DEFINE_PER_CPU(struct kvm_steal_time, steal_time) __aligned(64); +static DEFINE_PER_CPU_DECRYPTED(struct kvm_vcpu_pv_apf_data, apf_reason) __aligned(64); +static DEFINE_PER_CPU_DECRYPTED(struct kvm_steal_time, steal_time) __aligned(64); static int has_steal_clock = 0; /* @@ -312,7 +312,7 @@ static void kvm_register_steal_time(void) cpu, (unsigned long long) slow_virt_to_phys(st)); } -static DEFINE_PER_CPU(unsigned long, kvm_apic_eoi) = KVM_PV_EOI_DISABLED; +static DEFINE_PER_CPU_DECRYPTED(unsigned long, kvm_apic_eoi) = KVM_PV_EOI_DISABLED; static notrace void kvm_guest_apic_eoi_write(u32 reg, u32 val) { @@ -426,9 +426,37 @@ void kvm_disable_steal_time(void) wrmsr(MSR_KVM_STEAL_TIME, 0, 0); } +static inline void __set_percpu_decrypted(void *ptr, unsigned long size) +{ + early_set_memory_decrypted(slow_virt_to_phys(ptr), size); +} + +/* + * Iterate through all possible CPUs and map the memory region pointed + * by apf_reason, steal_time and kvm_apic_eoi as decrypted at once. + * + * Note: we iterate through all possible CPUs to ensure that CPUs + * hotplugged will have their per-cpu variable already mapped as + * decrypted. + */ +static void __init sev_map_percpu_data(void) +{ + int cpu; + + if (!sev_active()) + return; + + for_each_possible_cpu(cpu) { + __set_percpu_decrypted(&per_cpu(apf_reason, cpu), sizeof(apf_reason)); + __set_percpu_decrypted(&per_cpu(steal_time, cpu), sizeof(steal_time)); + __set_percpu_decrypted(&per_cpu(kvm_apic_eoi, cpu), sizeof(kvm_apic_eoi)); + } +} + #ifdef CONFIG_SMP static void __init kvm_smp_prepare_boot_cpu(void) { + sev_map_percpu_data(); kvm_guest_cpu_init(); native_smp_prepare_boot_cpu(); kvm_spinlock_init(); @@ -496,6 +524,7 @@ void __init kvm_guest_init(void) kvm_cpu_online, kvm_cpu_down_prepare) < 0) pr_err("kvm_guest: Failed to install cpu hotplug callbacks\n"); #else + sev_map_percpu_data(); kvm_guest_cpu_init(); #endif -- 2.9.5