From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753057AbdJTOcC (ORCPT ); Fri, 20 Oct 2017 10:32:02 -0400 Received: from mail-dm3nam03on0088.outbound.protection.outlook.com ([104.47.41.88]:47104 "EHLO NAM03-DM3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752968AbdJTObv (ORCPT ); Fri, 20 Oct 2017 10:31:51 -0400 From: Brijesh Singh To: x86@kernel.org, kvm@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Borislav Petkov , 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 Subject: [Part1 PATCH v7 16/17] X86/KVM: Decrypt shared per-cpu variables when SEV is active Date: Fri, 20 Oct 2017 09:30:58 -0500 Message-Id: <20171020143059.3291-17-brijesh.singh@amd.com> X-Mailer: git-send-email 2.9.5 In-Reply-To: <20171020143059.3291-1-brijesh.singh@amd.com> References: <20171020143059.3291-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: BN6PR14CA0029.namprd14.prod.outlook.com (10.171.172.143) To SN1PR12MB0160.namprd12.prod.outlook.com (10.162.3.147) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 906acfca-f121-423d-3d24-08d517c7449d X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(48565401081)(4534020)(4602075)(4627075)(201703031133081)(201702281549075)(2017052603229);SRVR:SN1PR12MB0160; X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0160;3:wli/wTvgrRGEAqGX/atlAUzexcMSSWkE+61ixoQ61xJZLlFRtW96r3reEey5ODWePwBbzC7i9dU5k36VMQAq9wqYwiaSP+pzluvdOdGT2BXqZBEpN7dEIqNIZqLs+gMLj7CW5/YwtI4xXhOWOI5ckrHWJuOr1Q0vsOLK32rOHypNPBLVHIfsbjc6fO/f2eMaaXcWogcjNlP+p0LL1n2g6V2c3OGKynHpPRQiu3Ff8+9Gb5Z3KbXLeLQBSV4bE+sV;25:uKKQKxHwxVbCSSBXLrUgsF1EM1k1d/q26rSCDjCAHySRF6Fas3fpQ9njCNloN8d8vkzXw5LEoKObvq+22m1GNEsTN1tUR/5sIiV8n70ffNlrcNIQzp0xImzmze6wIVYRf5RQHgBvFjQtTnDxjrV2VdTxVZPXvqJhTWU1UREBbGTaWU2HA8nichRbpc0vkEacUXcUb8Dgo/dCgYGFir1WlgLOz9vsKQjC+3dyabefR+KCe8AM4dlmPKMdfLumv43UB5kTKrNonSg4zEQAeZH1Bic0B3hXam0jd5JUNaqHm3VMsGZjJ5VBLIvVa/K02VQvG6/s7ojQdVVrhiu0ojOguQ==;31:jTe/nc+gqlnSdZZw8saVTwk11NhD7+1YCNruOMhl1mTb9lb8cT2u0TCkpZQia61qy6gZhvtMuZoPipXplnk590K8pFpZ/lzG+AtjHbOtfvWWQEuwSLAztVDH+OgwW2vFO96Mmxt28riu6Eo5EnhA4/+3fXijzGrnkPnX03pm1OovxAmx2xTO2FJIMGPpEVNA7xeQ2NOnjjN5oAmzZn1X6RWF7Q0LueF9pgXhhf5qq1I= X-MS-TrafficTypeDiagnostic: SN1PR12MB0160: X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0160;20:/RypOSi5w5hXbbLoYgzMSWXG4BES6HRIOYOPw+aB1d/caGR/HIKv92X9btxbdd6hzx0iq47wXxZGvu+RH6OeX2LzYiX7FFi1u9KfaKmzH8AS6ynFb+nuhyBioweGYfbvrx/meY4VmxxUBd00U3RWWggPryS4Bh68lS6pIMyhKl+ZJKTSHB4OBRyLSlJYGD+theD19gNQWwnwHUZMVkLc+Pf4uOcmvagKsYiKP6NSpCCBYkZhLrQkVI33lr51sG8ddTHGA5nx8p+zCjgBXEvPbLCrgUtWMiEkKdvvEoWdCoG46i0VMmAOGIOONy+EIT28ecU2xG7QH4hWFVcZtqjQPMZqmJ7vlnvufa4hMCGUTK10+EBSmJArXdgqsBfgfsYQKlp9YO9PFx60DnsYQaU+zb1fyqRHtdP0QyZmuhxLipNI8ooOAEGEmgMVmynGbkNHIexk9TXWxvacOWJhSPFQljJorpwTWgftQHeNza3zCEtJKs9EGx9x+eEMLWHb2+Ue;4:DaTOQD4Jztg/EgLZ2dTx6qddUM+7CofezO+DuUUVzvc7xB7bRTZCW1yePtVQT9s8wcbQpoh4b4TaTPvVwgqbArEerZHOYLPpLuO0HNuJDT3oVkng1lk4HEsb+lZEHDTo3UUSU6gE4YLVgIA33msXd5VozdcfJg0E8hL2oSmrin7kGSdppiHbIRbkoWLhvLhGc0tkos/KtycbuKCZPpLvHzmxancg8aH5gLADfw5LPNc2gLPDkuGWkW8fjJnvQGjY3Ugw+9VzVjyxD/BMaLWM9cOYX3CNC1DUAjhko0im98HggAij5Ug4cAR0c4qWH80rAVfuG+Cc3q/7Z7ZAwW1wkw== 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)(5005006)(8121501046)(3002001)(3231020)(93006095)(93001095)(10201501046)(100000703101)(100105400095)(6055026)(6041248)(20161123562025)(20161123564025)(20161123555025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123560025)(20161123558100)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:SN1PR12MB0160;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:SN1PR12MB0160; X-Forefront-PRVS: 0466CA5A45 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(6009001)(39860400002)(376002)(346002)(199003)(189002)(54906003)(1076002)(6666003)(189998001)(68736007)(8676002)(305945005)(2870700001)(50226002)(7736002)(101416001)(76176999)(8936002)(97736004)(25786009)(81166006)(81156014)(16526018)(6486002)(23676002)(478600001)(2906002)(50466002)(4326008)(7416002)(47776003)(66066001)(5660300001)(2950100002)(53936002)(106356001)(3846002)(50986999)(53416004)(6116002)(36756003)(33646002)(86362001)(105586002)(316002);DIR:OUT;SFP:1101;SCL:1;SRVR:SN1PR12MB0160;H:ubuntu-010236106000.amd.com;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=brijesh.singh@amd.com; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtTTjFQUjEyTUIwMTYwOzIzOmNkMERTdWtDS2xjSm5JQkFYUUZDN0djSkJl?= =?utf-8?B?MDZlcnVVYWN3emxRNWhDZHhTWVZoVFh0ZnFlNVdoMENmWFpxNGdBOGJaYi9y?= =?utf-8?B?WDREc1UzUG1OVk9jaERsNk5taFI1K0NpeXN0RzFqVGltWW9MNTN0Zzk4WXpU?= =?utf-8?B?MnNDMEJYQVNGV1l2NjZuVUkvK2lWYU15MFd6T0lIZUYvSWFIejd5VFdnc0o2?= =?utf-8?B?a211MDJJekE2M01NdFVNa1hIbUdrV3pUQ21LT3ZQUnhRSUMxTEkrZk5HWk9x?= =?utf-8?B?STNPUmpnSk5SOWg2Y0NDNEtUYjRoN1hSL0ozZXVuaXBzRFdCRWkyOExUVDRy?= =?utf-8?B?d0o1eW5rRFVQZWJpeGttenJybTh5alpHSm1RRmtoeXJSTHpXak5Cb0Mvd240?= =?utf-8?B?Y25iUk1qSkUvUmViKzIzTUMrZEdjZ09ZK2RpYU40dWYvZ1JmUWRuWXkvTmQv?= =?utf-8?B?VkM2ZGcyWWU5UkNZQ3NBdjNZMjFaa3hYell2bUN4QnQ1dWhaUmtZcHZGYkZs?= =?utf-8?B?M1RxMm42TERjMUhnRVc5LzE0UXJsbTZyUFF0NHJZUE1YRTFFVGkyclBubnlJ?= =?utf-8?B?VTd6UlpsZDBhSitjMGRqbUYzTlV1ekE2K2ZQdFB4Y3dtdXBVNjQxUDN1NEp1?= =?utf-8?B?UUN3OFczajBrRWdzTHlOMEVZRmtYdWQyc2JpOGNLdXM0a25rcnFWdm1xem4w?= =?utf-8?B?S0VFNlhJbkgxYkFSS0pCakU4VWRSVVdxUGRTb2RldXhaRElaWEpEUlhnRWFM?= =?utf-8?B?bjZLK25nWTlGT1VWSzBJT1RyUnRYQUFsKy9rMjNKQi9TQ3RETlMzc3FMa1No?= =?utf-8?B?SlRIdDFKd0lCYUxjWm1EYUhFODJORUJpVHdGbCtYdWE0U2dvNWp1cVRlZWtT?= =?utf-8?B?OTNtVmJlS2N3QUtYQnBoVzYxRlpzeUkyYzBJeU5LT3ZHbW9jLzNSUFhKNzZQ?= =?utf-8?B?Vk9mKzdsRjg2Q3NFMEdmN3BPT29VSnJKTFJscHJ6WW9IVWZuMkVFSllSb1My?= =?utf-8?B?NUFpZzFlc3ZHTldQNjc3REdyRFc5Qkh5azNGaXhYalY1MFloRytxc29VY2x4?= =?utf-8?B?cndDdWdiWCtKakl3RXRYQzVLSHM5U25idkJpS3Z2N1Y2TGUxNWF2WGJPTllk?= =?utf-8?B?dVg4M0tLMVBFU0RBSmY0MWVSa21OTFdzdmdYV055K2RTOG9GbFIwTVFDQkVE?= =?utf-8?B?TUFqbGp0SHZya0gySmdVK0ZtQmJaOHdUditIM0FOVUE1QzZ3T0VHazUyTFFS?= =?utf-8?B?VFRXekdTM0RNT0xNV0tNbkN3RWliVkxJdEh4R3pYT1lkdldFMXRVMGVHSk5w?= =?utf-8?B?ODVSR293Y1E1ay9renVMaTVXa095OExna05Yald4VnFINWdaUW1GRlUxb2JI?= =?utf-8?B?WkhqbW83djBWTFFjMVYxSlNOdlArUUZLc05BTm5ZSnphNVBLNTZMbndYT25j?= =?utf-8?Q?pRX5I60LDBA1BaS68xxmN1KziKT?= X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0160;6:2yIbXDuiCh6Fs3vAmAE4AMAI4NRSezWia/Y3UHO+0Zl7HTniGAOW9UMxlTZqcYVXgnHPZTl0YWkQDVjza/qpfP8hhWu03+J4TQFS8g71WNWyd33Iz5zyP2szCt6XWQ4E97HxLYAuSVlhviBrXEs0merPIYTJ+UzxSPzTE7lsaBvU6hMZG+sYYKVtnxu2z+zyxcJ47EQJMxjvgF/2vwVfw3EtM69aekf3ysNdImpQzIUmITp2nPFzrEKChTZc8HNBkUOeKpac1Glx43l8hLfdOQytlY1I6iG6MUBhH9ikHJpMlm3plyWFdBcC7TtXO0U5ruc0pk+Pag7Lm+g0fDmqvg==;5:bIweAA2V7bPs+Xbx7YEalT9k7gioM2fCmtTS7NrIgXRO+9bFyu1s7+XbaCRPSEjfoH5JdfCsmGphOKCwH/MV21W6mozljJKzQC97nujA0yFyBzm7Uma3D9s4uIsxxIBpt0u8Ea0Rn2SEVp0ztyWHKA==;24:jkXSgvT1mx8S2Jzg+cCi0nytymhW/uM/BT1k/Jzvxf8Urr5gNQh+BfW6a80E//m4rGCwHDJikrENbIvlLAyOwf7TRTyIC52Ph1EDvrjEDNc=;7:fwmxjUQUIw3tfFQjfWsHtXq1UIbHKTN3PRS6a0ilQcJ6Wbm7AmzI7BDlFgLzNUnyI3IJrbmb2FZdM/Jg5Ai6vyMRg0rQQMZoQU0OLrpDJfTTxn2n9uRilETySFolFqT3W8KFR0dbs4OwntJn4TIqYvrcYi+hCbBOAEHQWm/Bc3JEEx6sG5e5N0tN9mB5NGetYCwgF2iKNIpxGUsD7Izjb1qtxYxpbBhTHRBUDtz8N3o= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0160;20:A316d/v7ZU9TfepA7xPGIU7gzDYhfnNX+Rj0h9oHhP796zDpBCsntpRhktQ/bSEC2ttqivaSdSRaGZds7wvHc724T5LSAdOtdCIduWParZPshy9sZyz3lKNe/PL3mMIUBzYYvRSTLq/4Y6ItNYQgGKvuetBQ0TL3ra2Z6nFhqo/g7+FvdD8zjEqJ9j28NL46dmy+poc8M4uuL7hW415CQ3NXcnUVUSWg2H4/ezg2pV8B6cb5+sAVBwFuA8guXGsb X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Oct 2017 14:31:35.0164 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 906acfca-f121-423d-3d24-08d517c7449d X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR12MB0160 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. Signed-off-by: Brijesh Singh Reviewed-by: Borislav Petkov Tested-by: Borislav Petkov 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 --- arch/x86/kernel/kvm.c | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c index 8bb9594d0761..3df743b60c80 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,42 @@ 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((unsigned long) 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) { + /* + * Map the per-cpu variables as decrypted before kvm_guest_cpu_init() + * shares the guest physical address with the hypervisor. + */ + sev_map_percpu_data(); + kvm_guest_cpu_init(); native_smp_prepare_boot_cpu(); kvm_spinlock_init(); @@ -496,6 +529,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