From patchwork Tue Mar 11 15:16:20 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Gabriel L. Somlo" X-Patchwork-Id: 329161 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 256172C00B8 for ; Wed, 12 Mar 2014 03:32:44 +1100 (EST) Received: from localhost ([::1]:55738 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WNOVs-0000Ul-9r for incoming@patchwork.ozlabs.org; Tue, 11 Mar 2014 11:22:40 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40150) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WNOTG-0005XT-EU for qemu-devel@nongnu.org; Tue, 11 Mar 2014 11:20:04 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WNOTA-0007G6-Ol for qemu-devel@nongnu.org; Tue, 11 Mar 2014 11:19:58 -0400 Received: from mail-qa0-x22d.google.com ([2607:f8b0:400d:c00::22d]:59038) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WNOTA-0007Fv-Ib for qemu-devel@nongnu.org; Tue, 11 Mar 2014 11:19:52 -0400 Received: by mail-qa0-f45.google.com with SMTP id hw13so8465896qab.4 for ; Tue, 11 Mar 2014 08:19:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=nTENJlk6l0CnHcuu5N+XIIIhYalhR17OpAx5YOwjYIo=; b=IRqxoad25R8VdPuG3Nc/9TcqGhUekTLYBpwkmjQdZDTLHdNOKFKr5lLUFymdERmqMr ewZXhxuQkMr+AQgAFU4SU+SBlcra5fXdDgdiTVrFOwi9X/GyTLhx+ji95ICBF6uiSWKL ZvEcE2w1GLqEWX/MbgbmNuZ6qvavog8S+1sXDXjy1ZicBxgq35covpyggKnu003UMxya SY3ilUe98UOK0isovSPHpHrGYM9RlhPvnkki+90flDIeny0CfcgvqCFjJDqHNNgZF6GJ Kh/euFBooM5tO/2ksDMk7ZRfiBvL6EuJDks/QpZPsvYRDb0OUN7kY+5egZfuN512qYSM VgaA== X-Received: by 10.140.42.21 with SMTP id b21mr3129127qga.87.1394551192204; Tue, 11 Mar 2014 08:19:52 -0700 (PDT) Received: from ERROL.ini.cmu.edu (ERROL.INI.CMU.EDU. [128.2.16.43]) by mx.google.com with ESMTPSA id m14sm68900013qax.9.2014.03.11.08.19.51 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 11 Mar 2014 08:19:51 -0700 (PDT) From: "Gabriel L. Somlo" To: qemu-devel@nongnu.org Date: Tue, 11 Mar 2014 11:16:20 -0400 Message-Id: <1394550989-693-5-git-send-email-somlo@cmu.edu> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1394550989-693-1-git-send-email-somlo@cmu.edu> References: <1394532186.22422.24.camel@nilsson.home.kraxel.org> <1394550989-693-1-git-send-email-somlo@cmu.edu> X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2607:f8b0:400d:c00::22d 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 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: "Gabriel L. Somlo" 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 --- 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);