From patchwork Fri Dec 12 19:15:45 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Corey Minyard X-Patchwork-Id: 420632 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 619CD14009B for ; Sat, 13 Dec 2014 06:21:21 +1100 (AEDT) Received: from localhost ([::1]:59135 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XzVmB-0006ZH-HZ for incoming@patchwork.ozlabs.org; Fri, 12 Dec 2014 14:21:19 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59209) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XzVkZ-0003oJ-Ag for qemu-devel@nongnu.org; Fri, 12 Dec 2014 14:19:44 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XzVkT-0005cL-WB for qemu-devel@nongnu.org; Fri, 12 Dec 2014 14:19:39 -0500 Received: from mail-yk0-x235.google.com ([2607:f8b0:4002:c07::235]:65283) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XzVkT-0005cH-SK for qemu-devel@nongnu.org; Fri, 12 Dec 2014 14:19:33 -0500 Received: by mail-yk0-f181.google.com with SMTP id 142so3381347ykq.12 for ; Fri, 12 Dec 2014 11:19:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=z0Lnl5n0siFB5xmdCAZyLyNFF+3kdbdoozYEirH1sy8=; b=SLKyVHyR43lrLm2L4nUcj0Uss1O6TZC89VkGTajToCP6TE7E8wXZ+/l7A7IJwv3XCC lx0b73EOp93/RWnI3mWoR685RpLFDYpQ+tCETlPswiF7C7VQDrsgqtXWu6oGbb8jWQJF OhwaiSausFmPKwB2A2JtdCjtn07FMtLC33wKoaSY9qIfEztWLwfQ/ksSU5jbEszw9gUc t/88h5Vp02kZyjZT80Qc31JJDkLXE4C6lpHjeFp+9ed78m0U8UWFzJX5/68gFTaxzIM0 kMXZDuIUp+8W9FGyPc0L1IYtSaEr6Vya4TXEn0XuuerMPlyCmyMxkSFeiySOwASkr9hs 9ouQ== X-Received: by 10.236.20.170 with SMTP id p30mr12962867yhp.93.1418411973518; Fri, 12 Dec 2014 11:19:33 -0800 (PST) Received: from t430.minyard.home (pool-173-57-152-84.dllstx.fios.verizon.net. [173.57.152.84]) by mx.google.com with ESMTPSA id f19sm1174825yhp.50.2014.12.12.11.19.32 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 12 Dec 2014 11:19:32 -0800 (PST) Received: from t430.minyard.home (t430.minyard.home [127.0.0.1]) by t430.minyard.home (8.14.7/8.14.7) with ESMTP id sBCJJL2B020959; Fri, 12 Dec 2014 13:19:21 -0600 Received: (from cminyard@localhost) by t430.minyard.home (8.14.7/8.14.7/Submit) id sBCJJ7gX020945; Fri, 12 Dec 2014 13:19:07 -0600 From: minyard@acm.org To: qemu-devel@nongnu.org Date: Fri, 12 Dec 2014 13:15:45 -0600 Message-Id: <1418411751-3614-11-git-send-email-minyard@acm.org> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1418411751-3614-1-git-send-email-minyard@acm.org> References: <1418411751-3614-1-git-send-email-minyard@acm.org> X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2607:f8b0:4002:c07::235 Cc: Corey Minyard , Corey Minyard Subject: [Qemu-devel] [PATCH 10/16] pc: Postpone adding ACPI and SMBIOS to fw_cfg X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: Corey Minyard Postpone the addition of the ACPI and SMBIOS tables until after device initialization. This allows devices to add entries to these tables. Signed-off-by: Corey Minyard --- hw/i386/pc.c | 58 ++++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 18 deletions(-) diff --git a/hw/i386/pc.c b/hw/i386/pc.c index f31d55e..831d421 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -639,11 +639,45 @@ static unsigned int pc_apic_id_limit(unsigned int max_cpus) return x86_cpu_apic_id_from_index(max_cpus - 1) + 1; } -static FWCfgState *bochs_bios_init(void) +struct pc_bios_post_init { + Notifier post_init; + void *fw_cfg; +}; +static struct pc_bios_post_init post_init; + +/* Add the ACPI and SMBIOS tables after all the hardware has been initialized. + * This gives devices a chance to add to those tables. + */ +static void pc_bios_post_initfn(Notifier *n, void *opaque) { - FWCfgState *fw_cfg; + struct pc_bios_post_init *p = container_of(n, struct pc_bios_post_init, + post_init); uint8_t *smbios_tables, *smbios_anchor; size_t smbios_tables_len, smbios_anchor_len; + FWCfgState *fw_cfg = p->fw_cfg; + + smbios_tables = smbios_get_table_legacy(&smbios_tables_len); + if (smbios_tables) { + fw_cfg_add_bytes(fw_cfg, FW_CFG_SMBIOS_ENTRIES, + smbios_tables, smbios_tables_len); + } + + smbios_get_tables(&smbios_tables, &smbios_tables_len, + &smbios_anchor, &smbios_anchor_len); + if (smbios_anchor) { + fw_cfg_add_file(fw_cfg, "etc/smbios/smbios-tables", + smbios_tables, smbios_tables_len); + fw_cfg_add_file(fw_cfg, "etc/smbios/smbios-anchor", + smbios_anchor, smbios_anchor_len); + } + + fw_cfg_add_bytes(fw_cfg, FW_CFG_ACPI_TABLES, + acpi_tables, acpi_tables_len); +} + +static FWCfgState *bochs_bios_init(void) +{ + FWCfgState *fw_cfg; uint64_t *numa_fw_cfg; int i, j; unsigned int apic_id_limit = pc_apic_id_limit(max_cpus); @@ -666,24 +700,8 @@ static FWCfgState *bochs_bios_init(void) fw_cfg_add_i16(fw_cfg, FW_CFG_MAX_CPUS, (uint16_t)apic_id_limit); fw_cfg_add_i32(fw_cfg, FW_CFG_ID, 1); fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size); - fw_cfg_add_bytes(fw_cfg, FW_CFG_ACPI_TABLES, - acpi_tables, acpi_tables_len); fw_cfg_add_i32(fw_cfg, FW_CFG_IRQ0_OVERRIDE, kvm_allows_irq0_override()); - smbios_tables = smbios_get_table_legacy(&smbios_tables_len); - if (smbios_tables) { - fw_cfg_add_bytes(fw_cfg, FW_CFG_SMBIOS_ENTRIES, - smbios_tables, smbios_tables_len); - } - - smbios_get_tables(&smbios_tables, &smbios_tables_len, - &smbios_anchor, &smbios_anchor_len); - if (smbios_anchor) { - fw_cfg_add_file(fw_cfg, "etc/smbios/smbios-tables", - smbios_tables, smbios_tables_len); - fw_cfg_add_file(fw_cfg, "etc/smbios/smbios-anchor", - smbios_anchor, smbios_anchor_len); - } fw_cfg_add_bytes(fw_cfg, FW_CFG_E820_TABLE, &e820_reserve, sizeof(e820_reserve)); @@ -714,6 +732,10 @@ static FWCfgState *bochs_bios_init(void) (1 + apic_id_limit + nb_numa_nodes) * sizeof(*numa_fw_cfg)); + post_init.fw_cfg = fw_cfg; + post_init.post_init.notify = pc_bios_post_initfn; + qemu_add_machine_init_done_notifier(&post_init.post_init); + return fw_cfg; }