From: Mark McLoughlin <markmc@redhat.com>
To: Anthony Liguori <anthony@codemonkey.ws>
Cc: Mark McLoughlin <markmc@redhat.com>, qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH 5/5] monitor: add "info capabilities" command
Date: Thu, 13 Nov 2008 16:46:03 +0000 [thread overview]
Message-ID: <1226594763-2304-6-git-send-email-markmc@redhat.com> (raw)
In-Reply-To: <1226594763-2304-5-git-send-email-markmc@redhat.com>
Add a monitor command which allows the user (or management tools) to
query what features the given qemu binary supports.
The output format is ".ini style" and is intended to list:
1) New features - e.g. cache=writethrough
2) Compile time configurables - e.g. built with kqemu support
3) Magic numbers - e.g. the vcpu limit
Signed-off-by: Mark McLoughlin <markmc@redhat.com>
---
console.h | 3 +
hw/boards.h | 1 +
hw/bt.h | 6 +++
hw/pc.h | 2 +
hw/usb.h | 3 +
monitor.c | 138 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
net.c | 18 ++++++++
net.h | 3 +
qemu-char.c | 25 +++++++++++
qemu-char.h | 1 +
sysemu.h | 5 ++
vl.c | 91 +++++++++++++++++++++++++++++++++++---
12 files changed, 288 insertions(+), 8 deletions(-)
diff --git a/console.h b/console.h
index fba9e29..f6d5de9 100644
--- a/console.h
+++ b/console.h
@@ -144,6 +144,9 @@ void qemu_console_resize(QEMUConsole *console, int width, int height);
void qemu_console_copy(QEMUConsole *console, int src_x, int src_y,
int dst_x, int dst_y, int w, int h);
+/* vl.c */
+const char * const *graphics_list_types(void);
+
/* sdl.c */
void sdl_display_init(DisplayState *ds, int full_screen, int no_frame);
diff --git a/hw/boards.h b/hw/boards.h
index 0097b4b..ed471af 100644
--- a/hw/boards.h
+++ b/hw/boards.h
@@ -26,6 +26,7 @@ typedef struct QEMUMachine {
} QEMUMachine;
int qemu_register_machine(QEMUMachine *m);
+QEMUMachine *qemu_list_machines(void);
void register_machines(void);
/* Axis ETRAX. */
diff --git a/hw/bt.h b/hw/bt.h
index 2d65e10..226d2bb 100644
--- a/hw/bt.h
+++ b/hw/bt.h
@@ -105,6 +105,12 @@ struct bt_device_s {
uint16_t clkoff; /* Note: Always little-endian */
};
+/* Max number of bluetooth switches on the commandline. */
+#define MAX_BT_CMDLINE 10
+
+/* vl.c */
+const char * const *bt_list_types(void);
+
/* bt.c */
void bt_device_init(struct bt_device_s *dev, struct bt_scatternet_s *net);
void bt_device_done(struct bt_device_s *dev);
diff --git a/hw/pc.h b/hw/pc.h
index d64d8a6..abcfae5 100644
--- a/hw/pc.h
+++ b/hw/pc.h
@@ -122,6 +122,8 @@ extern enum vga_retrace_method vga_retrace_method;
#define VGA_RAM_SIZE (9 * 1024 * 1024)
#endif
+const char * const *vga_list_types(void);
+
int isa_vga_init(DisplayState *ds, uint8_t *vga_ram_base,
unsigned long vga_ram_offset, int vga_ram_size);
int pci_vga_init(PCIBus *bus, DisplayState *ds, uint8_t *vga_ram_base,
diff --git a/hw/usb.h b/hw/usb.h
index 4204808..334c7f4 100644
--- a/hw/usb.h
+++ b/hw/usb.h
@@ -264,6 +264,9 @@ USBDevice *usb_wacom_init(void);
/* usb-serial.c */
USBDevice *usb_serial_init(const char *filename);
+/* Max number of USB devices that can be specified on the commandline. */
+#define MAX_USB_CMDLINE 8
+
/* usb ports of the VM */
void qemu_register_usb_port(USBPort *port, void *opaque, int index,
diff --git a/monitor.c b/monitor.c
index 8fff3aa..6e83486 100644
--- a/monitor.c
+++ b/monitor.c
@@ -26,6 +26,8 @@
#include "hw/pcmcia.h"
#include "hw/pc.h"
#include "hw/pci.h"
+#include "hw/boards.h"
+#include "hw/bt.h"
#include "gdbstub.h"
#include "net.h"
#include "qemu-char.h"
@@ -245,6 +247,140 @@ static void do_info_version(void)
term_printf("%s\n", QEMU_VERSION);
}
+/* join a list of strings using a comma as the separator */
+static char *list2str(const char * const *list, char *buf, int bufsize)
+{
+ char *p = buf;
+ int i;
+
+ *p = '\0';
+
+ if (!list)
+ return buf;
+
+ for (i = 0; list[i] != NULL; i++) {
+ int ret;
+
+ ret = snprintf(p, bufsize, "%s,", list[i]);
+ if (ret >= bufsize)
+ break;
+
+ p += ret;
+ bufsize -= ret;
+ }
+
+ /* chop off the trailing comma */
+ if (p != buf)
+ *(--p) = '\0';
+
+ return buf;
+}
+
+static void list_printf(const char *prefix, const char * const *list)
+{
+ char buf[4096];
+
+ term_printf("%s=%s\n", prefix, list2str(list, buf, sizeof(buf)));
+}
+
+static const char * const accel_names[] = {
+#ifdef USE_KQEMU
+ "kqemu",
+#endif
+#ifdef CONFIG_KVM
+ "kvm",
+#endif
+ NULL
+};
+
+static void machines_printf(void)
+{
+ QEMUMachine *machines, *m;
+ const char **names;
+ int i;
+
+ machines = qemu_list_machines();
+
+ i = 0;
+ m = machines;
+ while (m != NULL) {
+ i++;
+ m = m->next;
+ }
+ i++; /* for NULL terminator */
+
+ names = alloca(i * sizeof(const char *));
+
+ i = 0;
+ m = machines;
+ while (m != NULL) {
+ names[i++] = m->name;
+ m = m->next;
+ }
+
+ names[i] = NULL;
+
+ list_printf("machines", names);
+}
+
+static void do_machine_capabilities(void)
+{
+ QEMUMachine *m;
+
+ m = qemu_list_machines();
+ while (m != NULL) {
+ term_printf("[machine]\n");
+ term_printf("name=%s\n", m->name);
+ term_printf("max_cpus=%d\n", m->max_cpus);
+ list_printf("nic_models", m->nic_models ? m->nic_models() : NULL);
+ term_printf("\n");
+ m = m->next;
+ }
+}
+
+static void do_info_capabilities(void)
+{
+ term_printf("[qemu]\n");
+ list_printf("accel", accel_names);
+ term_printf("arch=%s\n", TARGET_ARCH);
+ list_printf("cpu", cpu_names());
+ machines_printf();
+
+ term_printf("\n");
+
+ do_machine_capabilities();
+
+ term_printf("[devices]\n");
+ list_printf("bluetooth", bt_list_types());
+ list_printf("char", qemu_chr_list_types());
+ list_printf("drive_cache", drive_cache_types());
+ list_printf("drive_if", drive_if_types());
+ list_printf("graphics", graphics_list_types());
+ list_printf("network", net_client_types());
+#ifdef HAS_AUDIO
+ list_printf("soundhw", soundhw_list_types());
+#endif
+ list_printf("vga", vga_list_types());
+
+ term_printf("\n");
+
+ term_printf("[limits]\n");
+ term_printf("max_boot_dev=q\n"); /* above '-boot q' not allowed */
+ term_printf("max_bluetooth_devs=%d\n", MAX_BT_CMDLINE);
+ term_printf("max_drives=%d\n", MAX_DRIVES);
+ term_printf("max_ide_devs=%d\n", MAX_IDE_DEVS);
+ term_printf("max_net_clients=%d\n", MAX_NET_CLIENTS);
+ term_printf("max_nics=%d\n", MAX_NICS);
+ term_printf("max_option_roms=%d\n", MAX_OPTION_ROMS);
+ term_printf("max_parallel_ports=%d\n", MAX_PARALLEL_PORTS);
+#ifdef TARGET_SPARC
+ term_printf("max_prom_envs=%d\n", MAX_PROM_ENVS);
+#endif
+ term_printf("max_scsi_devs=%d\n", MAX_SCSI_DEVS);
+ term_printf("max_serial_ports=%d\n", MAX_SERIAL_PORTS);
+ term_printf("max_usb_devs=%d\n", MAX_USB_CMDLINE);
+}
+
static void do_info_name(void)
{
if (qemu_name)
@@ -1481,6 +1617,8 @@ static const term_cmd_t term_cmds[] = {
static const term_cmd_t info_cmds[] = {
{ "version", "", do_info_version,
"", "show the version of qemu" },
+ { "capabilities", "", do_info_capabilities,
+ "", "show the capabilities of qemu" },
{ "network", "", do_info_network,
"", "show the network state" },
{ "chardev", "", qemu_chr_info,
diff --git a/net.c b/net.c
index f94ff1b..1660976 100644
--- a/net.c
+++ b/net.c
@@ -1371,6 +1371,24 @@ VLANState *qemu_find_vlan(int id)
return vlan;
}
+const char * const *net_client_types(void)
+{
+ static const char * const types[] = {
+ "tap",
+ "socket",
+#ifdef CONFIG_SLIRP
+ "user",
+#endif
+#ifdef CONFIG_VDE
+ "vde",
+#endif
+ "none",
+ NULL
+ };
+
+ return types;
+}
+
int net_client_init(const char *device, const char *p)
{
char buf[1024];
diff --git a/net.h b/net.h
index a2b01ae..f5ef353 100644
--- a/net.h
+++ b/net.h
@@ -23,6 +23,8 @@ struct VLANState {
unsigned int nb_guest_devs, nb_host_devs;
};
+#define MAX_NET_CLIENTS 32
+
VLANState *qemu_find_vlan(int id);
VLANClientState *qemu_new_vlan_client(VLANState *vlan,
IOReadHandler *fd_read,
@@ -70,6 +72,7 @@ uint16_t net_checksum_tcpudp(uint16_t length, uint16_t proto,
void net_checksum_calculate(uint8_t *data, int length);
/* from net.c */
+const char * const *net_client_types(void);
int net_client_init(const char *device, const char *p);
int net_client_parse(const char *str);
void net_slirp_smb(const char *exported_dir);
diff --git a/qemu-char.c b/qemu-char.c
index 2cf8644..b8c4a58 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -2149,6 +2149,31 @@ CharDriverState *qemu_chr_open(const char *label, const char *filename)
return chr;
}
+const char * const *qemu_chr_list_types(void)
+{
+ static const char * const types[] = {
+ "null", "vc", "tcp", "telnet", "mon",
+#ifndef _WIN32
+ "unix", "file", "pipe", "pty", "stdio",
+#if defined(__linux__)
+ "dev_parport",
+#endif
+#if defined(__linux__) || defined(__sun__) || defined(__FreeBSD__) \
+ || defined(__NetBSD__) || defined(__OpenBSD__)
+ "dev_tty",
+#endif
+#else /* !_WIN32 */
+ "COM", "pipe", "con", "file",
+#endif
+#ifdef CONFIG_BRLAPI
+ "braille",
+#endif
+ NULL
+ };
+
+ return types;
+}
+
void qemu_chr_close(CharDriverState *chr)
{
TAILQ_REMOVE(&chardevs, chr, next);
diff --git a/qemu-char.h b/qemu-char.h
index c64fc28..063e0c1 100644
--- a/qemu-char.h
+++ b/qemu-char.h
@@ -61,6 +61,7 @@ struct CharDriverState {
TAILQ_ENTRY(CharDriverState) next;
};
+const char * const *qemu_chr_list_types(void);
CharDriverState *qemu_chr_open(const char *label, const char *filename);
void qemu_chr_close(CharDriverState *chr);
void qemu_chr_printf(CharDriverState *s, const char *fmt, ...);
diff --git a/sysemu.h b/sysemu.h
index ef0fe50..8fe55d9 100644
--- a/sysemu.h
+++ b/sysemu.h
@@ -143,6 +143,9 @@ extern DriveInfo drives_table[MAX_DRIVES+1];
extern int drive_get_index(BlockInterfaceType type, int bus, int unit);
extern int drive_get_max_bus(BlockInterfaceType type);
+const char * const *drive_if_types(void);
+const char * const *drive_cache_types(void);
+
/* serial ports */
#define MAX_SERIAL_PORTS 4
@@ -187,6 +190,8 @@ struct soundhw {
};
extern struct soundhw soundhw[];
+
+const char * const *soundhw_list_types();
#endif
void do_usb_add(const char *devname);
diff --git a/vl.c b/vl.c
index e4184d3..b1bd37c 100644
--- a/vl.c
+++ b/vl.c
@@ -166,12 +166,6 @@
#define DEFAULT_RAM_SIZE 128
#endif
-/* Max number of USB devices that can be specified on the commandline. */
-#define MAX_USB_CMDLINE 8
-
-/* Max number of bluetooth switches on the commandline. */
-#define MAX_BT_CMDLINE 10
-
/* XXX: use a two level table to limit memory usage */
#define MAX_IOPORTS 65536
@@ -2122,6 +2116,22 @@ static int bt_parse(const char *opt)
return 1;
}
+const char * const *bt_list_types(void)
+{
+ static const char * const bt_types[] = {
+ "hci_null", /* -bt hci,null */
+#ifdef CONFIG_BLUEZ
+ "hci_host", /* -bt hci,host[:id] */
+#endif
+ "hci_vlan", /* -bt hci[,vlan=n] */
+ "vhci_vlan", /* -bt vhci[,vlan=n] */
+ "keyboard", /* -bt device:keyboard[,vlan=n */
+ NULL
+ };
+
+ return bt_types;
+}
+
/***********************************************************/
/* QEMU Block devices */
@@ -2502,6 +2512,24 @@ static int drive_init(struct drive_opt *arg, int snapshot,
return 0;
}
+const char * const *drive_if_types(void)
+{
+ static const char * const if_types[] = {
+ "ide", "scsi", "floppy", "pflash", "mtd", "sd", NULL
+ };
+
+ return if_types;
+}
+
+const char * const *drive_cache_types(void)
+{
+ static const char * const cache_types[] = {
+ "off", "none", "writethrough", "writeback", NULL
+ };
+
+ return cache_types;
+}
+
/***********************************************************/
/* USB devices */
@@ -3314,6 +3342,11 @@ int qemu_register_machine(QEMUMachine *m)
return 0;
}
+QEMUMachine *qemu_list_machines(void)
+{
+ return first_machine;
+}
+
static QEMUMachine *find_machine(const char *name)
{
QEMUMachine *m;
@@ -4282,6 +4315,21 @@ struct soundhw soundhw[] = {
{ NULL, NULL, 0, 0, { NULL } }
};
+const char * const *soundhw_list_types(void)
+{
+ static const char *types[sizeof(soundhw)/sizeof(struct soundhw)];
+
+ if (!types[0]) {
+ int i;
+
+ for (i = 0; soundhw[i].name; i++)
+ types[i] = soundhw[i].name;
+ types[i] = NULL;
+ }
+
+ return types;
+}
+
static void select_soundhw (const char *optarg)
{
struct soundhw *c;
@@ -4341,6 +4389,35 @@ static void select_soundhw (const char *optarg)
}
#endif
+const char * const *graphics_list_types(void)
+{
+ static const char * const types[] = {
+ "nographics",
+#if defined(CONFIG_SDL) || defined(CONFIG_COCOA)
+ "graphics",
+#endif
+#ifdef CONFIG_CURSES
+ "curses",
+#endif
+ "vnc",
+#ifdef CONFIG_VNC_TLS
+ "vnc_tls",
+#endif
+ NULL
+ };
+
+ return types;
+}
+
+const char * const *vga_list_types(void)
+{
+ static const char * const types[] = {
+ "std", "cirrus", "vmware", NULL
+ };
+
+ return types;
+}
+
static void select_vgahw (const char *p)
{
const char *opts;
@@ -4399,8 +4476,6 @@ static int qemu_uuid_parse(const char *str, uint8_t *uuid)
return 0;
}
-#define MAX_NET_CLIENTS 32
-
#ifndef _WIN32
static void termsig_handler(int signal)
--
1.5.4.3
next prev parent reply other threads:[~2008-11-13 16:47 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-11-13 16:45 [Qemu-devel] [PATCH 0/5] Add "info capabilities" monitor command Mark McLoughlin
2008-11-13 16:45 ` [Qemu-devel] [PATCH 1/5] Re-factor nic model listing Mark McLoughlin
2008-11-13 16:46 ` [Qemu-devel] [PATCH 2/5] Add cpu_list() for any targets that don't already have it Mark McLoughlin
2008-11-13 16:46 ` [Qemu-devel] [PATCH 3/5] Rename xxx_cpu_list() to cpu_xxx_list() Mark McLoughlin
2008-11-13 16:46 ` [Qemu-devel] [PATCH 4/5] Add new cpu_names() function Mark McLoughlin
2008-11-13 16:46 ` Mark McLoughlin [this message]
2008-11-13 19:50 ` [Qemu-devel] Re: [PATCH 5/5] monitor: add "info capabilities" command Anthony Liguori
2008-11-14 16:02 ` Mark McLoughlin
2008-11-14 10:07 ` [Qemu-devel] " Avi Kivity
2008-11-14 15:58 ` Mark McLoughlin
2008-11-16 7:17 ` Avi Kivity
2008-11-14 10:13 ` Daniel P. Berrange
2008-11-13 19:47 ` [Qemu-devel] Re: [PATCH 4/5] Add new cpu_names() function Anthony Liguori
2008-11-14 15:36 ` Mark McLoughlin
2008-11-13 18:35 ` [Qemu-devel] [PATCH 1/5] Re-factor nic model listing Paul Brook
2008-11-13 19:45 ` Anthony Liguori
2008-11-13 22:50 ` Paul Brook
2008-11-14 2:31 ` Jamie Lokier
2008-11-14 2:49 ` Anthony Liguori
2008-11-13 19:44 ` [Qemu-devel] " Anthony Liguori
2008-11-14 15:34 ` Mark McLoughlin
2008-11-13 17:49 ` [Qemu-devel] [PATCH 0/5] Add "info capabilities" monitor command Blue Swirl
2008-11-14 2:50 ` Jamie Lokier
2008-11-14 16:09 ` Mark McLoughlin
2008-11-14 3:28 ` [Qemu-devel] " Anthony Liguori
2008-11-14 3:51 ` Jamie Lokier
2008-11-14 15:56 ` Mark McLoughlin
2008-11-14 22:54 ` Jamie Lokier
2008-11-14 15:51 ` Mark McLoughlin
2008-11-14 22:52 ` Jamie Lokier
2008-11-14 10:16 ` [Qemu-devel] " Daniel P. Berrange
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1226594763-2304-6-git-send-email-markmc@redhat.com \
--to=markmc@redhat.com \
--cc=anthony@codemonkey.ws \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.