From mboxrd@z Thu Jan 1 00:00:00 1970 From: Nick Desaulniers Subject: [PATCH] KVM: x86: dynamically allocate large struct in em_fxrstor Date: Tue, 23 May 2017 23:24:33 -0700 Message-ID: <20170524062433.20680-1-nick.desaulniers@gmail.com> Cc: Nick Desaulniers , Paolo Bonzini , =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= , Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , x86@kernel.org, kvm@vger.kernel.org, linux-kernel@vger.kernel.org To: unlisted-recipients:; (no To-header on input) Return-path: Received: from mail-pg0-f66.google.com ([74.125.83.66]:36564 "EHLO mail-pg0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1761383AbdEXG1Q (ORCPT ); Wed, 24 May 2017 02:27:16 -0400 Sender: kvm-owner@vger.kernel.org List-ID: Fixes the warning: arch/x86/kvm/emulate.c:4018:12: warning: stack frame size of 1080 bytes in function 'em_fxrstor' [-Wframe-larger-than=] static int em_fxrstor(struct x86_emulate_ctxt *ctxt) ^ Found with CONFIG_FRAME_WARN set to 1024. Signed-off-by: Nick Desaulniers --- arch/x86/kvm/emulate.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 0816ab2e8adc..1d7c9ceeff56 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c @@ -4017,30 +4017,38 @@ static int fxrstor_fixup(struct x86_emulate_ctxt *ctxt, static int em_fxrstor(struct x86_emulate_ctxt *ctxt) { - struct fxregs_state fx_state; + struct fxregs_state *fx_state; int rc; rc = check_fxsr(ctxt); if (rc != X86EMUL_CONTINUE) return rc; - rc = segmented_read_std(ctxt, ctxt->memop.addr.mem, &fx_state, 512); + fx_state = kmalloc(sizeof(*fx_state), GFP_KERNEL); + if (!fx_state) + return -ENOMEM; + + rc = segmented_read_std(ctxt, ctxt->memop.addr.mem, fx_state, 512); if (rc != X86EMUL_CONTINUE) - return rc; + goto out; - if (fx_state.mxcsr >> 16) - return emulate_gp(ctxt, 0); + if (fx_state->mxcsr >> 16) { + rc = emulate_gp(ctxt, 0); + goto out; + } ctxt->ops->get_fpu(ctxt); if (ctxt->mode < X86EMUL_MODE_PROT64) - rc = fxrstor_fixup(ctxt, &fx_state); + rc = fxrstor_fixup(ctxt, fx_state); if (rc == X86EMUL_CONTINUE) - rc = asm_safe("fxrstor %[fx]", : [fx] "m"(fx_state)); + rc = asm_safe("fxrstor %[fx]", : [fx] "m"(*fx_state)); ctxt->ops->put_fpu(ctxt); +out: + kfree(fx_state); return rc; } -- 2.11.0