Accepting request 585178 from home:bfrogers:branches:Virtualization
Add support for setting OEM strings table (fate#323624) OBS-URL: https://build.opensuse.org/request/show/585178 OBS-URL: https://build.opensuse.org/package/show/Virtualization/qemu?expand=0&rev=398
This commit is contained in:
parent
8b3ea2463f
commit
531647e446
215
0076-smbios-support-setting-OEM-strings-.patch
Normal file
215
0076-smbios-support-setting-OEM-strings-.patch
Normal file
@ -0,0 +1,215 @@
|
||||
From 3eb1915349b247cd88fd050c0caf37070b5e6977 Mon Sep 17 00:00:00 2001
|
||||
From: "Daniel P. Berrange" <berrange@redhat.com>
|
||||
Date: Sat, 28 Oct 2017 21:51:36 +0100
|
||||
Subject: [PATCH] smbios: support setting OEM strings table
|
||||
|
||||
The cloud-init program currently allows fetching of its data by repurposing of
|
||||
the 'system' type 'serial' field. This is a clear abuse of the serial field that
|
||||
would clash with other valid usage a virt management app might have for that
|
||||
field.
|
||||
|
||||
Fortunately the SMBIOS defines an "OEM Strings" table whose puporse is to allow
|
||||
exposing of arbitrary vendor specific strings to the operating system. This is
|
||||
perfect for use with cloud-init, or as a way to pass arguments to OS installers
|
||||
such as anaconda.
|
||||
|
||||
This patch makes it easier to support this with QEMU. e.g.
|
||||
|
||||
$QEMU -smbios type=11,value=Hello,value=World,value=Tricky,,value=test
|
||||
|
||||
Which results in the guest seeing dmidecode data
|
||||
|
||||
Handle 0x0E00, DMI type 11, 5 bytes
|
||||
OEM Strings
|
||||
String 1: Hello
|
||||
String 2: World
|
||||
String 3: Tricky,value=test
|
||||
|
||||
It is suggested that any app wanting to make use of this OEM strings capability
|
||||
for accepting data from the host mgmt layer should use its name as a string
|
||||
prefix. e.g. to expose OEM strings targetting both cloud init and anaconda in
|
||||
parallel the mgmt app could set
|
||||
|
||||
$QEMU -smbios type=11,value=cloud-init:ds=nocloud-net;s=http://10.10.0.1:8000/,\
|
||||
value=anaconda:method=http://dl.fedoraproject.org/pub/fedora/linux/releases/25/x86_64/os
|
||||
|
||||
which would appear as
|
||||
|
||||
Handle 0x0E00, DMI type 11, 5 bytes
|
||||
OEM Strings
|
||||
String 1: cloud-init:ds=nocloud-net;s=http://10.10.0.1:8000/
|
||||
String 2: anaconda:method=http://dl.fedoraproject.org/pub/fedora/linux/releases/25/x86_64/os
|
||||
|
||||
Use of such string prefixes means the app won't have to care which string slot
|
||||
its data appears in.
|
||||
|
||||
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
(cherry picked from commit 2d6dcbf93fb01b4a7f45a93d276d4d74b16392dd)
|
||||
[BR: FATE#323624]
|
||||
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||||
---
|
||||
hw/smbios/smbios.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++
|
||||
hw/smbios/smbios_build.h | 12 ++++++++
|
||||
include/hw/smbios/smbios.h | 6 ++++
|
||||
3 files changed, 90 insertions(+)
|
||||
|
||||
diff --git a/hw/smbios/smbios.c b/hw/smbios/smbios.c
|
||||
index 1a5437a07d..5d11f01874 100644
|
||||
--- a/hw/smbios/smbios.c
|
||||
+++ b/hw/smbios/smbios.c
|
||||
@@ -95,6 +95,11 @@ static struct {
|
||||
const char *sock_pfx, *manufacturer, *version, *serial, *asset, *part;
|
||||
} type4;
|
||||
|
||||
+static struct {
|
||||
+ size_t nvalues;
|
||||
+ const char **values;
|
||||
+} type11;
|
||||
+
|
||||
static struct {
|
||||
const char *loc_pfx, *bank, *manufacturer, *serial, *asset, *part;
|
||||
uint16_t speed;
|
||||
@@ -282,6 +287,14 @@ static const QemuOptDesc qemu_smbios_type4_opts[] = {
|
||||
{ /* end of list */ }
|
||||
};
|
||||
|
||||
+static const QemuOptDesc qemu_smbios_type11_opts[] = {
|
||||
+ {
|
||||
+ .name = "value",
|
||||
+ .type = QEMU_OPT_STRING,
|
||||
+ .help = "OEM string data",
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
static const QemuOptDesc qemu_smbios_type17_opts[] = {
|
||||
{
|
||||
.name = "type",
|
||||
@@ -590,6 +603,27 @@ static void smbios_build_type_4_table(unsigned instance)
|
||||
smbios_type4_count++;
|
||||
}
|
||||
|
||||
+static void smbios_build_type_11_table(void)
|
||||
+{
|
||||
+ char count_str[128];
|
||||
+ size_t i;
|
||||
+
|
||||
+ if (type11.nvalues == 0) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ SMBIOS_BUILD_TABLE_PRE(11, 0xe00, true); /* required */
|
||||
+
|
||||
+ snprintf(count_str, sizeof(count_str), "%zu", type11.nvalues);
|
||||
+ t->count = type11.nvalues;
|
||||
+
|
||||
+ for (i = 0; i < type11.nvalues; i++) {
|
||||
+ SMBIOS_TABLE_SET_STR_LIST(11, type11.values[i]);
|
||||
+ }
|
||||
+
|
||||
+ SMBIOS_BUILD_TABLE_POST;
|
||||
+}
|
||||
+
|
||||
#define ONE_KB ((ram_addr_t)1 << 10)
|
||||
#define ONE_MB ((ram_addr_t)1 << 20)
|
||||
#define ONE_GB ((ram_addr_t)1 << 30)
|
||||
@@ -832,6 +866,8 @@ void smbios_get_tables(const struct smbios_phys_mem_area *mem_array,
|
||||
smbios_build_type_4_table(i);
|
||||
}
|
||||
|
||||
+ smbios_build_type_11_table();
|
||||
+
|
||||
#define MAX_DIMM_SZ (16ll * ONE_GB)
|
||||
#define GET_DIMM_SZ ((i < dimm_cnt - 1) ? MAX_DIMM_SZ \
|
||||
: ((ram_size - 1) % MAX_DIMM_SZ) + 1)
|
||||
@@ -882,6 +918,38 @@ static void save_opt(const char **dest, QemuOpts *opts, const char *name)
|
||||
}
|
||||
}
|
||||
|
||||
+
|
||||
+struct opt_list {
|
||||
+ const char *name;
|
||||
+ size_t *ndest;
|
||||
+ const char ***dest;
|
||||
+};
|
||||
+
|
||||
+static int save_opt_one(void *opaque,
|
||||
+ const char *name, const char *value,
|
||||
+ Error **errp)
|
||||
+{
|
||||
+ struct opt_list *opt = opaque;
|
||||
+
|
||||
+ if (!g_str_equal(name, opt->name)) {
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ *opt->dest = g_renew(const char *, *opt->dest, (*opt->ndest) + 1);
|
||||
+ (*opt->dest)[*opt->ndest] = value;
|
||||
+ (*opt->ndest)++;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void save_opt_list(size_t *ndest, const char ***dest,
|
||||
+ QemuOpts *opts, const char *name)
|
||||
+{
|
||||
+ struct opt_list opt = {
|
||||
+ name, ndest, dest,
|
||||
+ };
|
||||
+ qemu_opt_foreach(opts, save_opt_one, &opt, NULL);
|
||||
+}
|
||||
+
|
||||
void smbios_entry_add(QemuOpts *opts, Error **errp)
|
||||
{
|
||||
const char *val;
|
||||
@@ -1035,6 +1103,10 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
|
||||
save_opt(&type4.asset, opts, "asset");
|
||||
save_opt(&type4.part, opts, "part");
|
||||
return;
|
||||
+ case 11:
|
||||
+ qemu_opts_validate(opts, qemu_smbios_type11_opts, &error_fatal);
|
||||
+ save_opt_list(&type11.nvalues, &type11.values, opts, "value");
|
||||
+ return;
|
||||
case 17:
|
||||
qemu_opts_validate(opts, qemu_smbios_type17_opts, &error_fatal);
|
||||
save_opt(&type17.loc_pfx, opts, "loc_pfx");
|
||||
diff --git a/hw/smbios/smbios_build.h b/hw/smbios/smbios_build.h
|
||||
index 68b8b72e09..93b360d520 100644
|
||||
--- a/hw/smbios/smbios_build.h
|
||||
+++ b/hw/smbios/smbios_build.h
|
||||
@@ -63,6 +63,18 @@ extern unsigned smbios_table_cnt;
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
+#define SMBIOS_TABLE_SET_STR_LIST(tbl_type, 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; \
|
||||
+ ++str_index; \
|
||||
+ } \
|
||||
+ } while (0)
|
||||
+
|
||||
#define SMBIOS_BUILD_TABLE_POST \
|
||||
do { \
|
||||
size_t term_cnt, t_size; \
|
||||
diff --git a/include/hw/smbios/smbios.h b/include/hw/smbios/smbios.h
|
||||
index 31e8d5f47e..a83adb93d7 100644
|
||||
--- a/include/hw/smbios/smbios.h
|
||||
+++ b/include/hw/smbios/smbios.h
|
||||
@@ -195,6 +195,12 @@ struct smbios_type_4 {
|
||||
uint16_t processor_family2;
|
||||
} QEMU_PACKED;
|
||||
|
||||
+/* SMBIOS type 11 - OEM strings */
|
||||
+struct smbios_type_11 {
|
||||
+ struct smbios_structure_header header;
|
||||
+ uint8_t count;
|
||||
+} QEMU_PACKED;
|
||||
+
|
||||
/* SMBIOS type 16 - Physical Memory Array (v2.7) */
|
||||
struct smbios_type_16 {
|
||||
struct smbios_structure_header header;
|
@ -1,3 +1,10 @@
|
||||
-------------------------------------------------------------------
|
||||
Fri Mar 9 20:52:00 UTC 2018 - brogers@suse.com
|
||||
|
||||
- Patch queue updated from git://github.com/openSUSE/qemu.git opensuse-2.11
|
||||
* Patches added:
|
||||
0076-smbios-support-setting-OEM-strings-.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Sat Mar 3 14:24:13 UTC 2018 - brogers@suse.com
|
||||
|
||||
|
@ -101,6 +101,7 @@ Patch0072: 0072-tests-qmp-test-blacklist-query-sev-.patch
|
||||
Patch0073: 0073-sev-i386-add-migration-blocker.patch
|
||||
Patch0074: 0074-cpu-i386-populate-CPUID-0x8000_001F.patch
|
||||
Patch0075: 0075-migration-warn-about-inconsistent-s.patch
|
||||
Patch0076: 0076-smbios-support-setting-OEM-strings-.patch
|
||||
# Please do not add QEMU patches manually here.
|
||||
# Run update_git.sh to regenerate this queue.
|
||||
Source400: update_git.sh
|
||||
@ -205,6 +206,7 @@ syscall layer occurs on the native hardware and operating system.
|
||||
%patch0073 -p1
|
||||
%patch0074 -p1
|
||||
%patch0075 -p1
|
||||
%patch0076 -p1
|
||||
|
||||
%build
|
||||
./configure \
|
||||
|
@ -1,3 +1,10 @@
|
||||
-------------------------------------------------------------------
|
||||
Fri Mar 9 20:51:57 UTC 2018 - brogers@suse.com
|
||||
|
||||
- Add support for setting OEM strings table (fate#323624)
|
||||
0076-smbios-support-setting-OEM-strings-.patch
|
||||
- Patch queue updated from git://github.com/openSUSE/qemu.git opensuse-2.11
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Sat Mar 3 14:24:10 UTC 2018 - brogers@suse.com
|
||||
|
||||
|
@ -205,6 +205,7 @@ Patch0072: 0072-tests-qmp-test-blacklist-query-sev-.patch
|
||||
Patch0073: 0073-sev-i386-add-migration-blocker.patch
|
||||
Patch0074: 0074-cpu-i386-populate-CPUID-0x8000_001F.patch
|
||||
Patch0075: 0075-migration-warn-about-inconsistent-s.patch
|
||||
Patch0076: 0076-smbios-support-setting-OEM-strings-.patch
|
||||
# Please do not add QEMU patches manually here.
|
||||
# Run update_git.sh to regenerate this queue.
|
||||
|
||||
@ -879,6 +880,7 @@ This package provides a service file for starting and stopping KSM.
|
||||
%patch0073 -p1
|
||||
%patch0074 -p1
|
||||
%patch0075 -p1
|
||||
%patch0076 -p1
|
||||
|
||||
%if 0%{?suse_version} > 1320
|
||||
%patch1000 -p1
|
||||
|
@ -1,3 +1,10 @@
|
||||
-------------------------------------------------------------------
|
||||
Fri Mar 9 20:51:57 UTC 2018 - brogers@suse.com
|
||||
|
||||
- Add support for setting OEM strings table (fate#323624)
|
||||
0076-smbios-support-setting-OEM-strings-.patch
|
||||
- Patch queue updated from git://github.com/openSUSE/qemu.git opensuse-2.11
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Sat Mar 3 14:24:10 UTC 2018 - brogers@suse.com
|
||||
|
||||
|
@ -205,6 +205,7 @@ Patch0072: 0072-tests-qmp-test-blacklist-query-sev-.patch
|
||||
Patch0073: 0073-sev-i386-add-migration-blocker.patch
|
||||
Patch0074: 0074-cpu-i386-populate-CPUID-0x8000_001F.patch
|
||||
Patch0075: 0075-migration-warn-about-inconsistent-s.patch
|
||||
Patch0076: 0076-smbios-support-setting-OEM-strings-.patch
|
||||
# Please do not add QEMU patches manually here.
|
||||
# Run update_git.sh to regenerate this queue.
|
||||
|
||||
@ -879,6 +880,7 @@ This package provides a service file for starting and stopping KSM.
|
||||
%patch0073 -p1
|
||||
%patch0074 -p1
|
||||
%patch0075 -p1
|
||||
%patch0076 -p1
|
||||
|
||||
%if 0%{?suse_version} > 1320
|
||||
%patch1000 -p1
|
||||
|
Loading…
Reference in New Issue
Block a user