Received: by 2002:a25:ca44:0:0:0:0:0 with SMTP id a65csp1119183ybg; Wed, 29 Jul 2020 06:23:27 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxSFHuElgezM/3gg+xgPKSRBrh0bnRrja7vTWiJdxAQXX5FqJNr/HULbJyuprS7zTrt+XwP X-Received: by 2002:a17:906:b2d2:: with SMTP id cf18mr18169717ejb.551.1596029007004; Wed, 29 Jul 2020 06:23:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1596029006; cv=none; d=google.com; s=arc-20160816; b=BqMQcs2KLNMOoKA/6n7B61fWx3d7xTMB7hd1ScBNxUG4alEkHBixFlm0IwstEYFtBy wRNA4qE1YTWC3sYXArFpZvS+OozQ6tZYlFJ3s0y4lXrCI+l9N74rFfDshgvfEuqg4g4b dohlf3RGLL9oUlfKFYBPze8zPypJlpyI61ZdlDk2ONYFUs4mFKtUYCOuC/KpFbgRTpcH vNg+Tc1U/3H1Bul9V14MkLDE1uKZmf/bFiSAqx7+jo56D6vuYGA49TU1RWAYuo/ERk8z s2zIzmIgG1xrYt+xJcCI13vbi3AChN5dbOzDmI9z8uMdVSdVPmNIE9vCNSl0YkISMME/ SGMw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=ibZ29GF67ffc1PNwmgR2p5zRLI7ji93+F4e7wTh4B4M=; b=BK3BZ8dZI8tEUr2obL2gFa9fjKxWbqGxAkqtcUbkxVH6A4DboeoHUB85n+hNtBH9fg IcdPbdgi5jfoNOzlhpHRlXA8Ea0nydZ+mibK1NS73waBP1Dez2MX0w9tqwS7sVvzhAvI bx2pZaW2GHnQAXciQEwzV6TLF+knr2WAw4TBckpMychf78KOx7kUCqmfhmMcGSTfX4Sx iKNptPI3LjjUE7Z+i/Mjn29jAwR9Y0aSfYZjZ3Q/4vkkQlCYkKJVQfEP3WQHF26wLda9 dZS7hEl5kqGcNbKQFLbGwdC3vkmbpqdOKA3JJjKsVJhp1W24y0YaCfHBX6E0zERlfxOI BbKQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=8bytes.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id ce15si1393845edb.201.2020.07.29.06.23.04; Wed, 29 Jul 2020 06:23:26 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=8bytes.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727124AbgG2NWu (ORCPT + 99 others); Wed, 29 Jul 2020 09:22:50 -0400 Received: from 8bytes.org ([81.169.241.247]:33806 "EHLO theia.8bytes.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726353AbgG2NWr (ORCPT ); Wed, 29 Jul 2020 09:22:47 -0400 Received: by theia.8bytes.org (Postfix, from userid 1000) id 08A37E4; Wed, 29 Jul 2020 15:22:45 +0200 (CEST) From: Joerg Roedel To: Paolo Bonzini Cc: Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Joerg Roedel Subject: [PATCH 1/4] KVM: SVM: nested: Don't allocate VMCB structures on stack Date: Wed, 29 Jul 2020 15:22:31 +0200 Message-Id: <20200729132234.2346-2-joro@8bytes.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200729132234.2346-1-joro@8bytes.org> References: <20200729132234.2346-1-joro@8bytes.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Joerg Roedel Do not allocate a vmcb_control_area and a vmcb_save_area on the stack, as these structures will become larger with future extenstions of SVM and thus the svm_set_nested_state() function will become a too large stack frame. Signed-off-by: Joerg Roedel --- arch/x86/kvm/svm/nested.c | 44 ++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/arch/x86/kvm/svm/nested.c b/arch/x86/kvm/svm/nested.c index 61378a3c2ce4..f3c3c4e1ca7f 100644 --- a/arch/x86/kvm/svm/nested.c +++ b/arch/x86/kvm/svm/nested.c @@ -1061,8 +1061,9 @@ static int svm_set_nested_state(struct kvm_vcpu *vcpu, struct vmcb *hsave = svm->nested.hsave; struct vmcb __user *user_vmcb = (struct vmcb __user *) &user_kvm_nested_state->data.svm[0]; - struct vmcb_control_area ctl; - struct vmcb_save_area save; + struct vmcb_control_area *ctl; + struct vmcb_save_area *save; + int ret; u32 cr0; if (kvm_state->format != KVM_STATE_NESTED_FORMAT_SVM) @@ -1096,13 +1097,22 @@ static int svm_set_nested_state(struct kvm_vcpu *vcpu, return -EINVAL; if (kvm_state->size < sizeof(*kvm_state) + KVM_STATE_NESTED_SVM_VMCB_SIZE) return -EINVAL; - if (copy_from_user(&ctl, &user_vmcb->control, sizeof(ctl))) - return -EFAULT; - if (copy_from_user(&save, &user_vmcb->save, sizeof(save))) - return -EFAULT; - if (!nested_vmcb_check_controls(&ctl)) - return -EINVAL; + ret = -ENOMEM; + ctl = kzalloc(sizeof(*ctl), GFP_KERNEL); + save = kzalloc(sizeof(*save), GFP_KERNEL); + if (!ctl || !save) + goto out_free; + + ret = -EFAULT; + if (copy_from_user(ctl, &user_vmcb->control, sizeof(ctl))) + goto out_free; + if (copy_from_user(save, &user_vmcb->save, sizeof(save))) + goto out_free; + + ret = -EINVAL; + if (!nested_vmcb_check_controls(ctl)) + goto out_free; /* * Processor state contains L2 state. Check that it is @@ -1110,15 +1120,15 @@ static int svm_set_nested_state(struct kvm_vcpu *vcpu, */ cr0 = kvm_read_cr0(vcpu); if (((cr0 & X86_CR0_CD) == 0) && (cr0 & X86_CR0_NW)) - return -EINVAL; + goto out_free; /* * Validate host state saved from before VMRUN (see * nested_svm_check_permissions). * TODO: validate reserved bits for all saved state. */ - if (!(save.cr0 & X86_CR0_PG)) - return -EINVAL; + if (!(save->cr0 & X86_CR0_PG)) + goto out_free; /* * All checks done, we can enter guest mode. L1 control fields @@ -1127,15 +1137,21 @@ static int svm_set_nested_state(struct kvm_vcpu *vcpu, * contains saved L1 state. */ copy_vmcb_control_area(&hsave->control, &svm->vmcb->control); - hsave->save = save; + hsave->save = *save; svm->nested.vmcb = kvm_state->hdr.svm.vmcb_pa; - load_nested_vmcb_control(svm, &ctl); + load_nested_vmcb_control(svm, ctl); nested_prepare_vmcb_control(svm); out_set_gif: svm_set_gif(svm, !!(kvm_state->flags & KVM_STATE_NESTED_GIF_SET)); - return 0; + + ret = 0; +out_free: + kfree(save); + kfree(ctl); + + return ret; } struct kvm_x86_nested_ops svm_nested_ops = { -- 2.17.1