From patchwork Wed May 12 20:56:46 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Blue Swirl X-Patchwork-Id: 52439 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 114A7B7DE9 for ; Thu, 13 May 2010 14:39:50 +1000 (EST) Received: from localhost ([127.0.0.1]:38524 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OCQD5-0005yx-4X for incoming@patchwork.ozlabs.org; Thu, 13 May 2010 00:39:47 -0400 Received: from [140.186.70.92] (port=34260 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OCPHA-0006NG-Hn for qemu-devel@nongnu.org; Wed, 12 May 2010 23:40:03 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OCJQS-0008L7-1E for qemu-devel@nongnu.org; Wed, 12 May 2010 17:25:22 -0400 Received: from mail-pz0-f204.google.com ([209.85.222.204]:40008) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OCJQR-0008Ip-Jc for qemu-devel@nongnu.org; Wed, 12 May 2010 17:25:07 -0400 Received: by pzk42 with SMTP id 42so290611pzk.4 for ; Wed, 12 May 2010 14:25:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:date:message-id :subject:from:to:content-type; bh=Tfio0X6a2hWi7s25oZDAsJpVCliLd4n7Ehmm27WEly0=; b=E0ZkF/e/JsxEG8Wcxg6zzU4UqLUMkePbW22ifyqgGwU92jlRdeCIFi1GAo3L9zp5k0 jK4IXLfFOPy79zichN4n7siXWmsRLE5rElM1I+2IGJpzGOC7ElXITbBSwHnFCduK4Rb7 1mRhqMqCDob8nqhXpJVJW71gCLslMujw6A/Gk= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=dUPCtG7Q4oPpgXd47cIF9aDqzWeJo6kdHviTTmexlPRXHndjO8YEd1yaAVQlXNu4V7 kHI5oNj/x5ojXXeRoEBRWT0ChCZNzNWudZHJ8/RV6FmNfUdN0ntJl4F+Adx9ThGaDlMD JrW1+c5H4ny3KV0HqycEvwDPzd2iylvKPtEqE= MIME-Version: 1.0 Received: by 10.141.90.14 with SMTP id s14mr5383148rvl.263.1273697806158; Wed, 12 May 2010 13:56:46 -0700 (PDT) Received: by 10.141.44.12 with HTTP; Wed, 12 May 2010 13:56:46 -0700 (PDT) Date: Wed, 12 May 2010 23:56:46 +0300 Message-ID: From: Blue Swirl To: qemu-devel X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) Subject: [Qemu-devel] [PATCH 1/4] monitor: add device info infrastructure 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: Blue Swirl --- monitor.c | 41 +++++++++++++++++++++++++++++++++++++++++ monitor.h | 10 ++++++++++ qemu-monitor.hx | 13 +++++++++++++ 3 files changed, 64 insertions(+), 0 deletions(-) diff --git a/monitor.c b/monitor.c index a1ebc5d..9bb1a30 100644 --- a/monitor.c +++ b/monitor.c @@ -129,6 +129,13 @@ typedef struct MonitorControl { int command_mode; } MonitorControl; +/* Callback for device info command */ +struct MonDevInfoEntry { + const struct MonDevInfo *dev_info; + void *dev_opaque; + QLIST_ENTRY(MonDevInfoEntry) next; +}; + struct Monitor { CharDriverState *chr; int mux_out; @@ -147,6 +154,7 @@ struct Monitor { #endif QError *error; QLIST_HEAD(,mon_fd_t) fds; + QLIST_HEAD(,MonDevInfoEntry) dev_infos; QLIST_ENTRY(Monitor) entry; }; @@ -2494,6 +2502,21 @@ int monitor_get_fd(Monitor *mon, const char *fdname) return -1; } +static void do_info_device(Monitor *mon, const QDict *qdict) +{ + struct MonDevInfoEntry *entry; + const char *name; + + name = qdict_get_str(qdict, "devname"); + + QLIST_FOREACH(entry, &mon->dev_infos, next) { + if (strcmp(entry->dev_info->dev_name, name) != 0) { + continue; + } + entry->dev_info->dev_info_cb(mon, entry->dev_opaque); + } +} + static const mon_cmd_t mon_cmds[] = { #include "qemu-monitor.h" { NULL, NULL, }, @@ -4166,6 +4189,13 @@ static void monitor_find_completion(const char *cmdline) for (cmd = mon_cmds; cmd->name != NULL; cmd++) { cmd_completion(str, cmd->name); } + } else if (!strcmp(cmd->name, "dev_info")) { + struct MonDevInfoEntry *entry; + + readline_set_completion_index(cur_mon->rs, strlen(str)); + QLIST_FOREACH(entry, &cur_mon->dev_infos, next) { + cmd_completion(str, entry->dev_info->dev_name); + } } break; default: @@ -4680,3 +4710,14 @@ int monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs, return err; } + +void monitor_register_device_info(const struct MonDevInfo *dev_info, + void *dev_opaque) +{ + struct MonDevInfoEntry *entry; + + entry = qemu_malloc(sizeof(*entry)); + entry->dev_info = dev_info; + entry->dev_opaque = dev_opaque; + QLIST_INSERT_HEAD(&cur_mon->dev_infos, entry, next); +} diff --git a/monitor.h b/monitor.h index ea15469..472f367 100644 --- a/monitor.h +++ b/monitor.h @@ -43,6 +43,16 @@ int monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs, BlockDriverCompletionFunc *completion_cb, void *opaque); +typedef void DeviceInfoFunc(Monitor *mon, void *opaque); + +struct MonDevInfo { + const char *dev_name; + DeviceInfoFunc *dev_info_cb; +}; + +void monitor_register_device_info(const struct MonDevInfo *dev_info, + void *dev_opaque); + int monitor_get_fd(Monitor *mon, const char *fdname); void monitor_vprintf(Monitor *mon, const char *fmt, va_list ap); diff --git a/qemu-monitor.hx b/qemu-monitor.hx index a8f194c..596025f 100644 --- a/qemu-monitor.hx +++ b/qemu-monitor.hx @@ -1182,6 +1182,19 @@ STEXI Enable the specified QMP capabilities ETEXI + { + .name = "dev_info", + .args_type = "devname:s", + .params = "device name", + .user_print = monitor_user_noop, + .mhandler.cmd = do_info_device, + .help = "show device information", + }, +STEXI +@item device @var{devicename} +Show information about a device. +ETEXI + STEXI @end table ETEXI