From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51593) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1b8rkw-0005oE-Di for qemu-devel@nongnu.org; Fri, 03 Jun 2016 12:15:31 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1b8rks-0007K6-41 for qemu-devel@nongnu.org; Fri, 03 Jun 2016 12:15:29 -0400 Received: from mx1.redhat.com ([209.132.183.28]:39296) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1b8rkr-0007K0-Rc for qemu-devel@nongnu.org; Fri, 03 Jun 2016 12:15:26 -0400 Date: Fri, 3 Jun 2016 19:15:22 +0300 From: "Michael S. Tsirkin" Message-ID: <20160603191237-mutt-send-email-mst@redhat.com> References: <1464111442-10387-1-git-send-email-minyard@acm.org> <1464111442-10387-4-git-send-email-minyard@acm.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1464111442-10387-4-git-send-email-minyard@acm.org> Subject: Re: [Qemu-devel] [PATCH v7 3/6] smbios: Move table build tools into an include file. List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: minyard@acm.org Cc: Igor Mammedov , Paolo Bonzini , qemu-devel@nongnu.org, cminyard@mvista.com On Tue, May 24, 2016 at 12:37:19PM -0500, minyard@acm.org wrote: > From: Corey Minyard > > This will let things in other files (like IPMI) build SMBIOS tables. > > Signed-off-by: Corey Minyard > --- > hw/smbios/smbios.c | 70 ++++--------------------------------------- > hw/smbios/smbios_build.h | 77 ++++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 83 insertions(+), 64 deletions(-) > create mode 100644 hw/smbios/smbios_build.h > > diff --git a/hw/smbios/smbios.c b/hw/smbios/smbios.c > index cb8a111..5dc3e43 100644 > --- a/hw/smbios/smbios.c > +++ b/hw/smbios/smbios.c > @@ -24,6 +24,7 @@ > #include "hw/smbios/smbios.h" > #include "hw/loader.h" > #include "exec/cpu-common.h" > +#include "smbios_build.h" > > /* legacy structures and constants for <= 2.0 machines */ > struct smbios_header { > @@ -53,10 +54,10 @@ static bool smbios_uuid_encoded = true; > /* end: legacy structures & constants for <= 2.0 machines */ > > > -static uint8_t *smbios_tables; > -static size_t smbios_tables_len; > -static unsigned smbios_table_max; > -static unsigned smbios_table_cnt; > +uint8_t *smbios_tables; > +size_t smbios_tables_len; > +unsigned smbios_table_max; > +unsigned smbios_table_cnt; > static SmbiosEntryPointType smbios_ep_type = SMBIOS_ENTRY_POINT_21; > > static SmbiosEntryPoint ep; > @@ -429,7 +430,7 @@ uint8_t *smbios_get_table_legacy(size_t *length) > /* end: legacy setup functions for <= 2.0 machines */ > > > -static bool smbios_skip_table(uint8_t type, bool required_table) > +bool smbios_skip_table(uint8_t type, bool required_table) > { > if (test_bit(type, have_binfile_bitmap)) { > return true; /* user provided their own binary blob(s) */ > @@ -443,65 +444,6 @@ static bool smbios_skip_table(uint8_t type, bool required_table) > return true; > } > > -#define SMBIOS_BUILD_TABLE_PRE(tbl_type, tbl_handle, tbl_required) \ > - struct smbios_type_##tbl_type *t; \ > - size_t t_off; /* table offset into smbios_tables */ \ > - int str_index = 0; \ > - do { \ > - /* should we skip building this table ? */ \ > - if (smbios_skip_table(tbl_type, tbl_required)) { \ > - return; \ > - } \ > - \ > - /* use offset of table t within smbios_tables */ \ > - /* (pointer must be updated after each realloc) */ \ > - t_off = smbios_tables_len; \ > - smbios_tables_len += sizeof(*t); \ > - smbios_tables = g_realloc(smbios_tables, smbios_tables_len); \ > - t = (struct smbios_type_##tbl_type *)(smbios_tables + t_off); \ > - \ > - t->header.type = tbl_type; \ > - t->header.length = sizeof(*t); \ > - t->header.handle = cpu_to_le16(tbl_handle); \ > - } while (0) > - > -#define SMBIOS_TABLE_SET_STR(tbl_type, field, value) \ > - do { \ > - int len = (value != NULL) ? strlen(value) + 1 : 0; \ > - if (len > 1) { \ > - smbios_tables = g_realloc(smbios_tables, \ > - smbios_tables_len + len); \ > - memcpy(smbios_tables + smbios_tables_len, value, len); \ > - smbios_tables_len += len; \ > - /* update pointer post-realloc */ \ > - t = (struct smbios_type_##tbl_type *)(smbios_tables + t_off); \ > - t->field = ++str_index; \ > - } else { \ > - t->field = 0; \ > - } \ > - } while (0) > - > -#define SMBIOS_BUILD_TABLE_POST \ > - do { \ > - size_t term_cnt, t_size; \ > - \ > - /* add '\0' terminator (add two if no strings defined) */ \ > - term_cnt = (str_index == 0) ? 2 : 1; \ > - smbios_tables = g_realloc(smbios_tables, \ > - smbios_tables_len + term_cnt); \ > - memset(smbios_tables + smbios_tables_len, 0, term_cnt); \ > - smbios_tables_len += term_cnt; \ > - \ > - /* update smbios max. element size */ \ > - t_size = smbios_tables_len - t_off; \ > - if (t_size > smbios_table_max) { \ > - smbios_table_max = t_size; \ > - } \ > - \ > - /* update smbios element count */ \ > - smbios_table_cnt++; \ > - } while (0) > - > static void smbios_build_type_0_table(void) > { > SMBIOS_BUILD_TABLE_PRE(0, 0x000, false); /* optional, leave up to BIOS */ > diff --git a/hw/smbios/smbios_build.h b/hw/smbios/smbios_build.h > new file mode 100644 > index 0000000..2257721 > --- /dev/null > +++ b/hw/smbios/smbios_build.h > @@ -0,0 +1,77 @@ > +/* > + * SMBIOS Support > + * > + * Copyright (C) 2009 Hewlett-Packard Development Company, L.P. > + * Copyright (C) 2013 Red Hat, Inc. > + */ Pls add license and author info as well. > + > +#ifndef QEMU_SMBIOS_BUILD_H > +#define QEMU_SMBIOS_BUILD_H > + > +bool smbios_skip_table(uint8_t type, bool required_table); > + > +extern uint8_t *smbios_tables; > +extern size_t smbios_tables_len; > +extern unsigned smbios_table_max; > +extern unsigned smbios_table_cnt; > + > +#define SMBIOS_BUILD_TABLE_PRE(tbl_type, tbl_handle, tbl_required) \ > + struct smbios_type_##tbl_type *t; \ > + size_t t_off; /* table offset into smbios_tables */ \ > + int str_index = 0; \ > + do { \ > + /* should we skip building this table ? */ \ > + if (smbios_skip_table(tbl_type, tbl_required)) { \ > + return; \ > + } \ > + \ > + /* use offset of table t within smbios_tables */ \ > + /* (pointer must be updated after each realloc) */ \ > + t_off = smbios_tables_len; \ > + smbios_tables_len += sizeof(*t); \ > + smbios_tables = g_realloc(smbios_tables, smbios_tables_len); \ > + t = (struct smbios_type_##tbl_type *)(smbios_tables + t_off); \ > + \ > + t->header.type = tbl_type; \ > + t->header.length = sizeof(*t); \ > + t->header.handle = cpu_to_le16(tbl_handle); \ > + } while (0) > + > +#define SMBIOS_TABLE_SET_STR(tbl_type, field, value) \ > + do { \ > + int len = (value != NULL) ? strlen(value) + 1 : 0; \ > + if (len > 1) { \ > + smbios_tables = g_realloc(smbios_tables, \ > + smbios_tables_len + len); \ > + memcpy(smbios_tables + smbios_tables_len, value, len); \ > + smbios_tables_len += len; \ > + /* update pointer post-realloc */ \ > + t = (struct smbios_type_##tbl_type *)(smbios_tables + t_off); \ > + t->field = ++str_index; \ > + } else { \ > + t->field = 0; \ > + } \ > + } while (0) > + > +#define SMBIOS_BUILD_TABLE_POST \ > + do { \ > + size_t term_cnt, t_size; \ > + \ > + /* add '\0' terminator (add two if no strings defined) */ \ > + term_cnt = (str_index == 0) ? 2 : 1; \ > + smbios_tables = g_realloc(smbios_tables, \ > + smbios_tables_len + term_cnt); \ > + memset(smbios_tables + smbios_tables_len, 0, term_cnt); \ > + smbios_tables_len += term_cnt; \ > + \ > + /* update smbios max. element size */ \ > + t_size = smbios_tables_len - t_off; \ > + if (t_size > smbios_table_max) { \ > + smbios_table_max = t_size; \ > + } \ > + \ > + /* update smbios element count */ \ > + smbios_table_cnt++; \ > + } while (0) > + > +#endif /* QEMU_SMBIOS_BUILD_H */ > -- > 2.7.4