From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932842AbdKFSNp (ORCPT ); Mon, 6 Nov 2017 13:13:45 -0500 Received: from mail-by2nam03on0078.outbound.protection.outlook.com ([104.47.42.78]:49424 "EHLO NAM03-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S932757AbdKFSMm (ORCPT ); Mon, 6 Nov 2017 13:12:42 -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 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 Subject: [Part2 PATCH v8 26/38] KVM: SVM: VMRUN should use associated ASID when SEV is enabled Date: Mon, 6 Nov 2017 12:11:18 -0600 Message-Id: <20171106181130.68491-27-brijesh.singh@amd.com> X-Mailer: git-send-email 2.9.5 In-Reply-To: <20171106181130.68491-1-brijesh.singh@amd.com> References: <20171106181130.68491-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: BN6PR10CA0031.namprd10.prod.outlook.com (10.175.102.145) To SN1PR12MB0159.namprd12.prod.outlook.com (10.162.3.146) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 19696f7b-76b3-4c90-6822-08d52541f129 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(48565401081)(2017052603199);SRVR:SN1PR12MB0159; X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0159;3:Tx9o2wX3O2nXWC3+XdYNBBD4YpebEdFRb7zYEtydeIBVeZ9nr2NAfUVqV4eDVKDtQxJbJxp+I4igXPvX/GRu2lIRy5DmiDVZly5MShG6EjRij3qFpQ3FIIn9X6q8De+iMvnrlmByFnzfJlSNau3+PhLKNdfUyMUphLtN0K8SpCXgAE+6clUSdtpfcDHrgNFMOCbBrXPmTd0orf/5fNKjFVWlCfT0xa1snwe9i4pFF7cex5MlDpfRTw0r7984oF4c;25:oakQCkZQL+GF2Q7bIJH98gy0aWlY7GIcT3Nku/JlSK0iPcF0B2DxSdjUyNVGW8tniNu2oYMOgt7n6z+aUv7oe6FT8wsn3U1UuuFcHYZymM4c76DYwrJPz4K/9sDM6JQEO+3FXnf+WSnI8Wq1fD7NTfpwG0EDfeJgESdJcZlVJzW0AjSwMq23gyN2oXfhDfo47OoNKUowbEwWChPu5ADdV9hFfUMbLlh5WRDb4H0Gg1UQOqX6ok2th+tyAzTdO71OaXN0eCkhybrtFU40fvDZlpO/Crw+607pinGErxFoEd8j45/97XdWh7GNsEBBFugrVsE8slR9BD50zt+FxDK0RQ==;31:Oy2w/LWK9ilUKkQlbc/SlR7QETXT8ynYGTww6/isO5yL1+Nf/UJ0FeAarf4xW1yPWk8ua5L0VJn0AmcRFySqOKYKZbzmPsbgbyBrpQZDw+MFibT4AnAsQhEhUV1zIvjU17uCGEwxcj3D80jnWyRIzO2+UKV192oLrfU/UBr6mnZwUG461jkxa5kmYzV2gigkHhKyVH/zDl//oym1fLCb/EPwiTrL61qpaW/iZFa6zGU= X-MS-TrafficTypeDiagnostic: SN1PR12MB0159: X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0159;20:ACKABi8eIjWjx0Jq8eLlDZ83qgHIQje9v+8zswojdgDnSvtZSHLgiebbmgQLQcJKmfcCoJIJpakjZybe5g/soh6QDNh0Z9OYhql/A2chztkyI8gq8DPMucvrApq0t/OQdoEMDhs51blHMs9uANTp1LlLil7cqIXw0JFAds7PfdcsfHIso4Y1Hdd8rjfNa5pFVF+TC+wnUjSgz1UNBQzl4dLCjIt90cuJqt3nbrEyq6zT/EdkAK4OGFTkCvgDSBRDTJKuuV8IKQO4B/uAxkXfy+FTaW1U1EYrbPOmfcT3vjAj27576cKT6dfYT7C5tV9tt7+Uz4osqJ+CuPT5rmlOXbC0NRv56Xzg1M5Rhv+wbw3+DmqP4kVj9lttV+pajh6+S6A2iZLN26gErxNjYkK73Sbw/h7inHfFzYdRRVl22cKDz8tH5kF9DxNSXN5gG9kEl/LkVTVl7M3koO3fpMjzLi21F02adXuzjs3K1+mqDcST3AvZlCukcSKGdBV/LYS4;4:taqzuI9OmMs+HmjoSw2SQlMTHskzKSEMojXMh16Cyx8b3VXmJB62Z5KtchU6o65NjUMmPmlwdLdYb0Momga/moTGeXVcRK/irxQam/N7BeBShyAkvHsYAnADi6d/AlxlJWs8QH+KMwwI2/4PJJGtkhk0gljo5qy0FAwvMXNuhfwiVATW29vAnmFZNqYtDElb9GgyksFlobQQ30h4/B0MaxxBrj31kf8X6O9u2dUYgW+NjpOXCBBllhDo02srI0fn6thKx6Y85lJO81KGXWKIr70Vr2KCIUw4DoeAl9Uf2vHSWC5lxSRyYQiaolQqrsN9B9qCdaxJMJ2VNPi1lblbKg== 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)(3231021)(100000703101)(100105400095)(3002001)(93006095)(93001095)(10201501046)(6055026)(6041248)(20161123564025)(20161123562025)(20161123555025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123560025)(20161123558100)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:SN1PR12MB0159;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:SN1PR12MB0159; X-Forefront-PRVS: 048396AFA0 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(6009001)(346002)(376002)(39860400002)(189002)(199003)(68736007)(97736004)(4326008)(316002)(16526018)(54906003)(7736002)(8936002)(2906002)(81166006)(81156014)(25786009)(53936002)(8676002)(2870700001)(1076002)(6116002)(23676003)(50226002)(189998001)(305945005)(86362001)(3846002)(50466002)(33646002)(66066001)(36756003)(53416004)(47776003)(5660300001)(7416002)(76176999)(478600001)(6486002)(105586002)(50986999)(2950100002)(101416001)(106356001)(6666003);DIR:OUT;SFP:1101;SCL:1;SRVR:SN1PR12MB0159;H:wsp141597wss.amd.com;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtTTjFQUjEyTUIwMTU5OzIzOmFpNWkwM0FXdkVSVkIvNkxKQUtmZXNUeG02?= =?utf-8?B?YzVld01US21nY0JGbXRZeUdSRERPSzI3aW5rQnYxNkh6TTNXaE5DL3NFWWdG?= =?utf-8?B?dHRZR1pMSU93bHpxY0ZPNisxbnE5K2tYMkhBcklsWmRNWG4vb3pERUwwMXBx?= =?utf-8?B?aTByVWNJdDNqWmFBM05MdW1jV3VHU2poQmhHRHREWVYvVzZ0c2g1UVprWGJZ?= =?utf-8?B?ZWY2YlN5M3JhaENqaXJSWUF0NXVoWWlZQVoxZk9tV0tSZTUrYUFhRU5qZ0pB?= =?utf-8?B?UWZ1bWt6Qk1UeXFVUGpCYWNRZjZLdWx2SEJXbjFrcmphRnp0dkV2dzZBN1l3?= =?utf-8?B?VitsUnhYNUdqM1NUZm1tMkh3NGplODM2WTFseG5PRU9yYmZ1Y1VLcHdtMGNm?= =?utf-8?B?WnV1WHhDUXdvSVhzWjl4dmszemNNczFTOE0zK2JibStNeFo5c0x0YXZ6ODgr?= =?utf-8?B?eG1DZGFQMjFTeGNWQWdFdUtvd1ZuWHRXOHZoM3VXT29oMVJnc2pqTzRacll0?= =?utf-8?B?WVBiUnZuYUhOQWZIT1FjUXlrdVh4MnkyUzVFWUFMWXBReUhhUG9FRW0rVlVU?= =?utf-8?B?SUVoVFdlVmp6d1EwWUJnRU1KWVlZZ2U3Y2RQb2JudEtYbjUyM3BPbDkzZUFz?= =?utf-8?B?THNGMVZyQm9kSmovMWJFR1dqelJEZHhRRzNveGMxZDlKWTJ0Ujg1Um4yK25S?= =?utf-8?B?REQyVmJXM0lqK25aQ0hTeGtwOExQRGNRd0tFbkxlRllGQXJIbkxCNFI4R1ho?= =?utf-8?B?SnFBYkw5SGd5OWppOTZKSy95dlZTOFluUVJHQW5NWmNucm9LdFBVUmpPOXBo?= =?utf-8?B?TGExODJENWlnaXNpVkJUbkRVWVJ5WERjWWd1ZnNEOEFQZUxVWVVpaEpHRGdx?= =?utf-8?B?UERGN2NhTWdpeFZWeFJKc0VOTzAxSklkZk1Tc1Y5bW93a3N2c29PNkVEY2w4?= =?utf-8?B?aS9zdStYclNwV1kxOEpHNWM4V3Yvd2NSS1dlbnl3anFxREZUYkNML2tVWjN3?= =?utf-8?B?S0lHeEtvUU1JVVVKeEFwRStpaUNjYVlUSXRyM1BLemJoUGlQOGlyMXlSd041?= =?utf-8?B?eU9scU5QVDNyYllEVDEydklFWEl2VXVZRjJMZzFpUWJGZ1o4QWpSN1Y4MUQx?= =?utf-8?B?WEQxaVViWjJXTkVnQ1luSi92S095ckJ1d2s2d085bWYrYytLR3JhdnFNa0JC?= =?utf-8?B?KzRtdHpUc1diaDQwVnppZEhHOVRJVUp5S3pXWHhBd1kzdXRKZmY5Zy81cGpX?= =?utf-8?B?cXBTUW5xdWxtUmkxRnNyQUlOQlJYMEp6aWJYaHdweE0wWnEzQWNJM1VHamlj?= =?utf-8?B?UEdtTjRldzlzeDY0N21JYzBEVHVaMVkwQW9qT0tvMStUaHJLcHVqMG9RWDZ5?= =?utf-8?B?Q2RZbExqeGx4cElUaFhsRWk5YUZsOFpBenAvM1prQXoxRi8xNEptYXJTc25F?= =?utf-8?Q?tJknlHU8FfsbTeRhjRyoK+7uXjG?= X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0159;6:iJMbKkFanPGmHPjoDt5IfsjTkjuJPOoSv8EtX6AZdc8PoNUKSvAOPSb/rIXzrCmJ9buXtyQT5/0LOgJUUoGaFRsBYnDsyRr8a/4kGCiIWCpii1+46GY77bKsSUdmlqJAtURA7YclfkjXN5CucPuVdWgzCxM5CeEYXUiEIHGhWYqvELbtCZ52CpEqOJ1BdZgpd3qYe87oX6aLEJybR4au7H9h/ObwoDGVoGEmkzsHoHiSjQmRO6kIYSHeh42aazeHa+Ybk1KYPugekGw5olZqwrklGnOaA9Dg5IyTFrSwrMkMQdM8FoLiLwkf/+eZr7ihm+oJwuZ3wpxPGGBbbQ6HhgehipVDgCxXbVMuxl3j7hc=;5:auFHZswSuqoc60pHhnsbdVbcGU8DTg4JBBESDcoMOhF/Eu6zjnVFG8Fkx+XNkbafVueKbHh3UbdTacP1JRUSpqQlD/m9eInNB8cYKWw6FjIttRz6zukXixRcJER7ZXD+UEvAQth0umfghm/BZROz/o3ac069lx6+1unAs0fhFro=;24:m8p44USR3a4RHTegrCrvXCw8QmoK+oi+dTwQAQ13Iqh4r3IvzTJDLhSBFmysTfbOQqsgg1Br5tcXmAsLO0DeqWlnNut90mDvSlwLSjUATMA=;7:QSeLeeHZirl6dfnv4KY0M83Q2txJ94f5LT+0geYTH5cIzV1j7Pi4rIN5gSyxDGdAfuTJs34lR0KaNHJH2uueECiyHtcEbQJomJifk3ij78BTXKwcGMW6ilxW29CZZqsdb8KLUiMgAJbmtEEi/C3gT3mLNvHvfXgJbacl58MtdYQB0Sfpet+IpR1cUFhB6n2R9Zust96+BNb7jffEhZpdYCKgh86+hkv5296Mx74ruZbNOriWxR7dQKx9NS0Vq9jf SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0159;20:z2/STP1vcu0/ADgPDg2qxOze6K5+1QROoThJMyqIaVY2/n/JAlPl+KXxRUKqhOoDQbj4NHA7Fob/huC2YWr9NkZdvypnOsRL0jrORzx8DNALi7Odehpr+XJ+WYFNrwP+idqSWQ8y1uXb1n7NS7dyzdHtUeQ4sFFB0uJePJ+FrinrzC9TqHIy76K0F14M9qRT4URqxuA3CUYNKw8ieZ8r2yRuNIT7ENYZyAzccqE3NvxgimopokIpsUziZhe0fFIE X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Nov 2017 18:12:28.1761 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 19696f7b-76b3-4c90-6822-08d52541f129 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR12MB0159 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org SEV hardware uses ASIDs to associate a memory encryption key with a guest VM. During guest creation, a SEV VM uses the SEV_CMD_ACTIVATE command to bind a particular ASID to the guest. Lets make sure that the VMCB is programmed with the bound ASID before a VMRUN. 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 | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 7379fc218128..9d04cc8fbbf9 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c @@ -213,6 +213,9 @@ struct vcpu_svm { */ struct list_head ir_list; spinlock_t ir_list_lock; + + /* which host CPU was used for running this vcpu */ + unsigned int last_cpu; }; /* @@ -340,6 +343,13 @@ static inline bool sev_guest(struct kvm *kvm) return sev->active; } +static inline int sev_get_asid(struct kvm *kvm) +{ + struct kvm_sev_info *sev = &kvm->arch.sev_info; + + return sev->asid; +} + static inline void mark_all_dirty(struct vmcb *vmcb) { vmcb->control.clean = 0; @@ -550,6 +560,9 @@ struct svm_cpu_data { struct kvm_ldttss_desc *tss_desc; struct page *save_area; + + /* index = sev_asid, value = vmcb pointer */ + struct vmcb **sev_vmcbs; }; static DEFINE_PER_CPU(struct svm_cpu_data *, svm_data); @@ -863,6 +876,7 @@ static void svm_cpu_uninit(int cpu) return; per_cpu(svm_data, raw_smp_processor_id()) = NULL; + kfree(sd->sev_vmcbs); __free_page(sd->save_area); kfree(sd); } @@ -876,11 +890,18 @@ static int svm_cpu_init(int cpu) if (!sd) return -ENOMEM; sd->cpu = cpu; - sd->save_area = alloc_page(GFP_KERNEL); r = -ENOMEM; + sd->save_area = alloc_page(GFP_KERNEL); if (!sd->save_area) goto err_1; + if (svm_sev_enabled()) { + r = -ENOMEM; + sd->sev_vmcbs = kmalloc((max_sev_asid + 1) * sizeof(void *), GFP_KERNEL); + if (!sd->sev_vmcbs) + goto err_1; + } + per_cpu(svm_data, cpu) = sd; return 0; @@ -1468,10 +1489,16 @@ static int avic_init_backing_page(struct kvm_vcpu *vcpu) static void __sev_asid_free(int asid) { - int pos; + struct svm_cpu_data *sd; + int cpu, pos; pos = asid - 1; clear_bit(pos, sev_asid_bitmap); + + for_each_possible_cpu(cpu) { + sd = per_cpu(svm_data, cpu); + sd->sev_vmcbs[pos] = NULL; + } } static void sev_asid_free(struct kvm *kvm) @@ -4429,12 +4456,39 @@ static void reload_tss(struct kvm_vcpu *vcpu) load_TR_desc(); } +static void pre_sev_run(struct vcpu_svm *svm, int cpu) +{ + struct svm_cpu_data *sd = per_cpu(svm_data, cpu); + int asid = sev_get_asid(svm->vcpu.kvm); + + /* Assign the asid allocated with this SEV guest */ + svm->vmcb->control.asid = asid; + + /* + * Flush guest TLB: + * + * 1) when different VMCB for the same ASID is to be run on the same host CPU. + * 2) or this VMCB was executed on different host CPU in previous VMRUNs. + */ + if (sd->sev_vmcbs[asid] == svm->vmcb && + svm->last_cpu == cpu) + return; + + svm->last_cpu = cpu; + sd->sev_vmcbs[asid] = svm->vmcb; + svm->vmcb->control.tlb_ctl = TLB_CONTROL_FLUSH_ASID; + mark_dirty(svm->vmcb, VMCB_ASID); +} + static void pre_svm_run(struct vcpu_svm *svm) { int cpu = raw_smp_processor_id(); struct svm_cpu_data *sd = per_cpu(svm_data, cpu); + if (sev_guest(svm->vcpu.kvm)) + return pre_sev_run(svm, cpu); + /* FIXME: handle wraparound of asid_generation */ if (svm->asid_generation != sd->asid_generation) new_asid(svm, sd); -- 2.9.5