From nobody Thu May 2 07:10:35 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 80.81.252.135 is neither permitted nor denied by domain of seabios.org) client-ip=80.81.252.135; envelope-from=seabios-bounces@seabios.org; helo=mail.coreboot.org; Authentication-Results: mx.zoho.com; dkim=fail spf=none (zoho.com: 80.81.252.135 is neither permitted nor denied by domain of seabios.org) smtp.mailfrom=seabios-bounces@seabios.org; Return-Path: Received: from mail.coreboot.org (mail.coreboot.org [80.81.252.135]) by mx.zohomail.com with SMTPS id 1490738557483784.6887513761909; Tue, 28 Mar 2017 15:02:37 -0700 (PDT) Received: from [127.0.0.1] (helo=ra.coresystems.de) by mail.coreboot.org with esmtp (Exim 4.86_2) (envelope-from ) id 1cszC1-0003WT-I3; Wed, 29 Mar 2017 00:02:21 +0200 Received: from mxs1.seznam.cz ([77.75.78.125]) by mail.coreboot.org with esmtps (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.86_2) (envelope-from ) id 1cszBr-0002Qx-Pj for seabios@seabios.org; Wed, 29 Mar 2017 00:02:19 +0200 Received: from email.seznam.cz by email-smtpc2b.ko.seznam.cz (email-smtpc2b.ko.seznam.cz [10.53.13.45]) id 07917316d7eccecb032f3e59; Wed, 29 Mar 2017 00:02:09 +0200 (CEST) Received: from darkstar.example.net (host-94-78-181-79.dynamic.mm.pl [94.78.181.79]) by email-relay30.ko.seznam.cz (Seznam SMTPD 1.3.60) with ESMTP; Wed, 29 Mar 2017 00:02:08 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=email.cz; s=beta; t=1490738529; bh=Xu63CFreSRa/9Lb5A7Y7D7GotC/TGK6YDtA47OgjwLo=; h=DKIM-Signature:Received:From:To:Cc:Subject:Date:Message-Id: X-Mailer; b=fVfYmrEa2A88VTB4TIfHTql9E7qAYk/27S5TBxXNSafALdsHekrMuEb4I8C6YtgTU +w0RfyJaxViZzd1eF9T+njnO47CA68/R491kG8I1UZunOoMHxCMR4f/LK1eTCZDawJ 7VWeQ//sJ04s1bqQHtLmnlu0R1psCDdfqK8gVAtg= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=email.cz; s=beta; t=1490738529; bh=Xu63CFreSRa/9Lb5A7Y7D7GotC/TGK6YDtA47OgjwLo=; h=Received:From:To:Cc:Subject:Date:Message-Id:X-Mailer; b=jEcMPE/MwUvWJSamtlaJNOZnRtagKt4mxqhkHVrfG3IrugHuexSo+8rWKSMUKSqxo LZWN2mL4Dc8Z+7hzLwXvTJgzbEBh3Ah9mMkUGcYECinRII95WX/QXslk5EBcKa1XE2 bU3IMe6QEuvOH9Ed/1ca91vQxwVZPvypGtTLz5ZM= From: Petr Berky To: seabios@seabios.org Date: Tue, 28 Mar 2017 23:03:53 +0200 Message-Id: <20170328210353.18586-1-petr.berky@email.cz> X-Mailer: git-send-email 2.11.0 X-Spam-Score: -0.4 (/) Subject: [SeaBIOS] [PATCH v3] config: Add function to check if fw_cfg exists X-BeenThere: seabios@seabios.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: SeaBIOS mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: seabios-bounces@seabios.org Sender: "SeaBIOS" X-Duff: Orig. Duff, Duff Lite, Duff Dry, Duff Dark, Raspberry Duff, Lady Duff, Red Duff, Tartar Control Duff X-ZohoMail-DKIM: fail (found 2 invalid signatures) X-ZohoMail: RDKM_2 RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" It was found qemu_get_present_cpus_count may return impossible number of cpus because of not checking if fw_cfg exists before using it. That may lead to undefined behavior of emulator, in particular Bochs that freezes. Signed-off-by: Petr Berky Reviewed-by: Laszlo Ersek --- src/fw/paravirt.c | 12 +++++++++++- src/fw/paravirt.h | 1 + 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/fw/paravirt.c b/src/fw/paravirt.c index 707502d..5b23d78 100644 --- a/src/fw/paravirt.c +++ b/src/fw/paravirt.c @@ -32,9 +32,16 @@ u32 RamSize; u64 RamSizeOver4G; // Type of emulator platform. int PlatformRunningOn VARFSEG; +// cfg enabled +int cfg_enabled =3D 0; // cfg_dma enabled int cfg_dma_enabled =3D 0; =20 +inline int qemu_cfg_enabled(void) +{ + return cfg_enabled; +} + inline int qemu_cfg_dma_enabled(void) { return cfg_dma_enabled; @@ -392,7 +399,9 @@ u16 qemu_get_present_cpus_count(void) { u16 smp_count =3D 0; - qemu_cfg_read_entry(&smp_count, QEMU_CFG_NB_CPUS, sizeof(smp_count)); + if (qemu_cfg_enabled()) { + qemu_cfg_read_entry(&smp_count, QEMU_CFG_NB_CPUS, sizeof(smp_count= )); + } u16 cmos_cpu_count =3D rtc_read(CMOS_BIOS_SMP_COUNT) + 1; if (smp_count < cmos_cpu_count) { smp_count =3D cmos_cpu_count; @@ -571,6 +580,7 @@ void qemu_cfg_init(void) return; =20 dprintf(1, "Found QEMU fw_cfg\n"); + cfg_enabled =3D 1; =20 // Detect DMA interface. u32 id; diff --git a/src/fw/paravirt.h b/src/fw/paravirt.h index 16f3d9a..a14d83e 100644 --- a/src/fw/paravirt.h +++ b/src/fw/paravirt.h @@ -49,6 +49,7 @@ static inline int runningOnKVM(void) { // QEMU_CFG_DMA ID bit #define QEMU_CFG_VERSION_DMA 2 =20 +int qemu_cfg_enabled(void); int qemu_cfg_dma_enabled(void); void qemu_preinit(void); void qemu_platform_setup(void); --=20 2.11.0 _______________________________________________ SeaBIOS mailing list SeaBIOS@seabios.org https://www.coreboot.org/mailman/listinfo/seabios