Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> --- cpus.c | 16 ++++++++++++++++ cpus.h | 2 ++ hw/qdev-properties.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ hw/qdev.h | 5 +++++ 4 files changed, 67 insertions(+), 0 deletions(-)
diff --git a/cpus.c b/cpus.c index fcd0f09..da6ec44 100644 --- a/cpus.c +++ b/cpus.c @@ -91,6 +91,22 @@ void cpu_synchronize_all_post_init(void) } } +CPUState *cpu_get_by_id(int id) +{ + CPUState *cpu; + + for (cpu = first_cpu; cpu; cpu = cpu->next_cpu) + if (cpu->cpu_index == id) + return cpu; + + return NULL; +} + +int cpu_get_id(CPUState *env) +{ + return env->cpu_index; +} + int cpu_is_stopped(CPUState *env) { return !vm_running || env->stopped; diff --git a/cpus.h b/cpus.h index 774150a..df3c193 100644 --- a/cpus.h +++ b/cpus.h @@ -6,6 +6,8 @@ int qemu_init_main_loop(void); void qemu_main_loop_start(void); void resume_all_vcpus(void); void pause_all_vcpus(void); +CPUState *cpu_get_by_id(int id); +int cpu_get_id(CPUState *env); /* vl.c */ extern int smp_cores; diff --git a/hw/qdev-properties.c b/hw/qdev-properties.c index 5a8739d..2759c83 100644 --- a/hw/qdev-properties.c +++ b/hw/qdev-properties.c @@ -1,6 +1,7 @@ #include "net.h" #include "qdev.h" #include "qerror.h" +#include "cpus.h" void *qdev_get_prop_ptr(DeviceState *dev, Property *prop) { @@ -281,6 +282,44 @@ PropertyInfo qdev_prop_string = { .free = free_string, }; +/* --- cpu --- */ + +static int parse_cpu(DeviceState *dev, Property *prop, const char *str) +{ + CPUState **ptr = qdev_get_prop_ptr(dev, prop); + char *end; + int id; + + if (!*str) + return -ENOENT; + + id = strtol (str, &end, 0); + if (*end) + return -ENOENT; + + *ptr = cpu_get_by_id(id); + if (*ptr == NULL) + return -ENOENT; + return 0; +} + +static int print_cpu(DeviceState *dev, Property *prop, char *dest, size_t len) +{ + CPUState **ptr = qdev_get_prop_ptr(dev, prop); + if (*ptr) + return snprintf(dest, len, "CPU #%d", cpu_get_id(*ptr)); + else + return snprintf(dest, len, "CPU #<null>"); +} + +PropertyInfo qdev_prop_cpu = { + .name = "cpu", + .type = PROP_TYPE_CPU, + .size = sizeof(DriveInfo*), + .parse = parse_cpu, + .print = print_cpu, +}; + /* --- drive --- */ static int parse_drive(DeviceState *dev, Property *prop, const char *str) @@ -657,6 +696,11 @@ void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value) qdev_prop_set(dev, name, &value, PROP_TYPE_PTR); } +void qdev_prop_set_cpu(DeviceState *dev, const char *name, CPUState *value) +{ + qdev_prop_set(dev, name, &value, PROP_TYPE_CPU); +} + void qdev_prop_set_defaults(DeviceState *dev, Property *props) { if (!props) diff --git a/hw/qdev.h b/hw/qdev.h index be5ad67..eec2f52 100644 --- a/hw/qdev.h +++ b/hw/qdev.h @@ -90,6 +90,7 @@ enum PropertyType { PROP_TYPE_VLAN, PROP_TYPE_PTR, PROP_TYPE_BIT, + PROP_TYPE_CPU, }; struct PropertyInfo { @@ -203,6 +204,7 @@ extern PropertyInfo qdev_prop_drive; extern PropertyInfo qdev_prop_netdev; extern PropertyInfo qdev_prop_vlan; extern PropertyInfo qdev_prop_pci_devfn; +extern PropertyInfo qdev_prop_cpu; #define DEFINE_PROP(_name, _state, _field, _prop, _type) { \ .name = (_name), \ @@ -257,6 +259,8 @@ extern PropertyInfo qdev_prop_pci_devfn; DEFINE_PROP(_n, _s, _f, qdev_prop_drive, DriveInfo*) #define DEFINE_PROP_MACADDR(_n, _s, _f) \ DEFINE_PROP(_n, _s, _f, qdev_prop_macaddr, MACAddr) +#define DEFINE_PROP_CPU(_n, _s, _f) \ + DEFINE_PROP(_n, _s, _f, qdev_prop_cpu, CPUState*) #define DEFINE_PROP_END_OF_LIST() \ {} @@ -276,6 +280,7 @@ void qdev_prop_set_chr(DeviceState *dev, const char *name, CharDriverState *valu void qdev_prop_set_netdev(DeviceState *dev, const char *name, VLANClientState *value); void qdev_prop_set_vlan(DeviceState *dev, const char *name, VLANState *value); void qdev_prop_set_drive(DeviceState *dev, const char *name, DriveInfo *value); +void qdev_prop_set_cpu(DeviceState *dev, const char *name, CPUState *value); void qdev_prop_set_macaddr(DeviceState *dev, const char *name, uint8_t *value); /* FIXME: Remove opaque pointer properties. */ void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value); -- 1.7.0.1