From patchwork Fri Jun 25 12:52:20 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 56973 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 5C94DB6F10 for ; Sat, 26 Jun 2010 05:23:53 +1000 (EST) Received: from localhost ([127.0.0.1]:47972 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OSEVB-00082O-LO for incoming@patchwork.ozlabs.org; Fri, 25 Jun 2010 15:23:49 -0400 Received: from [140.186.70.92] (port=44113 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OSD2H-00026K-0f for qemu-devel@nongnu.org; Fri, 25 Jun 2010 13:50:02 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OS8Ok-0002gB-5p for qemu-devel@nongnu.org; Fri, 25 Jun 2010 08:52:47 -0400 Received: from mail-ww0-f45.google.com ([74.125.82.45]:47259) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OS8Ok-0002cg-0U for qemu-devel@nongnu.org; Fri, 25 Jun 2010 08:52:46 -0400 Received: by mail-ww0-f45.google.com with SMTP id 18so201074wwb.4 for ; Fri, 25 Jun 2010 05:52:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:sender:from:to:cc:subject :date:message-id:x-mailer:in-reply-to:references; bh=I6pAaeXKu70VdRf5s9KXiEi6YKzigHjKmdoYerzjiqQ=; b=eSVww9WvhCPlGtjPwC5SPrmqUDs3a3Rcz0skO9Nyi9s5zM2QxDhdsJxazog6rBmqwH /aIRbK4tx7jxF9rXJU/jC2yNctnXuNEsxMkyfAKw5KB5nXTg1uR8Ig4BgWd7QsPB/39k jtUey7DBNytMZS93rvcRdPS1NuBv/UHXtBx9Q= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; b=M0y518WWsRgY+A3lOa2lKnLorFobXjJ0rk6KYK8rqq9noajmg/i89kp8TiRfJDUv+I 7CUMMBNzi2FRrysNR1FRghqKIpl0H/ztnGTZctoT/fp5Zeo2XyTEq/jYs49olVp9aJrU pLlTJtt5nQ6pi8yCPxvIDc2edAqrIJsdAe+N0= Received: by 10.216.170.9 with SMTP id o9mr530065wel.45.1277470360478; Fri, 25 Jun 2010 05:52:40 -0700 (PDT) Received: from localhost.localdomain (nat-pool-brq-t.redhat.com [209.132.186.34]) by mx.google.com with ESMTPS id o3sm116954wee.38.2010.06.25.05.52.38 (version=TLSv1/SSLv3 cipher=RC4-MD5); Fri, 25 Jun 2010 05:52:39 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Fri, 25 Jun 2010 14:52:20 +0200 Message-Id: <1277470342-5861-6-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.7.0.1 In-Reply-To: <1277470342-5861-1-git-send-email-pbonzini@redhat.com> References: <1277470342-5861-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) Cc: Amit Shah , Isaku Yamahata Subject: [Qemu-devel] [PATCH 5/7] add qdev property type "cpu" X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Signed-off-by: Paolo Bonzini --- 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 #"); +} + +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);