From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932852AbdKFSOP (ORCPT ); Mon, 6 Nov 2017 13:14:15 -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 S932741AbdKFSMj (ORCPT ); Mon, 6 Nov 2017 13:12:39 -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 25/38] KVM: SVM: Add KVM_SEV_INIT command Date: Mon, 6 Nov 2017 12:11:17 -0600 Message-Id: <20171106181130.68491-26-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: 198ec823-94e5-4c0a-5c85-08d52541f05c 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:XDN/RqCH4FFygIrKGLEig5ya1Y5ptnXkngCwhIobMeX/AdG8NBlr1fZ+q6o5+AQ4M0xkWACkrJn0G+soHLvneDtJDrVZZvHul1kC4tpn/Dqlcn97kkLCO4iAdllg/Ak2MMprtPUF+/WIWCOC9oW6LkXskWnYFRQiJeQTD4y1M3pTwsWmB0BjVGgck2a+4qv4sH41FbVT0oQGhC1IUgPFzzHudavF7pTPKapqt2LWHJXMZuhToOztjdg4wraOG2v4;25:/t9ttcI0ZWNPIWowfa9ykJ/1Ji1K+a9GxgJ6vg4yNicYMst9Y5IhlE6DDzFMk/+zeYrDfMe65bYnCPbbjN9HLCU1HQ3XAJx0ZhgZEw+UrUdp59S1HnaBaLbf3kcmfMmSkwEPxbmq3HLfNh9HKXHgzusI14C6/kq+0o5Lp50pb/QjaFulcgBb0w+9Kz4jDdIF5ttU86Fbm/aDS1YzJ2AsGdqu1nBcyfAwVEHbqb55fbM4Fu2ajmK4yblSUoQJk6hhGYNO0dBdDJQdEAbbSJ2eafCSEwmhmjmO/DBFWBkzU2sILX2VhJEQB6MEHLtmDLD1z1fAcP8dFRtHZ8WF7SvX/w==;31:1Tbe/6xVCT+q84vULtlt1mSR6FImHNJWsArybo472W1zJbubcAIYf0VQeV90U59TC+xoMa/IqVPUkNLO5kmIiKwVZ3m09q27ZR/X3vSZZ9I6AoIlPoGMUeQGEnPPxcBbH+oAtmyC1FTn7hMq2ZC3AFLtutxBVEVgIvhsfA2ebWaho0E1hyn21fLLPO22rXEfIJ9qxzeXMg5bMK0IZMkPuoE8nziqgWc2F31yS20dSGI= X-MS-TrafficTypeDiagnostic: SN1PR12MB0159: X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0159;20:Sp4KJJwpr/g2YWpw/Szf+JdlpJb2/cihY+p/NqNeGZA/2yZlU0cSXjYOlkObQamcQ0HTiJvEAIAf3crJ5ed/yXqVBPBmKMhjcYhKqdT7JHQaGFWPrIwHxsaH6kh0tq7duM0TzXx9Cq1mBj8aivSKRG+6e+WFtNXGVSv9dtc0JnjsjnWELC6HONpu/P3b6X7APPblb4VkONdPLGshWTz1Cr8uq5CKNgMfl62srNAAFmdEanqltTbgaBJFJM2aNxL4XAIxZuyJgNnZbeORyHPU1FyXQe8Ef1hanqDr1QG47mkF5ThTtXKQM/uM534lbdJ8BxhTVuwKTmygm1UAeOpYYVIgVimHYXP1RdrfI7YZnmaJNwbfItlBqI1Lgqvp5Mq9djrxeevSo8WrclFgGeALnP50DHKfDewkTIfii1eAj8gyhjwu9CuWfihpSjG2CcQ9BcOfXHXMKZnrEvl7qI3Aq3Dm+TBwSXRikP81NfLnFHw5BvF62gZM4NzxXG8QMwzW;4:WYmf4rCJmgya6lElbfdEF3zrLKSJ0ttEVO7Ze2Dp8lR5Y5Bdzi6iXwo+Ubgu8e7KKk/A4qqXLSE1igzln/rzQFM7VHanUZm2K02ekWHityvvXSHkailBaMO7xSsvUtZShaC0/0svzIEtnTwI/nezpWUeXzmfk4RHY8cyKUYBCmvu0T0iuURTdwuXbESGnfEPxF/pnUQWKbHGb+pOXJNCyrdWML+Xqecb6Cv++WkbY5tINal8olq4+E41RAIstuViMFDrDhUDKKPjXzZsaY4ST45buSug+6v+N5H84K5z0aUaBL9zN5mR+YgnyGl+s0WNZBzr3VJF/DvCSBMAOtDibQ== 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?MTtTTjFQUjEyTUIwMTU5OzIzOnVHZVNZMnBNcjc5WkpLWkEvMVB2T1U4b3I5?= =?utf-8?B?M1VpMTdOM0R4djlXTUxKeEU4bjV0S25XaHNJUzJ4U2RYSnp5ZHRoa2MzZDJh?= =?utf-8?B?Y1lQaXd5aEVPZ0ozZVl4V2tSdVVScjE2RyttK0Z1VUFIRnFBeW5pbXhsUWll?= =?utf-8?B?NnBlQ2VBRHFuWmtyd2Vta21uenU1OEt1OXROakgveTIzMk5lNnJVVEFwUjRL?= =?utf-8?B?d0FMTmxjd3luZHNtZzd3VUcrZ1RCdW5ZS3VjcUFuSlpZNWhqMTVGMi9Tbm5Z?= =?utf-8?B?ZEhrRDNsaG9qZEFJUlNuU3Q0aW0vck1aenUyMGIyYTlyMWx6SFFySk9Jd1M3?= =?utf-8?B?VCtWKzluNW9EMXY4RndCUWEvL3FhTXU1ZjVndC9BWmIxLy9kTnZvSHk3UlM4?= =?utf-8?B?eHNHMFYrcmZWUmdlaE1FdTNoSThyWFR6QW50a25mRUhRM0hsK0dHdG5lYlJH?= =?utf-8?B?ME1PKzluTkN6Yll4dnJIL004cjQydXM1MmtnUlR0NCtJUnVTNTBqUDF5Y3VC?= =?utf-8?B?WlNidWx1elNpSnBTRHVVUU94VXhRUHdwQTl4MUpHT0ZDcCsybFkvQ1g1TzNB?= =?utf-8?B?K2pXLy96MWZBTTU3VkdBWXZ5Z2lrdlBzVEJwejNITW9KejR4ZGdsWjhpUERu?= =?utf-8?B?ZmtiZVlKNnBQd2dlVVM1eWJHVVhndFMwN3h2bUdTU3dNSE9YQ3R4azlnZ1kv?= =?utf-8?B?VkFnNDE5NjlzSEFvZ2JOcGZLbjUxV2RKN1RudnJqNGlsMTJpSFdDV3U4TzdT?= =?utf-8?B?WmpGalJ0NEg5RHdxOEg4ZVI5SzlWSG9KUmRwSWY0T2ZzK0d1UHdtWVJFR0Mv?= =?utf-8?B?WlNnbFVTZmdJOW5UMGZIVHBwNzU1Z20wYk1VY3J3Q0dIYngrcnNZWm83YVRx?= =?utf-8?B?WHFiS2Q4TnI1alZqVGlIbmE1dWRacVNVSjdmWUpVWGJ3U1dJUWQrSWtrZFlW?= =?utf-8?B?VjJSVHVyMDZ3b2hZZzBPWWJzcHZzTW84RWxWbUlEQjhRRzRHVVhhRlVBM29p?= =?utf-8?B?VUJGRjhFRUl4bFBBZHVvWmJ5QXFFUWh5d29DbUxWQndxWExiN0VTaGhsdEFy?= =?utf-8?B?b2VJMlZaK3AySjM0L3NsanFuRlAvb1VYaisyelFxbTZkdkY4amxjSXgzY2hY?= =?utf-8?B?VkZzVlNHeWM2K1E4aVdSeDh1UVBYMmFYMVQxblN2VWNDdW5GU2dCSjE4MWVG?= =?utf-8?B?VjR5c2prUWZuLzJyVkNSZHh3akxRcktBMEJuOUJTYVNkcyt2djljQmJUQ3Rh?= =?utf-8?B?VDZMVHVBSXlCQzMwUnVabHB6RGFCbW5FUlhkazNrWlVFNjNMd016QUp2QjU1?= =?utf-8?B?VUtGTERIYUJkN3U2dTAybzRGcGs0V0llSXR6KzIrNk5pRDh4NGdWMjBUaDA3?= =?utf-8?B?cXRPdWZjSk91UmpiajEzN1FuMmJxM1Ira3gxOG1UTGpRSURLVTVMaW9nbGhL?= =?utf-8?Q?fMOuPyPV2xN2RW0pXzt4V4hPXZe?= X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0159;6:zWCXOi4mLsjVTOrqk5T+mLBbTuTNte2bSuBnjDBNQ2Dp7xzQppfD1vnSfeeKk4A9nZ4TmlmW2bRQI+BrSazyEN8VVUQXbOud2s0jMo6cwF3K3Z/Dwf9PKtf4lUmbrizspi4/Suu8q2KUfef5vfg0iHJ8vYtERb9bFIS/lVOyPsJLNF8Wmt0mrq8DLX7Fa75ohUXqSCZjfpw64J992R7vYLsTx7+qfA1Ip43/RUQ4e2WOwzauUwV3ntlcS8LmAqqhgYNUM2QeRXOhVqqLhw7sON8kVXr2rMqffvM7fsW8d2WyqAQCVrzZz1NKNZox3l/BOT0yS4GXfqN27Kl1BoO5sd1qUJzpmr8nR7c0mk7ZkUU=;5:mTZD7om8wlVQNQC3C8+4+uUHUm3vkPvGPsi0CNd9aG75OjtV53GoXjgO+RqVClO1Ic40nbTeJ167aERPDZxT9EwboWDDDws5r6EnGk7FfjjRikJGVwwPyaoO5wfGffscJFPi6PkZEQnyKw44yDQ0falhYCt3lSo2FaftQWY3TEg=;24:hIZBOMw7khXATj5z8n6uNkKqixFpC6BcNuYG0Coz4JVMPPxGqW/W0XvazFSloU+pSKGyfsQ62qg2MBwFc/Hzcs9Vk/jHvySieTy33DhM2sM=;7:ril2lDoMnxt9YafAVlLLvO+qZNUs7s1Ony76LeBn3taZc7sUOUOByYveIoJf3UYpfpgumJqbpycu9aOAQdZT15hUjWM5UEzYLnO8FLF8eT8X4UOc26/lTcisfUcvwMr5n5msaZtx1Vxp9TUuhdsx3EPO0k504S0J7aQC3kMeAKNKyGTp4iuVgBC9OeC/WgwpUjRvWh9hhgwzXqBXrOJhuDUwnW9aN1Bv2Bhl2aPp3jbP4hoHYBJepr09Oof02Q+b SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0159;20:InQ24hpKJvyPPaw0zfo/SpyNiwMhuqiJ5pL7AERWpX7D3FKuTT0m9I0IIEWYiI1v3fVoBubTe8xvFFZcYtIbKrF1ynXDiDn3y4liCamjo2w5T+bp9zfpxI5oNDckOfU5XrvG1/42pQcinzAYaJ/NAKSbDbwTwdFrXaSBG9ju8IumaIK8ODXpfo4xIOr2sAiD0eHsYtf5AULL/ROy9Zvm4+uJwdKaNtNdErSGAc5aodnxBE72pAIYbO3JGnE0XY7+ X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Nov 2017 18:12:26.8479 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 198ec823-94e5-4c0a-5c85-08d52541f05c 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 The command initializes the SEV platform context and allocates a new ASID for this guest from the SEV ASID pool. The firmware must be initialized before we issue any guest launch commands to create a new memory encryption context. 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/include/asm/kvm_host.h | 7 +++ arch/x86/kvm/svm.c | 125 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 131 insertions(+), 1 deletion(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 1be6f17499de..1841fe960888 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -747,6 +747,11 @@ enum kvm_irqchip_mode { KVM_IRQCHIP_SPLIT, /* created with KVM_CAP_SPLIT_IRQCHIP */ }; +struct kvm_sev_info { + bool active; /* SEV enabled guest */ + unsigned int asid; /* ASID used for this guest */ +}; + struct kvm_arch { unsigned int n_used_mmu_pages; unsigned int n_requested_mmu_pages; @@ -834,6 +839,8 @@ struct kvm_arch { bool x2apic_format; bool x2apic_broadcast_quirk_disabled; + + struct kvm_sev_info sev_info; }; struct kvm_vm_stat { diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 59abb9fe2f13..7379fc218128 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c @@ -37,6 +37,8 @@ #include #include #include +#include +#include #include #include @@ -324,6 +326,19 @@ enum { #define VMCB_AVIC_APIC_BAR_MASK 0xFFFFFFFFFF000ULL static unsigned int max_sev_asid; +static unsigned long *sev_asid_bitmap; + +static inline bool svm_sev_enabled(void) +{ + return max_sev_asid; +} + +static inline bool sev_guest(struct kvm *kvm) +{ + struct kvm_sev_info *sev = &kvm->arch.sev_info; + + return sev->active; +} static inline void mark_all_dirty(struct vmcb *vmcb) { @@ -1060,6 +1075,11 @@ static int avic_ga_log_notifier(u32 ga_tag) static __init void sev_hardware_setup(void) { max_sev_asid = cpuid_ecx(0x8000001F); + + /* Initialize SEV ASID bitmap */ + if (max_sev_asid) + sev_asid_bitmap = kcalloc(BITS_TO_LONGS(max_sev_asid), + sizeof(unsigned long), GFP_KERNEL); } static __init int svm_hardware_setup(void) @@ -1168,6 +1188,9 @@ static __exit void svm_hardware_unsetup(void) { int cpu; + if (svm_sev_enabled()) + kfree(sev_asid_bitmap); + for_each_possible_cpu(cpu) svm_cpu_uninit(cpu); @@ -1358,6 +1381,9 @@ static void init_vmcb(struct vcpu_svm *svm) svm->vmcb->control.int_ctl |= V_GIF_ENABLE_MASK; } + if (sev_guest(svm->vcpu.kvm)) + svm->vmcb->control.nested_ctl |= SVM_NESTED_CTL_SEV_ENABLE; + mark_all_dirty(svm->vmcb); enable_gif(svm); @@ -1440,6 +1466,29 @@ static int avic_init_backing_page(struct kvm_vcpu *vcpu) return 0; } +static void __sev_asid_free(int asid) +{ + int pos; + + pos = asid - 1; + clear_bit(pos, sev_asid_bitmap); +} + +static void sev_asid_free(struct kvm *kvm) +{ + struct kvm_sev_info *sev = &kvm->arch.sev_info; + + __sev_asid_free(sev->asid); +} + +static void sev_vm_destroy(struct kvm *kvm) +{ + if (!sev_guest(kvm)) + return; + + sev_asid_free(kvm); +} + static void avic_vm_destroy(struct kvm *kvm) { unsigned long flags; @@ -1458,6 +1507,12 @@ static void avic_vm_destroy(struct kvm *kvm) spin_unlock_irqrestore(&svm_vm_data_hash_lock, flags); } +static void svm_vm_destroy(struct kvm *kvm) +{ + avic_vm_destroy(kvm); + sev_vm_destroy(kvm); +} + static int avic_vm_init(struct kvm *kvm) { unsigned long flags; @@ -5523,6 +5578,72 @@ static int enable_smi_window(struct kvm_vcpu *vcpu) return 0; } +static int sev_asid_new(void) +{ + int pos; + + pos = find_first_zero_bit(sev_asid_bitmap, max_sev_asid); + if (pos >= max_sev_asid) + return -EBUSY; + + set_bit(pos, sev_asid_bitmap); + return pos + 1; +} + +static int sev_guest_init(struct kvm *kvm, struct kvm_sev_cmd *argp) +{ + struct kvm_sev_info *sev = &kvm->arch.sev_info; + int asid, ret; + + ret = -EBUSY; + asid = sev_asid_new(); + if (asid < 0) + return ret; + + ret = sev_platform_init(&argp->error); + if (ret) + goto e_free; + + sev->active = true; + sev->asid = asid; + + return 0; + +e_free: + __sev_asid_free(asid); + return ret; +} + +static int svm_mem_enc_op(struct kvm *kvm, void __user *argp) +{ + struct kvm_sev_cmd sev_cmd; + int r; + + if (!svm_sev_enabled()) + return -ENOTTY; + + if (copy_from_user(&sev_cmd, argp, sizeof(struct kvm_sev_cmd))) + return -EFAULT; + + mutex_lock(&kvm->lock); + + switch (sev_cmd.id) { + case KVM_SEV_INIT: + r = sev_guest_init(kvm, &sev_cmd); + break; + default: + r = -EINVAL; + goto out; + } + + if (copy_to_user(argp, &sev_cmd, sizeof(struct kvm_sev_cmd))) + r = -EFAULT; + +out: + mutex_unlock(&kvm->lock); + return r; +} + static struct kvm_x86_ops svm_x86_ops __ro_after_init = { .cpu_has_kvm_support = has_svm, .disabled_by_bios = is_disabled, @@ -5539,7 +5660,7 @@ static struct kvm_x86_ops svm_x86_ops __ro_after_init = { .vcpu_reset = svm_vcpu_reset, .vm_init = avic_vm_init, - .vm_destroy = avic_vm_destroy, + .vm_destroy = svm_vm_destroy, .prepare_guest_switch = svm_prepare_guest_switch, .vcpu_load = svm_vcpu_load, @@ -5638,6 +5759,8 @@ static struct kvm_x86_ops svm_x86_ops __ro_after_init = { .pre_enter_smm = svm_pre_enter_smm, .pre_leave_smm = svm_pre_leave_smm, .enable_smi_window = enable_smi_window, + + .mem_enc_op = svm_mem_enc_op, }; static int __init svm_init(void) -- 2.9.5