mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 07:43:54 -06:00
QOM infrastructure fixes and device conversions
* QTest cleanups and test cases for PCI NICs * NAND fix for "info qtree" * Cleanup and extension of QOM machine tests * IndustryPack test cases and conversion to QOM realize * I2C cleanups * Cleanups of legacy qdev properties -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAABAgAGBQJTAooJAAoJEPou0S0+fgE/SuQQALW3zvra4ZLRAQV0e8kFoyj1 vVtmLkDhnCe4cYfxxfOX91NA0rH1ts2EO1+UcnaCHJlptNWfA+8qJW69XgYpHE3c DKQlKPL/9pV5ywY5uUw/t1UJHg2BfrLBDDM4lP+vrpwiQYq4kp24JffnhfY3l9MA 9qdkXu1HrlWoLRVGnMyGDXI8cb+5bTL+FEc6UuHl3P89/gj5BV+LDWn0QOFbAkxq 4wk+Xh6sHKcfOdq6vMCNGlTjlJnpbY43D1a8+q6hFGG8JBlpne7Oer7bse9k4uTK q/CzyNzC0lnjjcULpa4ptRlycH0ruD9DPY7Lco9XqYd3l/c9742PmTEqN5TZseKD XD7+hwT1tk7W8rihm8KETCP6sKlXz4w8tJiWe6IT3zwRzvXIolxxK93heQuaX73Z HFDmvTPVLUiWF8ftKTyWZM3w+jsbSH0QSrMCIHKJrPTRWTKphx0DUP74lWjNsvGs FFBjpAgrflLihxiuRrcLmekGn0xCTjhQWIo2GoiWTgLSEHNQQQUNO+15/kcU/vlI hh3DJpiBKeSnUapHHL0OEK6ryeHoG95akiRjImwWVthNLk4KEuWtlhFPYBtulO5A PA02trE4Ah769effX0ZYdNl23KbW4VxpZ8VZv+kp7RTrDKxw551HoEFJ5ja0nkvB O1CfsE7x0GH/Rbi/Hxhu =KRcc -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/afaerber/tags/qom-devices-for-peter' into staging QOM infrastructure fixes and device conversions * QTest cleanups and test cases for PCI NICs * NAND fix for "info qtree" * Cleanup and extension of QOM machine tests * IndustryPack test cases and conversion to QOM realize * I2C cleanups * Cleanups of legacy qdev properties # gpg: Signature made Mon 17 Feb 2014 22:15:37 GMT using RSA key ID 3E7E013F # gpg: Good signature from "Andreas Färber <afaerber@suse.de>" # gpg: aka "Andreas Färber <afaerber@suse.com>" * remotes/afaerber/tags/qom-devices-for-peter: (49 commits) qtest: Include system headers before user headers qapi: Refine human printing of sizes qdev: Use QAPI type names for properties qdev: Add enum property types to QAPI schema block: Handle "rechs" and "large" translation options qdev: Remove hex8/32/64 property types qdev: Remove most legacy printers qdev: Use human mode in "info qtree" qapi: Add human mode to StringOutputVisitor qdev: Inline qdev_prop_parse() qdev: Legacy properties are just strings qdev: Legacy properties are now read-only qdev: Remove legacy parsers for hex8/32/64 qdev: Sizes are now parsed by StringInputVisitor qapi: Add size parser to StringInputVisitor qtest: Don't segfault with invalid -qtest option ipack: Move IndustryPack out of hw/char/ ipoctal232: QOM parent field cleanup ipack: QOM parent field cleanup for IPackDevice ipack: QOM parent field cleanup for IPackBus ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
61e8a92364
124 changed files with 1049 additions and 865 deletions
|
@ -109,7 +109,8 @@ static void set_drive(Object *obj, Visitor *v, void *opaque,
|
|||
}
|
||||
|
||||
PropertyInfo qdev_prop_drive = {
|
||||
.name = "drive",
|
||||
.name = "str",
|
||||
.legacy_name = "drive",
|
||||
.get = get_drive,
|
||||
.set = set_drive,
|
||||
.release = release_drive,
|
||||
|
@ -164,7 +165,8 @@ static void set_chr(Object *obj, Visitor *v, void *opaque,
|
|||
}
|
||||
|
||||
PropertyInfo qdev_prop_chr = {
|
||||
.name = "chr",
|
||||
.name = "str",
|
||||
.legacy_name = "chr",
|
||||
.get = get_chr,
|
||||
.set = set_chr,
|
||||
.release = release_chr,
|
||||
|
@ -242,7 +244,8 @@ static void set_netdev(Object *obj, Visitor *v, void *opaque,
|
|||
}
|
||||
|
||||
PropertyInfo qdev_prop_netdev = {
|
||||
.name = "netdev",
|
||||
.name = "str",
|
||||
.legacy_name = "netdev",
|
||||
.get = get_netdev,
|
||||
.set = set_netdev,
|
||||
};
|
||||
|
@ -321,7 +324,8 @@ static void set_vlan(Object *obj, Visitor *v, void *opaque,
|
|||
}
|
||||
|
||||
PropertyInfo qdev_prop_vlan = {
|
||||
.name = "vlan",
|
||||
.name = "int32",
|
||||
.legacy_name = "vlan",
|
||||
.print = print_vlan,
|
||||
.get = get_vlan,
|
||||
.set = set_vlan,
|
||||
|
|
|
@ -74,13 +74,6 @@ static void bit_prop_set(DeviceState *dev, Property *props, bool val)
|
|||
}
|
||||
}
|
||||
|
||||
static int prop_print_bit(DeviceState *dev, Property *prop, char *dest,
|
||||
size_t len)
|
||||
{
|
||||
uint32_t *p = qdev_get_prop_ptr(dev, prop);
|
||||
return snprintf(dest, len, (*p & qdev_get_prop_mask(prop)) ? "on" : "off");
|
||||
}
|
||||
|
||||
static void prop_get_bit(Object *obj, Visitor *v, void *opaque,
|
||||
const char *name, Error **errp)
|
||||
{
|
||||
|
@ -114,9 +107,8 @@ static void prop_set_bit(Object *obj, Visitor *v, void *opaque,
|
|||
}
|
||||
|
||||
PropertyInfo qdev_prop_bit = {
|
||||
.name = "boolean",
|
||||
.name = "bool",
|
||||
.legacy_name = "on/off",
|
||||
.print = prop_print_bit,
|
||||
.get = prop_get_bit,
|
||||
.set = prop_set_bit,
|
||||
};
|
||||
|
@ -149,7 +141,7 @@ static void set_bool(Object *obj, Visitor *v, void *opaque,
|
|||
}
|
||||
|
||||
PropertyInfo qdev_prop_bool = {
|
||||
.name = "boolean",
|
||||
.name = "bool",
|
||||
.get = get_bool,
|
||||
.set = set_bool,
|
||||
};
|
||||
|
@ -187,40 +179,6 @@ PropertyInfo qdev_prop_uint8 = {
|
|||
.set = set_uint8,
|
||||
};
|
||||
|
||||
/* --- 8bit hex value --- */
|
||||
|
||||
static int parse_hex8(DeviceState *dev, Property *prop, const char *str)
|
||||
{
|
||||
uint8_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
char *end;
|
||||
|
||||
if (str[0] != '0' || str[1] != 'x') {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
*ptr = strtoul(str, &end, 16);
|
||||
if ((*end != '\0') || (end == str)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int print_hex8(DeviceState *dev, Property *prop, char *dest, size_t len)
|
||||
{
|
||||
uint8_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
return snprintf(dest, len, "0x%" PRIx8, *ptr);
|
||||
}
|
||||
|
||||
PropertyInfo qdev_prop_hex8 = {
|
||||
.name = "uint8",
|
||||
.legacy_name = "hex8",
|
||||
.parse = parse_hex8,
|
||||
.print = print_hex8,
|
||||
.get = get_uint8,
|
||||
.set = set_uint8,
|
||||
};
|
||||
|
||||
/* --- 16bit integer --- */
|
||||
|
||||
static void get_uint16(Object *obj, Visitor *v, void *opaque,
|
||||
|
@ -318,40 +276,6 @@ PropertyInfo qdev_prop_int32 = {
|
|||
.set = set_int32,
|
||||
};
|
||||
|
||||
/* --- 32bit hex value --- */
|
||||
|
||||
static int parse_hex32(DeviceState *dev, Property *prop, const char *str)
|
||||
{
|
||||
uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
char *end;
|
||||
|
||||
if (str[0] != '0' || str[1] != 'x') {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
*ptr = strtoul(str, &end, 16);
|
||||
if ((*end != '\0') || (end == str)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int print_hex32(DeviceState *dev, Property *prop, char *dest, size_t len)
|
||||
{
|
||||
uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
return snprintf(dest, len, "0x%" PRIx32, *ptr);
|
||||
}
|
||||
|
||||
PropertyInfo qdev_prop_hex32 = {
|
||||
.name = "uint32",
|
||||
.legacy_name = "hex32",
|
||||
.parse = parse_hex32,
|
||||
.print = print_hex32,
|
||||
.get = get_uint32,
|
||||
.set = set_uint32,
|
||||
};
|
||||
|
||||
/* --- 64bit integer --- */
|
||||
|
||||
static void get_uint64(Object *obj, Visitor *v, void *opaque,
|
||||
|
@ -385,40 +309,6 @@ PropertyInfo qdev_prop_uint64 = {
|
|||
.set = set_uint64,
|
||||
};
|
||||
|
||||
/* --- 64bit hex value --- */
|
||||
|
||||
static int parse_hex64(DeviceState *dev, Property *prop, const char *str)
|
||||
{
|
||||
uint64_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
char *end;
|
||||
|
||||
if (str[0] != '0' || str[1] != 'x') {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
*ptr = strtoull(str, &end, 16);
|
||||
if ((*end != '\0') || (end == str)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int print_hex64(DeviceState *dev, Property *prop, char *dest, size_t len)
|
||||
{
|
||||
uint64_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
return snprintf(dest, len, "0x%" PRIx64, *ptr);
|
||||
}
|
||||
|
||||
PropertyInfo qdev_prop_hex64 = {
|
||||
.name = "uint64",
|
||||
.legacy_name = "hex64",
|
||||
.parse = parse_hex64,
|
||||
.print = print_hex64,
|
||||
.get = get_uint64,
|
||||
.set = set_uint64,
|
||||
};
|
||||
|
||||
/* --- string --- */
|
||||
|
||||
static void release_string(Object *obj, const char *name, void *opaque)
|
||||
|
@ -427,16 +317,6 @@ static void release_string(Object *obj, const char *name, void *opaque)
|
|||
g_free(*(char **)qdev_get_prop_ptr(DEVICE(obj), prop));
|
||||
}
|
||||
|
||||
static int print_string(DeviceState *dev, Property *prop, char *dest,
|
||||
size_t len)
|
||||
{
|
||||
char **ptr = qdev_get_prop_ptr(dev, prop);
|
||||
if (!*ptr) {
|
||||
return snprintf(dest, len, "<null>");
|
||||
}
|
||||
return snprintf(dest, len, "\"%s\"", *ptr);
|
||||
}
|
||||
|
||||
static void get_string(Object *obj, Visitor *v, void *opaque,
|
||||
const char *name, Error **errp)
|
||||
{
|
||||
|
@ -478,8 +358,7 @@ static void set_string(Object *obj, Visitor *v, void *opaque,
|
|||
}
|
||||
|
||||
PropertyInfo qdev_prop_string = {
|
||||
.name = "string",
|
||||
.print = print_string,
|
||||
.name = "str",
|
||||
.release = release_string,
|
||||
.get = get_string,
|
||||
.set = set_string,
|
||||
|
@ -563,41 +442,31 @@ inval:
|
|||
}
|
||||
|
||||
PropertyInfo qdev_prop_macaddr = {
|
||||
.name = "macaddr",
|
||||
.name = "str",
|
||||
.legacy_name = "macaddr",
|
||||
.get = get_mac,
|
||||
.set = set_mac,
|
||||
};
|
||||
|
||||
/* --- lost tick policy --- */
|
||||
|
||||
static const char *lost_tick_policy_table[LOST_TICK_MAX+1] = {
|
||||
[LOST_TICK_DISCARD] = "discard",
|
||||
[LOST_TICK_DELAY] = "delay",
|
||||
[LOST_TICK_MERGE] = "merge",
|
||||
[LOST_TICK_SLEW] = "slew",
|
||||
[LOST_TICK_MAX] = NULL,
|
||||
};
|
||||
|
||||
QEMU_BUILD_BUG_ON(sizeof(LostTickPolicy) != sizeof(int));
|
||||
|
||||
PropertyInfo qdev_prop_losttickpolicy = {
|
||||
.name = "LostTickPolicy",
|
||||
.enum_table = lost_tick_policy_table,
|
||||
.enum_table = LostTickPolicy_lookup,
|
||||
.get = get_enum,
|
||||
.set = set_enum,
|
||||
};
|
||||
|
||||
/* --- BIOS CHS translation */
|
||||
|
||||
static const char *bios_chs_trans_table[] = {
|
||||
[BIOS_ATA_TRANSLATION_AUTO] = "auto",
|
||||
[BIOS_ATA_TRANSLATION_NONE] = "none",
|
||||
[BIOS_ATA_TRANSLATION_LBA] = "lba",
|
||||
};
|
||||
QEMU_BUILD_BUG_ON(sizeof(BiosAtaTranslation) != sizeof(int));
|
||||
|
||||
PropertyInfo qdev_prop_bios_chs_trans = {
|
||||
.name = "bios-chs-trans",
|
||||
.enum_table = bios_chs_trans_table,
|
||||
.name = "BiosAtaTranslation",
|
||||
.legacy_name = "bios-chs-trans",
|
||||
.enum_table = BiosAtaTranslation_lookup,
|
||||
.get = get_enum,
|
||||
.set = set_enum,
|
||||
};
|
||||
|
@ -715,7 +584,8 @@ static void set_blocksize(Object *obj, Visitor *v, void *opaque,
|
|||
}
|
||||
|
||||
PropertyInfo qdev_prop_blocksize = {
|
||||
.name = "blocksize",
|
||||
.name = "uint16",
|
||||
.legacy_name = "blocksize",
|
||||
.get = get_uint16,
|
||||
.set = set_blocksize,
|
||||
};
|
||||
|
@ -822,7 +692,8 @@ inval:
|
|||
}
|
||||
|
||||
PropertyInfo qdev_prop_pci_host_devaddr = {
|
||||
.name = "pci-host-devaddr",
|
||||
.name = "str",
|
||||
.legacy_name = "pci-host-devaddr",
|
||||
.get = get_pci_host_devaddr,
|
||||
.set = set_pci_host_devaddr,
|
||||
};
|
||||
|
@ -987,20 +858,6 @@ void error_set_from_qdev_prop_error(Error **errp, int ret, DeviceState *dev,
|
|||
}
|
||||
}
|
||||
|
||||
void qdev_prop_parse(DeviceState *dev, const char *name, const char *value,
|
||||
Error **errp)
|
||||
{
|
||||
char *legacy_name;
|
||||
|
||||
legacy_name = g_strdup_printf("legacy-%s", name);
|
||||
if (object_property_get_type(OBJECT(dev), legacy_name, NULL)) {
|
||||
object_property_parse(OBJECT(dev), value, legacy_name, errp);
|
||||
} else {
|
||||
object_property_parse(OBJECT(dev), value, name, errp);
|
||||
}
|
||||
g_free(legacy_name);
|
||||
}
|
||||
|
||||
void qdev_prop_set_bit(DeviceState *dev, const char *name, bool value)
|
||||
{
|
||||
object_property_set_bool(OBJECT(dev), value, name, &error_abort);
|
||||
|
@ -1093,7 +950,7 @@ void qdev_prop_set_globals_for_type(DeviceState *dev, const char *typename,
|
|||
if (strcmp(typename, prop->driver) != 0) {
|
||||
continue;
|
||||
}
|
||||
qdev_prop_parse(dev, prop->property, prop->value, &err);
|
||||
object_property_parse(OBJECT(dev), prop->value, prop->property, &err);
|
||||
if (err != NULL) {
|
||||
error_propagate(errp, err);
|
||||
return;
|
||||
|
@ -1140,39 +997,8 @@ static void set_size(Object *obj, Visitor *v, void *opaque,
|
|||
visit_type_size(v, ptr, name, errp);
|
||||
}
|
||||
|
||||
static int parse_size(DeviceState *dev, Property *prop, const char *str)
|
||||
{
|
||||
uint64_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
|
||||
if (str != NULL) {
|
||||
parse_option_size(prop->name, str, ptr, &error_abort);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int print_size(DeviceState *dev, Property *prop, char *dest, size_t len)
|
||||
{
|
||||
static const char suffixes[] = { 'B', 'K', 'M', 'G', 'T' };
|
||||
uint64_t div, val = *(uint64_t *)qdev_get_prop_ptr(dev, prop);
|
||||
int i;
|
||||
|
||||
/* Compute floor(log2(val)). */
|
||||
i = 64 - clz64(val);
|
||||
|
||||
/* Find the power of 1024 that we'll display as the units. */
|
||||
i /= 10;
|
||||
if (i >= ARRAY_SIZE(suffixes)) {
|
||||
i = ARRAY_SIZE(suffixes) - 1;
|
||||
}
|
||||
div = 1ULL << (i * 10);
|
||||
|
||||
return snprintf(dest, len, "%0.03f%c", (double)val/div, suffixes[i]);
|
||||
}
|
||||
|
||||
PropertyInfo qdev_prop_size = {
|
||||
.name = "size",
|
||||
.parse = parse_size,
|
||||
.print = print_size,
|
||||
.get = get_size,
|
||||
.set = set_size,
|
||||
};
|
||||
|
|
|
@ -588,31 +588,6 @@ static void qdev_get_legacy_property(Object *obj, Visitor *v, void *opaque,
|
|||
visit_type_str(v, &ptr, name, errp);
|
||||
}
|
||||
|
||||
static void qdev_set_legacy_property(Object *obj, Visitor *v, void *opaque,
|
||||
const char *name, Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
Error *local_err = NULL;
|
||||
char *ptr = NULL;
|
||||
int ret;
|
||||
|
||||
if (dev->realized) {
|
||||
qdev_prop_set_after_realize(dev, name, errp);
|
||||
return;
|
||||
}
|
||||
|
||||
visit_type_str(v, &ptr, name, &local_err);
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
return;
|
||||
}
|
||||
|
||||
ret = prop->info->parse(dev, prop, ptr);
|
||||
error_set_from_qdev_prop_error(errp, ret, dev, prop, ptr);
|
||||
g_free(ptr);
|
||||
}
|
||||
|
||||
/**
|
||||
* @qdev_add_legacy_property - adds a legacy property
|
||||
*
|
||||
|
@ -625,25 +600,20 @@ static void qdev_set_legacy_property(Object *obj, Visitor *v, void *opaque,
|
|||
void qdev_property_add_legacy(DeviceState *dev, Property *prop,
|
||||
Error **errp)
|
||||
{
|
||||
gchar *name, *type;
|
||||
gchar *name;
|
||||
|
||||
/* Register pointer properties as legacy properties */
|
||||
if (!prop->info->print && !prop->info->parse &&
|
||||
(prop->info->set || prop->info->get)) {
|
||||
if (!prop->info->print && prop->info->get) {
|
||||
return;
|
||||
}
|
||||
|
||||
name = g_strdup_printf("legacy-%s", prop->name);
|
||||
type = g_strdup_printf("legacy<%s>",
|
||||
prop->info->legacy_name ?: prop->info->name);
|
||||
|
||||
object_property_add(OBJECT(dev), name, type,
|
||||
object_property_add(OBJECT(dev), name, "str",
|
||||
prop->info->print ? qdev_get_legacy_property : prop->info->get,
|
||||
prop->info->parse ? qdev_set_legacy_property : prop->info->set,
|
||||
NULL,
|
||||
NULL,
|
||||
prop, errp);
|
||||
|
||||
g_free(type);
|
||||
g_free(name);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue