From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54412) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WNmFv-0003HG-4A for qemu-devel@nongnu.org; Wed, 12 Mar 2014 12:43:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WNmFo-0008UL-EO for qemu-devel@nongnu.org; Wed, 12 Mar 2014 12:43:47 -0400 Received: from mail-qc0-x22c.google.com ([2607:f8b0:400d:c01::22c]:56612) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WNmFo-0008U3-9L for qemu-devel@nongnu.org; Wed, 12 Mar 2014 12:43:40 -0400 Received: by mail-qc0-f172.google.com with SMTP id i8so11574642qcq.17 for ; Wed, 12 Mar 2014 09:43:39 -0700 (PDT) From: "Gabriel L. Somlo" Date: Wed, 12 Mar 2014 12:40:09 -0400 Message-Id: <1394642412-29317-11-git-send-email-somlo@cmu.edu> In-Reply-To: <1394642412-29317-1-git-send-email-somlo@cmu.edu> References: <1394612454.17393.16.camel@nilsson.home.kraxel.org> <1394642412-29317-1-git-send-email-somlo@cmu.edu> Subject: [Qemu-devel] [v3 PATCH 10/13] SMBIOS: Build full type 19 tables List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: agraf@suse.de, gsomlo@gmail.com, armbru@redhat.com, alex.williamson@redhat.com, kevin@koconnor.net, kraxel@redhat.com, lersek@redhat.com From: "Gabriel L. Somlo" Build full smbios type 19 (memory array mapped address) tables, and make them available via fw_cfg Signed-off-by: Gabriel Somlo --- hw/i386/pc_piix.c | 3 ++- hw/i386/pc_q35.c | 3 ++- hw/i386/smbios.c | 27 ++++++++++++++++++++++++++- include/hw/i386/smbios.h | 4 +++- 4 files changed, 33 insertions(+), 4 deletions(-) diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c index ef2d062..5950d7f 100644 --- a/hw/i386/pc_piix.c +++ b/hw/i386/pc_piix.c @@ -146,7 +146,8 @@ static void pc_init1(QEMUMachineInitArgs *args, if (smbios_defaults) { /* These values are guest ABI, do not change */ smbios_set_defaults("QEMU", "Standard PC (i440FX + PIIX, 1996)", - args->machine->name); + args->machine->name, + below_4g_mem_size, above_4g_mem_size); } /* allocate ram and load rom/bios */ diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c index dfcc252..482f466 100644 --- a/hw/i386/pc_q35.c +++ b/hw/i386/pc_q35.c @@ -133,7 +133,8 @@ static void pc_q35_init(QEMUMachineInitArgs *args) if (smbios_defaults) { /* These values are guest ABI, do not change */ smbios_set_defaults("QEMU", "Standard PC (Q35 + ICH9, 2009)", - args->machine->name); + args->machine->name, + below_4g_mem_size, above_4g_mem_size); } /* allocate ram and load rom/bios */ diff --git a/hw/i386/smbios.c b/hw/i386/smbios.c index 58bef22..2560e17 100644 --- a/hw/i386/smbios.c +++ b/hw/i386/smbios.c @@ -43,6 +43,7 @@ static int smbios_type4_count = 0; static bool smbios_immutable; static bool smbios_have_defaults; static uint32_t smbios_cpuid_version, smbios_cpuid_features; /* for type 4 */ +static ram_addr_t smbios_below_4g_ram, smbios_above_4g_ram; /* for type 19 */ static DECLARE_BITMAP(have_binfile_bitmap, SMBIOS_MAX_TYPE+1); static DECLARE_BITMAP(have_fields_bitmap, SMBIOS_MAX_TYPE+1); @@ -544,6 +545,19 @@ static void smbios_build_type_17_table(unsigned instance, unsigned size_mb) SMBIOS_BUILD_TABLE_POST; } +static void smbios_build_type_19_table(unsigned instance, + unsigned start_kb, unsigned size_kb) +{ + SMBIOS_BUILD_TABLE_PRE(19, 0x1300 + instance, true); /* required */ + + t->starting_address = start_kb; + t->ending_address = start_kb + size_kb - 1; + t->memory_array_handle = 0x1000; /* Type 16 (Phys. Mem. Array) */ + t->partition_width = 1; /* hardcoded in SeaBIOS */ + + SMBIOS_BUILD_TABLE_POST; +} + #define SMBIOS_SET_DEFAULT(field, value) \ if (!field) { \ field = value; \ @@ -556,10 +570,17 @@ void smbios_set_cpuid(uint32_t version, uint32_t features) } void smbios_set_defaults(const char *manufacturer, - const char *product, const char *version) + const char *product, const char *version, + ram_addr_t below_4g_mem_size, + ram_addr_t above_4g_mem_size) { const char *manufacturer_compat = "Bochs"; /* SeaBIOS compatibility */ smbios_have_defaults = true; + + assert(ram_size == below_4g_mem_size + above_4g_mem_size); + smbios_below_4g_ram = below_4g_mem_size; + smbios_above_4g_ram = above_4g_mem_size; + SMBIOS_SET_DEFAULT(type0.vendor, manufacturer); SMBIOS_SET_DEFAULT(type0.version, version); SMBIOS_SET_DEFAULT(type0.date, "01/01/2014"); @@ -603,6 +624,10 @@ uint8_t *smbios_get_table(size_t *length) ((ram_size_mb - 1) & 0x3FFF) + 1 : 0x4000; smbios_build_type_17_table(i, size_mb); } + smbios_build_type_19_table(0, 0, smbios_below_4g_ram >> 10); + if (smbios_above_4g_ram) { + smbios_build_type_19_table(1, 4 << 20, smbios_above_4g_ram >> 10); + } smbios_validate_table(); smbios_immutable = true; } diff --git a/include/hw/i386/smbios.h b/include/hw/i386/smbios.h index af5ee01..a9e8411 100644 --- a/include/hw/i386/smbios.h +++ b/include/hw/i386/smbios.h @@ -20,7 +20,9 @@ void smbios_entry_add(QemuOpts *opts); void smbios_set_cpuid(uint32_t version, uint32_t features); void smbios_set_defaults(const char *manufacturer, - const char *product, const char *version); + const char *product, const char *version, + ram_addr_t below_4g_mem_size, + ram_addr_t above_4g_mem_size); uint8_t *smbios_get_table(size_t *length); /* -- 1.8.1.4