From: armbru@redhat.com
To: qemu-devel@nongnu.org
Cc: lersek@redhat.com, aliguori@us.ibm.com, ehabkost@redhat.com
Subject: [Qemu-devel] [PATCH v2 3/7] smbios: Improve diagnostics for conflicting entries
Date: Fri, 16 Aug 2013 15:18:30 +0200 [thread overview]
Message-ID: <1376659114-6630-4-git-send-email-armbru@redhat.com> (raw)
In-Reply-To: <1376659114-6630-1-git-send-email-armbru@redhat.com>
From: Markus Armbruster <armbru@redhat.com>
We allow either tables or fields for the same type. Makes sense,
because SeaBIOS uses fields only when no tables are present.
We do this by searching the SMBIOS blob for a previously added table
or field. Error messages look like this:
qemu-system-x86_64: -smbios type=1,serial=42: SMBIOS type 1 table already defined, cannot add field
User needs to know that "table" is defined by -smbios file=..., and
"field" by -smbios type=...
Instead of searching the blob, record additions of interest, and check
that. Simpler, and makes better error messages possible:
qemu-system-x86_64: -smbios file=smbios_type_1.bin: Can't mix file= and type= for same type
qemu-system-x86_64: -smbios type=1,serial=42,serial=99: This is the conflicting setting
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
hw/i386/smbios.c | 43 +++++++++++++++++--------------------------
1 file changed, 17 insertions(+), 26 deletions(-)
diff --git a/hw/i386/smbios.c b/hw/i386/smbios.c
index a113f8b..7908c47 100644
--- a/hw/i386/smbios.c
+++ b/hw/i386/smbios.c
@@ -48,6 +48,12 @@ static uint8_t *smbios_entries;
static size_t smbios_entries_len;
static int smbios_type4_count = 0;
+static struct {
+ bool seen;
+ int headertype;
+ Location loc;
+} first_opt[2];
+
static QemuOptsList qemu_smbios_opts = {
.name = "smbios",
.head = QTAILQ_HEAD_INITIALIZER(qemu_smbios_opts.head),
@@ -159,35 +165,20 @@ uint8_t *smbios_get_table(size_t *length)
*/
static void smbios_check_collision(int type, int entry)
{
- uint16_t *num_entries = (uint16_t *)smbios_entries;
- struct smbios_header *header;
- char *p;
- int i;
-
- if (!num_entries)
- return;
-
- p = (char *)(num_entries + 1);
-
- for (i = 0; i < *num_entries; i++) {
- header = (struct smbios_header *)p;
- if (entry == SMBIOS_TABLE_ENTRY && header->type == SMBIOS_FIELD_ENTRY) {
- struct smbios_field *field = (void *)header;
- if (type == field->type) {
- error_report("SMBIOS type %d field already defined, "
- "cannot add table", type);
- exit(1);
- }
- } else if (entry == SMBIOS_FIELD_ENTRY &&
- header->type == SMBIOS_TABLE_ENTRY) {
- struct smbios_structure_header *table = (void *)(header + 1);
- if (type == table->type) {
- error_report("SMBIOS type %d table already defined, "
- "cannot add field", type);
+ 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);
}
- p += le16_to_cpu(header->length);
}
}
--
1.8.1.4
next prev parent reply other threads:[~2013-08-16 13:18 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-08-16 13:18 [Qemu-devel] [PATCH v2 0/7] smbios cleanup & nicer defaults for type 1 armbru
2013-08-16 13:18 ` [Qemu-devel] [PATCH v2 1/7] smbios: Normalize smbios_entry_add()'s error handling to exit(1) armbru
2013-08-16 13:18 ` [Qemu-devel] [PATCH v2 2/7] smbios: Convert to QemuOpts armbru
2013-09-28 20:47 ` Michael S. Tsirkin
2013-09-30 8:48 ` Markus Armbruster
2013-08-16 13:18 ` armbru [this message]
2013-08-16 13:18 ` [Qemu-devel] [PATCH v2 4/7] smbios: Make multiple -smbios type= accumulate sanely armbru
2013-08-17 12:48 ` Eric Blake
2013-08-16 13:18 ` [Qemu-devel] [PATCH v2 5/7] smbios: Factor out smbios_maybe_add_str() armbru
2013-08-16 13:18 ` [Qemu-devel] [PATCH v2 6/7] vl: Set current_machine early armbru
2013-08-17 13:07 ` Andreas Färber
2013-08-19 9:35 ` Markus Armbruster
2013-08-19 16:37 ` Andreas Färber
2013-08-20 9:09 ` Markus Armbruster
2013-08-16 13:18 ` [Qemu-devel] [PATCH v2 7/7] smbios: Set system manufacturer, product & version by default armbru
2013-08-27 17:04 ` Michael S. Tsirkin
2013-08-27 23:22 ` Eric Blake
2013-08-28 6:05 ` Michael S. Tsirkin
2013-08-17 12:08 ` [Qemu-devel] [PATCH v2 0/7] smbios cleanup & nicer defaults for type 1 Laszlo Ersek
2013-08-17 12:50 ` Eric Blake
2013-09-17 15:27 ` Michael S. Tsirkin
2013-09-18 11:42 ` Markus Armbruster
2013-09-24 6:07 ` Michael S. Tsirkin
2013-09-28 19:41 ` Michael S. Tsirkin
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=1376659114-6630-4-git-send-email-armbru@redhat.com \
--to=armbru@redhat.com \
--cc=aliguori@us.ibm.com \
--cc=ehabkost@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).