Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756935AbcCRGL7 (ORCPT ); Fri, 18 Mar 2016 02:11:59 -0400 Received: from mail-by2on0058.outbound.protection.outlook.com ([207.46.100.58]:3904 "EHLO na01-by2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1756912AbcCRGLk (ORCPT ); Fri, 18 Mar 2016 02:11:40 -0400 Authentication-Results: redhat.com; dkim=none (message not signed) header.d=none;redhat.com; dmarc=none action=none header.from=amd.com; From: Suravee Suthikulpanit To: , , , , , CC: , , , , Suravee Suthikulpanit Subject: [PART1 RFC v3 10/12] svm: Do not expose x2APIC when enable AVIC Date: Fri, 18 Mar 2016 01:09:46 -0500 Message-ID: <1458281388-14452-11-git-send-email-Suravee.Suthikulpanit@amd.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1458281388-14452-1-git-send-email-Suravee.Suthikulpanit@amd.com> References: <1458281388-14452-1-git-send-email-Suravee.Suthikulpanit@amd.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [124.121.8.20] X-ClientProxiedBy: SG2PR04CA0047.apcprd04.prod.outlook.com (25.169.49.143) To BY1PR12MB0437.namprd12.prod.outlook.com (25.162.147.139) X-MS-Office365-Filtering-Correlation-Id: 63668d82-90b1-47cf-f09b-08d34ef4292a X-Microsoft-Exchange-Diagnostics: 1;BY1PR12MB0437;2:PjQf+RuTQfwo8CZGnT9/4f4gzEEzomaMIPEHTdNW7BMZwvXlJDAmZvxWCJRiyVSTq9nucHeIMXsfP62Q/n2Z8YkEVBH4K2myd2MuWgHRT3h1y1Szkzu20tJ4IRkDQ3ipyywPFjMVvpQGpt1yYRK8ewciHH64P1i5Vu67Ik8jFYfj+0sRlWhPfKwN7XUEO//u;3:V0SNjcrALcRtzLOxEdFHdHKD2MGqCGF8YwuW14f2yYnTs2wc1tMtzfkFC115ZGcl/BreS12pJUi4HQoCYH6ssL7f9/aBPoYdHNO+LG4nz0c7WxbrWo9GOndA1zvWxBeR;25:0RMVvlS5436Fs5pplKz92runuJ4nH5uvDJ5MoTDBrrYgo9QM9t3VS4kjaEqkVEikpajty80fvaGRHR/rEuP/UFK2zK2/fM9gJkBUqFySUBEOsVE9S9Q81JfbCTNB80prZgRy6iyu2LIw4DIidE9qs9YbF/zdnNKg+Qq5AvZa1scWDmWJuM0vzpO/lLDRUz5WH9B1Dali745oe+HTKZe/7ad+VnphEF/JnkQ7gJjdvpPDGToawDZcByZHytm8pXN8e8WCwgedUr9KvQNVYGmwAuhw10uePZn5cpPzHk1uiOOoelLg9y72p5HuxO2Tv0ezMLCaTQYTBYUmwF6jok0J94wJWmHpcsSn/7mzVXqX7Bc79ty1ofBQzD08cR/vYnrwUggviQ1jW3dqfmU8JOAIYaS11BJpiM8WrhOOuZiUncJpo6ACONSac5qt8W9gCw2LMGzfSXlBKNbVAdvEEwCimTrh6WllOslCfhol8G/7FZcvZpEvd4dQrb1CD95tT0UE X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY1PR12MB0437; X-Microsoft-Exchange-Diagnostics: 1;BY1PR12MB0437;20:ZyYmf8SD8fZQki74Pt25aT9pIrINhsh0kfe7NgDvFtgYgG2FO2vX4aEa0ZQRFPtrrSc+Z95ZJTLBedUekUvyAYVBMleoEdYC6iywBtjxDw9lOquZRPChMFfeT5MQ0bUHlDXE91niA+ArlfQmWkMjjTJGm7mbXNGSP+3RqzmxpLLhpqQMkKzKVlOTqQEZ+0V2jZk5tDdX4xYXiDfxo2ufcAlKHl0AxXmfn/raOsPAS4/vK5GBAJAzfSYSpFFYCt5EP03uNTw0VUHkhf95+tJcovTZhUSEysV5HFQOy3rM0voc8DSDQLtt9BCa/sh5MbOx7dHn9vnxneAfPgX/AqLfn5eG48/gVM6QoC9o6JuFsfbBc9fw/N4G/7yYGU3/60YpqE2anjBsBtJ1sunrrB7CFZuSvI/keiQ1wdkVnEHBXlzDCUhtWDO4Y5pG2eZroUbFJGNNlRtlr+gzKmLQGEfXGHXSV5XFFtJcw9LYqc1R1bl3fjUYhVvc5zplL3mphHv6;4:flxk/5p3oHgXbLjz2WMxg9xHjR0pJDoxiwFL3sNu8eeNUZtVm1WOwLn+ffib3XIkV/aebwyvzdTdvcWxqZAPPwABgK0TBnXfsus7uHuJVSzr0DNkQyJpWBzZd6Bz/E4Xha7BgHbH5cN0T8Xn4dCZ+bZKnj6OOn5ApwuBFgugHHXukVM8XKWHBC+zASPoapc0GjJH4k/RM1BPS0Dd9bnKeNZyDzCxSoslSczCVVSgbSaJsEyC70zY3Fd8/uBjiMYC8QYpGKUWmp3BmVaueRJcjyPizvbuhOL72G5t8dC4FY52zpMKkHFb6bmwhy0UurM/Aycy5nkIxrnFHXU0P1nRaynXHL/3WNxsvkb5egHzPT0YMfzjD+hyAifTFQskRUtC X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001);SRVR:BY1PR12MB0437;BCL:0;PCL:0;RULEID:;SRVR:BY1PR12MB0437; X-Forefront-PRVS: 088552DE73 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(6069001)(189998001)(66066001)(19580395003)(19580405001)(47776003)(42186005)(3846002)(5001770100001)(50226001)(6116002)(2201001)(86362001)(586003)(229853001)(2950100001)(36756003)(5004730100002)(77096005)(81166005)(5003940100001)(4326007)(50466002)(92566002)(48376002)(5008740100001)(76176999)(50986999);DIR:OUT;SFP:1101;SCL:1;SRVR:BY1PR12MB0437;H:localhost.localdomain;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BY1PR12MB0437;23:GMp5pIkMCSQg1XIBNPGKiwfAo5WypnPZkbxTqr3q8Es0ieMbOKQADuxstOfSH5z9p8w85u4UeUPYW7Gb64/CUHIqqNWMbV+JkzVNayc1vJp2PU/FS+6aW56Ij1ZhxW02uNWY7h+pcs/Iz/5ziH6kSbs2PydrjKgIvjCct8IP8r8Py2k/9z+cruv+Yzp7avSt+9gHqbsPgMiR6Z/z90Aw3cnwNUIvQn6oTWCqRJE+UYYutv45F6ojAnCns1ooh+tiGKCjw7VxCqiSoBFisXyDsaIahJXkBr9xUZfQYuZoG38V1XVOTa2yB8G5d24jRPQEoMSXbpfV6ls37eR7a2dw7soEn4KQPmyQJK3a5Fvi42pVzg60X2i59enDOwXBKxJBHIQq3XtP8gJpOTgiHT7jbjq09FWOPPI3BfzAdIjL12x2r8V+N+hOvFKHBURvakhzlE3T0zZJZ9aoAwP6WTiBbGwqklgal8gx9oYuVq2F6OpSXbN6CeBXxYiiBmcNeC5ApMbjb9UW/Yjyej2AhkRVYLaJIwSI2xRZgfpAsC+6oaXBTQOJ0smU7aEbwLOVZ2p2l7cvwiyyIx3z6H4kzQcgESDfTEU3IDqdMD8tp6ZP4DBdPS/0OFeUkvCwVfSAgHC6CvsCk6ZwvS/8zwl82vDQnqNU2I9+mfJhoL22131n5COquMZt3hGI352NUi0NnPIVhzLEpzQYnGWHYNEHHDBcLM3wTSYaUrBwBprQ0j3nVgdE7Nq8MEHdmE9C/3SlkQW8zOq885aGWfaeEW7Io1a8UwQXJTyMJkcWnyYTMHlWWK61BtAgG7C2GZutcq4rcE1xVLTHg7tcuHn6WSU+MIomtb6XxB+yCe0utgy8Q8caNTQ= X-Microsoft-Exchange-Diagnostics: 1;BY1PR12MB0437;5:bVXFruXFrrowHliz9M9jHoMltRUkEXcAi3GiRTj8vQCgPsMCZDpVCmUZTVhrCzeWTuzeu8zcBGYEHkOsqMTVaU1Y2GC3SWcX1zT+CW05xi0kfL4jA3WYYbiSwvG06RchYYqbUd89Ipp4uRibcnUZEQ==;24:eJ3hpY9KAig8kuv8vBfYyqS92x61zRkfGGvLsYk05bLFdRz90FIq1RMkwX9jI5Mj5sZwYXofvFlZWHTNO3hE2Zt2hd0UgaI3/HXpN01FpeA=;20:YWvZHsLsHVwmsuH88vMH5bVJrAuJx8YCz+cn7UJeUiJdZHOndToCYDxbngsLCBiwts+dV9KS+4mj8wFPjuZ7hSpfbmtxGJITHpl/WZIsn+8UmOZNznC/4EQs2n4hrkSV2adQ3oe+1lPhyGIsyOKMK/hadyzog9gjZOWTOv4VwdLayt3n9+MAhKnTAQjwkHkCr4tZIADfkxar9C/XuA3bA3LPa87fIRJmTVnvMpoH/XfKZGN1XEWEZ9VsoPenU1rw X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Mar 2016 06:11:32.9350 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY1PR12MB0437 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3862 Lines: 127 From: Suravee Suthikulpanit Since AVIC only virtualizes xAPIC hardware for the guest, we need to: * Intercept APIC BAR msr accesses to disable x2APIC * Intercept CPUID access to not advertise x2APIC support * Hide x2APIC support when checking via KVM ioctl Signed-off-by: Suravee Suthikulpanit --- arch/x86/kvm/svm.c | 49 ++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 6303147..ba84d57 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c @@ -209,6 +209,7 @@ static const struct svm_direct_access_msrs { { .index = MSR_IA32_LASTBRANCHTOIP, .always = false }, { .index = MSR_IA32_LASTINTFROMIP, .always = false }, { .index = MSR_IA32_LASTINTTOIP, .always = false }, + { .index = MSR_IA32_APICBASE, .always = false }, { .index = MSR_INVALID, .always = false }, }; @@ -841,7 +842,7 @@ static void set_msr_interception(u32 *msrpm, unsigned msr, msrpm[offset] = tmp; } -static void svm_vcpu_init_msrpm(u32 *msrpm) +static void svm_vcpu_init_msrpm(struct vcpu_svm *svm, u32 *msrpm) { int i; @@ -853,6 +854,9 @@ static void svm_vcpu_init_msrpm(u32 *msrpm) set_msr_interception(msrpm, direct_access_msrs[i].index, 1, 1); } + + if (svm_vcpu_avic_enabled(svm)) + set_msr_interception(msrpm, MSR_IA32_APICBASE, 1, 1); } static void add_msr_offset(u32 offset) @@ -1394,18 +1398,18 @@ static struct kvm_vcpu *svm_create_vcpu(struct kvm *kvm, unsigned int id) svm->nested.hsave = page_address(hsave_page); - svm->msrpm = page_address(msrpm_pages); - svm_vcpu_init_msrpm(svm->msrpm); - - svm->nested.msrpm = page_address(nested_msrpm_pages); - svm_vcpu_init_msrpm(svm->nested.msrpm); - svm->vmcb = page_address(page); clear_page(svm->vmcb); svm->vmcb_pa = page_to_pfn(page) << PAGE_SHIFT; svm->asid_generation = 0; init_vmcb(svm); + svm->msrpm = page_address(msrpm_pages); + svm_vcpu_init_msrpm(svm, svm->msrpm); + + svm->nested.msrpm = page_address(nested_msrpm_pages); + svm_vcpu_init_msrpm(svm, svm->nested.msrpm); + svm_init_osvw(&svm->vcpu); return &svm->vcpu; @@ -3308,6 +3312,18 @@ static int svm_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) msr_info->data = 0x1E; } break; + case MSR_IA32_APICBASE: + if (svm_vcpu_avic_enabled(svm)) { + /* Note: + * For AVIC, we need to disable X2APIC + * and enable XAPIC + */ + kvm_get_msr_common(vcpu, msr_info); + msr_info->data &= ~X2APIC_ENABLE; + msr_info->data |= XAPIC_ENABLE; + break; + } + /* Follow through if not AVIC */ default: return kvm_get_msr_common(vcpu, msr_info); } @@ -3436,6 +3452,10 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr) case MSR_VM_IGNNE: vcpu_unimpl(vcpu, "unimplemented wrmsr: 0x%x data 0x%llx\n", ecx, data); break; + case MSR_IA32_APICBASE: + if (svm_vcpu_avic_enabled(svm)) + avic_update_vapic_bar(to_svm(vcpu), data); + /* Follow through */ default: return kvm_set_msr_common(vcpu, msr); } @@ -4554,11 +4574,26 @@ static void svm_cpuid_update(struct kvm_vcpu *vcpu) /* Update nrips enabled cache */ svm->nrips_enabled = !!guest_cpuid_has_nrips(&svm->vcpu); + + /* Do not support X2APIC when enable AVIC */ + if (svm_vcpu_avic_enabled(svm)) { + int i; + + for (i = 0 ; i < vcpu->arch.cpuid_nent ; i++) { + if (vcpu->arch.cpuid_entries[i].function == 1) + vcpu->arch.cpuid_entries[i].ecx &= ~(1 << 21); + } + } } static void svm_set_supported_cpuid(u32 func, struct kvm_cpuid_entry2 *entry) { switch (func) { + case 0x00000001: + /* Do not support X2APIC when enable AVIC */ + if (avic) + entry->ecx &= ~(1 << 21); + break; case 0x80000001: if (nested) entry->ecx |= (1 << 2); /* Set SVM bit */ -- 1.9.1