From patchwork Wed Nov 1 21:16:10 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Brijesh Singh X-Patchwork-Id: 10037561 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id DF091603B5 for ; Wed, 1 Nov 2017 22:03:10 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D0D9D28C0F for ; Wed, 1 Nov 2017 22:03:10 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C517D28C1A; Wed, 1 Nov 2017 22:03:10 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_HI autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 42C4828C0F for ; Wed, 1 Nov 2017 22:03:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933586AbdKAVR2 (ORCPT ); Wed, 1 Nov 2017 17:17:28 -0400 Received: from mail-bn3nam01on0059.outbound.protection.outlook.com ([104.47.33.59]:44352 "EHLO NAM01-BN3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S933554AbdKAVRQ (ORCPT ); Wed, 1 Nov 2017 17:17:16 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amdcloud.onmicrosoft.com; s=selector1-amd-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=MFVZ9ur8I5uwuIiWNE0GAcri/VkFNJTY9NSKI1hsvaE=; b=vJ6fi1IQXK6l78oPF43PPnphYD8cO1k5FGIxjJ+sadM5VgsTEkQItK3lOk2n3mIaZp/0e2yr3UGFWQDZoOf9rYiQOroT3z6/JXjm7skbGr6zsBXkPzkdx8isC9K9z41YBoJ72wYMQfZificuKGkIpxACe58kj+MtAxgAwScJnxs= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=brijesh.singh@amd.com; Received: from wsp141597wss.amd.com (165.204.78.1) by DM2PR12MB0155.namprd12.prod.outlook.com (2a01:111:e400:50ce::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.178.6; Wed, 1 Nov 2017 21:16:53 +0000 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 v7 25/38] KVM: SVM: Add KVM_SEV_INIT command Date: Wed, 1 Nov 2017 16:16:10 -0500 Message-Id: <20171101211623.71496-26-brijesh.singh@amd.com> X-Mailer: git-send-email 2.9.5 In-Reply-To: <20171101211623.71496-1-brijesh.singh@amd.com> References: <20171101211623.71496-1-brijesh.singh@amd.com> MIME-Version: 1.0 X-Originating-IP: [165.204.78.1] X-ClientProxiedBy: DM5PR06CA0064.namprd06.prod.outlook.com (2603:10b6:3:37::26) To DM2PR12MB0155.namprd12.prod.outlook.com (2a01:111:e400:50ce::18) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 0cc40d5d-23f8-4258-4b29-08d5216de016 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(48565401081)(4534020)(4602075)(2017052603199); SRVR:DM2PR12MB0155; X-Microsoft-Exchange-Diagnostics: 1; DM2PR12MB0155; 3:mlsvCCHsjH3RkwuedIvnncfBSWc+JbfVYxyqkOgjV1Xyzty5HvwwxOeKBElHBYX7d/CgWrrTB7ZpvchJgv58obwCBLRZoVdBMmdIt+F2w8CZzsXWuftpLSiskSw52jkg9zBv3gKiDMg0t5wLk6QLTzXMrih0DnT+TkzZF++fw2p6Dw7ie6L5VPnosxa9Bq/aiE5alTZ+30oveyB1d61e3MuNO2jlzoWgaxVIvRkCp5keB57GVuQPDM2F4eRNltXf; 25:IuHsjmtJ5if1FMNPKMUpznnhbfiWXset2HOgKe5BJe71lnb/alDL2IHO10cWCwF/+Jl1sUYNKwGDZ7Gr9gNhVe0KZzSiow/gL1c4QGYvam16TQQNDkqo9P4t6EgZY9akYceD5LwXuCiuvKF8F4xgIROjYeGiIAJpENMlEVON4jFtU3tXF4AwDdHlpa6mstYSZ4a6XgcNLeUbW6bu5EJlxl2vqmtOq+Q31vjSVwDlzAp3KcndLA4LITTIsMAAr/xR1VKgwrkC9jLDtpjDhtz8nfCvmnsSt8onxRUuioAMkNVVwdNOt8aAsScUxpCRwPq9tiFnJrYWsBw3OfgJt5mdww==; 31:kihRZ+xVNHd0f6KmlISaH0pCTO2tbLDa0IJ90n1SVOXerwTOKDw/pvBelCsH52CxByGf4G0sDnH1NJEwG7Upq2ibzUPovjn0N/lo73PzXiT/X1W5Op1REnEk4nHTHBP4phbsLP0qorbVcBPox4EAqPmvpRdjeTpyCPWaFe+sv8QQvcatmC0AoV1eBaLr0Sf7HaIxKPsaIfK/UyHLa1EGMa7XrYlYD3WIPSutK5+bcms= X-MS-TrafficTypeDiagnostic: DM2PR12MB0155: X-Microsoft-Exchange-Diagnostics: 1; DM2PR12MB0155; 20:QP1TEukDCKNg4VsqavHN7Aw28c3tyDxGMVk8jgKTRJGZLm6Nn2p09+oKmdeziqayCCtU4jlMdHc7Ke7vBADviCChwP2X71Nx7OfCIoS9kWcg2iislJcaFw+jILA7+6KVXbpm9m7XTzoUkEcFbad2lU76ilG6Vtw266D8f5/lFD+5GhlPYjUFP2JdtwcDhQsaBQfivvl+MIGnUODorf8rw2YRsIYGhWJ+ziCeicEGOQ08ASH7KEDamLB+OKZltB47A5AyEGtJ/POrWZbrHfmHTXlHwxTvQP82oQ5+Nx6/FAn72KmzlUPOHh7ytcFuuuhKhad2FnBJ1jZELDiFo6eaNPlDD8DdFujedAX4aUph6w0xsa05ok0nQYWG7mmH74mZPvEABQoAJ/G+O31Az9TvkzfDbKTPDpxus2IPbWMW8tElVouAOlRLsfXbSTk55hLqUMJ5X4Wl90UBe1Qf/EsG6VGBMIC6DhCDbQgsql/vx8wR6sLr72EITc40AN//Z033; 4:mqPOaPpZ2gfpYUX9vwV4mmDcp1jbSYt40/ivcT5U9dicVY37KZx1+W9a6SP4nMykAcMBRiG876Okv0JVXaFppl6QNh0bA/lENOKKYV1aQkEg+cV2Cz6iRBtDp+lwVg+CPisDGK2HiFzZRHAsqaruTnznFE6D1Y8htU+LaYSgxho+3x9VyiKuLmuNeJSFVjTUW3fa0KgLRuh9rt6YnOj5kzIafWrrzWg/98pqBCOPR/F/80qKHQ412VJyZagIwjxCZGtNAqf8cxA62f+SAyNESvlahmQYaqsrt6MmCdQtwfTKsRFa01kV1/EvR8AlFnN+NI2k/ILss1otnWOqRcYrPQ== 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)(100000703101)(100105400095)(3231020)(10201501046)(93006095)(93001095)(3002001)(6055026)(6041248)(20161123560025)(20161123555025)(20161123564025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123562025)(20161123558100)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:DM2PR12MB0155; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:DM2PR12MB0155; X-Forefront-PRVS: 0478C23FE0 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6009001)(39860400002)(376002)(346002)(189002)(199003)(1076002)(6116002)(97736004)(66066001)(50466002)(3846002)(25786009)(4326008)(54906003)(316002)(8676002)(47776003)(36756003)(23676003)(50986999)(478600001)(7416002)(81156014)(81166006)(105586002)(53416004)(53936002)(189998001)(106356001)(2906002)(16526018)(2870700001)(76176999)(33646002)(305945005)(7736002)(86362001)(5660300001)(6486002)(101416001)(50226002)(68736007)(8936002)(2950100002)(6666003); DIR:OUT; SFP:1101; SCL:1; SRVR:DM2PR12MB0155; H:wsp141597wss.amd.com; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: amd.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtETTJQUjEyTUIwMTU1OzIzOjFTZDk3RERmdFpXOTdYUXpCT2RQbURwZmcx?= =?utf-8?B?a05sZ0VHUTAwUzBQZno0Rzlqc2FWbWs1ZEwrNkE4Q0VkZ3Q0d3ZIZXFLdzBF?= =?utf-8?B?czEwWUk1MFZWMDRyVlVCYnBuc2w3MXhjaUlGNy9qeGJHS04ydWZjRXI5OWJu?= =?utf-8?B?VDR3RTB0aG5vSHVxN3M0RXhkamwrYklIUlRGV1I3MFQwK21NdVVsWGVQZUZQ?= =?utf-8?B?Q25rOHlaOXhDNFlDNEtlZlRTZi9Oa3VLMFJIODlSV25qb1E0M1VldEN3c3Iw?= =?utf-8?B?Wmd2WU16K2Y0MjBxdzRlUml4RW9mc1VseVg5QVcrblJHelpMbGN6dlp2Ny9D?= =?utf-8?B?UlFpTTQ1b1JrYUY5NDlTT3lBSnh5SDJ3Mm9xT09TMUZ2eDhpTGFrWVphZFhN?= =?utf-8?B?cGNueGl2VXd6VmliVlNZc0Z3dDhWVjFhLzJRbjhOOVVrYk53RzNwNGZOSWNi?= =?utf-8?B?NDJlbzVDamZXeW9rZWZGUmhDWE44enVOS2x1RXV6SjluVVNSRXd3QzUydFl1?= =?utf-8?B?alBFZnFzajIxMml1Mk4rMURJWk5hdlkyQU5td1NlZU94c1JWODE4Y3JjSllV?= =?utf-8?B?TjRoZmxwTTV0d3U1RVhqQUkvVkJOWk9iSWVrT01jdXZ0ODFoOXVhYjltL1kv?= =?utf-8?B?d21uV2g2WUVzK0lDY1RJNHJXeVJYMVNXWFpIOFovZXdUOGkrTzZOM2RySEhz?= =?utf-8?B?SzBDVm5VS0QvcU5FQ1A1WDZ6SHhSSFNzSWhDM3JoeXkyZjEvMTZ3ZXpFSEVk?= =?utf-8?B?b2dMRnptNm9GbWtYVUpQTTEra2FuK2hTcmw4UTNwS2lXYW9RNGZOMTE2WjFh?= =?utf-8?B?dlgyelkrd2ZmbjZpV3UxemhHL3Y5a0xDV05Mc05SS0JCdWhoVDZ6VFNhWm1q?= =?utf-8?B?aFNlSUhERHlRY3M1WVl6SUIrd0dibDBOZUx0OHVjS0xhR3huOXY5Nm1jSlhl?= =?utf-8?B?UWZNQUlFQk11ZnN4NjA4THF5Z2E2YUhLdFIzSEFxdVQzc3JFTmxRdzNncmdR?= =?utf-8?B?MWYyVml2dXJMUW5Yb0xSU0pFZEtBREpGTkxIT0Vyd1ZiejhFWHF2ZWFsS282?= =?utf-8?B?Zk41eTF1VXBEa3BxZmtuNmFWQUQ1WjhmYXh2MjAzQzNjR3pNSEpONHZkUkNY?= =?utf-8?B?aEhKbERiNDFNdzVKU3hxNVE3R1M0MURkb05DYS9yMVQvcU9pdFM5aXZVTnZa?= =?utf-8?B?L3UycEdKVWVnNUI0RDUxLzJ0Vk14S0tVZllJTVRPRmlQdUpmRUQzS2xuc2FU?= =?utf-8?B?bjJSSnUyeUkyVFFxWTlDUzlVNWoyYmJhQjZBQWkwbkVDZHhaSG92UUI4S2p0?= =?utf-8?B?eVJLcUk4NU1PRWtqNXIwbVY4UG90TGloelJ3MEovenBWUGtaemlrRVl6cStO?= =?utf-8?B?cjRKaGRwaW9sR0IrVU1JT0Y0dElBK2FlLy9jZUtGOUQrMU9uSjg1LzEyeUNa?= =?utf-8?Q?ltYKIZ0h2tdF7cQTCmzqDdGV/g5?= X-Microsoft-Exchange-Diagnostics: 1; DM2PR12MB0155; 6:tzdd41yegf9e4SPKY3cp2R5WkhzV5Tqhn+gLrh2EDeTtoMaRbcJMHIaFKcx8qNq0nMOrZW39K0CqCAGjattnAyeiQ/fW4c/jbXrVoeA6wtpGowZ7pzV4Hi6D0mco4fjWlSLAQ/JIHBPuCr38YnsFpir6jSFkAS49rTNsCSyNURUUHJVpVh3OKQ3zvF5e5NI8LoXNi4T7Hyd9r9PU8s8Vl+uXfMBFY6ocyjAlRYiIZoQIN2ABPNTM//SWfb4croyFSLk3I65kFe32NsP80o4SfC/D5tKXWPz7zcfGFHVRurmPMmJ4Zfe4qmjGwOnk2KfW+vSYHE99vMDr6tDlonrITQr7rhiBr8RYJe/SvCPqRVg=; 5:H1sVyBsUedxPQWe+LsfoxRn5m6UyfqrsBEsOiNN//yDkuCM88xoRfJEkvDLNJMsFVr2qZ8a4u9mH/1Le1dGEbxZ0bVHSEFGt1njygcRQj3/7nqmtb1KZWWmvYfQW4zEyKwuD4rwprDq4aZLZadQvkyyGbYhBPdtc0mxTgSmyIgs=; 24:cV8O+kO5sbTQxT8CQyGytef/lqBeyxTnvKZ8z+LQaVptGqLRBWvFiFwXNWmSQ/0E8WFT4ArES6ZjFqa2KJrnEo9B8E50PLXKJwwlJ/Dk474=; 7:NAtojX6csbAZDK21+dFD11z3wT+X/2Eb41DRJWz7ZR5w/chByl3TTD1W2Se1Rv72xVyEX9KGOefG57JamuVJ9E62y3pfcQaMiUldknqjjQSxEwZ8u9q3Fxz3HjdQHLjjQRvhPZHwYalbtiPRuRUlwJHkNRCtJDIVdyIQrj2QIXuknZ5H3PkfeHUH5X6rg7tl5p4EOFKeq9CYJY8divuk8vKKAeXDa5U7IGSSvsdqL0AHQ8vam6IWl8qIzrWZIRn+ SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; DM2PR12MB0155; 20:ZFYHCpzpylAIioLiec9RNBBQlePks+Rtgd7Vk94rdyAfOc8TyS21w+GJ0pQ/LDI7J4uIXyO5G5Is5ycYFpxDjj2WhjtI5b5f3F8lrEKWu+U+lKrGWZyLn4+TSDM+iaOKL446sxbSnEYuzvxET1vBC0IJGOg3MDALudjaNIg1zhvhSewz52TfQAMU9PMi5dLspqX6lXnsnsjuyLfBDtkdwdQp+IMehDlK0IjnT4PZoFodfXjlNSgTJvFTXRpUqLfL X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Nov 2017 21:16:53.3596 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 0cc40d5d-23f8-4258-4b29-08d5216de016 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM2PR12MB0155 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP 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 --- arch/x86/include/asm/kvm_host.h | 7 +++ arch/x86/kvm/svm.c | 130 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 136 insertions(+), 1 deletion(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 3af074452b2b..b8837cff22ec 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 d4b62536e305..1410e6b7e8d8 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) { @@ -1063,6 +1078,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) @@ -1167,10 +1187,18 @@ static __init int svm_hardware_setup(void) return r; } +static __exit void sev_hardware_unsetup(void) +{ + if (svm_sev_enabled()) + kfree(sev_asid_bitmap); +} + static __exit void svm_hardware_unsetup(void) { int cpu; + sev_hardware_unsetup(); + for_each_possible_cpu(cpu) svm_cpu_uninit(cpu); @@ -1361,6 +1389,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); @@ -1443,6 +1474,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; @@ -1461,6 +1515,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; @@ -5427,6 +5487,72 @@ static void svm_setup_mce(struct kvm_vcpu *vcpu) vcpu->arch.mcg_cap &= 0x1ff; } +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(NULL, &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, @@ -5443,7 +5569,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, @@ -5537,6 +5663,8 @@ static struct kvm_x86_ops svm_x86_ops __ro_after_init = { .deliver_posted_interrupt = svm_deliver_avic_intr, .update_pi_irte = svm_update_pi_irte, .setup_mce = svm_setup_mce, + + .mem_enc_op = svm_mem_enc_op, }; static int __init svm_init(void)