qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] Re: [kvm-devel] [PATCH 1 of 3] export SMBIOS/DMI tables to


From: Ryan Harper
Subject: [Qemu-devel] Re: [kvm-devel] [PATCH 1 of 3] export SMBIOS/DMI tables to PC machines
Date: Fri, 7 Dec 2007 14:52:50 -0600
User-agent: Mutt/1.5.6+20040907i

* Anthony Liguori <address@hidden> [2007-12-07 14:49]:
> Ryan Harper wrote:
> >5 files changed, 754 insertions(+), 2 deletions(-)
> >Makefile.target |    4 
> >hw/pc.c         |   47 ++++
> >smbios.c        |  519 
> >+++++++++++++++++++++++++++++++++++++++++++++++++++++++
> >smbios_types.h  |  182 +++++++++++++++++++
> >sysemu.h        |    4 
> >
> >
> ># HG changeset patch
> ># User Ryan Harper <address@hidden>
> ># Date 1197058922 21600
> ># Node ID 37bf559ffcf74bfe62ec038c5818e4cf29b817f5
> ># Parent  25082b761acbe8b7fa535dedb4a53e02ef74128d
> >export SMBIOS/DMI tables to PC machines.
> >
> >This patch introduces code to generate PC SMBIOS/DMI tables and load them
> >into machine memory.  The resultant machine can use standard tools like
> >dmidecode to examine the in-memory generated table.
> >
> >Signed-off-by: Ryan Harper <address@hidden>
> >
> >diff -r 25082b761acb -r 37bf559ffcf7 Makefile.target
> >--- a/Makefile.target        Wed Dec 05 03:23:38 2007 +0000
> >+++ b/Makefile.target        Fri Dec 07 14:22:02 2007 -0600
> >@@ -396,7 +396,7 @@ endif
> > endif
> > 
> > # must use static linking to avoid leaving stuff in virtual address space
> >-VL_OBJS=vl.o osdep.o monitor.o pci.o loader.o isa_mmio.o
> >+VL_OBJS=vl.o osdep.o monitor.o pci.o loader.o isa_mmio.o smbios.o
> >  
> 
> smbios is x86 specific so you should move this down to one of the ifeq 
> ($(TARGET_BASE_ARCH), i386) guards.
> 

OK

> > # XXX: suppress QEMU_TOOL tests
> > VL_OBJS+=block-raw.o
> > 
> >@@ -535,7 +535,7 @@ ifndef CONFIG_DARWIN
> > ifndef CONFIG_DARWIN
> > ifndef CONFIG_WIN32
> > ifndef CONFIG_SOLARIS
> >-VL_LIBS+=-lutil
> >+VL_LIBS+=-lutil -luuid
> > endif
> > endif
> > endif
> >diff -r 25082b761acb -r 37bf559ffcf7 hw/pc.c
> >--- a/hw/pc.c        Wed Dec 05 03:23:38 2007 +0000
> >+++ b/hw/pc.c        Fri Dec 07 14:22:02 2007 -0600
> >@@ -44,6 +44,13 @@
> > 
> > #define MAX_IDE_BUS 2
> > 
> >+/* Hole in BIOS space between 0xF0000 and 0xFFF0 for DMI entry point */
> >+#define SMBIOS_ENTRY         0x000fac00
> >+
> >+/* ensure SMBIOS tables have enough room to support MAX_CPUS number of
> >+ * processor entries */
> >+#define SMBIOS_EXTRA         (5 << 12)
> >+
> > static fdctrl_t *floppy_controller;
> > static RTCState *rtc_state;
> > static PITState *pit;
> >@@ -832,6 +839,46 @@ static void pc_init1(int ram_size, int v
> >         }
> >     }
> > 
> >+    {
> >+        ram_addr_t smbios_offset, entrypoint_offset, smbios_base;
> >+        uint32_t smbios_phys;
> >+        int smbios_size
> >  
> 
> It's better to not have these open segments in the middle of functions.  
> You can either move the variable declarations to the top of the function 
> or split out into a separate function.

Easy enough, I'll adjust.

> >+        /* phys_ram_base + bios_offset implies 0xe0000 in guest ram */
> >+        smbios_base = (ram_addr_t)phys_ram_base + bios_offset;
> >+
> >+        /* take a guess at smbios size */
> >+        smbios_size = (SMBIOS_EXTRA-1) & ~4095;
> >+
> >+        /* we only have 32k of space between rombios32 and rombios16 */
> >+        if (smbios_size > SMBIOS_MAXIMUM_SIZE) {
> >+          fprintf(stderr, "qemu: SMBIOS image size too big (%u), max 
> >%u\n",
> >+                  smbios_size, SMBIOS_MAXIMUM_SIZE);
> >+          exit(1);
> >+        }
> >+
> >+        /* smbios is composed of two regions, an entry point table and
> >+        * a second table of all of the data.  These regions will live
> >+        * at different phyiscal addresses so we need to reserve space
> >+        * for two locations
> >+        * NB: Entry point is a fixed size (0x1f)
> >+        */
> >+
> >+        /* use the hole between end of rombios32 and start of 
> >+         * rombios16 @ 0xf0000 */
> >+        smbios_phys = 0xf0000 - smbios_size;
> >+        smbios_offset = (ram_addr_t)(smbios_phys - 0xe0000);
> >+        entrypoint_offset = (ram_addr_t)(SMBIOS_ENTRY - 0xe0000);
> >+
> >+        ret = load_smbios_tables((uint8_t *)smbios_base + 
> >entrypoint_offset,
> >+                                 (uint8_t *)smbios_base + smbios_offset,
> >+                                 smbios_phys);
> >+        if (ret < 0) {
> >+           fprintf(stderr, "qemu: could not generate SMBIOS\n");
> >+           exit(1);
> >+        }
> >+    }
> >+
> >     /* map all the bios at the top of memory */
> >     cpu_register_physical_memory((uint32_t)(-bios_size),
> >                                  bios_size, bios_offset | IO_MEM_ROM);
> >diff -r 25082b761acb -r 37bf559ffcf7 smbios.c
> >--- /dev/null        Thu Jan 01 00:00:00 1970 +0000
> >+++ b/smbios.c       Fri Dec 07 14:22:02 2007 -0600
> >@@ -0,0 +1,519 @@
> >+/*
> >+ * smbios.c - Generate SMBIOS tables for Xen HVM domU's.
> >+ *          - Adapted for QEMU/KVM
> >+ *
> >+ * This program is free software; you can redistribute it and/or modify
> >+ * it under the terms of the GNU General Public License as published by
> >+ * the Free Software Foundation; either version 2 of the License, or
> >+ * (at your option) any later version.
> >+ *
> >+ * This program is distributed in the hope that it will be useful,
> >+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
> >+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> >+ * GNU General Public License for more details.
> >+ *
> >+ * You should have received a copy of the GNU General Public License
> >+ * along with this program; if not, write to the Free Software
> >+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 
> >USA.
> >+ *
> >+ * Copyright (C) IBM Corporation, 2006, 2007
> >+ *
> >+ * Authors: Andrew D. Ball <address@hidden>
> >+ *          Ryan Harper <address@hidden>
> >+ */
> >+
> >+#include <stdio.h>
> >+#include <stdint.h>
> >+#include <string.h>
> >+#include <uuid/uuid.h>
> >+#include "hw/hw.h"
> >+#include "sysemu.h"
> >+#include "smbios_types.h"
> >+#include "config-host.h"
> >+
> >+CPUState *first_cpu;
> >  
> 
> This should probably be static.

doh, should be extern actually since it's defined elsewhere.

-- 
Ryan Harper
Software Engineer; Linux Technology Center
IBM Corp., Austin, Tx
(512) 838-9253   T/L: 678-9253
address@hidden




reply via email to

[Prev in Thread] Current Thread [Next in Thread]