* [PATCH v2 0/9] user-mode: Prune build dependencies (part 3)
@ 2020-03-16 0:11 Philippe Mathieu-Daudé
2020-03-16 0:11 ` [PATCH v2 1/9] hw/core/qdev-properties: Use qemu_strtol() in set_mac() handler Philippe Mathieu-Daudé
` (9 more replies)
0 siblings, 10 replies; 13+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-03-16 0:11 UTC (permalink / raw)
To: qemu-devel
Cc: Daniel P. Berrangé, Eduardo Habkost, Michael Roth,
Markus Armbruster, Paolo Bonzini, Philippe Mathieu-Daudé
This is the second part of a series reducing user-mode
dependencies. By stripping out unused code, the build
and testing time is reduced (as is space used by objects).
Part 3:
- Extract code not related to user-mode from hw/core/qdev-properties.c
- Reduce user-mode QAPI generated files
Since v1:
- Addressed Richard and Paolo review comments
Patch missing review: #2 'Use qemu_strtoul() in set_pci_host_devaddr()'
v1: https://www.mail-archive.com/qemu-devel@nongnu.org/msg688486.html
full series available at:
repo: https://github.com/philmd/qemu/
branch: usermode_pruning-v2
Based-on: <20200316000348.29692-1-philmd@redhat.com>
Philippe Mathieu-Daudé (9):
hw/core/qdev-properties: Use qemu_strtol() in set_mac() handler
hw/core/qdev-properties: Use qemu_strtoul() in set_pci_host_devaddr()
hw/core/qdev-properties: Fix code style
hw/core/qdev-properties: Export enum-related functions
hw/core/qdev-properties: Export qdev_prop_enum
hw/core/qdev-properties: Export some integer-related functions
hw/core/qdev-properties: Extract system-mode specific properties
hw/core: Add qdev stub for user-mode
qapi: Restrict code generated for user-mode
hw/core/qdev-prop-internal.h | 28 ++
include/hw/qdev-properties.h | 1 +
hw/core/qdev-properties-system.c | 602 ++++++++++++++++++++++++++++-
hw/core/qdev-properties.c | 643 ++-----------------------------
hw/core/qdev-stubs.c | 20 +
hw/core/Makefile.objs | 3 +
qapi/Makefile.objs | 37 +-
7 files changed, 714 insertions(+), 620 deletions(-)
create mode 100644 hw/core/qdev-prop-internal.h
create mode 100644 hw/core/qdev-stubs.c
--
2.21.1
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 1/9] hw/core/qdev-properties: Use qemu_strtol() in set_mac() handler
2020-03-16 0:11 [PATCH v2 0/9] user-mode: Prune build dependencies (part 3) Philippe Mathieu-Daudé
@ 2020-03-16 0:11 ` Philippe Mathieu-Daudé
2020-03-16 0:11 ` [PATCH v2 2/9] hw/core/qdev-properties: Use qemu_strtoul() in set_pci_host_devaddr() Philippe Mathieu-Daudé
` (8 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-03-16 0:11 UTC (permalink / raw)
To: qemu-devel
Cc: Daniel P. Berrangé, Eduardo Habkost, Richard Henderson,
Michael Roth, Markus Armbruster, Paolo Bonzini,
Philippe Mathieu-Daudé
The MACAddr structure contains an array of uint8_t. Previously
if a value was out of the [0..255] range, it was silently casted
and no input validation was done.
Replace strtol() by qemu_strtol() -- so checkpatch.pl won't
complain if we move this code later -- and return EINVAL if the
input is invalid.
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
v2: Comment we added input validation (rth)
---
hw/core/qdev-properties.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 59380ed761..48e4c98cf0 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -1,4 +1,5 @@
#include "qemu/osdep.h"
+#include "qemu/cutils.h"
#include "net/net.h"
#include "hw/qdev-properties.h"
#include "qapi/error.h"
@@ -532,7 +533,8 @@ static void set_mac(Object *obj, Visitor *v, const char *name, void *opaque,
MACAddr *mac = qdev_get_prop_ptr(dev, prop);
Error *local_err = NULL;
int i, pos;
- char *str, *p;
+ char *str;
+ const char *p;
if (dev->realized) {
qdev_prop_set_after_realize(dev, name, errp);
@@ -546,6 +548,8 @@ static void set_mac(Object *obj, Visitor *v, const char *name, void *opaque,
}
for (i = 0, pos = 0; i < 6; i++, pos += 3) {
+ long val;
+
if (!qemu_isxdigit(str[pos])) {
goto inval;
}
@@ -561,7 +565,10 @@ static void set_mac(Object *obj, Visitor *v, const char *name, void *opaque,
goto inval;
}
}
- mac->a[i] = strtol(str+pos, &p, 16);
+ if (qemu_strtol(str + pos, &p, 16, &val) < 0 || val > 0xff) {
+ goto inval;
+ }
+ mac->a[i] = val;
}
g_free(str);
return;
--
2.21.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 2/9] hw/core/qdev-properties: Use qemu_strtoul() in set_pci_host_devaddr()
2020-03-16 0:11 [PATCH v2 0/9] user-mode: Prune build dependencies (part 3) Philippe Mathieu-Daudé
2020-03-16 0:11 ` [PATCH v2 1/9] hw/core/qdev-properties: Use qemu_strtol() in set_mac() handler Philippe Mathieu-Daudé
@ 2020-03-16 0:11 ` Philippe Mathieu-Daudé
2020-03-16 18:39 ` Richard Henderson
2020-03-16 0:11 ` [PATCH v2 3/9] hw/core/qdev-properties: Fix code style Philippe Mathieu-Daudé
` (7 subsequent siblings)
9 siblings, 1 reply; 13+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-03-16 0:11 UTC (permalink / raw)
To: qemu-devel
Cc: Daniel P. Berrangé, Eduardo Habkost, Michael Roth,
Markus Armbruster, Paolo Bonzini, Philippe Mathieu-Daudé
Replace strtoul() by qemu_strtoul() so checkpatch.pl won't
complain if we move this code later. Increase the slot and
func local variables to unsigned long so that the range check
isn't truncated. Remove the 'e == p' test which is done in
check_strtox_error(), called by qemu_strtoul().
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
v2: drop the e == p test, do not do modify range check (rth)
---
hw/core/qdev-properties.c | 25 ++++++++++++-------------
1 file changed, 12 insertions(+), 13 deletions(-)
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 48e4c98cf0..0e4da655c1 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -820,10 +820,10 @@ static void set_pci_host_devaddr(Object *obj, Visitor *v, const char *name,
PCIHostDeviceAddress *addr = qdev_get_prop_ptr(dev, prop);
Error *local_err = NULL;
char *str, *p;
- char *e;
+ const char *e;
unsigned long val;
unsigned long dom = 0, bus = 0;
- unsigned int slot = 0, func = 0;
+ unsigned long slot = 0, func = 0;
if (dev->realized) {
qdev_prop_set_after_realize(dev, name, errp);
@@ -837,23 +837,23 @@ static void set_pci_host_devaddr(Object *obj, Visitor *v, const char *name,
}
p = str;
- val = strtoul(p, &e, 16);
- if (e == p || *e != ':') {
+ if (qemu_strtoul(p, &e, 16, &val) < 0) {
+ goto inval;
+ }
+ if (*e != ':') {
goto inval;
}
bus = val;
- p = e + 1;
- val = strtoul(p, &e, 16);
- if (e == p) {
+ p = (char *)e + 1;
+ if (qemu_strtoul(p, &e, 16, &val) < 0) {
goto inval;
}
if (*e == ':') {
dom = bus;
bus = val;
- p = e + 1;
- val = strtoul(p, &e, 16);
- if (e == p) {
+ p = (char *)e + 1;
+ if (qemu_strtoul(p, &e, 16, &val) < 0) {
goto inval;
}
}
@@ -862,9 +862,8 @@ static void set_pci_host_devaddr(Object *obj, Visitor *v, const char *name,
if (*e != '.') {
goto inval;
}
- p = e + 1;
- val = strtoul(p, &e, 10);
- if (e == p) {
+ p = (char *)e + 1;
+ if (qemu_strtoul(p, &e, 10, &val) < 0) {
goto inval;
}
func = val;
--
2.21.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 3/9] hw/core/qdev-properties: Fix code style
2020-03-16 0:11 [PATCH v2 0/9] user-mode: Prune build dependencies (part 3) Philippe Mathieu-Daudé
2020-03-16 0:11 ` [PATCH v2 1/9] hw/core/qdev-properties: Use qemu_strtol() in set_mac() handler Philippe Mathieu-Daudé
2020-03-16 0:11 ` [PATCH v2 2/9] hw/core/qdev-properties: Use qemu_strtoul() in set_pci_host_devaddr() Philippe Mathieu-Daudé
@ 2020-03-16 0:11 ` Philippe Mathieu-Daudé
2020-03-16 0:11 ` [PATCH v2 4/9] hw/core/qdev-properties: Export enum-related functions Philippe Mathieu-Daudé
` (6 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-03-16 0:11 UTC (permalink / raw)
To: qemu-devel
Cc: Daniel P. Berrangé, Eduardo Habkost, Richard Henderson,
Michael Roth, Markus Armbruster, Paolo Bonzini,
Philippe Mathieu-Daudé
We will soon move this code, fix its style to avoid checkpatch.pl
to complain.
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
hw/core/qdev-properties.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 0e4da655c1..8ef949e3bd 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -553,15 +553,15 @@ static void set_mac(Object *obj, Visitor *v, const char *name, void *opaque,
if (!qemu_isxdigit(str[pos])) {
goto inval;
}
- if (!qemu_isxdigit(str[pos+1])) {
+ if (!qemu_isxdigit(str[pos + 1])) {
goto inval;
}
if (i == 5) {
- if (str[pos+2] != '\0') {
+ if (str[pos + 2] != '\0') {
goto inval;
}
} else {
- if (str[pos+2] != ':' && str[pos+2] != '-') {
+ if (str[pos + 2] != ':' && str[pos + 2] != '-') {
goto inval;
}
}
@@ -767,8 +767,8 @@ static void set_blocksize(Object *obj, Visitor *v, const char *name,
/* We rely on power-of-2 blocksizes for bitmasks */
if ((value & (value - 1)) != 0) {
error_setg(errp,
- "Property %s.%s doesn't take value '%" PRId64 "', it's not a power of 2",
- dev->id ?: "", name, (int64_t)value);
+ "Property %s.%s doesn't take value '%" PRId64 "', "
+ "it's not a power of 2", dev->id ?: "", name, (int64_t)value);
return;
}
--
2.21.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 4/9] hw/core/qdev-properties: Export enum-related functions
2020-03-16 0:11 [PATCH v2 0/9] user-mode: Prune build dependencies (part 3) Philippe Mathieu-Daudé
` (2 preceding siblings ...)
2020-03-16 0:11 ` [PATCH v2 3/9] hw/core/qdev-properties: Fix code style Philippe Mathieu-Daudé
@ 2020-03-16 0:11 ` Philippe Mathieu-Daudé
2020-03-16 0:11 ` [PATCH v2 5/9] hw/core/qdev-properties: Export qdev_prop_enum Philippe Mathieu-Daudé
` (5 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-03-16 0:11 UTC (permalink / raw)
To: qemu-devel
Cc: Daniel P. Berrangé, Eduardo Habkost, Richard Henderson,
Michael Roth, Markus Armbruster, Paolo Bonzini,
Philippe Mathieu-Daudé
We are going to split this file and reuse these static functions.
Add the local "qdev-prop-internal.h" header declaring them.
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
hw/core/qdev-prop-internal.h | 19 ++++++++++++
hw/core/qdev-properties.c | 58 +++++++++++++++++++-----------------
2 files changed, 49 insertions(+), 28 deletions(-)
create mode 100644 hw/core/qdev-prop-internal.h
diff --git a/hw/core/qdev-prop-internal.h b/hw/core/qdev-prop-internal.h
new file mode 100644
index 0000000000..2a8c9a306a
--- /dev/null
+++ b/hw/core/qdev-prop-internal.h
@@ -0,0 +1,19 @@
+/*
+ * qdev property parsing
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#ifndef HW_CORE_QDEV_PROP_INTERNAL_H
+#define HW_CORE_QDEV_PROP_INTERNAL_H
+
+void qdev_propinfo_get_enum(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp);
+void qdev_propinfo_set_enum(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp);
+
+void qdev_propinfo_set_default_value_enum(ObjectProperty *op,
+ const Property *prop);
+
+#endif
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 8ef949e3bd..3f3a008938 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -16,6 +16,7 @@
#include "qapi/visitor.h"
#include "chardev/char.h"
#include "qemu/uuid.h"
+#include "qdev-prop-internal.h"
void qdev_prop_set_after_realize(DeviceState *dev, const char *name,
Error **errp)
@@ -51,8 +52,8 @@ void *qdev_get_prop_ptr(DeviceState *dev, Property *prop)
return ptr;
}
-static void get_enum(Object *obj, Visitor *v, const char *name, void *opaque,
- Error **errp)
+void qdev_propinfo_get_enum(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp)
{
DeviceState *dev = DEVICE(obj);
Property *prop = opaque;
@@ -61,8 +62,8 @@ static void get_enum(Object *obj, Visitor *v, const char *name, void *opaque,
visit_type_enum(v, prop->name, ptr, prop->info->enum_table, errp);
}
-static void set_enum(Object *obj, Visitor *v, const char *name, void *opaque,
- Error **errp)
+void qdev_propinfo_set_enum(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp)
{
DeviceState *dev = DEVICE(obj);
Property *prop = opaque;
@@ -76,7 +77,8 @@ static void set_enum(Object *obj, Visitor *v, const char *name, void *opaque,
visit_type_enum(v, prop->name, ptr, prop->info->enum_table, errp);
}
-static void set_default_value_enum(ObjectProperty *op, const Property *prop)
+void qdev_propinfo_set_default_value_enum(ObjectProperty *op,
+ const Property *prop)
{
object_property_set_default_str(op,
qapi_enum_lookup(prop->info->enum_table, prop->defval.i));
@@ -591,9 +593,9 @@ const PropertyInfo qdev_prop_on_off_auto = {
.name = "OnOffAuto",
.description = "on/off/auto",
.enum_table = &OnOffAuto_lookup,
- .get = get_enum,
- .set = set_enum,
- .set_default_value = set_default_value_enum,
+ .get = qdev_propinfo_get_enum,
+ .set = qdev_propinfo_set_enum,
+ .set_default_value = qdev_propinfo_set_default_value_enum,
};
/* --- lost tick policy --- */
@@ -603,9 +605,9 @@ QEMU_BUILD_BUG_ON(sizeof(LostTickPolicy) != sizeof(int));
const PropertyInfo qdev_prop_losttickpolicy = {
.name = "LostTickPolicy",
.enum_table = &LostTickPolicy_lookup,
- .get = get_enum,
- .set = set_enum,
- .set_default_value = set_default_value_enum,
+ .get = qdev_propinfo_get_enum,
+ .set = qdev_propinfo_set_enum,
+ .set_default_value = qdev_propinfo_set_default_value_enum,
};
/* --- Block device error handling policy --- */
@@ -617,9 +619,9 @@ const PropertyInfo qdev_prop_blockdev_on_error = {
.description = "Error handling policy, "
"report/ignore/enospc/stop/auto",
.enum_table = &BlockdevOnError_lookup,
- .get = get_enum,
- .set = set_enum,
- .set_default_value = set_default_value_enum,
+ .get = qdev_propinfo_get_enum,
+ .set = qdev_propinfo_set_enum,
+ .set_default_value = qdev_propinfo_set_default_value_enum,
};
/* --- BIOS CHS translation */
@@ -631,9 +633,9 @@ const PropertyInfo qdev_prop_bios_chs_trans = {
.description = "Logical CHS translation algorithm, "
"auto/none/lba/large/rechs",
.enum_table = &BiosAtaTranslation_lookup,
- .get = get_enum,
- .set = set_enum,
- .set_default_value = set_default_value_enum,
+ .get = qdev_propinfo_get_enum,
+ .set = qdev_propinfo_set_enum,
+ .set_default_value = qdev_propinfo_set_default_value_enum,
};
/* --- FDC default drive types */
@@ -643,9 +645,9 @@ const PropertyInfo qdev_prop_fdc_drive_type = {
.description = "FDC drive type, "
"144/288/120/none/auto",
.enum_table = &FloppyDriveType_lookup,
- .get = get_enum,
- .set = set_enum,
- .set_default_value = set_default_value_enum,
+ .get = qdev_propinfo_get_enum,
+ .set = qdev_propinfo_set_enum,
+ .set_default_value = qdev_propinfo_set_default_value_enum,
};
/* --- MultiFDCompression --- */
@@ -655,9 +657,9 @@ const PropertyInfo qdev_prop_multifd_compression = {
.description = "multifd_compression values, "
"none/zlib/zstd",
.enum_table = &MultiFDCompression_lookup,
- .get = get_enum,
- .set = set_enum,
- .set_default_value = set_default_value_enum,
+ .get = qdev_propinfo_get_enum,
+ .set = qdev_propinfo_set_enum,
+ .set_default_value = qdev_propinfo_set_default_value_enum,
};
/* --- pci address --- */
@@ -1281,9 +1283,9 @@ const PropertyInfo qdev_prop_off_auto_pcibar = {
.name = "OffAutoPCIBAR",
.description = "off/auto/bar0/bar1/bar2/bar3/bar4/bar5",
.enum_table = &OffAutoPCIBAR_lookup,
- .get = get_enum,
- .set = set_enum,
- .set_default_value = set_default_value_enum,
+ .get = qdev_propinfo_get_enum,
+ .set = qdev_propinfo_set_enum,
+ .set_default_value = qdev_propinfo_set_default_value_enum,
};
/* --- PCIELinkSpeed 2_5/5/8/16 -- */
@@ -1362,7 +1364,7 @@ const PropertyInfo qdev_prop_pcie_link_speed = {
.enum_table = &PCIELinkSpeed_lookup,
.get = get_prop_pcielinkspeed,
.set = set_prop_pcielinkspeed,
- .set_default_value = set_default_value_enum,
+ .set_default_value = qdev_propinfo_set_default_value_enum,
};
/* --- PCIELinkWidth 1/2/4/8/12/16/32 -- */
@@ -1459,5 +1461,5 @@ const PropertyInfo qdev_prop_pcie_link_width = {
.enum_table = &PCIELinkWidth_lookup,
.get = get_prop_pcielinkwidth,
.set = set_prop_pcielinkwidth,
- .set_default_value = set_default_value_enum,
+ .set_default_value = qdev_propinfo_set_default_value_enum,
};
--
2.21.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 5/9] hw/core/qdev-properties: Export qdev_prop_enum
2020-03-16 0:11 [PATCH v2 0/9] user-mode: Prune build dependencies (part 3) Philippe Mathieu-Daudé
` (3 preceding siblings ...)
2020-03-16 0:11 ` [PATCH v2 4/9] hw/core/qdev-properties: Export enum-related functions Philippe Mathieu-Daudé
@ 2020-03-16 0:11 ` Philippe Mathieu-Daudé
2020-03-16 0:11 ` [PATCH v2 6/9] hw/core/qdev-properties: Export some integer-related functions Philippe Mathieu-Daudé
` (4 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-03-16 0:11 UTC (permalink / raw)
To: qemu-devel
Cc: Daniel P. Berrangé, Eduardo Habkost, Richard Henderson,
Michael Roth, Markus Armbruster, Paolo Bonzini,
Philippe Mathieu-Daudé
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
include/hw/qdev-properties.h | 1 +
hw/core/qdev-properties.c | 7 +++++++
2 files changed, 8 insertions(+)
diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h
index f161604fb6..134753d595 100644
--- a/include/hw/qdev-properties.h
+++ b/include/hw/qdev-properties.h
@@ -8,6 +8,7 @@
extern const PropertyInfo qdev_prop_bit;
extern const PropertyInfo qdev_prop_bit64;
extern const PropertyInfo qdev_prop_bool;
+extern const PropertyInfo qdev_prop_enum;
extern const PropertyInfo qdev_prop_uint8;
extern const PropertyInfo qdev_prop_uint16;
extern const PropertyInfo qdev_prop_uint32;
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 3f3a008938..7e89c11dfd 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -84,6 +84,13 @@ void qdev_propinfo_set_default_value_enum(ObjectProperty *op,
qapi_enum_lookup(prop->info->enum_table, prop->defval.i));
}
+const PropertyInfo qdev_prop_enum = {
+ .name = "enum",
+ .get = qdev_propinfo_get_enum,
+ .set = qdev_propinfo_set_enum,
+ .set_default_value = qdev_propinfo_set_default_value_enum,
+};
+
/* Bit */
static uint32_t qdev_get_prop_mask(Property *prop)
--
2.21.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 6/9] hw/core/qdev-properties: Export some integer-related functions
2020-03-16 0:11 [PATCH v2 0/9] user-mode: Prune build dependencies (part 3) Philippe Mathieu-Daudé
` (4 preceding siblings ...)
2020-03-16 0:11 ` [PATCH v2 5/9] hw/core/qdev-properties: Export qdev_prop_enum Philippe Mathieu-Daudé
@ 2020-03-16 0:11 ` Philippe Mathieu-Daudé
2020-03-16 0:11 ` [PATCH v2 7/9] hw/core/qdev-properties: Extract system-mode specific properties Philippe Mathieu-Daudé
` (3 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-03-16 0:11 UTC (permalink / raw)
To: qemu-devel
Cc: Daniel P. Berrangé, Eduardo Habkost, Richard Henderson,
Michael Roth, Markus Armbruster, Paolo Bonzini,
Philippe Mathieu-Daudé
We are going to split this file and reuse these static functions.
Declare them in the local "qdev-prop-internal.h" header.
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
hw/core/qdev-prop-internal.h | 9 ++++++++
hw/core/qdev-properties.c | 42 +++++++++++++++++++-----------------
2 files changed, 31 insertions(+), 20 deletions(-)
diff --git a/hw/core/qdev-prop-internal.h b/hw/core/qdev-prop-internal.h
index 2a8c9a306a..dd2f215f1c 100644
--- a/hw/core/qdev-prop-internal.h
+++ b/hw/core/qdev-prop-internal.h
@@ -15,5 +15,14 @@ void qdev_propinfo_set_enum(Object *obj, Visitor *v, const char *name,
void qdev_propinfo_set_default_value_enum(ObjectProperty *op,
const Property *prop);
+void qdev_propinfo_set_default_value_int(ObjectProperty *op,
+ const Property *prop);
+void qdev_propinfo_set_default_value_uint(ObjectProperty *op,
+ const Property *prop);
+
+void qdev_propinfo_get_uint16(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp);
+void qdev_propinfo_get_int32(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp);
#endif
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 7e89c11dfd..8c85e0b648 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -275,12 +275,14 @@ static void set_uint8(Object *obj, Visitor *v, const char *name, void *opaque,
visit_type_uint8(v, name, ptr, errp);
}
-static void set_default_value_int(ObjectProperty *op, const Property *prop)
+void qdev_propinfo_set_default_value_int(ObjectProperty *op,
+ const Property *prop)
{
object_property_set_default_int(op, prop->defval.i);
}
-static void set_default_value_uint(ObjectProperty *op, const Property *prop)
+void qdev_propinfo_set_default_value_uint(ObjectProperty *op,
+ const Property *prop)
{
object_property_set_default_uint(op, prop->defval.u);
}
@@ -289,13 +291,13 @@ const PropertyInfo qdev_prop_uint8 = {
.name = "uint8",
.get = get_uint8,
.set = set_uint8,
- .set_default_value = set_default_value_uint,
+ .set_default_value = qdev_propinfo_set_default_value_uint,
};
/* --- 16bit integer --- */
-static void get_uint16(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
+void qdev_propinfo_get_uint16(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp)
{
DeviceState *dev = DEVICE(obj);
Property *prop = opaque;
@@ -321,9 +323,9 @@ static void set_uint16(Object *obj, Visitor *v, const char *name,
const PropertyInfo qdev_prop_uint16 = {
.name = "uint16",
- .get = get_uint16,
+ .get = qdev_propinfo_get_uint16,
.set = set_uint16,
- .set_default_value = set_default_value_uint,
+ .set_default_value = qdev_propinfo_set_default_value_uint,
};
/* --- 32bit integer --- */
@@ -353,8 +355,8 @@ static void set_uint32(Object *obj, Visitor *v, const char *name,
visit_type_uint32(v, name, ptr, errp);
}
-static void get_int32(Object *obj, Visitor *v, const char *name, void *opaque,
- Error **errp)
+void qdev_propinfo_get_int32(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp)
{
DeviceState *dev = DEVICE(obj);
Property *prop = opaque;
@@ -382,14 +384,14 @@ const PropertyInfo qdev_prop_uint32 = {
.name = "uint32",
.get = get_uint32,
.set = set_uint32,
- .set_default_value = set_default_value_uint,
+ .set_default_value = qdev_propinfo_set_default_value_uint,
};
const PropertyInfo qdev_prop_int32 = {
.name = "int32",
- .get = get_int32,
+ .get = qdev_propinfo_get_int32,
.set = set_int32,
- .set_default_value = set_default_value_int,
+ .set_default_value = qdev_propinfo_set_default_value_int,
};
/* --- 64bit integer --- */
@@ -448,14 +450,14 @@ const PropertyInfo qdev_prop_uint64 = {
.name = "uint64",
.get = get_uint64,
.set = set_uint64,
- .set_default_value = set_default_value_uint,
+ .set_default_value = qdev_propinfo_set_default_value_uint,
};
const PropertyInfo qdev_prop_int64 = {
.name = "int64",
.get = get_int64,
.set = set_int64,
- .set_default_value = set_default_value_int,
+ .set_default_value = qdev_propinfo_set_default_value_int,
};
/* --- string --- */
@@ -739,9 +741,9 @@ const PropertyInfo qdev_prop_pci_devfn = {
.name = "int32",
.description = "Slot and optional function number, example: 06.0 or 06",
.print = print_pci_devfn,
- .get = get_int32,
+ .get = qdev_propinfo_get_int32,
.set = set_pci_devfn,
- .set_default_value = set_default_value_int,
+ .set_default_value = qdev_propinfo_set_default_value_uint,
};
/* --- blocksize --- */
@@ -787,9 +789,9 @@ static void set_blocksize(Object *obj, Visitor *v, const char *name,
const PropertyInfo qdev_prop_blocksize = {
.name = "uint16",
.description = "A power of two between 512 and 32768",
- .get = get_uint16,
+ .get = qdev_propinfo_get_uint16,
.set = set_blocksize,
- .set_default_value = set_default_value_uint,
+ .set_default_value = qdev_propinfo_set_default_value_uint,
};
/* --- pci host address --- */
@@ -1071,7 +1073,7 @@ const PropertyInfo qdev_prop_arraylen = {
.name = "uint32",
.get = get_uint32,
.set = set_prop_arraylen,
- .set_default_value = set_default_value_uint,
+ .set_default_value = qdev_propinfo_set_default_value_uint,
};
/* --- public helpers --- */
@@ -1265,7 +1267,7 @@ const PropertyInfo qdev_prop_size = {
.name = "size",
.get = get_size,
.set = set_size,
- .set_default_value = set_default_value_uint,
+ .set_default_value = qdev_propinfo_set_default_value_uint,
};
/* --- object link property --- */
--
2.21.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 7/9] hw/core/qdev-properties: Extract system-mode specific properties
2020-03-16 0:11 [PATCH v2 0/9] user-mode: Prune build dependencies (part 3) Philippe Mathieu-Daudé
` (5 preceding siblings ...)
2020-03-16 0:11 ` [PATCH v2 6/9] hw/core/qdev-properties: Export some integer-related functions Philippe Mathieu-Daudé
@ 2020-03-16 0:11 ` Philippe Mathieu-Daudé
2020-03-16 0:11 ` [PATCH v2 8/9] hw/core: Add qdev stub for user-mode Philippe Mathieu-Daudé
` (2 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-03-16 0:11 UTC (permalink / raw)
To: qemu-devel
Cc: Daniel P. Berrangé, Eduardo Habkost, Richard Henderson,
Michael Roth, Markus Armbruster, Paolo Bonzini,
Philippe Mathieu-Daudé
Move properties specific to machines into a separate file.
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
hw/core/qdev-properties-system.c | 602 ++++++++++++++++++++++++++++++-
hw/core/qdev-properties.c | 590 ------------------------------
2 files changed, 594 insertions(+), 598 deletions(-)
diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-system.c
index 70bfd4809b..55a34c165c 100644
--- a/hw/core/qdev-properties-system.c
+++ b/hw/core/qdev-properties-system.c
@@ -11,19 +11,24 @@
*/
#include "qemu/osdep.h"
-#include "audio/audio.h"
-#include "net/net.h"
#include "hw/qdev-properties.h"
#include "qapi/error.h"
+#include "qapi/visitor.h"
+#include "qapi/qapi-types-block.h"
+#include "qapi/qapi-types-machine.h"
+#include "qapi/qapi-types-migration.h"
#include "qapi/qmp/qerror.h"
+#include "qemu/ctype.h"
+#include "qemu/cutils.h"
+#include "qemu/error-report.h"
+#include "qdev-prop-internal.h"
+
+#include "audio/audio.h"
+#include "chardev/char-fe.h"
#include "sysemu/block-backend.h"
#include "sysemu/blockdev.h"
-#include "hw/block/block.h"
-#include "net/hub.h"
-#include "qapi/visitor.h"
-#include "chardev/char-fe.h"
-#include "sysemu/iothread.h"
-#include "sysemu/tpm_backend.h"
+#include "net/net.h"
+#include "hw/pci/pci.h"
static void get_pointer(Object *obj, Visitor *v, Property *prop,
char *(*print)(void *ptr),
@@ -273,6 +278,99 @@ const PropertyInfo qdev_prop_chr = {
.release = release_chr,
};
+/* --- mac address --- */
+
+/*
+ * accepted syntax versions:
+ * 01:02:03:04:05:06
+ * 01-02-03-04-05-06
+ */
+static void get_mac(Object *obj, Visitor *v, const char *name, void *opaque,
+ Error **errp)
+{
+ DeviceState *dev = DEVICE(obj);
+ Property *prop = opaque;
+ MACAddr *mac = qdev_get_prop_ptr(dev, prop);
+ char buffer[2 * 6 + 5 + 1];
+ char *p = buffer;
+
+ snprintf(buffer, sizeof(buffer), "%02x:%02x:%02x:%02x:%02x:%02x",
+ mac->a[0], mac->a[1], mac->a[2],
+ mac->a[3], mac->a[4], mac->a[5]);
+
+ visit_type_str(v, name, &p, errp);
+}
+
+static void set_mac(Object *obj, Visitor *v, const char *name, void *opaque,
+ Error **errp)
+{
+ DeviceState *dev = DEVICE(obj);
+ Property *prop = opaque;
+ MACAddr *mac = qdev_get_prop_ptr(dev, prop);
+ Error *local_err = NULL;
+ int i, pos;
+ char *str;
+ const char *p;
+
+ if (dev->realized) {
+ qdev_prop_set_after_realize(dev, name, errp);
+ return;
+ }
+
+ visit_type_str(v, name, &str, &local_err);
+ if (local_err) {
+ error_propagate(errp, local_err);
+ return;
+ }
+
+ for (i = 0, pos = 0; i < 6; i++, pos += 3) {
+ long val;
+
+ if (!qemu_isxdigit(str[pos])) {
+ goto inval;
+ }
+ if (!qemu_isxdigit(str[pos + 1])) {
+ goto inval;
+ }
+ if (i == 5) {
+ if (str[pos + 2] != '\0') {
+ goto inval;
+ }
+ } else {
+ if (str[pos + 2] != ':' && str[pos + 2] != '-') {
+ goto inval;
+ }
+ }
+ if (qemu_strtol(str + pos, &p, 16, &val) < 0 || val > 0xff) {
+ goto inval;
+ }
+ mac->a[i] = val;
+ }
+ g_free(str);
+ return;
+
+inval:
+ error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str);
+ g_free(str);
+}
+
+const PropertyInfo qdev_prop_macaddr = {
+ .name = "str",
+ .description = "Ethernet 6-byte MAC Address, example: 52:54:00:12:34:56",
+ .get = get_mac,
+ .set = set_mac,
+};
+
+void qdev_prop_set_macaddr(DeviceState *dev, const char *name,
+ const uint8_t *value)
+{
+ char str[2 * 6 + 5 + 1];
+ snprintf(str, sizeof(str), "%02x:%02x:%02x:%02x:%02x:%02x",
+ value[0], value[1], value[2], value[3], value[4], value[5]);
+
+ object_property_set_str(OBJECT(dev), str, name, &error_abort);
+}
+
/* --- netdev device --- */
static void get_netdev(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
@@ -456,3 +554,491 @@ void qdev_set_nic_properties(DeviceState *dev, NICInfo *nd)
}
nd->instantiated = 1;
}
+
+/* --- lost tick policy --- */
+
+QEMU_BUILD_BUG_ON(sizeof(LostTickPolicy) != sizeof(int));
+
+const PropertyInfo qdev_prop_losttickpolicy = {
+ .name = "LostTickPolicy",
+ .enum_table = &LostTickPolicy_lookup,
+ .get = qdev_propinfo_get_enum,
+ .set = qdev_propinfo_set_enum,
+ .set_default_value = qdev_propinfo_set_default_value_enum,
+};
+
+/* --- Block device error handling policy --- */
+
+QEMU_BUILD_BUG_ON(sizeof(BlockdevOnError) != sizeof(int));
+
+const PropertyInfo qdev_prop_blockdev_on_error = {
+ .name = "BlockdevOnError",
+ .description = "Error handling policy, "
+ "report/ignore/enospc/stop/auto",
+ .enum_table = &BlockdevOnError_lookup,
+ .get = qdev_propinfo_get_enum,
+ .set = qdev_propinfo_set_enum,
+ .set_default_value = qdev_propinfo_set_default_value_enum,
+};
+
+/* --- BIOS CHS translation */
+
+QEMU_BUILD_BUG_ON(sizeof(BiosAtaTranslation) != sizeof(int));
+
+const PropertyInfo qdev_prop_bios_chs_trans = {
+ .name = "BiosAtaTranslation",
+ .description = "Logical CHS translation algorithm, "
+ "auto/none/lba/large/rechs",
+ .enum_table = &BiosAtaTranslation_lookup,
+ .get = qdev_propinfo_get_enum,
+ .set = qdev_propinfo_set_enum,
+ .set_default_value = qdev_propinfo_set_default_value_enum,
+};
+
+/* --- FDC default drive types */
+
+const PropertyInfo qdev_prop_fdc_drive_type = {
+ .name = "FdcDriveType",
+ .description = "FDC drive type, "
+ "144/288/120/none/auto",
+ .enum_table = &FloppyDriveType_lookup,
+ .get = qdev_propinfo_get_enum,
+ .set = qdev_propinfo_set_enum,
+ .set_default_value = qdev_propinfo_set_default_value_enum,
+};
+
+/* --- blocksize --- */
+
+static void set_blocksize(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp)
+{
+ DeviceState *dev = DEVICE(obj);
+ Property *prop = opaque;
+ uint16_t value, *ptr = qdev_get_prop_ptr(dev, prop);
+ Error *local_err = NULL;
+ const int64_t min = 512;
+ const int64_t max = 32768;
+
+ if (dev->realized) {
+ qdev_prop_set_after_realize(dev, name, errp);
+ return;
+ }
+
+ visit_type_uint16(v, name, &value, &local_err);
+ if (local_err) {
+ error_propagate(errp, local_err);
+ return;
+ }
+ /* value of 0 means "unset" */
+ if (value && (value < min || value > max)) {
+ error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE,
+ dev->id ? : "", name, (int64_t)value, min, max);
+ return;
+ }
+
+ /* We rely on power-of-2 blocksizes for bitmasks */
+ if ((value & (value - 1)) != 0) {
+ error_setg(errp,
+ "Property %s.%s doesn't take value '%" PRId64 "', "
+ "it's not a power of 2", dev->id ?: "", name, (int64_t)value);
+ return;
+ }
+
+ *ptr = value;
+}
+
+const PropertyInfo qdev_prop_blocksize = {
+ .name = "uint16",
+ .description = "A power of two between 512 and 32768",
+ .get = qdev_propinfo_get_uint16,
+ .set = set_blocksize,
+ .set_default_value = qdev_propinfo_set_default_value_uint,
+};
+
+/* --- MultiFDCompression --- */
+
+const PropertyInfo qdev_prop_multifd_compression = {
+ .name = "MultiFDCompression",
+ .description = "multifd_compression values, "
+ "none/zlib/zstd",
+ .enum_table = &MultiFDCompression_lookup,
+ .get = qdev_propinfo_get_enum,
+ .set = qdev_propinfo_set_enum,
+ .set_default_value = qdev_propinfo_set_default_value_enum,
+};
+
+/* --- pci address --- */
+
+/*
+ * bus-local address, i.e. "$slot" or "$slot.$fn"
+ */
+static void set_pci_devfn(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp)
+{
+ DeviceState *dev = DEVICE(obj);
+ Property *prop = opaque;
+ int32_t value, *ptr = qdev_get_prop_ptr(dev, prop);
+ unsigned int slot, fn, n;
+ Error *local_err = NULL;
+ char *str;
+
+ if (dev->realized) {
+ qdev_prop_set_after_realize(dev, name, errp);
+ return;
+ }
+
+ visit_type_str(v, name, &str, &local_err);
+ if (local_err) {
+ error_free(local_err);
+ local_err = NULL;
+ visit_type_int32(v, name, &value, &local_err);
+ if (local_err) {
+ error_propagate(errp, local_err);
+ } else if (value < -1 || value > 255) {
+ error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
+ name ? name : "null", "pci_devfn");
+ } else {
+ *ptr = value;
+ }
+ return;
+ }
+
+ if (sscanf(str, "%x.%x%n", &slot, &fn, &n) != 2) {
+ fn = 0;
+ if (sscanf(str, "%x%n", &slot, &n) != 1) {
+ goto invalid;
+ }
+ }
+ if (str[n] != '\0' || fn > 7 || slot > 31) {
+ goto invalid;
+ }
+ *ptr = slot << 3 | fn;
+ g_free(str);
+ return;
+
+invalid:
+ error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str);
+ g_free(str);
+}
+
+static int print_pci_devfn(DeviceState *dev, Property *prop, char *dest,
+ size_t len)
+{
+ int32_t *ptr = qdev_get_prop_ptr(dev, prop);
+
+ if (*ptr == -1) {
+ return snprintf(dest, len, "<unset>");
+ } else {
+ return snprintf(dest, len, "%02x.%x", *ptr >> 3, *ptr & 7);
+ }
+}
+
+const PropertyInfo qdev_prop_pci_devfn = {
+ .name = "int32",
+ .description = "Slot and optional function number, example: 06.0 or 06",
+ .print = print_pci_devfn,
+ .get = qdev_propinfo_get_int32,
+ .set = set_pci_devfn,
+ .set_default_value = qdev_propinfo_set_default_value_int,
+};
+
+/* --- pci host address --- */
+
+static void get_pci_host_devaddr(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp)
+{
+ DeviceState *dev = DEVICE(obj);
+ Property *prop = opaque;
+ PCIHostDeviceAddress *addr = qdev_get_prop_ptr(dev, prop);
+ char buffer[] = "ffff:ff:ff.f";
+ char *p = buffer;
+ int rc = 0;
+
+ /*
+ * Catch "invalid" device reference from vfio-pci and allow the
+ * default buffer representing the non-existent device to be used.
+ */
+ if (~addr->domain || ~addr->bus || ~addr->slot || ~addr->function) {
+ rc = snprintf(buffer, sizeof(buffer), "%04x:%02x:%02x.%0d",
+ addr->domain, addr->bus, addr->slot, addr->function);
+ assert(rc == sizeof(buffer) - 1);
+ }
+
+ visit_type_str(v, name, &p, errp);
+}
+
+/*
+ * Parse [<domain>:]<bus>:<slot>.<func>
+ * if <domain> is not supplied, it's assumed to be 0.
+ */
+static void set_pci_host_devaddr(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp)
+{
+ DeviceState *dev = DEVICE(obj);
+ Property *prop = opaque;
+ PCIHostDeviceAddress *addr = qdev_get_prop_ptr(dev, prop);
+ Error *local_err = NULL;
+ char *str, *p;
+ const char *e;
+ unsigned long val;
+ unsigned long dom = 0, bus = 0;
+ unsigned long slot = 0, func = 0;
+
+ if (dev->realized) {
+ qdev_prop_set_after_realize(dev, name, errp);
+ return;
+ }
+
+ visit_type_str(v, name, &str, &local_err);
+ if (local_err) {
+ error_propagate(errp, local_err);
+ return;
+ }
+
+ p = str;
+ if (qemu_strtoul(p, &e, 16, &val) < 0) {
+ goto inval;
+ }
+ if (*e != ':') {
+ goto inval;
+ }
+ bus = val;
+
+ p = (char *)e + 1;
+ if (qemu_strtoul(p, &e, 16, &val) < 0) {
+ goto inval;
+ }
+ if (*e == ':') {
+ dom = bus;
+ bus = val;
+ p = (char *)e + 1;
+ if (qemu_strtoul(p, &e, 16, &val) < 0) {
+ goto inval;
+ }
+ }
+ slot = val;
+
+ if (*e != '.') {
+ goto inval;
+ }
+ p = (char *)e + 1;
+ if (qemu_strtoul(p, &e, 10, &val) < 0) {
+ goto inval;
+ }
+ func = val;
+
+ if (dom > 0xffff || bus > 0xff || slot > 0x1f || func > 7) {
+ goto inval;
+ }
+
+ if (*e) {
+ goto inval;
+ }
+
+ addr->domain = dom;
+ addr->bus = bus;
+ addr->slot = slot;
+ addr->function = func;
+
+ g_free(str);
+ return;
+
+inval:
+ error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str);
+ g_free(str);
+}
+
+const PropertyInfo qdev_prop_pci_host_devaddr = {
+ .name = "str",
+ .description = "Address (bus/device/function) of "
+ "the host device, example: 04:10.0",
+ .get = get_pci_host_devaddr,
+ .set = set_pci_host_devaddr,
+};
+
+/* --- OffAutoPCIBAR off/auto/bar0/bar1/bar2/bar3/bar4/bar5 --- */
+
+const PropertyInfo qdev_prop_off_auto_pcibar = {
+ .name = "OffAutoPCIBAR",
+ .description = "off/auto/bar0/bar1/bar2/bar3/bar4/bar5",
+ .enum_table = &OffAutoPCIBAR_lookup,
+ .get = qdev_propinfo_get_enum,
+ .set = qdev_propinfo_set_enum,
+ .set_default_value = qdev_propinfo_set_default_value_enum,
+};
+
+/* --- PCIELinkSpeed 2_5/5/8/16 -- */
+
+static void get_prop_pcielinkspeed(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp)
+{
+ DeviceState *dev = DEVICE(obj);
+ Property *prop = opaque;
+ PCIExpLinkSpeed *p = qdev_get_prop_ptr(dev, prop);
+ int speed;
+
+ switch (*p) {
+ case QEMU_PCI_EXP_LNK_2_5GT:
+ speed = PCIE_LINK_SPEED_2_5;
+ break;
+ case QEMU_PCI_EXP_LNK_5GT:
+ speed = PCIE_LINK_SPEED_5;
+ break;
+ case QEMU_PCI_EXP_LNK_8GT:
+ speed = PCIE_LINK_SPEED_8;
+ break;
+ case QEMU_PCI_EXP_LNK_16GT:
+ speed = PCIE_LINK_SPEED_16;
+ break;
+ default:
+ /* Unreachable */
+ abort();
+ }
+
+ visit_type_enum(v, prop->name, &speed, prop->info->enum_table, errp);
+}
+
+static void set_prop_pcielinkspeed(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp)
+{
+ DeviceState *dev = DEVICE(obj);
+ Property *prop = opaque;
+ PCIExpLinkSpeed *p = qdev_get_prop_ptr(dev, prop);
+ int speed;
+ Error *local_err = NULL;
+
+ if (dev->realized) {
+ qdev_prop_set_after_realize(dev, name, errp);
+ return;
+ }
+
+ visit_type_enum(v, prop->name, &speed, prop->info->enum_table, &local_err);
+ if (local_err) {
+ error_propagate(errp, local_err);
+ return;
+ }
+
+ switch (speed) {
+ case PCIE_LINK_SPEED_2_5:
+ *p = QEMU_PCI_EXP_LNK_2_5GT;
+ break;
+ case PCIE_LINK_SPEED_5:
+ *p = QEMU_PCI_EXP_LNK_5GT;
+ break;
+ case PCIE_LINK_SPEED_8:
+ *p = QEMU_PCI_EXP_LNK_8GT;
+ break;
+ case PCIE_LINK_SPEED_16:
+ *p = QEMU_PCI_EXP_LNK_16GT;
+ break;
+ default:
+ /* Unreachable */
+ abort();
+ }
+}
+
+const PropertyInfo qdev_prop_pcie_link_speed = {
+ .name = "PCIELinkSpeed",
+ .description = "2_5/5/8/16",
+ .enum_table = &PCIELinkSpeed_lookup,
+ .get = get_prop_pcielinkspeed,
+ .set = set_prop_pcielinkspeed,
+ .set_default_value = qdev_propinfo_set_default_value_enum,
+};
+
+/* --- PCIELinkWidth 1/2/4/8/12/16/32 -- */
+
+static void get_prop_pcielinkwidth(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp)
+{
+ DeviceState *dev = DEVICE(obj);
+ Property *prop = opaque;
+ PCIExpLinkWidth *p = qdev_get_prop_ptr(dev, prop);
+ int width;
+
+ switch (*p) {
+ case QEMU_PCI_EXP_LNK_X1:
+ width = PCIE_LINK_WIDTH_1;
+ break;
+ case QEMU_PCI_EXP_LNK_X2:
+ width = PCIE_LINK_WIDTH_2;
+ break;
+ case QEMU_PCI_EXP_LNK_X4:
+ width = PCIE_LINK_WIDTH_4;
+ break;
+ case QEMU_PCI_EXP_LNK_X8:
+ width = PCIE_LINK_WIDTH_8;
+ break;
+ case QEMU_PCI_EXP_LNK_X12:
+ width = PCIE_LINK_WIDTH_12;
+ break;
+ case QEMU_PCI_EXP_LNK_X16:
+ width = PCIE_LINK_WIDTH_16;
+ break;
+ case QEMU_PCI_EXP_LNK_X32:
+ width = PCIE_LINK_WIDTH_32;
+ break;
+ default:
+ /* Unreachable */
+ abort();
+ }
+
+ visit_type_enum(v, prop->name, &width, prop->info->enum_table, errp);
+}
+
+static void set_prop_pcielinkwidth(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp)
+{
+ DeviceState *dev = DEVICE(obj);
+ Property *prop = opaque;
+ PCIExpLinkWidth *p = qdev_get_prop_ptr(dev, prop);
+ int width;
+ Error *local_err = NULL;
+
+ if (dev->realized) {
+ qdev_prop_set_after_realize(dev, name, errp);
+ return;
+ }
+
+ visit_type_enum(v, prop->name, &width, prop->info->enum_table, &local_err);
+ if (local_err) {
+ error_propagate(errp, local_err);
+ return;
+ }
+
+ switch (width) {
+ case PCIE_LINK_WIDTH_1:
+ *p = QEMU_PCI_EXP_LNK_X1;
+ break;
+ case PCIE_LINK_WIDTH_2:
+ *p = QEMU_PCI_EXP_LNK_X2;
+ break;
+ case PCIE_LINK_WIDTH_4:
+ *p = QEMU_PCI_EXP_LNK_X4;
+ break;
+ case PCIE_LINK_WIDTH_8:
+ *p = QEMU_PCI_EXP_LNK_X8;
+ break;
+ case PCIE_LINK_WIDTH_12:
+ *p = QEMU_PCI_EXP_LNK_X12;
+ break;
+ case PCIE_LINK_WIDTH_16:
+ *p = QEMU_PCI_EXP_LNK_X16;
+ break;
+ case PCIE_LINK_WIDTH_32:
+ *p = QEMU_PCI_EXP_LNK_X32;
+ break;
+ default:
+ /* Unreachable */
+ abort();
+ }
+}
+
+const PropertyInfo qdev_prop_pcie_link_width = {
+ .name = "PCIELinkWidth",
+ .description = "1/2/4/8/12/16/32",
+ .enum_table = &PCIELinkWidth_lookup,
+ .get = get_prop_pcielinkwidth,
+ .set = set_prop_pcielinkwidth,
+ .set_default_value = qdev_propinfo_set_default_value_enum,
+};
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 8c85e0b648..1fd256dd22 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -1,20 +1,11 @@
#include "qemu/osdep.h"
-#include "qemu/cutils.h"
-#include "net/net.h"
#include "hw/qdev-properties.h"
#include "qapi/error.h"
-#include "hw/pci/pci.h"
-#include "qapi/qapi-types-block.h"
-#include "qapi/qapi-types-machine.h"
#include "qapi/qapi-types-misc.h"
#include "qapi/qmp/qerror.h"
#include "qemu/ctype.h"
#include "qemu/error-report.h"
-#include "qapi/qapi-types-migration.h"
-#include "hw/block/block.h"
-#include "net/hub.h"
#include "qapi/visitor.h"
-#include "chardev/char.h"
#include "qemu/uuid.h"
#include "qdev-prop-internal.h"
@@ -513,89 +504,6 @@ const PropertyInfo qdev_prop_string = {
.set = set_string,
};
-/* --- mac address --- */
-
-/*
- * accepted syntax versions:
- * 01:02:03:04:05:06
- * 01-02-03-04-05-06
- */
-static void get_mac(Object *obj, Visitor *v, const char *name, void *opaque,
- Error **errp)
-{
- DeviceState *dev = DEVICE(obj);
- Property *prop = opaque;
- MACAddr *mac = qdev_get_prop_ptr(dev, prop);
- char buffer[2 * 6 + 5 + 1];
- char *p = buffer;
-
- snprintf(buffer, sizeof(buffer), "%02x:%02x:%02x:%02x:%02x:%02x",
- mac->a[0], mac->a[1], mac->a[2],
- mac->a[3], mac->a[4], mac->a[5]);
-
- visit_type_str(v, name, &p, errp);
-}
-
-static void set_mac(Object *obj, Visitor *v, const char *name, void *opaque,
- Error **errp)
-{
- DeviceState *dev = DEVICE(obj);
- Property *prop = opaque;
- MACAddr *mac = qdev_get_prop_ptr(dev, prop);
- Error *local_err = NULL;
- int i, pos;
- char *str;
- const char *p;
-
- if (dev->realized) {
- qdev_prop_set_after_realize(dev, name, errp);
- return;
- }
-
- visit_type_str(v, name, &str, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
- return;
- }
-
- for (i = 0, pos = 0; i < 6; i++, pos += 3) {
- long val;
-
- if (!qemu_isxdigit(str[pos])) {
- goto inval;
- }
- if (!qemu_isxdigit(str[pos + 1])) {
- goto inval;
- }
- if (i == 5) {
- if (str[pos + 2] != '\0') {
- goto inval;
- }
- } else {
- if (str[pos + 2] != ':' && str[pos + 2] != '-') {
- goto inval;
- }
- }
- if (qemu_strtol(str + pos, &p, 16, &val) < 0 || val > 0xff) {
- goto inval;
- }
- mac->a[i] = val;
- }
- g_free(str);
- return;
-
-inval:
- error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str);
- g_free(str);
-}
-
-const PropertyInfo qdev_prop_macaddr = {
- .name = "str",
- .description = "Ethernet 6-byte MAC Address, example: 52:54:00:12:34:56",
- .get = get_mac,
- .set = set_mac,
-};
-
/* --- on/off/auto --- */
const PropertyInfo qdev_prop_on_off_auto = {
@@ -607,307 +515,6 @@ const PropertyInfo qdev_prop_on_off_auto = {
.set_default_value = qdev_propinfo_set_default_value_enum,
};
-/* --- lost tick policy --- */
-
-QEMU_BUILD_BUG_ON(sizeof(LostTickPolicy) != sizeof(int));
-
-const PropertyInfo qdev_prop_losttickpolicy = {
- .name = "LostTickPolicy",
- .enum_table = &LostTickPolicy_lookup,
- .get = qdev_propinfo_get_enum,
- .set = qdev_propinfo_set_enum,
- .set_default_value = qdev_propinfo_set_default_value_enum,
-};
-
-/* --- Block device error handling policy --- */
-
-QEMU_BUILD_BUG_ON(sizeof(BlockdevOnError) != sizeof(int));
-
-const PropertyInfo qdev_prop_blockdev_on_error = {
- .name = "BlockdevOnError",
- .description = "Error handling policy, "
- "report/ignore/enospc/stop/auto",
- .enum_table = &BlockdevOnError_lookup,
- .get = qdev_propinfo_get_enum,
- .set = qdev_propinfo_set_enum,
- .set_default_value = qdev_propinfo_set_default_value_enum,
-};
-
-/* --- BIOS CHS translation */
-
-QEMU_BUILD_BUG_ON(sizeof(BiosAtaTranslation) != sizeof(int));
-
-const PropertyInfo qdev_prop_bios_chs_trans = {
- .name = "BiosAtaTranslation",
- .description = "Logical CHS translation algorithm, "
- "auto/none/lba/large/rechs",
- .enum_table = &BiosAtaTranslation_lookup,
- .get = qdev_propinfo_get_enum,
- .set = qdev_propinfo_set_enum,
- .set_default_value = qdev_propinfo_set_default_value_enum,
-};
-
-/* --- FDC default drive types */
-
-const PropertyInfo qdev_prop_fdc_drive_type = {
- .name = "FdcDriveType",
- .description = "FDC drive type, "
- "144/288/120/none/auto",
- .enum_table = &FloppyDriveType_lookup,
- .get = qdev_propinfo_get_enum,
- .set = qdev_propinfo_set_enum,
- .set_default_value = qdev_propinfo_set_default_value_enum,
-};
-
-/* --- MultiFDCompression --- */
-
-const PropertyInfo qdev_prop_multifd_compression = {
- .name = "MultiFDCompression",
- .description = "multifd_compression values, "
- "none/zlib/zstd",
- .enum_table = &MultiFDCompression_lookup,
- .get = qdev_propinfo_get_enum,
- .set = qdev_propinfo_set_enum,
- .set_default_value = qdev_propinfo_set_default_value_enum,
-};
-
-/* --- pci address --- */
-
-/*
- * bus-local address, i.e. "$slot" or "$slot.$fn"
- */
-static void set_pci_devfn(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
-{
- DeviceState *dev = DEVICE(obj);
- Property *prop = opaque;
- int32_t value, *ptr = qdev_get_prop_ptr(dev, prop);
- unsigned int slot, fn, n;
- Error *local_err = NULL;
- char *str;
-
- if (dev->realized) {
- qdev_prop_set_after_realize(dev, name, errp);
- return;
- }
-
- visit_type_str(v, name, &str, &local_err);
- if (local_err) {
- error_free(local_err);
- local_err = NULL;
- visit_type_int32(v, name, &value, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
- } else if (value < -1 || value > 255) {
- error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
- name ? name : "null", "pci_devfn");
- } else {
- *ptr = value;
- }
- return;
- }
-
- if (sscanf(str, "%x.%x%n", &slot, &fn, &n) != 2) {
- fn = 0;
- if (sscanf(str, "%x%n", &slot, &n) != 1) {
- goto invalid;
- }
- }
- if (str[n] != '\0' || fn > 7 || slot > 31) {
- goto invalid;
- }
- *ptr = slot << 3 | fn;
- g_free(str);
- return;
-
-invalid:
- error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str);
- g_free(str);
-}
-
-static int print_pci_devfn(DeviceState *dev, Property *prop, char *dest,
- size_t len)
-{
- int32_t *ptr = qdev_get_prop_ptr(dev, prop);
-
- if (*ptr == -1) {
- return snprintf(dest, len, "<unset>");
- } else {
- return snprintf(dest, len, "%02x.%x", *ptr >> 3, *ptr & 7);
- }
-}
-
-const PropertyInfo qdev_prop_pci_devfn = {
- .name = "int32",
- .description = "Slot and optional function number, example: 06.0 or 06",
- .print = print_pci_devfn,
- .get = qdev_propinfo_get_int32,
- .set = set_pci_devfn,
- .set_default_value = qdev_propinfo_set_default_value_uint,
-};
-
-/* --- blocksize --- */
-
-static void set_blocksize(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
-{
- DeviceState *dev = DEVICE(obj);
- Property *prop = opaque;
- uint16_t value, *ptr = qdev_get_prop_ptr(dev, prop);
- Error *local_err = NULL;
- const int64_t min = 512;
- const int64_t max = 32768;
-
- if (dev->realized) {
- qdev_prop_set_after_realize(dev, name, errp);
- return;
- }
-
- visit_type_uint16(v, name, &value, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
- return;
- }
- /* value of 0 means "unset" */
- if (value && (value < min || value > max)) {
- error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE,
- dev->id ? : "", name, (int64_t)value, min, max);
- return;
- }
-
- /* We rely on power-of-2 blocksizes for bitmasks */
- if ((value & (value - 1)) != 0) {
- error_setg(errp,
- "Property %s.%s doesn't take value '%" PRId64 "', "
- "it's not a power of 2", dev->id ?: "", name, (int64_t)value);
- return;
- }
-
- *ptr = value;
-}
-
-const PropertyInfo qdev_prop_blocksize = {
- .name = "uint16",
- .description = "A power of two between 512 and 32768",
- .get = qdev_propinfo_get_uint16,
- .set = set_blocksize,
- .set_default_value = qdev_propinfo_set_default_value_uint,
-};
-
-/* --- pci host address --- */
-
-static void get_pci_host_devaddr(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
-{
- DeviceState *dev = DEVICE(obj);
- Property *prop = opaque;
- PCIHostDeviceAddress *addr = qdev_get_prop_ptr(dev, prop);
- char buffer[] = "ffff:ff:ff.f";
- char *p = buffer;
- int rc = 0;
-
- /*
- * Catch "invalid" device reference from vfio-pci and allow the
- * default buffer representing the non-existent device to be used.
- */
- if (~addr->domain || ~addr->bus || ~addr->slot || ~addr->function) {
- rc = snprintf(buffer, sizeof(buffer), "%04x:%02x:%02x.%0d",
- addr->domain, addr->bus, addr->slot, addr->function);
- assert(rc == sizeof(buffer) - 1);
- }
-
- visit_type_str(v, name, &p, errp);
-}
-
-/*
- * Parse [<domain>:]<bus>:<slot>.<func>
- * if <domain> is not supplied, it's assumed to be 0.
- */
-static void set_pci_host_devaddr(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
-{
- DeviceState *dev = DEVICE(obj);
- Property *prop = opaque;
- PCIHostDeviceAddress *addr = qdev_get_prop_ptr(dev, prop);
- Error *local_err = NULL;
- char *str, *p;
- const char *e;
- unsigned long val;
- unsigned long dom = 0, bus = 0;
- unsigned long slot = 0, func = 0;
-
- if (dev->realized) {
- qdev_prop_set_after_realize(dev, name, errp);
- return;
- }
-
- visit_type_str(v, name, &str, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
- return;
- }
-
- p = str;
- if (qemu_strtoul(p, &e, 16, &val) < 0) {
- goto inval;
- }
- if (*e != ':') {
- goto inval;
- }
- bus = val;
-
- p = (char *)e + 1;
- if (qemu_strtoul(p, &e, 16, &val) < 0) {
- goto inval;
- }
- if (*e == ':') {
- dom = bus;
- bus = val;
- p = (char *)e + 1;
- if (qemu_strtoul(p, &e, 16, &val) < 0) {
- goto inval;
- }
- }
- slot = val;
-
- if (*e != '.') {
- goto inval;
- }
- p = (char *)e + 1;
- if (qemu_strtoul(p, &e, 10, &val) < 0) {
- goto inval;
- }
- func = val;
-
- if (dom > 0xffff || bus > 0xff || slot > 0x1f || func > 7) {
- goto inval;
- }
-
- if (*e) {
- goto inval;
- }
-
- addr->domain = dom;
- addr->bus = bus;
- addr->slot = slot;
- addr->function = func;
-
- g_free(str);
- return;
-
-inval:
- error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str);
- g_free(str);
-}
-
-const PropertyInfo qdev_prop_pci_host_devaddr = {
- .name = "str",
- .description = "Address (bus/device/function) of "
- "the host device, example: 04:10.0",
- .get = get_pci_host_devaddr,
- .set = set_pci_host_devaddr,
-};
-
/* --- UUID --- */
static void get_uuid(Object *obj, Visitor *v, const char *name, void *opaque,
@@ -1167,16 +774,6 @@ void qdev_prop_set_string(DeviceState *dev, const char *name, const char *value)
object_property_set_str(OBJECT(dev), value, name, &error_abort);
}
-void qdev_prop_set_macaddr(DeviceState *dev, const char *name,
- const uint8_t *value)
-{
- char str[2 * 6 + 5 + 1];
- snprintf(str, sizeof(str), "%02x:%02x:%02x:%02x:%02x:%02x",
- value[0], value[1], value[2], value[3], value[4], value[5]);
-
- object_property_set_str(OBJECT(dev), str, name, &error_abort);
-}
-
void qdev_prop_set_enum(DeviceState *dev, const char *name, int value)
{
Property *prop;
@@ -1285,190 +882,3 @@ const PropertyInfo qdev_prop_link = {
.name = "link",
.create = create_link_property,
};
-
-/* --- OffAutoPCIBAR off/auto/bar0/bar1/bar2/bar3/bar4/bar5 --- */
-
-const PropertyInfo qdev_prop_off_auto_pcibar = {
- .name = "OffAutoPCIBAR",
- .description = "off/auto/bar0/bar1/bar2/bar3/bar4/bar5",
- .enum_table = &OffAutoPCIBAR_lookup,
- .get = qdev_propinfo_get_enum,
- .set = qdev_propinfo_set_enum,
- .set_default_value = qdev_propinfo_set_default_value_enum,
-};
-
-/* --- PCIELinkSpeed 2_5/5/8/16 -- */
-
-static void get_prop_pcielinkspeed(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
-{
- DeviceState *dev = DEVICE(obj);
- Property *prop = opaque;
- PCIExpLinkSpeed *p = qdev_get_prop_ptr(dev, prop);
- int speed;
-
- switch (*p) {
- case QEMU_PCI_EXP_LNK_2_5GT:
- speed = PCIE_LINK_SPEED_2_5;
- break;
- case QEMU_PCI_EXP_LNK_5GT:
- speed = PCIE_LINK_SPEED_5;
- break;
- case QEMU_PCI_EXP_LNK_8GT:
- speed = PCIE_LINK_SPEED_8;
- break;
- case QEMU_PCI_EXP_LNK_16GT:
- speed = PCIE_LINK_SPEED_16;
- break;
- default:
- /* Unreachable */
- abort();
- }
-
- visit_type_enum(v, prop->name, &speed, prop->info->enum_table, errp);
-}
-
-static void set_prop_pcielinkspeed(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
-{
- DeviceState *dev = DEVICE(obj);
- Property *prop = opaque;
- PCIExpLinkSpeed *p = qdev_get_prop_ptr(dev, prop);
- int speed;
- Error *local_err = NULL;
-
- if (dev->realized) {
- qdev_prop_set_after_realize(dev, name, errp);
- return;
- }
-
- visit_type_enum(v, prop->name, &speed, prop->info->enum_table, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
- return;
- }
-
- switch (speed) {
- case PCIE_LINK_SPEED_2_5:
- *p = QEMU_PCI_EXP_LNK_2_5GT;
- break;
- case PCIE_LINK_SPEED_5:
- *p = QEMU_PCI_EXP_LNK_5GT;
- break;
- case PCIE_LINK_SPEED_8:
- *p = QEMU_PCI_EXP_LNK_8GT;
- break;
- case PCIE_LINK_SPEED_16:
- *p = QEMU_PCI_EXP_LNK_16GT;
- break;
- default:
- /* Unreachable */
- abort();
- }
-}
-
-const PropertyInfo qdev_prop_pcie_link_speed = {
- .name = "PCIELinkSpeed",
- .description = "2_5/5/8/16",
- .enum_table = &PCIELinkSpeed_lookup,
- .get = get_prop_pcielinkspeed,
- .set = set_prop_pcielinkspeed,
- .set_default_value = qdev_propinfo_set_default_value_enum,
-};
-
-/* --- PCIELinkWidth 1/2/4/8/12/16/32 -- */
-
-static void get_prop_pcielinkwidth(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
-{
- DeviceState *dev = DEVICE(obj);
- Property *prop = opaque;
- PCIExpLinkWidth *p = qdev_get_prop_ptr(dev, prop);
- int width;
-
- switch (*p) {
- case QEMU_PCI_EXP_LNK_X1:
- width = PCIE_LINK_WIDTH_1;
- break;
- case QEMU_PCI_EXP_LNK_X2:
- width = PCIE_LINK_WIDTH_2;
- break;
- case QEMU_PCI_EXP_LNK_X4:
- width = PCIE_LINK_WIDTH_4;
- break;
- case QEMU_PCI_EXP_LNK_X8:
- width = PCIE_LINK_WIDTH_8;
- break;
- case QEMU_PCI_EXP_LNK_X12:
- width = PCIE_LINK_WIDTH_12;
- break;
- case QEMU_PCI_EXP_LNK_X16:
- width = PCIE_LINK_WIDTH_16;
- break;
- case QEMU_PCI_EXP_LNK_X32:
- width = PCIE_LINK_WIDTH_32;
- break;
- default:
- /* Unreachable */
- abort();
- }
-
- visit_type_enum(v, prop->name, &width, prop->info->enum_table, errp);
-}
-
-static void set_prop_pcielinkwidth(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
-{
- DeviceState *dev = DEVICE(obj);
- Property *prop = opaque;
- PCIExpLinkWidth *p = qdev_get_prop_ptr(dev, prop);
- int width;
- Error *local_err = NULL;
-
- if (dev->realized) {
- qdev_prop_set_after_realize(dev, name, errp);
- return;
- }
-
- visit_type_enum(v, prop->name, &width, prop->info->enum_table, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
- return;
- }
-
- switch (width) {
- case PCIE_LINK_WIDTH_1:
- *p = QEMU_PCI_EXP_LNK_X1;
- break;
- case PCIE_LINK_WIDTH_2:
- *p = QEMU_PCI_EXP_LNK_X2;
- break;
- case PCIE_LINK_WIDTH_4:
- *p = QEMU_PCI_EXP_LNK_X4;
- break;
- case PCIE_LINK_WIDTH_8:
- *p = QEMU_PCI_EXP_LNK_X8;
- break;
- case PCIE_LINK_WIDTH_12:
- *p = QEMU_PCI_EXP_LNK_X12;
- break;
- case PCIE_LINK_WIDTH_16:
- *p = QEMU_PCI_EXP_LNK_X16;
- break;
- case PCIE_LINK_WIDTH_32:
- *p = QEMU_PCI_EXP_LNK_X32;
- break;
- default:
- /* Unreachable */
- abort();
- }
-}
-
-const PropertyInfo qdev_prop_pcie_link_width = {
- .name = "PCIELinkWidth",
- .description = "1/2/4/8/12/16/32",
- .enum_table = &PCIELinkWidth_lookup,
- .get = get_prop_pcielinkwidth,
- .set = set_prop_pcielinkwidth,
- .set_default_value = qdev_propinfo_set_default_value_enum,
-};
--
2.21.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 8/9] hw/core: Add qdev stub for user-mode
2020-03-16 0:11 [PATCH v2 0/9] user-mode: Prune build dependencies (part 3) Philippe Mathieu-Daudé
` (6 preceding siblings ...)
2020-03-16 0:11 ` [PATCH v2 7/9] hw/core/qdev-properties: Extract system-mode specific properties Philippe Mathieu-Daudé
@ 2020-03-16 0:11 ` Philippe Mathieu-Daudé
2020-03-16 18:56 ` Richard Henderson
2020-03-16 0:11 ` [PATCH v2 9/9] qapi: Restrict code generated " Philippe Mathieu-Daudé
2020-03-18 8:25 ` [PATCH v2 0/9] user-mode: Prune build dependencies (part 3) Philippe Mathieu-Daudé
9 siblings, 1 reply; 13+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-03-16 0:11 UTC (permalink / raw)
To: qemu-devel
Cc: Daniel P. Berrangé, Eduardo Habkost, Michael Roth,
Markus Armbruster, Paolo Bonzini, Philippe Mathieu-Daudé
While user-mode does not use peripherals (devices), it uses a
CPU which is a device.
In the next commit we will reduce the QAPI generated code for
user-mode. Since qdev.c calls qapi_event_send_device_deleted(),
let's add a stub for it.
Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
v2: use common-obj-$(CONFIG_ALL) (Paolo)
---
hw/core/qdev-stubs.c | 20 ++++++++++++++++++++
hw/core/Makefile.objs | 3 +++
2 files changed, 23 insertions(+)
create mode 100644 hw/core/qdev-stubs.c
diff --git a/hw/core/qdev-stubs.c b/hw/core/qdev-stubs.c
new file mode 100644
index 0000000000..0819dcba12
--- /dev/null
+++ b/hw/core/qdev-stubs.c
@@ -0,0 +1,20 @@
+/*
+ * QAPI qdev stubs
+ *
+ * Copyright (c) 2020 Red Hat, Inc.
+ *
+ * Author:
+ * Philippe Mathieu-Daudé <philmd@redhat.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "qemu/osdep.h"
+#include "qapi/qapi-events-qdev.h"
+
+void qapi_event_send_device_deleted(bool has_device,
+ const char *device, const char *path)
+{
+}
diff --git a/hw/core/Makefile.objs b/hw/core/Makefile.objs
index 6215e7c208..9f874a8840 100644
--- a/hw/core/Makefile.objs
+++ b/hw/core/Makefile.objs
@@ -31,3 +31,6 @@ common-obj-$(CONFIG_OR_IRQ) += or-irq.o
common-obj-$(CONFIG_SPLIT_IRQ) += split-irq.o
common-obj-$(CONFIG_PLATFORM_BUS) += platform-bus.o
common-obj-$(CONFIG_GENERIC_LOADER) += generic-loader.o
+
+common-obj-$(call lnot,$(CONFIG_SOFTMMU)) += qdev-stubs.o
+common-obj-$(CONFIG_ALL) += qdev-stubs.o
--
2.21.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 9/9] qapi: Restrict code generated for user-mode
2020-03-16 0:11 [PATCH v2 0/9] user-mode: Prune build dependencies (part 3) Philippe Mathieu-Daudé
` (7 preceding siblings ...)
2020-03-16 0:11 ` [PATCH v2 8/9] hw/core: Add qdev stub for user-mode Philippe Mathieu-Daudé
@ 2020-03-16 0:11 ` Philippe Mathieu-Daudé
2020-03-18 8:25 ` [PATCH v2 0/9] user-mode: Prune build dependencies (part 3) Philippe Mathieu-Daudé
9 siblings, 0 replies; 13+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-03-16 0:11 UTC (permalink / raw)
To: qemu-devel
Cc: Daniel P. Berrangé, Eduardo Habkost, Richard Henderson,
Michael Roth, Markus Armbruster, Paolo Bonzini,
Philippe Mathieu-Daudé
A lot of QAPI generated code is never used by user-mode.
Rewrite the QAPI_COMMON_MODULES variable one entry per line,
and split it in 3 groups:
- always used
- use by system-mode or tools
- only used by system-mode
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
qapi/Makefile.objs | 37 +++++++++++++++++++++++++++++++++----
1 file changed, 33 insertions(+), 4 deletions(-)
diff --git a/qapi/Makefile.objs b/qapi/Makefile.objs
index 4673ab7490..18435db426 100644
--- a/qapi/Makefile.objs
+++ b/qapi/Makefile.objs
@@ -5,11 +5,40 @@ util-obj-y += opts-visitor.o qapi-clone-visitor.o
util-obj-y += qmp-event.o
util-obj-y += qapi-util.o
-QAPI_COMMON_MODULES = audio authz block-core block char common control crypto
-QAPI_COMMON_MODULES += dump error introspect job machine migration misc
-QAPI_COMMON_MODULES += net pragma qdev qom rdma rocker run-state sockets tpm
-QAPI_COMMON_MODULES += trace transaction ui
+QAPI_COMMON_MODULES = common
+QAPI_COMMON_MODULES += introspect
+QAPI_COMMON_MODULES += misc
+
+ifeq ($(CONFIG_SOFTMMU),y)
+QAPI_COMMON_MODULES += audio
+QAPI_COMMON_MODULES += dump
+QAPI_COMMON_MODULES += machine
+QAPI_COMMON_MODULES += migration
+QAPI_COMMON_MODULES += net rocker
+QAPI_COMMON_MODULES += qdev
+QAPI_COMMON_MODULES += rdma
+QAPI_COMMON_MODULES += tpm
+QAPI_COMMON_MODULES += trace
+QAPI_COMMON_MODULES += ui
QAPI_TARGET_MODULES = machine-target misc-target
+endif # CONFIG_SOFTMMU
+
+ifeq ($(call lor,$(CONFIG_SOFTMMU),$(CONFIG_TOOLS)),y)
+QAPI_COMMON_MODULES += authz
+QAPI_COMMON_MODULES += block
+QAPI_COMMON_MODULES += block-core
+QAPI_COMMON_MODULES += char
+QAPI_COMMON_MODULES += control
+QAPI_COMMON_MODULES += crypto
+QAPI_COMMON_MODULES += error
+QAPI_COMMON_MODULES += job
+QAPI_COMMON_MODULES += pragma
+QAPI_COMMON_MODULES += qom
+QAPI_COMMON_MODULES += run-state
+QAPI_COMMON_MODULES += sockets
+QAPI_COMMON_MODULES += transaction
+endif # CONFIG_SOFTMMU || CONFIG_TOOLS
+
QAPI_MODULES = $(QAPI_COMMON_MODULES) $(QAPI_TARGET_MODULES)
util-obj-y += qapi-builtin-types.o
--
2.21.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v2 2/9] hw/core/qdev-properties: Use qemu_strtoul() in set_pci_host_devaddr()
2020-03-16 0:11 ` [PATCH v2 2/9] hw/core/qdev-properties: Use qemu_strtoul() in set_pci_host_devaddr() Philippe Mathieu-Daudé
@ 2020-03-16 18:39 ` Richard Henderson
0 siblings, 0 replies; 13+ messages in thread
From: Richard Henderson @ 2020-03-16 18:39 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel
Cc: Markus Armbruster, Paolo Bonzini, Daniel P. Berrangé,
Eduardo Habkost, Michael Roth
On 3/15/20 5:11 PM, Philippe Mathieu-Daudé wrote:
> Replace strtoul() by qemu_strtoul() so checkpatch.pl won't
> complain if we move this code later. Increase the slot and
> func local variables to unsigned long so that the range check
> isn't truncated. Remove the 'e == p' test which is done in
> check_strtox_error(), called by qemu_strtoul().
>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> ---
> v2: drop the e == p test, do not do modify range check (rth)
> ---
> hw/core/qdev-properties.c | 25 ++++++++++++-------------
> 1 file changed, 12 insertions(+), 13 deletions(-)
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 8/9] hw/core: Add qdev stub for user-mode
2020-03-16 0:11 ` [PATCH v2 8/9] hw/core: Add qdev stub for user-mode Philippe Mathieu-Daudé
@ 2020-03-16 18:56 ` Richard Henderson
0 siblings, 0 replies; 13+ messages in thread
From: Richard Henderson @ 2020-03-16 18:56 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel
Cc: Markus Armbruster, Paolo Bonzini, Daniel P. Berrangé,
Eduardo Habkost, Michael Roth
On 3/15/20 5:11 PM, Philippe Mathieu-Daudé wrote:
> While user-mode does not use peripherals (devices), it uses a
> CPU which is a device.
> In the next commit we will reduce the QAPI generated code for
> user-mode. Since qdev.c calls qapi_event_send_device_deleted(),
> let's add a stub for it.
>
> Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> ---
> v2: use common-obj-$(CONFIG_ALL) (Paolo)
> ---
> hw/core/qdev-stubs.c | 20 ++++++++++++++++++++
> hw/core/Makefile.objs | 3 +++
> 2 files changed, 23 insertions(+)
> create mode 100644 hw/core/qdev-stubs.c
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 0/9] user-mode: Prune build dependencies (part 3)
2020-03-16 0:11 [PATCH v2 0/9] user-mode: Prune build dependencies (part 3) Philippe Mathieu-Daudé
` (8 preceding siblings ...)
2020-03-16 0:11 ` [PATCH v2 9/9] qapi: Restrict code generated " Philippe Mathieu-Daudé
@ 2020-03-18 8:25 ` Philippe Mathieu-Daudé
9 siblings, 0 replies; 13+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-03-18 8:25 UTC (permalink / raw)
To: qemu-devel
Cc: Michael Roth, Paolo Bonzini, Daniel P. Berrangé,
Eduardo Habkost, Markus Armbruster
Hi Eduardo,
On 3/16/20 1:11 AM, Philippe Mathieu-Daudé wrote:
> This is the second part of a series reducing user-mode
> dependencies. By stripping out unused code, the build
> and testing time is reduced (as is space used by objects).
>
> Part 3:
> - Extract code not related to user-mode from hw/core/qdev-properties.c
> - Reduce user-mode QAPI generated files
>
> Since v1:
> - Addressed Richard and Paolo review comments
>
> Patch missing review: #2 'Use qemu_strtoul() in set_pci_host_devaddr()'
>
> v1: https://www.mail-archive.com/qemu-devel@nongnu.org/msg688486.html
>
> full series available at:
> repo: https://github.com/philmd/qemu/
> branch: usermode_pruning-v2
>
> Based-on: <20200316000348.29692-1-philmd@redhat.com>
>
> Philippe Mathieu-Daudé (9):
> hw/core/qdev-properties: Use qemu_strtol() in set_mac() handler
> hw/core/qdev-properties: Use qemu_strtoul() in set_pci_host_devaddr()
> hw/core/qdev-properties: Fix code style
> hw/core/qdev-properties: Export enum-related functions
> hw/core/qdev-properties: Export qdev_prop_enum
> hw/core/qdev-properties: Export some integer-related functions
> hw/core/qdev-properties: Extract system-mode specific properties
If you have to respin "x86 and machine queue" please consider including
reviewed patches 1-7 :)
> hw/core: Add qdev stub for user-mode
> qapi: Restrict code generated for user-mode
>
> hw/core/qdev-prop-internal.h | 28 ++
> include/hw/qdev-properties.h | 1 +
> hw/core/qdev-properties-system.c | 602 ++++++++++++++++++++++++++++-
> hw/core/qdev-properties.c | 643 ++-----------------------------
> hw/core/qdev-stubs.c | 20 +
> hw/core/Makefile.objs | 3 +
> qapi/Makefile.objs | 37 +-
> 7 files changed, 714 insertions(+), 620 deletions(-)
> create mode 100644 hw/core/qdev-prop-internal.h
> create mode 100644 hw/core/qdev-stubs.c
>
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2020-03-18 8:26 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-03-16 0:11 [PATCH v2 0/9] user-mode: Prune build dependencies (part 3) Philippe Mathieu-Daudé
2020-03-16 0:11 ` [PATCH v2 1/9] hw/core/qdev-properties: Use qemu_strtol() in set_mac() handler Philippe Mathieu-Daudé
2020-03-16 0:11 ` [PATCH v2 2/9] hw/core/qdev-properties: Use qemu_strtoul() in set_pci_host_devaddr() Philippe Mathieu-Daudé
2020-03-16 18:39 ` Richard Henderson
2020-03-16 0:11 ` [PATCH v2 3/9] hw/core/qdev-properties: Fix code style Philippe Mathieu-Daudé
2020-03-16 0:11 ` [PATCH v2 4/9] hw/core/qdev-properties: Export enum-related functions Philippe Mathieu-Daudé
2020-03-16 0:11 ` [PATCH v2 5/9] hw/core/qdev-properties: Export qdev_prop_enum Philippe Mathieu-Daudé
2020-03-16 0:11 ` [PATCH v2 6/9] hw/core/qdev-properties: Export some integer-related functions Philippe Mathieu-Daudé
2020-03-16 0:11 ` [PATCH v2 7/9] hw/core/qdev-properties: Extract system-mode specific properties Philippe Mathieu-Daudé
2020-03-16 0:11 ` [PATCH v2 8/9] hw/core: Add qdev stub for user-mode Philippe Mathieu-Daudé
2020-03-16 18:56 ` Richard Henderson
2020-03-16 0:11 ` [PATCH v2 9/9] qapi: Restrict code generated " Philippe Mathieu-Daudé
2020-03-18 8:25 ` [PATCH v2 0/9] user-mode: Prune build dependencies (part 3) Philippe Mathieu-Daudé
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).