[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [PATCH] ioemu-monitor.patch
ChangeSet 1.1722, 2005/06/21 08:07:48+01:00, leendert@xxxxxxxxxxxxxx [PATCH] ioemu-monitor.patch The following patch adds back qemu monitor commands to qemu-dm which make sense. That is, eject and change devices, and show some device state. Signed-Off-By: Leendert van Doorn <leendert@xxxxxxxxxxxxxx> ===== tools/ioemu/monitor.c 1.1 vs edited ===== hw/i8259.c | 2 monitor.c | 327 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 327 insertions(+), 2 deletions(-) diff -Nru a/tools/ioemu/hw/i8259.c b/tools/ioemu/hw/i8259.c --- a/tools/ioemu/hw/i8259.c 2005-06-21 04:05:09 -04:00 +++ b/tools/ioemu/hw/i8259.c 2005-06-21 04:05:09 -04:00 @@ -27,7 +27,7 @@ //#define DEBUG_PIC //#define DEBUG_IRQ_LATENCY -//#define DEBUG_IRQ_COUNT +#define DEBUG_IRQ_COUNT typedef struct PicState { uint8_t last_irr; /* edge detection */ diff -Nru a/tools/ioemu/monitor.c b/tools/ioemu/monitor.c --- a/tools/ioemu/monitor.c 2005-06-21 04:05:09 -04:00 +++ b/tools/ioemu/monitor.c 2005-06-21 04:05:09 -04:00 @@ -123,6 +123,108 @@ return 0; } +static void help_cmd1(term_cmd_t *cmds, const char *prefix, const char *name) +{ + term_cmd_t *cmd; + + for(cmd = cmds; cmd->name != NULL; cmd++) { + if (!name || !strcmp(name, cmd->name)) + term_printf("%s%s %s -- %s\n", prefix, cmd->name, cmd->params, cmd->help); + } +} + +static void help_cmd(const char *name) +{ + if (name && !strcmp(name, "info")) { + help_cmd1(info_cmds, "info ", NULL); + } else { + help_cmd1(term_cmds, "", name); + if (name && !strcmp(name, "log")) { + CPULogItem *item; + term_printf("Log items (comma separated):\n"); + term_printf("%-10s %s\n", "none", "remove all logs"); + for(item = cpu_log_items; item->mask != 0; item++) { + term_printf("%-10s %s\n", item->name, item->help); + } + } + } +} + +static void do_help(const char *name) +{ + help_cmd(name); +} + +static void do_commit(void) +{ + int i; + + for (i = 0; i < MAX_DISKS; i++) { + if (bs_table[i]) { + bdrv_commit(bs_table[i]); + } + } +} + +static void do_info(const char *item) +{ + term_cmd_t *cmd; + + if (!item) + goto help; + for(cmd = info_cmds; cmd->name != NULL; cmd++) { + if (compare_cmd(item, cmd->name)) + goto found; + } + help: + help_cmd("info"); + return; + found: + cmd->handler(); +} + +static void do_info_version(void) +{ + term_printf("%s\n", QEMU_VERSION); +} + +static void do_info_network(void) +{ + int i, j; + NetDriverState *nd; + + for(i = 0; i < nb_nics; i++) { + nd = &nd_table[i]; + term_printf("%d: ifname=%s macaddr=", i, nd->ifname); + for(j = 0; j < 6; j++) { + if (j > 0) + term_printf(":"); + term_printf("%02x", nd->macaddr[j]); + } + term_printf("\n"); + } +} + +static void do_info_block(void) +{ + bdrv_info(); +} + +static void do_info_history (void) +{ + int i; + const char *str; + + i = 0; + for(;;) { + str = readline_get_history(i); + if (!str) + break; + term_printf("%d: '%s'\n", i, str); + i++; + } +} + static void do_quit(void) { extern int domid; @@ -134,12 +236,191 @@ exit(0); } +static int eject_device(BlockDriverState *bs, int force) +{ + if (bdrv_is_inserted(bs)) { + if (!force) { + if (!bdrv_is_removable(bs)) { + term_printf("device is not removable\n"); + return -1; + } + if (bdrv_is_locked(bs)) { + term_printf("device is locked\n"); + return -1; + } + } + bdrv_close(bs); + } + return 0; +} + +static void do_eject(int force, const char *filename) +{ + BlockDriverState *bs; + + bs = bdrv_find(filename); + if (!bs) { + term_printf("device not found\n"); + return; + } + eject_device(bs, force); +} + +static void do_change(const char *device, const char *filename) +{ + BlockDriverState *bs; +#if 0 + int i; + char password[256]; +#endif + + bs = bdrv_find(device); + if (!bs) { + term_printf("device not found\n"); + return; + } + if (eject_device(bs, 0) < 0) + return; + bdrv_open(bs, filename, 0); +#if 0 + if (bdrv_is_encrypted(bs)) { + term_printf("%s is encrypted.\n", device); + for(i = 0; i < 3; i++) { + monitor_readline("Password: ", 1, password, sizeof(password)); + if (bdrv_set_key(bs, password) == 0) + break; + term_printf("invalid password\n"); + } + } +#endif +} + +static void do_screen_dump(const char *filename) +{ + vga_screen_dump(filename); +} + +static void do_log(const char *items) +{ + int mask; + + if (!strcmp(items, "none")) { + mask = 0; + } else { + mask = cpu_str_to_log_mask(items); + if (!mask) { + help_cmd("log"); + return; + } + } + cpu_set_log(mask); +} + static term_cmd_t term_cmds[] = { + { "help|?", "s?", do_help, + "[cmd]", "show the help" }, + { "commit", "", do_commit, + "", "commit changes to the disk images (if -snapshot is used)" }, + { "info", "s?", do_info, + "subcommand", "show various information about the system state" }, + { "q|quit", "", do_quit, + "", "quit the emulator" }, + { "eject", "-fB", do_eject, + "[-f] device", "eject a removable media (use -f to force it)" }, + { "change", "BF", do_change, + "device filename", "change a removable media" }, + { "screendump", "F", do_screen_dump, + "filename", "save screen into PPM image 'filename'" }, + { "log", "s", do_log, + "item1[,...]", "activate logging of the specified items to '/tmp/qemu.log'" }, { "q|quit", "", do_quit, "", "quit the emulator" }, { NULL, NULL, }, }; +static term_cmd_t info_cmds[] = { + { "version", "", do_info_version, + "", "show the version of qemu" }, + { "network", "", do_info_network, + "", "show the network state" }, + { "block", "", do_info_block, + "", "show the block devices" }, + { "history", "", do_info_history, + "", "show the command line history", }, + { "irq", "", irq_info, + "", "show the interrupts statistics (if available)", }, + { "pic", "", pic_info, + "", "show i8259 (PIC) state", }, + { "pci", "", pci_info, + "", "show PCI info", }, + { NULL, NULL, }, +}; + +static int get_str(char *buf, int buf_size, const char **pp) +{ _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |