From: "Gabriel L. Somlo" <gsomlo@gmail.com>
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
Subject: [Qemu-devel] [v2 PATCH 04/13] SMBIOS: Use bitmaps to check for smbios table collisions
Date: Tue, 11 Mar 2014 11:16:20 -0400 [thread overview]
Message-ID: <1394550989-693-5-git-send-email-somlo@cmu.edu> (raw)
In-Reply-To: <1394550989-693-1-git-send-email-somlo@cmu.edu>
From: "Gabriel L. Somlo" <somlo@cmu.edu>
Replace existing smbios_check_collision() functionality with
a pair of bitmaps: have_binfile_bitmap and have_fields_bitmap.
Bits corresponding to each smbios type are set by smbios_entry_add(),
which also uses the bitmaps to ensure that binary blobs and field
values are never accepted for the same type.
These bitmaps will also be used in the future to decide whether
or not to build a full table for a given smbios type.
Signed-off-by: Gabriel Somlo <somlo@cmu.edu>
---
hw/i386/smbios.c | 51 ++++++++++++++++++++----------------------------
include/hw/i386/smbios.h | 2 ++
2 files changed, 23 insertions(+), 30 deletions(-)
diff --git a/hw/i386/smbios.c b/hw/i386/smbios.c
index f4ee7b4..6889332 100644
--- a/hw/i386/smbios.c
+++ b/hw/i386/smbios.c
@@ -49,11 +49,8 @@ static size_t smbios_entries_len;
static int smbios_type4_count = 0;
static bool smbios_immutable;
-static struct {
- bool seen;
- int headertype;
- Location loc;
-} first_opt[2];
+static DECLARE_BITMAP(have_binfile_bitmap, SMBIOS_MAX_TYPE+1);
+static DECLARE_BITMAP(have_fields_bitmap, SMBIOS_MAX_TYPE+1);
static struct {
const char *vendor, *version, *date;
@@ -164,29 +161,6 @@ static void smbios_validate_table(void)
}
}
-/*
- * To avoid unresolvable overlaps in data, don't allow both
- * tables and fields for the same smbios type.
- */
-static void smbios_check_collision(int type, int entry)
-{
- if (type < ARRAY_SIZE(first_opt)) {
- if (first_opt[type].seen) {
- if (first_opt[type].headertype != entry) {
- error_report("Can't mix file= and type= for same type");
- loc_push_restore(&first_opt[type].loc);
- error_report("This is the conflicting setting");
- loc_pop(&first_opt[type].loc);
- exit(1);
- }
- } else {
- first_opt[type].seen = true;
- first_opt[type].headertype = entry;
- loc_save(&first_opt[type].loc);
- }
- }
-}
-
static void smbios_add_field(int type, int offset, const void *data, size_t len)
{
struct smbios_field *field;
@@ -331,7 +305,14 @@ void smbios_entry_add(QemuOpts *opts)
}
header = (struct smbios_structure_header *)(table->data);
- smbios_check_collision(header->type, SMBIOS_TABLE_ENTRY);
+
+ if (test_bit(header->type, have_fields_bitmap)) {
+ error_report("Can't add binary type %d table! "
+ "(fields already specified)", header->type);
+ exit(1);
+ }
+ set_bit(header->type, have_binfile_bitmap);
+
if (header->type == 4) {
smbios_type4_count++;
}
@@ -346,7 +327,17 @@ void smbios_entry_add(QemuOpts *opts)
if (val) {
unsigned long type = strtoul(val, NULL, 0);
- smbios_check_collision(type, SMBIOS_FIELD_ENTRY);
+ if (type > SMBIOS_MAX_TYPE) {
+ error_report("smbios type (%ld) out of range!", type);
+ exit(1);
+ }
+
+ if (test_bit(type, have_binfile_bitmap)) {
+ error_report("Can't add fields for type %ld table! "
+ "(binary file already loaded)", type);
+ exit(1);
+ }
+ set_bit(type, have_fields_bitmap);
switch (type) {
case 0:
diff --git a/include/hw/i386/smbios.h b/include/hw/i386/smbios.h
index a7ec973..8b63441 100644
--- a/include/hw/i386/smbios.h
+++ b/include/hw/i386/smbios.h
@@ -15,6 +15,8 @@
#include "qemu/option.h"
+#define SMBIOS_MAX_TYPE 127
+
void smbios_entry_add(QemuOpts *opts);
void smbios_set_defaults(const char *manufacturer,
const char *product, const char *version);
--
1.8.1.4
next prev parent reply other threads:[~2014-03-11 15:20 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-10 16:56 [Qemu-devel] SMBIOS (Set of 10 patches) Gabriel L. Somlo
2014-03-10 17:55 ` Eric Blake
2014-03-10 18:17 ` Gabriel L. Somlo
2014-03-10 18:31 ` Gabriel L. Somlo
2014-03-10 19:14 ` Eric Blake
2014-03-10 19:22 ` Eric Blake
2014-03-10 19:31 ` Eric Blake
2014-03-11 10:03 ` Gerd Hoffmann
2014-03-11 13:27 ` Kevin O'Connor
2014-03-12 8:31 ` Gerd Hoffmann
2014-03-11 15:16 ` [Qemu-devel] [v2 PATCH 00/13] SMBIOS: build full tables in QEMU Gabriel L. Somlo
2014-03-11 15:16 ` [Qemu-devel] [v2 PATCH 01/13] SMBIOS: Update all table definitions to smbios spec v2.3 Gabriel L. Somlo
2014-03-11 15:16 ` [Qemu-devel] [v2 PATCH 02/13] SMBIOS: Rename smbios_set_type1_defaults() for more general use Gabriel L. Somlo
2014-03-11 15:16 ` [Qemu-devel] [v2 PATCH 03/13] SMBIOS: Use macro to set smbios defaults Gabriel L. Somlo
2014-03-11 15:16 ` Gabriel L. Somlo [this message]
2014-03-11 15:16 ` [Qemu-devel] [v2 PATCH 05/13] SMBIOS: Add code to build full smbios tables; build type 2 table Gabriel L. Somlo
2014-03-11 16:28 ` [Qemu-devel] [v3 " Gabriel L. Somlo
2014-03-11 15:16 ` [Qemu-devel] [v2 PATCH 06/13] SMBIOS: Build full tables for types 0 and 1 Gabriel L. Somlo
2014-03-11 15:16 ` [Qemu-devel] [v2 PATCH 07/13] SMBIOS: Remove unused code for passing individual fields to bios Gabriel L. Somlo
2014-03-11 15:16 ` [Qemu-devel] [v2 PATCH 08/13] SMBIOS: Build full type 3 table Gabriel L. Somlo
2014-03-11 15:16 ` [Qemu-devel] [v2 PATCH 09/13] SMBIOS: Build full type 4 tables Gabriel L. Somlo
2014-03-11 15:16 ` [Qemu-devel] [v2 PATCH 10/13] SMBIOS: Build full smbios v2.3 compliant type 16 and 17 tables Gabriel L. Somlo
2014-03-11 15:16 ` [Qemu-devel] [v2 PATCH 11/13] SMBIOS: Build full type 19 tables Gabriel L. Somlo
2014-03-12 8:27 ` Gerd Hoffmann
2014-03-12 13:05 ` Gabriel L. Somlo
2014-03-12 13:24 ` Gerd Hoffmann
2014-03-12 14:44 ` Gabriel L. Somlo
2014-03-12 15:51 ` Gerd Hoffmann
2014-03-12 16:45 ` Gabriel L. Somlo
2014-03-12 18:04 ` Gabriel L. Somlo
2014-03-12 18:17 ` Gabriel L. Somlo
2014-03-11 15:16 ` [Qemu-devel] [v2 PATCH 12/13] SMBIOS: Build full type 20 tables Gabriel L. Somlo
2014-03-11 15:16 ` [Qemu-devel] [v2 PATCH 13/13] SMBIOS: Build full tables for type 32 and 127 Gabriel L. Somlo
2014-03-11 15:46 ` [Qemu-devel] [v2 PATCH 00/13] SMBIOS: build full tables in QEMU Kevin O'Connor
2014-03-11 16:58 ` Gabriel L. Somlo
2014-03-12 8:20 ` Gerd Hoffmann
2014-03-12 16:39 ` [Qemu-devel] [v3 " Gabriel L. Somlo
2014-03-12 16:40 ` [Qemu-devel] [v3 PATCH 01/13] SMBIOS: Rename smbios_set_type1_defaults() for more general use Gabriel L. Somlo
2014-03-12 16:40 ` [Qemu-devel] [v3 PATCH 02/13] SMBIOS: Use macro to set smbios defaults Gabriel L. Somlo
2014-03-12 16:40 ` [Qemu-devel] [v3 PATCH 03/13] SMBIOS: Use bitmaps to check for smbios table collisions Gabriel L. Somlo
2014-03-12 16:40 ` [Qemu-devel] [v3 PATCH 04/13] SMBIOS: Add code to build full smbios tables; build type 2 table Gabriel L. Somlo
2014-03-12 16:40 ` [Qemu-devel] [v3 PATCH 05/13] SMBIOS: Build full tables for types 0 and 1 Gabriel L. Somlo
2014-03-12 16:40 ` [Qemu-devel] [v3 PATCH 06/13] SMBIOS: Remove unused code for passing individual fields to bios Gabriel L. Somlo
2014-03-12 16:40 ` [Qemu-devel] [v3 PATCH 07/13] SMBIOS: Build full type 3 table Gabriel L. Somlo
2014-03-12 16:40 ` [Qemu-devel] [v3 PATCH 08/13] SMBIOS: Build full type 4 tables Gabriel L. Somlo
2014-03-12 16:40 ` [Qemu-devel] [v3 PATCH 09/13] SMBIOS: Build full smbios type 16 and 17 tables Gabriel L. Somlo
2014-03-12 16:40 ` [Qemu-devel] [v3 PATCH 10/13] SMBIOS: Build full type 19 tables Gabriel L. Somlo
2014-03-12 16:40 ` [Qemu-devel] [v3 PATCH 11/13] SMBIOS: Build full type 20 tables Gabriel L. Somlo
2014-03-12 16:40 ` [Qemu-devel] [v3 PATCH 12/13] SMBIOS: Build full tables for type 32 and 127 Gabriel L. Somlo
2014-03-12 16:40 ` [Qemu-devel] [v3 PATCH 13/13] SMBIOS: Update all table definitions to smbios spec v2.3 Gabriel L. Somlo
2014-03-12 16:48 ` [Qemu-devel] [v3 PATCH 00/13] SMBIOS: build full tables in QEMU Eric Blake
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1394550989-693-5-git-send-email-somlo@cmu.edu \
--to=gsomlo@gmail.com \
--cc=agraf@suse.de \
--cc=alex.williamson@redhat.com \
--cc=armbru@redhat.com \
--cc=kevin@koconnor.net \
--cc=kraxel@redhat.com \
--cc=lersek@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).