symbian-qemu-0.9.1-12/qemu-symbian-svp/monitor.c
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 /*
       
     2  * QEMU monitor
       
     3  *
       
     4  * Copyright (c) 2003-2004 Fabrice Bellard
       
     5  *
       
     6  * Permission is hereby granted, free of charge, to any person obtaining a copy
       
     7  * of this software and associated documentation files (the "Software"), to deal
       
     8  * in the Software without restriction, including without limitation the rights
       
     9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
       
    10  * copies of the Software, and to permit persons to whom the Software is
       
    11  * furnished to do so, subject to the following conditions:
       
    12  *
       
    13  * The above copyright notice and this permission notice shall be included in
       
    14  * all copies or substantial portions of the Software.
       
    15  *
       
    16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
       
    17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
       
    18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
       
    19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
       
    20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
       
    21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
       
    22  * THE SOFTWARE.
       
    23  */
       
    24 #include "hw/hw.h"
       
    25 #include "hw/usb.h"
       
    26 #include "hw/pcmcia.h"
       
    27 #include "hw/pc.h"
       
    28 #include "hw/pci.h"
       
    29 #include "gdbstub.h"
       
    30 #include "net.h"
       
    31 #include "qemu-char.h"
       
    32 #include "sysemu.h"
       
    33 #include "console.h"
       
    34 //#include "hw/gui.h"
       
    35 #include "gui_host.h"
       
    36 #include "block.h"
       
    37 #include "audio/audio.h"
       
    38 #include "disas.h"
       
    39 #include "balloon.h"
       
    40 #include <dirent.h>
       
    41 #include "qemu-timer.h"
       
    42 #include "migration.h"
       
    43 #include "kvm.h"
       
    44 
       
    45 //#define DEBUG
       
    46 //#define DEBUG_COMPLETION
       
    47 
       
    48 /*
       
    49  * Supported types:
       
    50  *
       
    51  * 'F'          filename
       
    52  * 'B'          block device name
       
    53  * 's'          string (accept optional quote)
       
    54  * 'i'          32 bit integer
       
    55  * 'l'          target long (32 or 64 bit)
       
    56  * '/'          optional gdb-like print format (like "/10x")
       
    57  *
       
    58  * '?'          optional type (for 'F', 's' and 'i')
       
    59  *
       
    60  */
       
    61 
       
    62 typedef struct term_cmd_t {
       
    63     const char *name;
       
    64     const char *args_type;
       
    65     void *handler;
       
    66     const char *params;
       
    67     const char *help;
       
    68 } term_cmd_t;
       
    69 
       
    70 #define MAX_MON 4
       
    71 static CharDriverState *monitor_hd[MAX_MON];
       
    72 static int hide_banner;
       
    73 
       
    74 static const term_cmd_t term_cmds[];
       
    75 static const term_cmd_t info_cmds[];
       
    76 
       
    77 static uint8_t term_outbuf[1024];
       
    78 static int term_outbuf_index;
       
    79 
       
    80 static void monitor_start_input(void);
       
    81 
       
    82 static CPUState *mon_cpu = NULL;
       
    83 
       
    84 void term_flush(void)
       
    85 {
       
    86     int i;
       
    87     if (term_outbuf_index > 0) {
       
    88         for (i = 0; i < MAX_MON; i++)
       
    89             if (monitor_hd[i] && monitor_hd[i]->focus == 0)
       
    90                 qemu_chr_write(monitor_hd[i], term_outbuf, term_outbuf_index);
       
    91         term_outbuf_index = 0;
       
    92     }
       
    93 }
       
    94 
       
    95 /* flush at every end of line or if the buffer is full */
       
    96 void term_puts(const char *str)
       
    97 {
       
    98     char c;
       
    99     for(;;) {
       
   100         c = *str++;
       
   101         if (c == '\0')
       
   102             break;
       
   103         if (c == '\n')
       
   104             term_outbuf[term_outbuf_index++] = '\r';
       
   105         term_outbuf[term_outbuf_index++] = c;
       
   106         if (term_outbuf_index >= (sizeof(term_outbuf) - 1) ||
       
   107             c == '\n')
       
   108             term_flush();
       
   109     }
       
   110 }
       
   111 
       
   112 void term_vprintf(const char *fmt, va_list ap)
       
   113 {
       
   114     char buf[4096];
       
   115     vsnprintf(buf, sizeof(buf), fmt, ap);
       
   116     term_puts(buf);
       
   117 }
       
   118 
       
   119 void term_printf(const char *fmt, ...)
       
   120 {
       
   121     va_list ap;
       
   122     va_start(ap, fmt);
       
   123     term_vprintf(fmt, ap);
       
   124     va_end(ap);
       
   125 }
       
   126 
       
   127 void term_print_filename(const char *filename)
       
   128 {
       
   129     int i;
       
   130 
       
   131     for (i = 0; filename[i]; i++) {
       
   132 	switch (filename[i]) {
       
   133 	case ' ':
       
   134 	case '"':
       
   135 	case '\\':
       
   136 	    term_printf("\\%c", filename[i]);
       
   137 	    break;
       
   138 	case '\t':
       
   139 	    term_printf("\\t");
       
   140 	    break;
       
   141 	case '\r':
       
   142 	    term_printf("\\r");
       
   143 	    break;
       
   144 	case '\n':
       
   145 	    term_printf("\\n");
       
   146 	    break;
       
   147 	default:
       
   148 	    term_printf("%c", filename[i]);
       
   149 	    break;
       
   150 	}
       
   151     }
       
   152 }
       
   153 
       
   154 static int monitor_fprintf(FILE *stream, const char *fmt, ...)
       
   155 {
       
   156     va_list ap;
       
   157     va_start(ap, fmt);
       
   158     term_vprintf(fmt, ap);
       
   159     va_end(ap);
       
   160     return 0;
       
   161 }
       
   162 
       
   163 static int compare_cmd(const char *name, const char *list)
       
   164 {
       
   165     const char *p, *pstart;
       
   166     int len;
       
   167     len = strlen(name);
       
   168     p = list;
       
   169     for(;;) {
       
   170         pstart = p;
       
   171         p = strchr(p, '|');
       
   172         if (!p)
       
   173             p = pstart + strlen(pstart);
       
   174         if ((p - pstart) == len && !memcmp(pstart, name, len))
       
   175             return 1;
       
   176         if (*p == '\0')
       
   177             break;
       
   178         p++;
       
   179     }
       
   180     return 0;
       
   181 }
       
   182 
       
   183 static void help_cmd1(const term_cmd_t *cmds, const char *prefix, const char *name)
       
   184 {
       
   185     const term_cmd_t *cmd;
       
   186 
       
   187     for(cmd = cmds; cmd->name != NULL; cmd++) {
       
   188         if (!name || !strcmp(name, cmd->name))
       
   189             term_printf("%s%s %s -- %s\n", prefix, cmd->name, cmd->params, cmd->help);
       
   190     }
       
   191 }
       
   192 
       
   193 static void help_cmd(const char *name)
       
   194 {
       
   195     if (name && !strcmp(name, "info")) {
       
   196         help_cmd1(info_cmds, "info ", NULL);
       
   197     } else {
       
   198         help_cmd1(term_cmds, "", name);
       
   199         if (name && !strcmp(name, "log")) {
       
   200             const CPULogItem *item;
       
   201             term_printf("Log items (comma separated):\n");
       
   202             term_printf("%-10s %s\n", "none", "remove all logs");
       
   203             for(item = cpu_log_items; item->mask != 0; item++) {
       
   204                 term_printf("%-10s %s\n", item->name, item->help);
       
   205             }
       
   206         }
       
   207     }
       
   208 }
       
   209 
       
   210 static void do_help(const char *name)
       
   211 {
       
   212     help_cmd(name);
       
   213 }
       
   214 
       
   215 static void do_commit(const char *device)
       
   216 {
       
   217     int i, all_devices;
       
   218 
       
   219     all_devices = !strcmp(device, "all");
       
   220     for (i = 0; i < nb_drives; i++) {
       
   221             if (all_devices ||
       
   222                 !strcmp(bdrv_get_device_name(drives_table[i].bdrv), device))
       
   223                 bdrv_commit(drives_table[i].bdrv);
       
   224     }
       
   225 }
       
   226 
       
   227 static void do_info(const char *item)
       
   228 {
       
   229     const term_cmd_t *cmd;
       
   230     void (*handler)(void);
       
   231 
       
   232     if (!item)
       
   233         goto help;
       
   234     for(cmd = info_cmds; cmd->name != NULL; cmd++) {
       
   235         if (compare_cmd(item, cmd->name))
       
   236             goto found;
       
   237     }
       
   238  help:
       
   239     help_cmd("info");
       
   240     return;
       
   241  found:
       
   242     handler = cmd->handler;
       
   243     handler();
       
   244 }
       
   245 
       
   246 static void do_info_version(void)
       
   247 {
       
   248   term_printf("%s\n", QEMU_VERSION QEMU_PKGVERSION);
       
   249 }
       
   250 
       
   251 static void do_info_name(void)
       
   252 {
       
   253     if (qemu_name)
       
   254         term_printf("%s\n", qemu_name);
       
   255 }
       
   256 
       
   257 #if defined(TARGET_I386)
       
   258 static void do_info_hpet(void)
       
   259 {
       
   260     term_printf("HPET is %s by QEMU\n", (no_hpet) ? "disabled" : "enabled");
       
   261 }
       
   262 #endif
       
   263 
       
   264 static void do_info_uuid(void)
       
   265 {
       
   266     term_printf(UUID_FMT "\n", qemu_uuid[0], qemu_uuid[1], qemu_uuid[2],
       
   267             qemu_uuid[3], qemu_uuid[4], qemu_uuid[5], qemu_uuid[6],
       
   268             qemu_uuid[7], qemu_uuid[8], qemu_uuid[9], qemu_uuid[10],
       
   269             qemu_uuid[11], qemu_uuid[12], qemu_uuid[13], qemu_uuid[14],
       
   270             qemu_uuid[15]);
       
   271 }
       
   272 
       
   273 static void do_info_block(void)
       
   274 {
       
   275     bdrv_info();
       
   276 }
       
   277 
       
   278 static void do_info_blockstats(void)
       
   279 {
       
   280     bdrv_info_stats();
       
   281 }
       
   282 
       
   283 /* get the current CPU defined by the user */
       
   284 static int mon_set_cpu(int cpu_index)
       
   285 {
       
   286     CPUState *env;
       
   287 
       
   288     for(env = first_cpu; env != NULL; env = env->next_cpu) {
       
   289         if (env->cpu_index == cpu_index) {
       
   290             mon_cpu = env;
       
   291             return 0;
       
   292         }
       
   293     }
       
   294     return -1;
       
   295 }
       
   296 
       
   297 static CPUState *mon_get_cpu(void)
       
   298 {
       
   299     if (!mon_cpu) {
       
   300         mon_set_cpu(0);
       
   301     }
       
   302     return mon_cpu;
       
   303 }
       
   304 
       
   305 static void do_info_registers(void)
       
   306 {
       
   307     CPUState *env;
       
   308     env = mon_get_cpu();
       
   309     if (!env)
       
   310         return;
       
   311 #ifdef TARGET_I386
       
   312     cpu_dump_state(env, NULL, monitor_fprintf,
       
   313                    X86_DUMP_FPU);
       
   314 #else
       
   315     cpu_dump_state(env, NULL, monitor_fprintf,
       
   316                    0);
       
   317 #endif
       
   318 }
       
   319 
       
   320 static void do_info_cpus(void)
       
   321 {
       
   322     CPUState *env;
       
   323 
       
   324     /* just to set the default cpu if not already done */
       
   325     mon_get_cpu();
       
   326 
       
   327     for(env = first_cpu; env != NULL; env = env->next_cpu) {
       
   328         term_printf("%c CPU #%d:",
       
   329                     (env == mon_cpu) ? '*' : ' ',
       
   330                     env->cpu_index);
       
   331 #if defined(TARGET_I386)
       
   332         term_printf(" pc=0x" TARGET_FMT_lx, env->eip + env->segs[R_CS].base);
       
   333 #elif defined(TARGET_PPC)
       
   334         term_printf(" nip=0x" TARGET_FMT_lx, env->nip);
       
   335 #elif defined(TARGET_SPARC)
       
   336         term_printf(" pc=0x" TARGET_FMT_lx " npc=0x" TARGET_FMT_lx, env->pc, env->npc);
       
   337 #elif defined(TARGET_MIPS)
       
   338         term_printf(" PC=0x" TARGET_FMT_lx, env->active_tc.PC);
       
   339 #endif
       
   340         if (env->halted)
       
   341             term_printf(" (halted)");
       
   342         term_printf("\n");
       
   343     }
       
   344 }
       
   345 
       
   346 static void do_cpu_set(int index)
       
   347 {
       
   348     if (mon_set_cpu(index) < 0)
       
   349         term_printf("Invalid CPU index\n");
       
   350 }
       
   351 
       
   352 static void do_info_jit(void)
       
   353 {
       
   354     dump_exec_info(NULL, monitor_fprintf);
       
   355 }
       
   356 
       
   357 static void do_info_history (void)
       
   358 {
       
   359     int i;
       
   360     const char *str;
       
   361 
       
   362     i = 0;
       
   363     for(;;) {
       
   364         str = readline_get_history(i);
       
   365         if (!str)
       
   366             break;
       
   367 	term_printf("%d: '%s'\n", i, str);
       
   368         i++;
       
   369     }
       
   370 }
       
   371 
       
   372 #if defined(TARGET_PPC)
       
   373 /* XXX: not implemented in other targets */
       
   374 static void do_info_cpu_stats (void)
       
   375 {
       
   376     CPUState *env;
       
   377 
       
   378     env = mon_get_cpu();
       
   379     cpu_dump_statistics(env, NULL, &monitor_fprintf, 0);
       
   380 }
       
   381 #endif
       
   382 
       
   383 static void do_quit(void)
       
   384 {
       
   385     exit(0);
       
   386 }
       
   387 
       
   388 static int eject_device(BlockDriverState *bs, int force)
       
   389 {
       
   390     if (bdrv_is_inserted(bs)) {
       
   391         if (!force) {
       
   392             if (!bdrv_is_removable(bs)) {
       
   393                 term_printf("device is not removable\n");
       
   394                 return -1;
       
   395             }
       
   396             if (bdrv_is_locked(bs)) {
       
   397                 term_printf("device is locked\n");
       
   398                 return -1;
       
   399             }
       
   400         }
       
   401         bdrv_close(bs);
       
   402     }
       
   403     return 0;
       
   404 }
       
   405 
       
   406 static void do_eject(int force, const char *filename)
       
   407 {
       
   408     BlockDriverState *bs;
       
   409 
       
   410     bs = bdrv_find(filename);
       
   411     if (!bs) {
       
   412         term_printf("device not found\n");
       
   413         return;
       
   414     }
       
   415     eject_device(bs, force);
       
   416 }
       
   417 
       
   418 static void do_change_block(const char *device, const char *filename, const char *fmt)
       
   419 {
       
   420     BlockDriverState *bs;
       
   421     BlockDriver *drv = NULL;
       
   422 
       
   423     bs = bdrv_find(device);
       
   424     if (!bs) {
       
   425         term_printf("device not found\n");
       
   426         return;
       
   427     }
       
   428     if (fmt) {
       
   429         drv = bdrv_find_format(fmt);
       
   430         if (!drv) {
       
   431             term_printf("invalid format %s\n", fmt);
       
   432             return;
       
   433         }
       
   434     }
       
   435     if (eject_device(bs, 0) < 0)
       
   436         return;
       
   437     bdrv_open2(bs, filename, 0, drv);
       
   438     qemu_key_check(bs, filename);
       
   439 }
       
   440 
       
   441 static void do_change_vnc(const char *target, const char *arg)
       
   442 {
       
   443     if (strcmp(target, "passwd") == 0 ||
       
   444 	strcmp(target, "password") == 0) {
       
   445 	char password[9];
       
   446 	if (arg) {
       
   447 	    strncpy(password, arg, sizeof(password));
       
   448 	    password[sizeof(password) - 1] = '\0';
       
   449 	} else
       
   450 	    monitor_readline("Password: ", 1, password, sizeof(password));
       
   451 	if (vnc_display_password(NULL, password) < 0)
       
   452 	    term_printf("could not set VNC server password\n");
       
   453     } else {
       
   454 	if (vnc_display_open(NULL, target) < 0)
       
   455 	    term_printf("could not start VNC server on %s\n", target);
       
   456     }
       
   457 }
       
   458 
       
   459 static void do_change(const char *device, const char *target, const char *arg)
       
   460 {
       
   461     if (strcmp(device, "vnc") == 0) {
       
   462 	do_change_vnc(target, arg);
       
   463     } else {
       
   464 	do_change_block(device, target, arg);
       
   465     }
       
   466 }
       
   467 
       
   468 static void do_screen_dump(const char *filename)
       
   469 {
       
   470     gui_notify_screen_dump(filename);
       
   471 }
       
   472 
       
   473 static void do_logfile(const char *filename)
       
   474 {
       
   475     cpu_set_log_filename(filename);
       
   476 }
       
   477 
       
   478 static void do_log(const char *items)
       
   479 {
       
   480     int mask;
       
   481 
       
   482     if (!strcmp(items, "none")) {
       
   483         mask = 0;
       
   484     } else {
       
   485         mask = cpu_str_to_log_mask(items);
       
   486         if (!mask) {
       
   487             help_cmd("log");
       
   488             return;
       
   489         }
       
   490     }
       
   491     cpu_set_log(mask);
       
   492 }
       
   493 
       
   494 static void do_stop(void)
       
   495 {
       
   496     vm_stop(EXCP_INTERRUPT);
       
   497 }
       
   498 
       
   499 static void do_cont(void)
       
   500 {
       
   501     vm_start();
       
   502 }
       
   503 
       
   504 #ifdef CONFIG_GDBSTUB
       
   505 static void do_gdbserver(const char *port)
       
   506 {
       
   507     if (!port)
       
   508         port = DEFAULT_GDBSTUB_PORT;
       
   509     if (gdbserver_start(port) < 0) {
       
   510         qemu_printf("Could not open gdbserver socket on port '%s'\n", port);
       
   511     } else {
       
   512         qemu_printf("Waiting gdb connection on port '%s'\n", port);
       
   513     }
       
   514 }
       
   515 #endif
       
   516 
       
   517 static void term_printc(int c)
       
   518 {
       
   519     term_printf("'");
       
   520     switch(c) {
       
   521     case '\'':
       
   522         term_printf("\\'");
       
   523         break;
       
   524     case '\\':
       
   525         term_printf("\\\\");
       
   526         break;
       
   527     case '\n':
       
   528         term_printf("\\n");
       
   529         break;
       
   530     case '\r':
       
   531         term_printf("\\r");
       
   532         break;
       
   533     default:
       
   534         if (c >= 32 && c <= 126) {
       
   535             term_printf("%c", c);
       
   536         } else {
       
   537             term_printf("\\x%02x", c);
       
   538         }
       
   539         break;
       
   540     }
       
   541     term_printf("'");
       
   542 }
       
   543 
       
   544 static void memory_dump(int count, int format, int wsize,
       
   545                         target_phys_addr_t addr, int is_physical)
       
   546 {
       
   547     CPUState *env;
       
   548     int nb_per_line, l, line_size, i, max_digits, len;
       
   549     uint8_t buf[16];
       
   550     uint64_t v;
       
   551 
       
   552     if (format == 'i') {
       
   553         int flags;
       
   554         flags = 0;
       
   555         env = mon_get_cpu();
       
   556         if (!env && !is_physical)
       
   557             return;
       
   558 #ifdef TARGET_I386
       
   559         if (wsize == 2) {
       
   560             flags = 1;
       
   561         } else if (wsize == 4) {
       
   562             flags = 0;
       
   563         } else {
       
   564             /* as default we use the current CS size */
       
   565             flags = 0;
       
   566             if (env) {
       
   567 #ifdef TARGET_X86_64
       
   568                 if ((env->efer & MSR_EFER_LMA) &&
       
   569                     (env->segs[R_CS].flags & DESC_L_MASK))
       
   570                     flags = 2;
       
   571                 else
       
   572 #endif
       
   573                 if (!(env->segs[R_CS].flags & DESC_B_MASK))
       
   574                     flags = 1;
       
   575             }
       
   576         }
       
   577 #endif
       
   578         monitor_disas(env, addr, count, is_physical, flags);
       
   579         return;
       
   580     }
       
   581 
       
   582     len = wsize * count;
       
   583     if (wsize == 1)
       
   584         line_size = 8;
       
   585     else
       
   586         line_size = 16;
       
   587     nb_per_line = line_size / wsize;
       
   588     max_digits = 0;
       
   589 
       
   590     switch(format) {
       
   591     case 'o':
       
   592         max_digits = (wsize * 8 + 2) / 3;
       
   593         break;
       
   594     default:
       
   595     case 'x':
       
   596         max_digits = (wsize * 8) / 4;
       
   597         break;
       
   598     case 'u':
       
   599     case 'd':
       
   600         max_digits = (wsize * 8 * 10 + 32) / 33;
       
   601         break;
       
   602     case 'c':
       
   603         wsize = 1;
       
   604         break;
       
   605     }
       
   606 
       
   607     while (len > 0) {
       
   608         if (is_physical)
       
   609             term_printf(TARGET_FMT_plx ":", addr);
       
   610         else
       
   611             term_printf(TARGET_FMT_lx ":", (target_ulong)addr);
       
   612         l = len;
       
   613         if (l > line_size)
       
   614             l = line_size;
       
   615         if (is_physical) {
       
   616             cpu_physical_memory_rw(addr, buf, l, 0);
       
   617         } else {
       
   618             env = mon_get_cpu();
       
   619             if (!env)
       
   620                 break;
       
   621             if (cpu_memory_rw_debug(env, addr, buf, l, 0) < 0) {
       
   622                 term_printf(" Cannot access memory\n");
       
   623                 break;
       
   624             }
       
   625         }
       
   626         i = 0;
       
   627         while (i < l) {
       
   628             switch(wsize) {
       
   629             default:
       
   630             case 1:
       
   631                 v = ldub_raw(buf + i);
       
   632                 break;
       
   633             case 2:
       
   634                 v = lduw_raw(buf + i);
       
   635                 break;
       
   636             case 4:
       
   637                 v = (uint32_t)ldl_raw(buf + i);
       
   638                 break;
       
   639             case 8:
       
   640                 v = ldq_raw(buf + i);
       
   641                 break;
       
   642             }
       
   643             term_printf(" ");
       
   644             switch(format) {
       
   645             case 'o':
       
   646                 term_printf("%#*" PRIo64, max_digits, v);
       
   647                 break;
       
   648             case 'x':
       
   649                 term_printf("0x%0*" PRIx64, max_digits, v);
       
   650                 break;
       
   651             case 'u':
       
   652                 term_printf("%*" PRIu64, max_digits, v);
       
   653                 break;
       
   654             case 'd':
       
   655                 term_printf("%*" PRId64, max_digits, v);
       
   656                 break;
       
   657             case 'c':
       
   658                 term_printc(v);
       
   659                 break;
       
   660             }
       
   661             i += wsize;
       
   662         }
       
   663         term_printf("\n");
       
   664         addr += l;
       
   665         len -= l;
       
   666     }
       
   667 }
       
   668 
       
   669 #if TARGET_LONG_BITS == 64
       
   670 #define GET_TLONG(h, l) (((uint64_t)(h) << 32) | (l))
       
   671 #else
       
   672 #define GET_TLONG(h, l) (l)
       
   673 #endif
       
   674 
       
   675 static void do_memory_dump(int count, int format, int size,
       
   676                            uint32_t addrh, uint32_t addrl)
       
   677 {
       
   678     target_long addr = GET_TLONG(addrh, addrl);
       
   679     memory_dump(count, format, size, addr, 0);
       
   680 }
       
   681 
       
   682 #if TARGET_PHYS_ADDR_BITS > 32
       
   683 #define GET_TPHYSADDR(h, l) (((uint64_t)(h) << 32) | (l))
       
   684 #else
       
   685 #define GET_TPHYSADDR(h, l) (l)
       
   686 #endif
       
   687 
       
   688 static void do_physical_memory_dump(int count, int format, int size,
       
   689                                     uint32_t addrh, uint32_t addrl)
       
   690 
       
   691 {
       
   692     target_phys_addr_t addr = GET_TPHYSADDR(addrh, addrl);
       
   693     memory_dump(count, format, size, addr, 1);
       
   694 }
       
   695 
       
   696 static void do_print(int count, int format, int size, unsigned int valh, unsigned int vall)
       
   697 {
       
   698     target_phys_addr_t val = GET_TPHYSADDR(valh, vall);
       
   699 #if TARGET_PHYS_ADDR_BITS == 32
       
   700     switch(format) {
       
   701     case 'o':
       
   702         term_printf("%#o", val);
       
   703         break;
       
   704     case 'x':
       
   705         term_printf("%#x", val);
       
   706         break;
       
   707     case 'u':
       
   708         term_printf("%u", val);
       
   709         break;
       
   710     default:
       
   711     case 'd':
       
   712         term_printf("%d", val);
       
   713         break;
       
   714     case 'c':
       
   715         term_printc(val);
       
   716         break;
       
   717     }
       
   718 #else
       
   719     switch(format) {
       
   720     case 'o':
       
   721         term_printf("%#" PRIo64, val);
       
   722         break;
       
   723     case 'x':
       
   724         term_printf("%#" PRIx64, val);
       
   725         break;
       
   726     case 'u':
       
   727         term_printf("%" PRIu64, val);
       
   728         break;
       
   729     default:
       
   730     case 'd':
       
   731         term_printf("%" PRId64, val);
       
   732         break;
       
   733     case 'c':
       
   734         term_printc(val);
       
   735         break;
       
   736     }
       
   737 #endif
       
   738     term_printf("\n");
       
   739 }
       
   740 
       
   741 static void do_memory_save(unsigned int valh, unsigned int vall,
       
   742                            uint32_t size, const char *filename)
       
   743 {
       
   744     FILE *f;
       
   745     target_long addr = GET_TLONG(valh, vall);
       
   746     uint32_t l;
       
   747     CPUState *env;
       
   748     uint8_t buf[1024];
       
   749 
       
   750     env = mon_get_cpu();
       
   751     if (!env)
       
   752         return;
       
   753 
       
   754     f = fopen(filename, "wb");
       
   755     if (!f) {
       
   756         term_printf("could not open '%s'\n", filename);
       
   757         return;
       
   758     }
       
   759     while (size != 0) {
       
   760         l = sizeof(buf);
       
   761         if (l > size)
       
   762             l = size;
       
   763         cpu_memory_rw_debug(env, addr, buf, l, 0);
       
   764         fwrite(buf, 1, l, f);
       
   765         addr += l;
       
   766         size -= l;
       
   767     }
       
   768     fclose(f);
       
   769 }
       
   770 
       
   771 static void do_physical_memory_save(unsigned int valh, unsigned int vall,
       
   772                                     uint32_t size, const char *filename)
       
   773 {
       
   774     FILE *f;
       
   775     uint32_t l;
       
   776     uint8_t buf[1024];
       
   777     target_phys_addr_t addr = GET_TPHYSADDR(valh, vall); 
       
   778 
       
   779     f = fopen(filename, "wb");
       
   780     if (!f) {
       
   781         term_printf("could not open '%s'\n", filename);
       
   782         return;
       
   783     }
       
   784     while (size != 0) {
       
   785         l = sizeof(buf);
       
   786         if (l > size)
       
   787             l = size;
       
   788         cpu_physical_memory_rw(addr, buf, l, 0);
       
   789         fwrite(buf, 1, l, f);
       
   790         fflush(f);
       
   791         addr += l;
       
   792         size -= l;
       
   793     }
       
   794     fclose(f);
       
   795 }
       
   796 
       
   797 static void do_sum(uint32_t start, uint32_t size)
       
   798 {
       
   799     uint32_t addr;
       
   800     uint8_t buf[1];
       
   801     uint16_t sum;
       
   802 
       
   803     sum = 0;
       
   804     for(addr = start; addr < (start + size); addr++) {
       
   805         cpu_physical_memory_rw(addr, buf, 1, 0);
       
   806         /* BSD sum algorithm ('sum' Unix command) */
       
   807         sum = (sum >> 1) | (sum << 15);
       
   808         sum += buf[0];
       
   809     }
       
   810     term_printf("%05d\n", sum);
       
   811 }
       
   812 
       
   813 typedef struct {
       
   814     int keycode;
       
   815     const char *name;
       
   816 } KeyDef;
       
   817 
       
   818 static const KeyDef key_defs[] = {
       
   819     { 0x2a, "shift" },
       
   820     { 0x36, "shift_r" },
       
   821 
       
   822     { 0x38, "alt" },
       
   823     { 0xb8, "alt_r" },
       
   824     { 0x64, "altgr" },
       
   825     { 0xe4, "altgr_r" },
       
   826     { 0x1d, "ctrl" },
       
   827     { 0x9d, "ctrl_r" },
       
   828 
       
   829     { 0xdd, "menu" },
       
   830 
       
   831     { 0x01, "esc" },
       
   832 
       
   833     { 0x02, "1" },
       
   834     { 0x03, "2" },
       
   835     { 0x04, "3" },
       
   836     { 0x05, "4" },
       
   837     { 0x06, "5" },
       
   838     { 0x07, "6" },
       
   839     { 0x08, "7" },
       
   840     { 0x09, "8" },
       
   841     { 0x0a, "9" },
       
   842     { 0x0b, "0" },
       
   843     { 0x0c, "minus" },
       
   844     { 0x0d, "equal" },
       
   845     { 0x0e, "backspace" },
       
   846 
       
   847     { 0x0f, "tab" },
       
   848     { 0x10, "q" },
       
   849     { 0x11, "w" },
       
   850     { 0x12, "e" },
       
   851     { 0x13, "r" },
       
   852     { 0x14, "t" },
       
   853     { 0x15, "y" },
       
   854     { 0x16, "u" },
       
   855     { 0x17, "i" },
       
   856     { 0x18, "o" },
       
   857     { 0x19, "p" },
       
   858 
       
   859     { 0x1c, "ret" },
       
   860 
       
   861     { 0x1e, "a" },
       
   862     { 0x1f, "s" },
       
   863     { 0x20, "d" },
       
   864     { 0x21, "f" },
       
   865     { 0x22, "g" },
       
   866     { 0x23, "h" },
       
   867     { 0x24, "j" },
       
   868     { 0x25, "k" },
       
   869     { 0x26, "l" },
       
   870 
       
   871     { 0x2c, "z" },
       
   872     { 0x2d, "x" },
       
   873     { 0x2e, "c" },
       
   874     { 0x2f, "v" },
       
   875     { 0x30, "b" },
       
   876     { 0x31, "n" },
       
   877     { 0x32, "m" },
       
   878     { 0x33, "comma" },
       
   879     { 0x34, "dot" },
       
   880     { 0x35, "slash" },
       
   881 
       
   882     { 0x37, "asterisk" },
       
   883 
       
   884     { 0x39, "spc" },
       
   885     { 0x3a, "caps_lock" },
       
   886     { 0x3b, "f1" },
       
   887     { 0x3c, "f2" },
       
   888     { 0x3d, "f3" },
       
   889     { 0x3e, "f4" },
       
   890     { 0x3f, "f5" },
       
   891     { 0x40, "f6" },
       
   892     { 0x41, "f7" },
       
   893     { 0x42, "f8" },
       
   894     { 0x43, "f9" },
       
   895     { 0x44, "f10" },
       
   896     { 0x45, "num_lock" },
       
   897     { 0x46, "scroll_lock" },
       
   898 
       
   899     { 0xb5, "kp_divide" },
       
   900     { 0x37, "kp_multiply" },
       
   901     { 0x4a, "kp_subtract" },
       
   902     { 0x4e, "kp_add" },
       
   903     { 0x9c, "kp_enter" },
       
   904     { 0x53, "kp_decimal" },
       
   905     { 0x54, "sysrq" },
       
   906 
       
   907     { 0x52, "kp_0" },
       
   908     { 0x4f, "kp_1" },
       
   909     { 0x50, "kp_2" },
       
   910     { 0x51, "kp_3" },
       
   911     { 0x4b, "kp_4" },
       
   912     { 0x4c, "kp_5" },
       
   913     { 0x4d, "kp_6" },
       
   914     { 0x47, "kp_7" },
       
   915     { 0x48, "kp_8" },
       
   916     { 0x49, "kp_9" },
       
   917 
       
   918     { 0x56, "<" },
       
   919 
       
   920     { 0x57, "f11" },
       
   921     { 0x58, "f12" },
       
   922 
       
   923     { 0xb7, "print" },
       
   924 
       
   925     { 0xc7, "home" },
       
   926     { 0xc9, "pgup" },
       
   927     { 0xd1, "pgdn" },
       
   928     { 0xcf, "end" },
       
   929 
       
   930     { 0xcb, "left" },
       
   931     { 0xc8, "up" },
       
   932     { 0xd0, "down" },
       
   933     { 0xcd, "right" },
       
   934 
       
   935     { 0xd2, "insert" },
       
   936     { 0xd3, "delete" },
       
   937 #if defined(TARGET_SPARC) && !defined(TARGET_SPARC64)
       
   938     { 0xf0, "stop" },
       
   939     { 0xf1, "again" },
       
   940     { 0xf2, "props" },
       
   941     { 0xf3, "undo" },
       
   942     { 0xf4, "front" },
       
   943     { 0xf5, "copy" },
       
   944     { 0xf6, "open" },
       
   945     { 0xf7, "paste" },
       
   946     { 0xf8, "find" },
       
   947     { 0xf9, "cut" },
       
   948     { 0xfa, "lf" },
       
   949     { 0xfb, "help" },
       
   950     { 0xfc, "meta_l" },
       
   951     { 0xfd, "meta_r" },
       
   952     { 0xfe, "compose" },
       
   953 #endif
       
   954     { 0, NULL },
       
   955 };
       
   956 
       
   957 static int get_keycode(const char *key)
       
   958 {
       
   959     const KeyDef *p;
       
   960     char *endp;
       
   961     int ret;
       
   962 
       
   963     for(p = key_defs; p->name != NULL; p++) {
       
   964         if (!strcmp(key, p->name))
       
   965             return p->keycode;
       
   966     }
       
   967     if (strstart(key, "0x", NULL)) {
       
   968         ret = strtoul(key, &endp, 0);
       
   969         if (*endp == '\0' && ret >= 0x01 && ret <= 0xff)
       
   970             return ret;
       
   971     }
       
   972     return -1;
       
   973 }
       
   974 
       
   975 #define MAX_KEYCODES 16
       
   976 static uint8_t keycodes[MAX_KEYCODES];
       
   977 static int nb_pending_keycodes;
       
   978 static QEMUTimer *key_timer;
       
   979 
       
   980 static void release_keys(void *opaque)
       
   981 {
       
   982     int keycode;
       
   983 
       
   984     while (nb_pending_keycodes > 0) {
       
   985         nb_pending_keycodes--;
       
   986         keycode = keycodes[nb_pending_keycodes];
       
   987         if (keycode & 0x80)
       
   988             gui_notify_dev_key(0xe0);
       
   989         gui_notify_dev_key(keycode | 0x80);
       
   990     }
       
   991 }
       
   992 
       
   993 static void do_sendkey(const char *string, int has_hold_time, int hold_time)
       
   994 {
       
   995     char keyname_buf[16];
       
   996     char *separator;
       
   997     int keyname_len, keycode, i;
       
   998 
       
   999     if (nb_pending_keycodes > 0) {
       
  1000         qemu_del_timer(key_timer);
       
  1001         release_keys(NULL);
       
  1002     }
       
  1003     if (!has_hold_time)
       
  1004         hold_time = 100;
       
  1005     i = 0;
       
  1006     while (1) {
       
  1007         separator = strchr(string, '-');
       
  1008         keyname_len = separator ? separator - string : strlen(string);
       
  1009         if (keyname_len > 0) {
       
  1010             pstrcpy(keyname_buf, sizeof(keyname_buf), string);
       
  1011             if (keyname_len > sizeof(keyname_buf) - 1) {
       
  1012                 term_printf("invalid key: '%s...'\n", keyname_buf);
       
  1013                 return;
       
  1014             }
       
  1015             if (i == MAX_KEYCODES) {
       
  1016                 term_printf("too many keys\n");
       
  1017                 return;
       
  1018             }
       
  1019             keyname_buf[keyname_len] = 0;
       
  1020             keycode = get_keycode(keyname_buf);
       
  1021             if (keycode < 0) {
       
  1022                 term_printf("unknown key: '%s'\n", keyname_buf);
       
  1023                 return;
       
  1024             }
       
  1025             keycodes[i++] = keycode;
       
  1026         }
       
  1027         if (!separator)
       
  1028             break;
       
  1029         string = separator + 1;
       
  1030     }
       
  1031     nb_pending_keycodes = i;
       
  1032     /* key down events */
       
  1033     for (i = 0; i < nb_pending_keycodes; i++) {
       
  1034         keycode = keycodes[i];
       
  1035         if (keycode & 0x80)
       
  1036             gui_notify_dev_key(0xe0);
       
  1037         gui_notify_dev_key(keycode & 0x7f);
       
  1038     }
       
  1039     /* delayed key up events */
       
  1040     qemu_mod_timer(key_timer, qemu_get_clock(vm_clock) +
       
  1041                     muldiv64(ticks_per_sec, hold_time, 1000));
       
  1042 }
       
  1043 
       
  1044 static int mouse_button_state;
       
  1045 
       
  1046 static void do_mouse_move(const char *dx_str, const char *dy_str,
       
  1047                           const char *dz_str)
       
  1048 {
       
  1049     int dx, dy, dz;
       
  1050     dx = strtol(dx_str, NULL, 0);
       
  1051     dy = strtol(dy_str, NULL, 0);
       
  1052     dz = 0;
       
  1053     if (dz_str)
       
  1054         dz = strtol(dz_str, NULL, 0);
       
  1055     kbd_mouse_event(dx, dy, dz, mouse_button_state);
       
  1056 }
       
  1057 
       
  1058 static void do_mouse_button(int button_state)
       
  1059 {
       
  1060     mouse_button_state = button_state;
       
  1061     kbd_mouse_event(0, 0, 0, mouse_button_state);
       
  1062 }
       
  1063 
       
  1064 static void do_ioport_read(int count, int format, int size, int addr, int has_index, int index)
       
  1065 {
       
  1066     uint32_t val;
       
  1067     int suffix;
       
  1068 
       
  1069     if (has_index) {
       
  1070         cpu_outb(NULL, addr & 0xffff, index & 0xff);
       
  1071         addr++;
       
  1072     }
       
  1073     addr &= 0xffff;
       
  1074 
       
  1075     switch(size) {
       
  1076     default:
       
  1077     case 1:
       
  1078         val = cpu_inb(NULL, addr);
       
  1079         suffix = 'b';
       
  1080         break;
       
  1081     case 2:
       
  1082         val = cpu_inw(NULL, addr);
       
  1083         suffix = 'w';
       
  1084         break;
       
  1085     case 4:
       
  1086         val = cpu_inl(NULL, addr);
       
  1087         suffix = 'l';
       
  1088         break;
       
  1089     }
       
  1090     term_printf("port%c[0x%04x] = %#0*x\n",
       
  1091                 suffix, addr, size * 2, val);
       
  1092 }
       
  1093 
       
  1094 /* boot_set handler */
       
  1095 static QEMUBootSetHandler *qemu_boot_set_handler = NULL;
       
  1096 static void *boot_opaque;
       
  1097 
       
  1098 void qemu_register_boot_set(QEMUBootSetHandler *func, void *opaque)
       
  1099 {
       
  1100     qemu_boot_set_handler = func;
       
  1101     boot_opaque = opaque;
       
  1102 }
       
  1103 
       
  1104 static void do_boot_set(const char *bootdevice)
       
  1105 {
       
  1106     int res;
       
  1107 
       
  1108     if (qemu_boot_set_handler)  {
       
  1109         res = qemu_boot_set_handler(boot_opaque, bootdevice);
       
  1110         if (res == 0)
       
  1111             term_printf("boot device list now set to %s\n", bootdevice);
       
  1112         else
       
  1113             term_printf("setting boot device list failed with error %i\n", res);
       
  1114     } else {
       
  1115         term_printf("no function defined to set boot device list for this architecture\n");
       
  1116     }
       
  1117 }
       
  1118 
       
  1119 static void do_system_reset(void)
       
  1120 {
       
  1121     qemu_system_reset_request();
       
  1122 }
       
  1123 
       
  1124 static void do_system_powerdown(void)
       
  1125 {
       
  1126     qemu_system_powerdown_request();
       
  1127 }
       
  1128 
       
  1129 #if defined(TARGET_I386)
       
  1130 static void print_pte(uint32_t addr, uint32_t pte, uint32_t mask)
       
  1131 {
       
  1132     term_printf("%08x: %08x %c%c%c%c%c%c%c%c\n",
       
  1133                 addr,
       
  1134                 pte & mask,
       
  1135                 pte & PG_GLOBAL_MASK ? 'G' : '-',
       
  1136                 pte & PG_PSE_MASK ? 'P' : '-',
       
  1137                 pte & PG_DIRTY_MASK ? 'D' : '-',
       
  1138                 pte & PG_ACCESSED_MASK ? 'A' : '-',
       
  1139                 pte & PG_PCD_MASK ? 'C' : '-',
       
  1140                 pte & PG_PWT_MASK ? 'T' : '-',
       
  1141                 pte & PG_USER_MASK ? 'U' : '-',
       
  1142                 pte & PG_RW_MASK ? 'W' : '-');
       
  1143 }
       
  1144 
       
  1145 static void tlb_info(void)
       
  1146 {
       
  1147     CPUState *env;
       
  1148     int l1, l2;
       
  1149     uint32_t pgd, pde, pte;
       
  1150 
       
  1151     env = mon_get_cpu();
       
  1152     if (!env)
       
  1153         return;
       
  1154 
       
  1155     if (!(env->cr[0] & CR0_PG_MASK)) {
       
  1156         term_printf("PG disabled\n");
       
  1157         return;
       
  1158     }
       
  1159     pgd = env->cr[3] & ~0xfff;
       
  1160     for(l1 = 0; l1 < 1024; l1++) {
       
  1161         cpu_physical_memory_read(pgd + l1 * 4, (uint8_t *)&pde, 4);
       
  1162         pde = le32_to_cpu(pde);
       
  1163         if (pde & PG_PRESENT_MASK) {
       
  1164             if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) {
       
  1165                 print_pte((l1 << 22), pde, ~((1 << 20) - 1));
       
  1166             } else {
       
  1167                 for(l2 = 0; l2 < 1024; l2++) {
       
  1168                     cpu_physical_memory_read((pde & ~0xfff) + l2 * 4,
       
  1169                                              (uint8_t *)&pte, 4);
       
  1170                     pte = le32_to_cpu(pte);
       
  1171                     if (pte & PG_PRESENT_MASK) {
       
  1172                         print_pte((l1 << 22) + (l2 << 12),
       
  1173                                   pte & ~PG_PSE_MASK,
       
  1174                                   ~0xfff);
       
  1175                     }
       
  1176                 }
       
  1177             }
       
  1178         }
       
  1179     }
       
  1180 }
       
  1181 
       
  1182 static void mem_print(uint32_t *pstart, int *plast_prot,
       
  1183                       uint32_t end, int prot)
       
  1184 {
       
  1185     int prot1;
       
  1186     prot1 = *plast_prot;
       
  1187     if (prot != prot1) {
       
  1188         if (*pstart != -1) {
       
  1189             term_printf("%08x-%08x %08x %c%c%c\n",
       
  1190                         *pstart, end, end - *pstart,
       
  1191                         prot1 & PG_USER_MASK ? 'u' : '-',
       
  1192                         'r',
       
  1193                         prot1 & PG_RW_MASK ? 'w' : '-');
       
  1194         }
       
  1195         if (prot != 0)
       
  1196             *pstart = end;
       
  1197         else
       
  1198             *pstart = -1;
       
  1199         *plast_prot = prot;
       
  1200     }
       
  1201 }
       
  1202 
       
  1203 static void mem_info(void)
       
  1204 {
       
  1205     CPUState *env;
       
  1206     int l1, l2, prot, last_prot;
       
  1207     uint32_t pgd, pde, pte, start, end;
       
  1208 
       
  1209     env = mon_get_cpu();
       
  1210     if (!env)
       
  1211         return;
       
  1212 
       
  1213     if (!(env->cr[0] & CR0_PG_MASK)) {
       
  1214         term_printf("PG disabled\n");
       
  1215         return;
       
  1216     }
       
  1217     pgd = env->cr[3] & ~0xfff;
       
  1218     last_prot = 0;
       
  1219     start = -1;
       
  1220     for(l1 = 0; l1 < 1024; l1++) {
       
  1221         cpu_physical_memory_read(pgd + l1 * 4, (uint8_t *)&pde, 4);
       
  1222         pde = le32_to_cpu(pde);
       
  1223         end = l1 << 22;
       
  1224         if (pde & PG_PRESENT_MASK) {
       
  1225             if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) {
       
  1226                 prot = pde & (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK);
       
  1227                 mem_print(&start, &last_prot, end, prot);
       
  1228             } else {
       
  1229                 for(l2 = 0; l2 < 1024; l2++) {
       
  1230                     cpu_physical_memory_read((pde & ~0xfff) + l2 * 4,
       
  1231                                              (uint8_t *)&pte, 4);
       
  1232                     pte = le32_to_cpu(pte);
       
  1233                     end = (l1 << 22) + (l2 << 12);
       
  1234                     if (pte & PG_PRESENT_MASK) {
       
  1235                         prot = pte & (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK);
       
  1236                     } else {
       
  1237                         prot = 0;
       
  1238                     }
       
  1239                     mem_print(&start, &last_prot, end, prot);
       
  1240                 }
       
  1241             }
       
  1242         } else {
       
  1243             prot = 0;
       
  1244             mem_print(&start, &last_prot, end, prot);
       
  1245         }
       
  1246     }
       
  1247 }
       
  1248 #endif
       
  1249 
       
  1250 static void do_info_kqemu(void)
       
  1251 {
       
  1252 #ifdef USE_KQEMU
       
  1253     CPUState *env;
       
  1254     int val;
       
  1255     val = 0;
       
  1256     env = mon_get_cpu();
       
  1257     if (!env) {
       
  1258         term_printf("No cpu initialized yet");
       
  1259         return;
       
  1260     }
       
  1261     val = env->kqemu_enabled;
       
  1262     term_printf("kqemu support: ");
       
  1263     switch(val) {
       
  1264     default:
       
  1265     case 0:
       
  1266         term_printf("disabled\n");
       
  1267         break;
       
  1268     case 1:
       
  1269         term_printf("enabled for user code\n");
       
  1270         break;
       
  1271     case 2:
       
  1272         term_printf("enabled for user and kernel code\n");
       
  1273         break;
       
  1274     }
       
  1275 #else
       
  1276     term_printf("kqemu support: not compiled\n");
       
  1277 #endif
       
  1278 }
       
  1279 
       
  1280 static void do_info_kvm(void)
       
  1281 {
       
  1282 #ifdef CONFIG_KVM
       
  1283     term_printf("kvm support: ");
       
  1284     if (kvm_enabled())
       
  1285 	term_printf("enabled\n");
       
  1286     else
       
  1287 	term_printf("disabled\n");
       
  1288 #else
       
  1289     term_printf("kvm support: not compiled\n");
       
  1290 #endif
       
  1291 }
       
  1292 
       
  1293 #ifdef CONFIG_PROFILER
       
  1294 
       
  1295 int64_t kqemu_time;
       
  1296 int64_t qemu_time;
       
  1297 int64_t kqemu_exec_count;
       
  1298 int64_t dev_time;
       
  1299 int64_t kqemu_ret_int_count;
       
  1300 int64_t kqemu_ret_excp_count;
       
  1301 int64_t kqemu_ret_intr_count;
       
  1302 
       
  1303 static void do_info_profile(void)
       
  1304 {
       
  1305     int64_t total;
       
  1306     total = qemu_time;
       
  1307     if (total == 0)
       
  1308         total = 1;
       
  1309     term_printf("async time  %" PRId64 " (%0.3f)\n",
       
  1310                 dev_time, dev_time / (double)ticks_per_sec);
       
  1311     term_printf("qemu time   %" PRId64 " (%0.3f)\n",
       
  1312                 qemu_time, qemu_time / (double)ticks_per_sec);
       
  1313     term_printf("kqemu time  %" PRId64 " (%0.3f %0.1f%%) count=%" PRId64 " int=%" PRId64 " excp=%" PRId64 " intr=%" PRId64 "\n",
       
  1314                 kqemu_time, kqemu_time / (double)ticks_per_sec,
       
  1315                 kqemu_time / (double)total * 100.0,
       
  1316                 kqemu_exec_count,
       
  1317                 kqemu_ret_int_count,
       
  1318                 kqemu_ret_excp_count,
       
  1319                 kqemu_ret_intr_count);
       
  1320     qemu_time = 0;
       
  1321     kqemu_time = 0;
       
  1322     kqemu_exec_count = 0;
       
  1323     dev_time = 0;
       
  1324     kqemu_ret_int_count = 0;
       
  1325     kqemu_ret_excp_count = 0;
       
  1326     kqemu_ret_intr_count = 0;
       
  1327 #ifdef USE_KQEMU
       
  1328     kqemu_record_dump();
       
  1329 #endif
       
  1330 }
       
  1331 #else
       
  1332 static void do_info_profile(void)
       
  1333 {
       
  1334     term_printf("Internal profiler not compiled\n");
       
  1335 }
       
  1336 #endif
       
  1337 
       
  1338 /* Capture support */
       
  1339 static LIST_HEAD (capture_list_head, CaptureState) capture_head;
       
  1340 
       
  1341 static void do_info_capture (void)
       
  1342 {
       
  1343     int i;
       
  1344     CaptureState *s;
       
  1345 
       
  1346     for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
       
  1347         term_printf ("[%d]: ", i);
       
  1348         s->ops.info (s->opaque);
       
  1349     }
       
  1350 }
       
  1351 
       
  1352 static void do_stop_capture (int n)
       
  1353 {
       
  1354     int i;
       
  1355     CaptureState *s;
       
  1356 
       
  1357     for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
       
  1358         if (i == n) {
       
  1359             s->ops.destroy (s->opaque);
       
  1360             LIST_REMOVE (s, entries);
       
  1361             qemu_free (s);
       
  1362             return;
       
  1363         }
       
  1364     }
       
  1365 }
       
  1366 
       
  1367 #ifdef HAS_AUDIO
       
  1368 static void do_wav_capture (const char *path,
       
  1369                             int has_freq, int freq,
       
  1370                             int has_bits, int bits,
       
  1371                             int has_channels, int nchannels)
       
  1372 {
       
  1373     CaptureState *s;
       
  1374 
       
  1375     s = qemu_mallocz (sizeof (*s));
       
  1376     if (!s) {
       
  1377         term_printf ("Not enough memory to add wave capture\n");
       
  1378         return;
       
  1379     }
       
  1380 
       
  1381     freq = has_freq ? freq : 44100;
       
  1382     bits = has_bits ? bits : 16;
       
  1383     nchannels = has_channels ? nchannels : 2;
       
  1384 
       
  1385     if (wav_start_capture (s, path, freq, bits, nchannels)) {
       
  1386         term_printf ("Faied to add wave capture\n");
       
  1387         qemu_free (s);
       
  1388     }
       
  1389     LIST_INSERT_HEAD (&capture_head, s, entries);
       
  1390 }
       
  1391 #endif
       
  1392 
       
  1393 #if defined(TARGET_I386)
       
  1394 static void do_inject_nmi(int cpu_index)
       
  1395 {
       
  1396     CPUState *env;
       
  1397 
       
  1398     for (env = first_cpu; env != NULL; env = env->next_cpu)
       
  1399         if (env->cpu_index == cpu_index) {
       
  1400             cpu_interrupt(env, CPU_INTERRUPT_NMI);
       
  1401             break;
       
  1402         }
       
  1403 }
       
  1404 #endif
       
  1405 
       
  1406 static void do_info_status(void)
       
  1407 {
       
  1408     if (vm_running)
       
  1409        term_printf("VM status: running\n");
       
  1410     else
       
  1411        term_printf("VM status: paused\n");
       
  1412 }
       
  1413 
       
  1414 
       
  1415 static void do_balloon(int value)
       
  1416 {
       
  1417     ram_addr_t target = value;
       
  1418     qemu_balloon(target << 20);
       
  1419 }
       
  1420 
       
  1421 static void do_info_balloon(void)
       
  1422 {
       
  1423     ram_addr_t actual;
       
  1424 
       
  1425     actual = qemu_balloon_status();
       
  1426     if (kvm_enabled() && !kvm_has_sync_mmu())
       
  1427         term_printf("Using KVM without synchronous MMU, ballooning disabled\n");
       
  1428     else if (actual == 0)
       
  1429         term_printf("Ballooning not activated in VM\n");
       
  1430     else
       
  1431         term_printf("balloon: actual=%d\n", (int)(actual >> 20));
       
  1432 }
       
  1433 
       
  1434 static const term_cmd_t term_cmds[] = {
       
  1435     { "help|?", "s?", do_help,
       
  1436       "[cmd]", "show the help" },
       
  1437     { "commit", "s", do_commit,
       
  1438       "device|all", "commit changes to the disk images (if -snapshot is used) or backing files" },
       
  1439     { "info", "s?", do_info,
       
  1440       "subcommand", "show various information about the system state" },
       
  1441     { "q|quit", "", do_quit,
       
  1442       "", "quit the emulator" },
       
  1443     { "eject", "-fB", do_eject,
       
  1444       "[-f] device", "eject a removable medium (use -f to force it)" },
       
  1445     { "change", "BFs?", do_change,
       
  1446       "device filename [format]", "change a removable medium, optional format" },
       
  1447     { "screendump", "F", do_screen_dump,
       
  1448       "filename", "save screen into PPM image 'filename'" },
       
  1449     { "logfile", "F", do_logfile,
       
  1450       "filename", "output logs to 'filename'" },
       
  1451     { "log", "s", do_log,
       
  1452       "item1[,...]", "activate logging of the specified items to '/tmp/qemu.log'" },
       
  1453     { "savevm", "s?", do_savevm,
       
  1454       "tag|id", "save a VM snapshot. If no tag or id are provided, a new snapshot is created" },
       
  1455     { "loadvm", "s", do_loadvm,
       
  1456       "tag|id", "restore a VM snapshot from its tag or id" },
       
  1457     { "delvm", "s", do_delvm,
       
  1458       "tag|id", "delete a VM snapshot from its tag or id" },
       
  1459     { "stop", "", do_stop,
       
  1460       "", "stop emulation", },
       
  1461     { "c|cont", "", do_cont,
       
  1462       "", "resume emulation", },
       
  1463 #ifdef CONFIG_GDBSTUB
       
  1464     { "gdbserver", "s?", do_gdbserver,
       
  1465       "[port]", "start gdbserver session (default port=1234)", },
       
  1466 #endif
       
  1467     { "x", "/l", do_memory_dump,
       
  1468       "/fmt addr", "virtual memory dump starting at 'addr'", },
       
  1469     { "xp", "/l", do_physical_memory_dump,
       
  1470       "/fmt addr", "physical memory dump starting at 'addr'", },
       
  1471     { "p|print", "/l", do_print,
       
  1472       "/fmt expr", "print expression value (use $reg for CPU register access)", },
       
  1473     { "i", "/ii.", do_ioport_read,
       
  1474       "/fmt addr", "I/O port read" },
       
  1475 
       
  1476     { "sendkey", "si?", do_sendkey,
       
  1477       "keys [hold_ms]", "send keys to the VM (e.g. 'sendkey ctrl-alt-f1', default hold time=100 ms)" },
       
  1478     { "system_reset", "", do_system_reset,
       
  1479       "", "reset the system" },
       
  1480     { "system_powerdown", "", do_system_powerdown,
       
  1481       "", "send system power down event" },
       
  1482     { "sum", "ii", do_sum,
       
  1483       "addr size", "compute the checksum of a memory region" },
       
  1484     { "usb_add", "s", do_usb_add,
       
  1485       "device", "add USB device (e.g. 'host:bus.addr' or 'host:vendor_id:product_id')" },
       
  1486     { "usb_del", "s", do_usb_del,
       
  1487       "device", "remove USB device 'bus.addr'" },
       
  1488     { "cpu", "i", do_cpu_set,
       
  1489       "index", "set the default CPU" },
       
  1490     { "mouse_move", "sss?", do_mouse_move,
       
  1491       "dx dy [dz]", "send mouse move events" },
       
  1492     { "mouse_button", "i", do_mouse_button,
       
  1493       "state", "change mouse button state (1=L, 2=M, 4=R)" },
       
  1494     { "mouse_set", "i", do_mouse_set,
       
  1495       "index", "set which mouse device receives events" },
       
  1496 #ifdef HAS_AUDIO
       
  1497     { "wavcapture", "si?i?i?", do_wav_capture,
       
  1498       "path [frequency bits channels]",
       
  1499       "capture audio to a wave file (default frequency=44100 bits=16 channels=2)" },
       
  1500 #endif
       
  1501      { "stopcapture", "i", do_stop_capture,
       
  1502        "capture index", "stop capture" },
       
  1503     { "memsave", "lis", do_memory_save,
       
  1504       "addr size file", "save to disk virtual memory dump starting at 'addr' of size 'size'", },
       
  1505     { "pmemsave", "lis", do_physical_memory_save,
       
  1506       "addr size file", "save to disk physical memory dump starting at 'addr' of size 'size'", },
       
  1507     { "boot_set", "s", do_boot_set,
       
  1508       "bootdevice", "define new values for the boot device list" },
       
  1509 #if defined(TARGET_I386)
       
  1510     { "nmi", "i", do_inject_nmi,
       
  1511       "cpu", "inject an NMI on the given CPU", },
       
  1512 #endif
       
  1513     { "migrate", "-ds", do_migrate,
       
  1514       "[-d] uri", "migrate to URI (using -d to not wait for completion)" },
       
  1515     { "migrate_cancel", "", do_migrate_cancel,
       
  1516       "", "cancel the current VM migration" },
       
  1517     { "migrate_set_speed", "s", do_migrate_set_speed,
       
  1518       "value", "set maximum speed (in bytes) for migrations" },
       
  1519     { "balloon", "i", do_balloon,
       
  1520       "target", "request VM to change it's memory allocation (in MB)" },
       
  1521     { NULL, NULL, },
       
  1522 };
       
  1523 
       
  1524 static const term_cmd_t info_cmds[] = {
       
  1525     { "version", "", do_info_version,
       
  1526       "", "show the version of qemu" },
       
  1527     { "network", "", do_info_network,
       
  1528       "", "show the network state" },
       
  1529     { "chardev", "", qemu_chr_info,
       
  1530       "", "show the character devices" },
       
  1531     { "block", "", do_info_block,
       
  1532       "", "show the block devices" },
       
  1533     { "blockstats", "", do_info_blockstats,
       
  1534       "", "show block device statistics" },
       
  1535     { "registers", "", do_info_registers,
       
  1536       "", "show the cpu registers" },
       
  1537     { "cpus", "", do_info_cpus,
       
  1538       "", "show infos for each CPU" },
       
  1539     { "history", "", do_info_history,
       
  1540       "", "show the command line history", },
       
  1541     { "irq", "", irq_info,
       
  1542       "", "show the interrupts statistics (if available)", },
       
  1543     { "pic", "", pic_info,
       
  1544       "", "show i8259 (PIC) state", },
       
  1545     { "pci", "", pci_info,
       
  1546       "", "show PCI info", },
       
  1547 #if defined(TARGET_I386)
       
  1548     { "tlb", "", tlb_info,
       
  1549       "", "show virtual to physical memory mappings", },
       
  1550     { "mem", "", mem_info,
       
  1551       "", "show the active virtual memory mappings", },
       
  1552     { "hpet", "", do_info_hpet,
       
  1553       "", "show state of HPET", },
       
  1554 #endif
       
  1555     { "jit", "", do_info_jit,
       
  1556       "", "show dynamic compiler info", },
       
  1557     { "kqemu", "", do_info_kqemu,
       
  1558       "", "show kqemu information", },
       
  1559     { "kvm", "", do_info_kvm,
       
  1560       "", "show kvm information", },
       
  1561     { "usb", "", usb_info,
       
  1562       "", "show guest USB devices", },
       
  1563     { "usbhost", "", usb_host_info,
       
  1564       "", "show host USB devices", },
       
  1565     { "profile", "", do_info_profile,
       
  1566       "", "show profiling information", },
       
  1567     { "capture", "", do_info_capture,
       
  1568       "", "show capture information" },
       
  1569     { "snapshots", "", do_info_snapshots,
       
  1570       "", "show the currently saved VM snapshots" },
       
  1571     { "status", "", do_info_status,
       
  1572       "", "show the current VM status (running|paused)" },
       
  1573     { "pcmcia", "", pcmcia_info,
       
  1574       "", "show guest PCMCIA status" },
       
  1575     { "mice", "", do_info_mice,
       
  1576       "", "show which guest mouse is receiving events" },
       
  1577     { "vnc", "", do_info_vnc,
       
  1578       "", "show the vnc server status"},
       
  1579     { "name", "", do_info_name,
       
  1580       "", "show the current VM name" },
       
  1581     { "uuid", "", do_info_uuid,
       
  1582       "", "show the current VM UUID" },
       
  1583 #if defined(TARGET_PPC)
       
  1584     { "cpustats", "", do_info_cpu_stats,
       
  1585       "", "show CPU statistics", },
       
  1586 #endif
       
  1587 #if defined(CONFIG_SLIRP)
       
  1588     { "slirp", "", do_info_slirp,
       
  1589       "", "show SLIRP statistics", },
       
  1590 #endif
       
  1591     { "migrate", "", do_info_migrate, "", "show migration status" },
       
  1592     { "balloon", "", do_info_balloon,
       
  1593       "", "show balloon information" },
       
  1594     { NULL, NULL, },
       
  1595 };
       
  1596 
       
  1597 /*******************************************************************/
       
  1598 
       
  1599 static const char *pch;
       
  1600 static jmp_buf expr_env;
       
  1601 
       
  1602 #define MD_TLONG 0
       
  1603 #define MD_I32   1
       
  1604 
       
  1605 typedef struct MonitorDef {
       
  1606     const char *name;
       
  1607     int offset;
       
  1608     target_long (*get_value)(const struct MonitorDef *md, int val);
       
  1609     int type;
       
  1610 } MonitorDef;
       
  1611 
       
  1612 #if defined(TARGET_I386)
       
  1613 static target_long monitor_get_pc (const struct MonitorDef *md, int val)
       
  1614 {
       
  1615     CPUState *env = mon_get_cpu();
       
  1616     if (!env)
       
  1617         return 0;
       
  1618     return env->eip + env->segs[R_CS].base;
       
  1619 }
       
  1620 #endif
       
  1621 
       
  1622 #if defined(TARGET_PPC)
       
  1623 static target_long monitor_get_ccr (const struct MonitorDef *md, int val)
       
  1624 {
       
  1625     CPUState *env = mon_get_cpu();
       
  1626     unsigned int u;
       
  1627     int i;
       
  1628 
       
  1629     if (!env)
       
  1630         return 0;
       
  1631 
       
  1632     u = 0;
       
  1633     for (i = 0; i < 8; i++)
       
  1634 	u |= env->crf[i] << (32 - (4 * i));
       
  1635 
       
  1636     return u;
       
  1637 }
       
  1638 
       
  1639 static target_long monitor_get_msr (const struct MonitorDef *md, int val)
       
  1640 {
       
  1641     CPUState *env = mon_get_cpu();
       
  1642     if (!env)
       
  1643         return 0;
       
  1644     return env->msr;
       
  1645 }
       
  1646 
       
  1647 static target_long monitor_get_xer (const struct MonitorDef *md, int val)
       
  1648 {
       
  1649     CPUState *env = mon_get_cpu();
       
  1650     if (!env)
       
  1651         return 0;
       
  1652     return env->xer;
       
  1653 }
       
  1654 
       
  1655 static target_long monitor_get_decr (const struct MonitorDef *md, int val)
       
  1656 {
       
  1657     CPUState *env = mon_get_cpu();
       
  1658     if (!env)
       
  1659         return 0;
       
  1660     return cpu_ppc_load_decr(env);
       
  1661 }
       
  1662 
       
  1663 static target_long monitor_get_tbu (const struct MonitorDef *md, int val)
       
  1664 {
       
  1665     CPUState *env = mon_get_cpu();
       
  1666     if (!env)
       
  1667         return 0;
       
  1668     return cpu_ppc_load_tbu(env);
       
  1669 }
       
  1670 
       
  1671 static target_long monitor_get_tbl (const struct MonitorDef *md, int val)
       
  1672 {
       
  1673     CPUState *env = mon_get_cpu();
       
  1674     if (!env)
       
  1675         return 0;
       
  1676     return cpu_ppc_load_tbl(env);
       
  1677 }
       
  1678 #endif
       
  1679 
       
  1680 #if defined(TARGET_SPARC)
       
  1681 #ifndef TARGET_SPARC64
       
  1682 static target_long monitor_get_psr (const struct MonitorDef *md, int val)
       
  1683 {
       
  1684     CPUState *env = mon_get_cpu();
       
  1685     if (!env)
       
  1686         return 0;
       
  1687     return GET_PSR(env);
       
  1688 }
       
  1689 #endif
       
  1690 
       
  1691 static target_long monitor_get_reg(const struct MonitorDef *md, int val)
       
  1692 {
       
  1693     CPUState *env = mon_get_cpu();
       
  1694     if (!env)
       
  1695         return 0;
       
  1696     return env->regwptr[val];
       
  1697 }
       
  1698 #endif
       
  1699 
       
  1700 static const MonitorDef monitor_defs[] = {
       
  1701 #ifdef TARGET_I386
       
  1702 
       
  1703 #define SEG(name, seg) \
       
  1704     { name, offsetof(CPUState, segs[seg].selector), NULL, MD_I32 },\
       
  1705     { name ".base", offsetof(CPUState, segs[seg].base) },\
       
  1706     { name ".limit", offsetof(CPUState, segs[seg].limit), NULL, MD_I32 },
       
  1707 
       
  1708     { "eax", offsetof(CPUState, regs[0]) },
       
  1709     { "ecx", offsetof(CPUState, regs[1]) },
       
  1710     { "edx", offsetof(CPUState, regs[2]) },
       
  1711     { "ebx", offsetof(CPUState, regs[3]) },
       
  1712     { "esp|sp", offsetof(CPUState, regs[4]) },
       
  1713     { "ebp|fp", offsetof(CPUState, regs[5]) },
       
  1714     { "esi", offsetof(CPUState, regs[6]) },
       
  1715     { "edi", offsetof(CPUState, regs[7]) },
       
  1716 #ifdef TARGET_X86_64
       
  1717     { "r8", offsetof(CPUState, regs[8]) },
       
  1718     { "r9", offsetof(CPUState, regs[9]) },
       
  1719     { "r10", offsetof(CPUState, regs[10]) },
       
  1720     { "r11", offsetof(CPUState, regs[11]) },
       
  1721     { "r12", offsetof(CPUState, regs[12]) },
       
  1722     { "r13", offsetof(CPUState, regs[13]) },
       
  1723     { "r14", offsetof(CPUState, regs[14]) },
       
  1724     { "r15", offsetof(CPUState, regs[15]) },
       
  1725 #endif
       
  1726     { "eflags", offsetof(CPUState, eflags) },
       
  1727     { "eip", offsetof(CPUState, eip) },
       
  1728     SEG("cs", R_CS)
       
  1729     SEG("ds", R_DS)
       
  1730     SEG("es", R_ES)
       
  1731     SEG("ss", R_SS)
       
  1732     SEG("fs", R_FS)
       
  1733     SEG("gs", R_GS)
       
  1734     { "pc", 0, monitor_get_pc, },
       
  1735 #elif defined(TARGET_PPC)
       
  1736     /* General purpose registers */
       
  1737     { "r0", offsetof(CPUState, gpr[0]) },
       
  1738     { "r1", offsetof(CPUState, gpr[1]) },
       
  1739     { "r2", offsetof(CPUState, gpr[2]) },
       
  1740     { "r3", offsetof(CPUState, gpr[3]) },
       
  1741     { "r4", offsetof(CPUState, gpr[4]) },
       
  1742     { "r5", offsetof(CPUState, gpr[5]) },
       
  1743     { "r6", offsetof(CPUState, gpr[6]) },
       
  1744     { "r7", offsetof(CPUState, gpr[7]) },
       
  1745     { "r8", offsetof(CPUState, gpr[8]) },
       
  1746     { "r9", offsetof(CPUState, gpr[9]) },
       
  1747     { "r10", offsetof(CPUState, gpr[10]) },
       
  1748     { "r11", offsetof(CPUState, gpr[11]) },
       
  1749     { "r12", offsetof(CPUState, gpr[12]) },
       
  1750     { "r13", offsetof(CPUState, gpr[13]) },
       
  1751     { "r14", offsetof(CPUState, gpr[14]) },
       
  1752     { "r15", offsetof(CPUState, gpr[15]) },
       
  1753     { "r16", offsetof(CPUState, gpr[16]) },
       
  1754     { "r17", offsetof(CPUState, gpr[17]) },
       
  1755     { "r18", offsetof(CPUState, gpr[18]) },
       
  1756     { "r19", offsetof(CPUState, gpr[19]) },
       
  1757     { "r20", offsetof(CPUState, gpr[20]) },
       
  1758     { "r21", offsetof(CPUState, gpr[21]) },
       
  1759     { "r22", offsetof(CPUState, gpr[22]) },
       
  1760     { "r23", offsetof(CPUState, gpr[23]) },
       
  1761     { "r24", offsetof(CPUState, gpr[24]) },
       
  1762     { "r25", offsetof(CPUState, gpr[25]) },
       
  1763     { "r26", offsetof(CPUState, gpr[26]) },
       
  1764     { "r27", offsetof(CPUState, gpr[27]) },
       
  1765     { "r28", offsetof(CPUState, gpr[28]) },
       
  1766     { "r29", offsetof(CPUState, gpr[29]) },
       
  1767     { "r30", offsetof(CPUState, gpr[30]) },
       
  1768     { "r31", offsetof(CPUState, gpr[31]) },
       
  1769     /* Floating point registers */
       
  1770     { "f0", offsetof(CPUState, fpr[0]) },
       
  1771     { "f1", offsetof(CPUState, fpr[1]) },
       
  1772     { "f2", offsetof(CPUState, fpr[2]) },
       
  1773     { "f3", offsetof(CPUState, fpr[3]) },
       
  1774     { "f4", offsetof(CPUState, fpr[4]) },
       
  1775     { "f5", offsetof(CPUState, fpr[5]) },
       
  1776     { "f6", offsetof(CPUState, fpr[6]) },
       
  1777     { "f7", offsetof(CPUState, fpr[7]) },
       
  1778     { "f8", offsetof(CPUState, fpr[8]) },
       
  1779     { "f9", offsetof(CPUState, fpr[9]) },
       
  1780     { "f10", offsetof(CPUState, fpr[10]) },
       
  1781     { "f11", offsetof(CPUState, fpr[11]) },
       
  1782     { "f12", offsetof(CPUState, fpr[12]) },
       
  1783     { "f13", offsetof(CPUState, fpr[13]) },
       
  1784     { "f14", offsetof(CPUState, fpr[14]) },
       
  1785     { "f15", offsetof(CPUState, fpr[15]) },
       
  1786     { "f16", offsetof(CPUState, fpr[16]) },
       
  1787     { "f17", offsetof(CPUState, fpr[17]) },
       
  1788     { "f18", offsetof(CPUState, fpr[18]) },
       
  1789     { "f19", offsetof(CPUState, fpr[19]) },
       
  1790     { "f20", offsetof(CPUState, fpr[20]) },
       
  1791     { "f21", offsetof(CPUState, fpr[21]) },
       
  1792     { "f22", offsetof(CPUState, fpr[22]) },
       
  1793     { "f23", offsetof(CPUState, fpr[23]) },
       
  1794     { "f24", offsetof(CPUState, fpr[24]) },
       
  1795     { "f25", offsetof(CPUState, fpr[25]) },
       
  1796     { "f26", offsetof(CPUState, fpr[26]) },
       
  1797     { "f27", offsetof(CPUState, fpr[27]) },
       
  1798     { "f28", offsetof(CPUState, fpr[28]) },
       
  1799     { "f29", offsetof(CPUState, fpr[29]) },
       
  1800     { "f30", offsetof(CPUState, fpr[30]) },
       
  1801     { "f31", offsetof(CPUState, fpr[31]) },
       
  1802     { "fpscr", offsetof(CPUState, fpscr) },
       
  1803     /* Next instruction pointer */
       
  1804     { "nip|pc", offsetof(CPUState, nip) },
       
  1805     { "lr", offsetof(CPUState, lr) },
       
  1806     { "ctr", offsetof(CPUState, ctr) },
       
  1807     { "decr", 0, &monitor_get_decr, },
       
  1808     { "ccr", 0, &monitor_get_ccr, },
       
  1809     /* Machine state register */
       
  1810     { "msr", 0, &monitor_get_msr, },
       
  1811     { "xer", 0, &monitor_get_xer, },
       
  1812     { "tbu", 0, &monitor_get_tbu, },
       
  1813     { "tbl", 0, &monitor_get_tbl, },
       
  1814 #if defined(TARGET_PPC64)
       
  1815     /* Address space register */
       
  1816     { "asr", offsetof(CPUState, asr) },
       
  1817 #endif
       
  1818     /* Segment registers */
       
  1819     { "sdr1", offsetof(CPUState, sdr1) },
       
  1820     { "sr0", offsetof(CPUState, sr[0]) },
       
  1821     { "sr1", offsetof(CPUState, sr[1]) },
       
  1822     { "sr2", offsetof(CPUState, sr[2]) },
       
  1823     { "sr3", offsetof(CPUState, sr[3]) },
       
  1824     { "sr4", offsetof(CPUState, sr[4]) },
       
  1825     { "sr5", offsetof(CPUState, sr[5]) },
       
  1826     { "sr6", offsetof(CPUState, sr[6]) },
       
  1827     { "sr7", offsetof(CPUState, sr[7]) },
       
  1828     { "sr8", offsetof(CPUState, sr[8]) },
       
  1829     { "sr9", offsetof(CPUState, sr[9]) },
       
  1830     { "sr10", offsetof(CPUState, sr[10]) },
       
  1831     { "sr11", offsetof(CPUState, sr[11]) },
       
  1832     { "sr12", offsetof(CPUState, sr[12]) },
       
  1833     { "sr13", offsetof(CPUState, sr[13]) },
       
  1834     { "sr14", offsetof(CPUState, sr[14]) },
       
  1835     { "sr15", offsetof(CPUState, sr[15]) },
       
  1836     /* Too lazy to put BATs and SPRs ... */
       
  1837 #elif defined(TARGET_SPARC)
       
  1838     { "g0", offsetof(CPUState, gregs[0]) },
       
  1839     { "g1", offsetof(CPUState, gregs[1]) },
       
  1840     { "g2", offsetof(CPUState, gregs[2]) },
       
  1841     { "g3", offsetof(CPUState, gregs[3]) },
       
  1842     { "g4", offsetof(CPUState, gregs[4]) },
       
  1843     { "g5", offsetof(CPUState, gregs[5]) },
       
  1844     { "g6", offsetof(CPUState, gregs[6]) },
       
  1845     { "g7", offsetof(CPUState, gregs[7]) },
       
  1846     { "o0", 0, monitor_get_reg },
       
  1847     { "o1", 1, monitor_get_reg },
       
  1848     { "o2", 2, monitor_get_reg },
       
  1849     { "o3", 3, monitor_get_reg },
       
  1850     { "o4", 4, monitor_get_reg },
       
  1851     { "o5", 5, monitor_get_reg },
       
  1852     { "o6", 6, monitor_get_reg },
       
  1853     { "o7", 7, monitor_get_reg },
       
  1854     { "l0", 8, monitor_get_reg },
       
  1855     { "l1", 9, monitor_get_reg },
       
  1856     { "l2", 10, monitor_get_reg },
       
  1857     { "l3", 11, monitor_get_reg },
       
  1858     { "l4", 12, monitor_get_reg },
       
  1859     { "l5", 13, monitor_get_reg },
       
  1860     { "l6", 14, monitor_get_reg },
       
  1861     { "l7", 15, monitor_get_reg },
       
  1862     { "i0", 16, monitor_get_reg },
       
  1863     { "i1", 17, monitor_get_reg },
       
  1864     { "i2", 18, monitor_get_reg },
       
  1865     { "i3", 19, monitor_get_reg },
       
  1866     { "i4", 20, monitor_get_reg },
       
  1867     { "i5", 21, monitor_get_reg },
       
  1868     { "i6", 22, monitor_get_reg },
       
  1869     { "i7", 23, monitor_get_reg },
       
  1870     { "pc", offsetof(CPUState, pc) },
       
  1871     { "npc", offsetof(CPUState, npc) },
       
  1872     { "y", offsetof(CPUState, y) },
       
  1873 #ifndef TARGET_SPARC64
       
  1874     { "psr", 0, &monitor_get_psr, },
       
  1875     { "wim", offsetof(CPUState, wim) },
       
  1876 #endif
       
  1877     { "tbr", offsetof(CPUState, tbr) },
       
  1878     { "fsr", offsetof(CPUState, fsr) },
       
  1879     { "f0", offsetof(CPUState, fpr[0]) },
       
  1880     { "f1", offsetof(CPUState, fpr[1]) },
       
  1881     { "f2", offsetof(CPUState, fpr[2]) },
       
  1882     { "f3", offsetof(CPUState, fpr[3]) },
       
  1883     { "f4", offsetof(CPUState, fpr[4]) },
       
  1884     { "f5", offsetof(CPUState, fpr[5]) },
       
  1885     { "f6", offsetof(CPUState, fpr[6]) },
       
  1886     { "f7", offsetof(CPUState, fpr[7]) },
       
  1887     { "f8", offsetof(CPUState, fpr[8]) },
       
  1888     { "f9", offsetof(CPUState, fpr[9]) },
       
  1889     { "f10", offsetof(CPUState, fpr[10]) },
       
  1890     { "f11", offsetof(CPUState, fpr[11]) },
       
  1891     { "f12", offsetof(CPUState, fpr[12]) },
       
  1892     { "f13", offsetof(CPUState, fpr[13]) },
       
  1893     { "f14", offsetof(CPUState, fpr[14]) },
       
  1894     { "f15", offsetof(CPUState, fpr[15]) },
       
  1895     { "f16", offsetof(CPUState, fpr[16]) },
       
  1896     { "f17", offsetof(CPUState, fpr[17]) },
       
  1897     { "f18", offsetof(CPUState, fpr[18]) },
       
  1898     { "f19", offsetof(CPUState, fpr[19]) },
       
  1899     { "f20", offsetof(CPUState, fpr[20]) },
       
  1900     { "f21", offsetof(CPUState, fpr[21]) },
       
  1901     { "f22", offsetof(CPUState, fpr[22]) },
       
  1902     { "f23", offsetof(CPUState, fpr[23]) },
       
  1903     { "f24", offsetof(CPUState, fpr[24]) },
       
  1904     { "f25", offsetof(CPUState, fpr[25]) },
       
  1905     { "f26", offsetof(CPUState, fpr[26]) },
       
  1906     { "f27", offsetof(CPUState, fpr[27]) },
       
  1907     { "f28", offsetof(CPUState, fpr[28]) },
       
  1908     { "f29", offsetof(CPUState, fpr[29]) },
       
  1909     { "f30", offsetof(CPUState, fpr[30]) },
       
  1910     { "f31", offsetof(CPUState, fpr[31]) },
       
  1911 #ifdef TARGET_SPARC64
       
  1912     { "f32", offsetof(CPUState, fpr[32]) },
       
  1913     { "f34", offsetof(CPUState, fpr[34]) },
       
  1914     { "f36", offsetof(CPUState, fpr[36]) },
       
  1915     { "f38", offsetof(CPUState, fpr[38]) },
       
  1916     { "f40", offsetof(CPUState, fpr[40]) },
       
  1917     { "f42", offsetof(CPUState, fpr[42]) },
       
  1918     { "f44", offsetof(CPUState, fpr[44]) },
       
  1919     { "f46", offsetof(CPUState, fpr[46]) },
       
  1920     { "f48", offsetof(CPUState, fpr[48]) },
       
  1921     { "f50", offsetof(CPUState, fpr[50]) },
       
  1922     { "f52", offsetof(CPUState, fpr[52]) },
       
  1923     { "f54", offsetof(CPUState, fpr[54]) },
       
  1924     { "f56", offsetof(CPUState, fpr[56]) },
       
  1925     { "f58", offsetof(CPUState, fpr[58]) },
       
  1926     { "f60", offsetof(CPUState, fpr[60]) },
       
  1927     { "f62", offsetof(CPUState, fpr[62]) },
       
  1928     { "asi", offsetof(CPUState, asi) },
       
  1929     { "pstate", offsetof(CPUState, pstate) },
       
  1930     { "cansave", offsetof(CPUState, cansave) },
       
  1931     { "canrestore", offsetof(CPUState, canrestore) },
       
  1932     { "otherwin", offsetof(CPUState, otherwin) },
       
  1933     { "wstate", offsetof(CPUState, wstate) },
       
  1934     { "cleanwin", offsetof(CPUState, cleanwin) },
       
  1935     { "fprs", offsetof(CPUState, fprs) },
       
  1936 #endif
       
  1937 #endif
       
  1938     { NULL },
       
  1939 };
       
  1940 
       
  1941 static void expr_error(const char *fmt)
       
  1942 {
       
  1943     term_printf(fmt);
       
  1944     term_printf("\n");
       
  1945     longjmp(expr_env, 1);
       
  1946 }
       
  1947 
       
  1948 /* return 0 if OK, -1 if not found, -2 if no CPU defined */
       
  1949 static int get_monitor_def(target_long *pval, const char *name)
       
  1950 {
       
  1951     const MonitorDef *md;
       
  1952     void *ptr;
       
  1953 
       
  1954     for(md = monitor_defs; md->name != NULL; md++) {
       
  1955         if (compare_cmd(name, md->name)) {
       
  1956             if (md->get_value) {
       
  1957                 *pval = md->get_value(md, md->offset);
       
  1958             } else {
       
  1959                 CPUState *env = mon_get_cpu();
       
  1960                 if (!env)
       
  1961                     return -2;
       
  1962                 ptr = (uint8_t *)env + md->offset;
       
  1963                 switch(md->type) {
       
  1964                 case MD_I32:
       
  1965                     *pval = *(int32_t *)ptr;
       
  1966                     break;
       
  1967                 case MD_TLONG:
       
  1968                     *pval = *(target_long *)ptr;
       
  1969                     break;
       
  1970                 default:
       
  1971                     *pval = 0;
       
  1972                     break;
       
  1973                 }
       
  1974             }
       
  1975             return 0;
       
  1976         }
       
  1977     }
       
  1978     return -1;
       
  1979 }
       
  1980 
       
  1981 static void next(void)
       
  1982 {
       
  1983     if (pch != '\0') {
       
  1984         pch++;
       
  1985         while (qemu_isspace(*pch))
       
  1986             pch++;
       
  1987     }
       
  1988 }
       
  1989 
       
  1990 static int64_t expr_sum(void);
       
  1991 
       
  1992 static int64_t expr_unary(void)
       
  1993 {
       
  1994     int64_t n;
       
  1995     char *p;
       
  1996     int ret;
       
  1997 
       
  1998     switch(*pch) {
       
  1999     case '+':
       
  2000         next();
       
  2001         n = expr_unary();
       
  2002         break;
       
  2003     case '-':
       
  2004         next();
       
  2005         n = -expr_unary();
       
  2006         break;
       
  2007     case '~':
       
  2008         next();
       
  2009         n = ~expr_unary();
       
  2010         break;
       
  2011     case '(':
       
  2012         next();
       
  2013         n = expr_sum();
       
  2014         if (*pch != ')') {
       
  2015             expr_error("')' expected");
       
  2016         }
       
  2017         next();
       
  2018         break;
       
  2019     case '\'':
       
  2020         pch++;
       
  2021         if (*pch == '\0')
       
  2022             expr_error("character constant expected");
       
  2023         n = *pch;
       
  2024         pch++;
       
  2025         if (*pch != '\'')
       
  2026             expr_error("missing terminating \' character");
       
  2027         next();
       
  2028         break;
       
  2029     case '$':
       
  2030         {
       
  2031             char buf[128], *q;
       
  2032             target_long reg=0;
       
  2033 
       
  2034             pch++;
       
  2035             q = buf;
       
  2036             while ((*pch >= 'a' && *pch <= 'z') ||
       
  2037                    (*pch >= 'A' && *pch <= 'Z') ||
       
  2038                    (*pch >= '0' && *pch <= '9') ||
       
  2039                    *pch == '_' || *pch == '.') {
       
  2040                 if ((q - buf) < sizeof(buf) - 1)
       
  2041                     *q++ = *pch;
       
  2042                 pch++;
       
  2043             }
       
  2044             while (qemu_isspace(*pch))
       
  2045                 pch++;
       
  2046             *q = 0;
       
  2047             ret = get_monitor_def(&reg, buf);
       
  2048             if (ret == -1)
       
  2049                 expr_error("unknown register");
       
  2050             else if (ret == -2)
       
  2051                 expr_error("no cpu defined");
       
  2052             n = reg;
       
  2053         }
       
  2054         break;
       
  2055     case '\0':
       
  2056         expr_error("unexpected end of expression");
       
  2057         n = 0;
       
  2058         break;
       
  2059     default:
       
  2060 #if TARGET_PHYS_ADDR_BITS > 32
       
  2061         n = strtoull(pch, &p, 0);
       
  2062 #else
       
  2063         n = strtoul(pch, &p, 0);
       
  2064 #endif
       
  2065         if (pch == p) {
       
  2066             expr_error("invalid char in expression");
       
  2067         }
       
  2068         pch = p;
       
  2069         while (qemu_isspace(*pch))
       
  2070             pch++;
       
  2071         break;
       
  2072     }
       
  2073     return n;
       
  2074 }
       
  2075 
       
  2076 
       
  2077 static int64_t expr_prod(void)
       
  2078 {
       
  2079     int64_t val, val2;
       
  2080     int op;
       
  2081 
       
  2082     val = expr_unary();
       
  2083     for(;;) {
       
  2084         op = *pch;
       
  2085         if (op != '*' && op != '/' && op != '%')
       
  2086             break;
       
  2087         next();
       
  2088         val2 = expr_unary();
       
  2089         switch(op) {
       
  2090         default:
       
  2091         case '*':
       
  2092             val *= val2;
       
  2093             break;
       
  2094         case '/':
       
  2095         case '%':
       
  2096             if (val2 == 0)
       
  2097                 expr_error("division by zero");
       
  2098             if (op == '/')
       
  2099                 val /= val2;
       
  2100             else
       
  2101                 val %= val2;
       
  2102             break;
       
  2103         }
       
  2104     }
       
  2105     return val;
       
  2106 }
       
  2107 
       
  2108 static int64_t expr_logic(void)
       
  2109 {
       
  2110     int64_t val, val2;
       
  2111     int op;
       
  2112 
       
  2113     val = expr_prod();
       
  2114     for(;;) {
       
  2115         op = *pch;
       
  2116         if (op != '&' && op != '|' && op != '^')
       
  2117             break;
       
  2118         next();
       
  2119         val2 = expr_prod();
       
  2120         switch(op) {
       
  2121         default:
       
  2122         case '&':
       
  2123             val &= val2;
       
  2124             break;
       
  2125         case '|':
       
  2126             val |= val2;
       
  2127             break;
       
  2128         case '^':
       
  2129             val ^= val2;
       
  2130             break;
       
  2131         }
       
  2132     }
       
  2133     return val;
       
  2134 }
       
  2135 
       
  2136 static int64_t expr_sum(void)
       
  2137 {
       
  2138     int64_t val, val2;
       
  2139     int op;
       
  2140 
       
  2141     val = expr_logic();
       
  2142     for(;;) {
       
  2143         op = *pch;
       
  2144         if (op != '+' && op != '-')
       
  2145             break;
       
  2146         next();
       
  2147         val2 = expr_logic();
       
  2148         if (op == '+')
       
  2149             val += val2;
       
  2150         else
       
  2151             val -= val2;
       
  2152     }
       
  2153     return val;
       
  2154 }
       
  2155 
       
  2156 static int get_expr(int64_t *pval, const char **pp)
       
  2157 {
       
  2158     pch = *pp;
       
  2159     if (setjmp(expr_env)) {
       
  2160         *pp = pch;
       
  2161         return -1;
       
  2162     }
       
  2163     while (qemu_isspace(*pch))
       
  2164         pch++;
       
  2165     *pval = expr_sum();
       
  2166     *pp = pch;
       
  2167     return 0;
       
  2168 }
       
  2169 
       
  2170 static int get_str(char *buf, int buf_size, const char **pp)
       
  2171 {
       
  2172     const char *p;
       
  2173     char *q;
       
  2174     int c;
       
  2175 
       
  2176     q = buf;
       
  2177     p = *pp;
       
  2178     while (qemu_isspace(*p))
       
  2179         p++;
       
  2180     if (*p == '\0') {
       
  2181     fail:
       
  2182         *q = '\0';
       
  2183         *pp = p;
       
  2184         return -1;
       
  2185     }
       
  2186     if (*p == '\"') {
       
  2187         p++;
       
  2188         while (*p != '\0' && *p != '\"') {
       
  2189             if (*p == '\\') {
       
  2190                 p++;
       
  2191                 c = *p++;
       
  2192                 switch(c) {
       
  2193                 case 'n':
       
  2194                     c = '\n';
       
  2195                     break;
       
  2196                 case 'r':
       
  2197                     c = '\r';
       
  2198                     break;
       
  2199                 case '\\':
       
  2200                 case '\'':
       
  2201                 case '\"':
       
  2202                     break;
       
  2203                 default:
       
  2204                     qemu_printf("unsupported escape code: '\\%c'\n", c);
       
  2205                     goto fail;
       
  2206                 }
       
  2207                 if ((q - buf) < buf_size - 1) {
       
  2208                     *q++ = c;
       
  2209                 }
       
  2210             } else {
       
  2211                 if ((q - buf) < buf_size - 1) {
       
  2212                     *q++ = *p;
       
  2213                 }
       
  2214                 p++;
       
  2215             }
       
  2216         }
       
  2217         if (*p != '\"') {
       
  2218             qemu_printf("unterminated string\n");
       
  2219             goto fail;
       
  2220         }
       
  2221         p++;
       
  2222     } else {
       
  2223         while (*p != '\0' && !qemu_isspace(*p)) {
       
  2224             if ((q - buf) < buf_size - 1) {
       
  2225                 *q++ = *p;
       
  2226             }
       
  2227             p++;
       
  2228         }
       
  2229     }
       
  2230     *q = '\0';
       
  2231     *pp = p;
       
  2232     return 0;
       
  2233 }
       
  2234 
       
  2235 static int default_fmt_format = 'x';
       
  2236 static int default_fmt_size = 4;
       
  2237 
       
  2238 #define MAX_ARGS 16
       
  2239 
       
  2240 static void monitor_handle_command(const char *cmdline)
       
  2241 {
       
  2242     const char *p, *pstart, *typestr;
       
  2243     char *q;
       
  2244     int c, nb_args, len, i, has_arg;
       
  2245     const term_cmd_t *cmd;
       
  2246     char cmdname[256];
       
  2247     char buf[1024];
       
  2248     void *str_allocated[MAX_ARGS];
       
  2249     void *args[MAX_ARGS];
       
  2250     void (*handler_0)(void);
       
  2251     void (*handler_1)(void *arg0);
       
  2252     void (*handler_2)(void *arg0, void *arg1);
       
  2253     void (*handler_3)(void *arg0, void *arg1, void *arg2);
       
  2254     void (*handler_4)(void *arg0, void *arg1, void *arg2, void *arg3);
       
  2255     void (*handler_5)(void *arg0, void *arg1, void *arg2, void *arg3,
       
  2256                       void *arg4);
       
  2257     void (*handler_6)(void *arg0, void *arg1, void *arg2, void *arg3,
       
  2258                       void *arg4, void *arg5);
       
  2259     void (*handler_7)(void *arg0, void *arg1, void *arg2, void *arg3,
       
  2260                       void *arg4, void *arg5, void *arg6);
       
  2261 
       
  2262 #ifdef DEBUG
       
  2263     term_printf("command='%s'\n", cmdline);
       
  2264 #endif
       
  2265 
       
  2266     /* extract the command name */
       
  2267     p = cmdline;
       
  2268     q = cmdname;
       
  2269     while (qemu_isspace(*p))
       
  2270         p++;
       
  2271     if (*p == '\0')
       
  2272         return;
       
  2273     pstart = p;
       
  2274     while (*p != '\0' && *p != '/' && !qemu_isspace(*p))
       
  2275         p++;
       
  2276     len = p - pstart;
       
  2277     if (len > sizeof(cmdname) - 1)
       
  2278         len = sizeof(cmdname) - 1;
       
  2279     memcpy(cmdname, pstart, len);
       
  2280     cmdname[len] = '\0';
       
  2281 
       
  2282     /* find the command */
       
  2283     for(cmd = term_cmds; cmd->name != NULL; cmd++) {
       
  2284         if (compare_cmd(cmdname, cmd->name))
       
  2285             goto found;
       
  2286     }
       
  2287     term_printf("unknown command: '%s'\n", cmdname);
       
  2288     return;
       
  2289  found:
       
  2290 
       
  2291     for(i = 0; i < MAX_ARGS; i++)
       
  2292         str_allocated[i] = NULL;
       
  2293 
       
  2294     /* parse the parameters */
       
  2295     typestr = cmd->args_type;
       
  2296     nb_args = 0;
       
  2297     for(;;) {
       
  2298         c = *typestr;
       
  2299         if (c == '\0')
       
  2300             break;
       
  2301         typestr++;
       
  2302         switch(c) {
       
  2303         case 'F':
       
  2304         case 'B':
       
  2305         case 's':
       
  2306             {
       
  2307                 int ret;
       
  2308                 char *str;
       
  2309 
       
  2310                 while (qemu_isspace(*p))
       
  2311                     p++;
       
  2312                 if (*typestr == '?') {
       
  2313                     typestr++;
       
  2314                     if (*p == '\0') {
       
  2315                         /* no optional string: NULL argument */
       
  2316                         str = NULL;
       
  2317                         goto add_str;
       
  2318                     }
       
  2319                 }
       
  2320                 ret = get_str(buf, sizeof(buf), &p);
       
  2321                 if (ret < 0) {
       
  2322                     switch(c) {
       
  2323                     case 'F':
       
  2324                         term_printf("%s: filename expected\n", cmdname);
       
  2325                         break;
       
  2326                     case 'B':
       
  2327                         term_printf("%s: block device name expected\n", cmdname);
       
  2328                         break;
       
  2329                     default:
       
  2330                         term_printf("%s: string expected\n", cmdname);
       
  2331                         break;
       
  2332                     }
       
  2333                     goto fail;
       
  2334                 }
       
  2335                 str = qemu_malloc(strlen(buf) + 1);
       
  2336                 pstrcpy(str, sizeof(buf), buf);
       
  2337                 str_allocated[nb_args] = str;
       
  2338             add_str:
       
  2339                 if (nb_args >= MAX_ARGS) {
       
  2340                 error_args:
       
  2341                     term_printf("%s: too many arguments\n", cmdname);
       
  2342                     goto fail;
       
  2343                 }
       
  2344                 args[nb_args++] = str;
       
  2345             }
       
  2346             break;
       
  2347         case '/':
       
  2348             {
       
  2349                 int count, format, size;
       
  2350 
       
  2351                 while (qemu_isspace(*p))
       
  2352                     p++;
       
  2353                 if (*p == '/') {
       
  2354                     /* format found */
       
  2355                     p++;
       
  2356                     count = 1;
       
  2357                     if (qemu_isdigit(*p)) {
       
  2358                         count = 0;
       
  2359                         while (qemu_isdigit(*p)) {
       
  2360                             count = count * 10 + (*p - '0');
       
  2361                             p++;
       
  2362                         }
       
  2363                     }
       
  2364                     size = -1;
       
  2365                     format = -1;
       
  2366                     for(;;) {
       
  2367                         switch(*p) {
       
  2368                         case 'o':
       
  2369                         case 'd':
       
  2370                         case 'u':
       
  2371                         case 'x':
       
  2372                         case 'i':
       
  2373                         case 'c':
       
  2374                             format = *p++;
       
  2375                             break;
       
  2376                         case 'b':
       
  2377                             size = 1;
       
  2378                             p++;
       
  2379                             break;
       
  2380                         case 'h':
       
  2381                             size = 2;
       
  2382                             p++;
       
  2383                             break;
       
  2384                         case 'w':
       
  2385                             size = 4;
       
  2386                             p++;
       
  2387                             break;
       
  2388                         case 'g':
       
  2389                         case 'L':
       
  2390                             size = 8;
       
  2391                             p++;
       
  2392                             break;
       
  2393                         default:
       
  2394                             goto next;
       
  2395                         }
       
  2396                     }
       
  2397                 next:
       
  2398                     if (*p != '\0' && !qemu_isspace(*p)) {
       
  2399                         term_printf("invalid char in format: '%c'\n", *p);
       
  2400                         goto fail;
       
  2401                     }
       
  2402                     if (format < 0)
       
  2403                         format = default_fmt_format;
       
  2404                     if (format != 'i') {
       
  2405                         /* for 'i', not specifying a size gives -1 as size */
       
  2406                         if (size < 0)
       
  2407                             size = default_fmt_size;
       
  2408                         default_fmt_size = size;
       
  2409                     }
       
  2410                     default_fmt_format = format;
       
  2411                 } else {
       
  2412                     count = 1;
       
  2413                     format = default_fmt_format;
       
  2414                     if (format != 'i') {
       
  2415                         size = default_fmt_size;
       
  2416                     } else {
       
  2417                         size = -1;
       
  2418                     }
       
  2419                 }
       
  2420                 if (nb_args + 3 > MAX_ARGS)
       
  2421                     goto error_args;
       
  2422                 args[nb_args++] = (void*)(long)count;
       
  2423                 args[nb_args++] = (void*)(long)format;
       
  2424                 args[nb_args++] = (void*)(long)size;
       
  2425             }
       
  2426             break;
       
  2427         case 'i':
       
  2428         case 'l':
       
  2429             {
       
  2430                 int64_t val;
       
  2431 
       
  2432                 while (qemu_isspace(*p))
       
  2433                     p++;
       
  2434                 if (*typestr == '?' || *typestr == '.') {
       
  2435                     if (*typestr == '?') {
       
  2436                         if (*p == '\0')
       
  2437                             has_arg = 0;
       
  2438                         else
       
  2439                             has_arg = 1;
       
  2440                     } else {
       
  2441                         if (*p == '.') {
       
  2442                             p++;
       
  2443                             while (qemu_isspace(*p))
       
  2444                                 p++;
       
  2445                             has_arg = 1;
       
  2446                         } else {
       
  2447                             has_arg = 0;
       
  2448                         }
       
  2449                     }
       
  2450                     typestr++;
       
  2451                     if (nb_args >= MAX_ARGS)
       
  2452                         goto error_args;
       
  2453                     args[nb_args++] = (void *)(long)has_arg;
       
  2454                     if (!has_arg) {
       
  2455                         if (nb_args >= MAX_ARGS)
       
  2456                             goto error_args;
       
  2457                         val = -1;
       
  2458                         goto add_num;
       
  2459                     }
       
  2460                 }
       
  2461                 if (get_expr(&val, &p))
       
  2462                     goto fail;
       
  2463             add_num:
       
  2464                 if (c == 'i') {
       
  2465                     if (nb_args >= MAX_ARGS)
       
  2466                         goto error_args;
       
  2467                     args[nb_args++] = (void *)(long)val;
       
  2468                 } else {
       
  2469                     if ((nb_args + 1) >= MAX_ARGS)
       
  2470                         goto error_args;
       
  2471 #if TARGET_PHYS_ADDR_BITS > 32
       
  2472                     args[nb_args++] = (void *)(long)((val >> 32) & 0xffffffff);
       
  2473 #else
       
  2474                     args[nb_args++] = (void *)0;
       
  2475 #endif
       
  2476                     args[nb_args++] = (void *)(long)(val & 0xffffffff);
       
  2477                 }
       
  2478             }
       
  2479             break;
       
  2480         case '-':
       
  2481             {
       
  2482                 int has_option;
       
  2483                 /* option */
       
  2484 
       
  2485                 c = *typestr++;
       
  2486                 if (c == '\0')
       
  2487                     goto bad_type;
       
  2488                 while (qemu_isspace(*p))
       
  2489                     p++;
       
  2490                 has_option = 0;
       
  2491                 if (*p == '-') {
       
  2492                     p++;
       
  2493                     if (*p != c) {
       
  2494                         term_printf("%s: unsupported option -%c\n",
       
  2495                                     cmdname, *p);
       
  2496                         goto fail;
       
  2497                     }
       
  2498                     p++;
       
  2499                     has_option = 1;
       
  2500                 }
       
  2501                 if (nb_args >= MAX_ARGS)
       
  2502                     goto error_args;
       
  2503                 args[nb_args++] = (void *)(long)has_option;
       
  2504             }
       
  2505             break;
       
  2506         default:
       
  2507         bad_type:
       
  2508             term_printf("%s: unknown type '%c'\n", cmdname, c);
       
  2509             goto fail;
       
  2510         }
       
  2511     }
       
  2512     /* check that all arguments were parsed */
       
  2513     while (qemu_isspace(*p))
       
  2514         p++;
       
  2515     if (*p != '\0') {
       
  2516         term_printf("%s: extraneous characters at the end of line\n",
       
  2517                     cmdname);
       
  2518         goto fail;
       
  2519     }
       
  2520 
       
  2521     switch(nb_args) {
       
  2522     case 0:
       
  2523         handler_0 = cmd->handler;
       
  2524         handler_0();
       
  2525         break;
       
  2526     case 1:
       
  2527         handler_1 = cmd->handler;
       
  2528         handler_1(args[0]);
       
  2529         break;
       
  2530     case 2:
       
  2531         handler_2 = cmd->handler;
       
  2532         handler_2(args[0], args[1]);
       
  2533         break;
       
  2534     case 3:
       
  2535         handler_3 = cmd->handler;
       
  2536         handler_3(args[0], args[1], args[2]);
       
  2537         break;
       
  2538     case 4:
       
  2539         handler_4 = cmd->handler;
       
  2540         handler_4(args[0], args[1], args[2], args[3]);
       
  2541         break;
       
  2542     case 5:
       
  2543         handler_5 = cmd->handler;
       
  2544         handler_5(args[0], args[1], args[2], args[3], args[4]);
       
  2545         break;
       
  2546     case 6:
       
  2547         handler_6 = cmd->handler;
       
  2548         handler_6(args[0], args[1], args[2], args[3], args[4], args[5]);
       
  2549         break;
       
  2550     case 7:
       
  2551         handler_7 = cmd->handler;
       
  2552         handler_7(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
       
  2553         break;
       
  2554     default:
       
  2555         term_printf("unsupported number of arguments: %d\n", nb_args);
       
  2556         goto fail;
       
  2557     }
       
  2558  fail:
       
  2559     for(i = 0; i < MAX_ARGS; i++)
       
  2560         qemu_free(str_allocated[i]);
       
  2561     return;
       
  2562 }
       
  2563 
       
  2564 static void cmd_completion(const char *name, const char *list)
       
  2565 {
       
  2566     const char *p, *pstart;
       
  2567     char cmd[128];
       
  2568     int len;
       
  2569 
       
  2570     p = list;
       
  2571     for(;;) {
       
  2572         pstart = p;
       
  2573         p = strchr(p, '|');
       
  2574         if (!p)
       
  2575             p = pstart + strlen(pstart);
       
  2576         len = p - pstart;
       
  2577         if (len > sizeof(cmd) - 2)
       
  2578             len = sizeof(cmd) - 2;
       
  2579         memcpy(cmd, pstart, len);
       
  2580         cmd[len] = '\0';
       
  2581         if (name[0] == '\0' || !strncmp(name, cmd, strlen(name))) {
       
  2582             add_completion(cmd);
       
  2583         }
       
  2584         if (*p == '\0')
       
  2585             break;
       
  2586         p++;
       
  2587     }
       
  2588 }
       
  2589 
       
  2590 static void file_completion(const char *input)
       
  2591 {
       
  2592     DIR *ffs;
       
  2593     struct dirent *d;
       
  2594     char path[1024];
       
  2595     char file[1024], file_prefix[1024];
       
  2596     int input_path_len;
       
  2597     const char *p;
       
  2598 
       
  2599     p = strrchr(input, '/');
       
  2600     if (!p) {
       
  2601         input_path_len = 0;
       
  2602         pstrcpy(file_prefix, sizeof(file_prefix), input);
       
  2603         pstrcpy(path, sizeof(path), ".");
       
  2604     } else {
       
  2605         input_path_len = p - input + 1;
       
  2606         memcpy(path, input, input_path_len);
       
  2607         if (input_path_len > sizeof(path) - 1)
       
  2608             input_path_len = sizeof(path) - 1;
       
  2609         path[input_path_len] = '\0';
       
  2610         pstrcpy(file_prefix, sizeof(file_prefix), p + 1);
       
  2611     }
       
  2612 #ifdef DEBUG_COMPLETION
       
  2613     term_printf("input='%s' path='%s' prefix='%s'\n", input, path, file_prefix);
       
  2614 #endif
       
  2615     ffs = opendir(path);
       
  2616     if (!ffs)
       
  2617         return;
       
  2618     for(;;) {
       
  2619         struct stat sb;
       
  2620         d = readdir(ffs);
       
  2621         if (!d)
       
  2622             break;
       
  2623         if (strstart(d->d_name, file_prefix, NULL)) {
       
  2624             memcpy(file, input, input_path_len);
       
  2625             if (input_path_len < sizeof(file))
       
  2626                 pstrcpy(file + input_path_len, sizeof(file) - input_path_len,
       
  2627                         d->d_name);
       
  2628             /* stat the file to find out if it's a directory.
       
  2629              * In that case add a slash to speed up typing long paths
       
  2630              */
       
  2631             stat(file, &sb);
       
  2632             if(S_ISDIR(sb.st_mode))
       
  2633                 pstrcat(file, sizeof(file), "/");
       
  2634             add_completion(file);
       
  2635         }
       
  2636     }
       
  2637     closedir(ffs);
       
  2638 }
       
  2639 
       
  2640 static void block_completion_it(void *opaque, const char *name)
       
  2641 {
       
  2642     const char *input = opaque;
       
  2643 
       
  2644     if (input[0] == '\0' ||
       
  2645         !strncmp(name, (char *)input, strlen(input))) {
       
  2646         add_completion(name);
       
  2647     }
       
  2648 }
       
  2649 
       
  2650 /* NOTE: this parser is an approximate form of the real command parser */
       
  2651 static void parse_cmdline(const char *cmdline,
       
  2652                          int *pnb_args, char **args)
       
  2653 {
       
  2654     const char *p;
       
  2655     int nb_args, ret;
       
  2656     char buf[1024];
       
  2657 
       
  2658     p = cmdline;
       
  2659     nb_args = 0;
       
  2660     for(;;) {
       
  2661         while (qemu_isspace(*p))
       
  2662             p++;
       
  2663         if (*p == '\0')
       
  2664             break;
       
  2665         if (nb_args >= MAX_ARGS)
       
  2666             break;
       
  2667         ret = get_str(buf, sizeof(buf), &p);
       
  2668         args[nb_args] = qemu_strdup(buf);
       
  2669         nb_args++;
       
  2670         if (ret < 0)
       
  2671             break;
       
  2672     }
       
  2673     *pnb_args = nb_args;
       
  2674 }
       
  2675 
       
  2676 void readline_find_completion(const char *cmdline)
       
  2677 {
       
  2678     const char *cmdname;
       
  2679     char *args[MAX_ARGS];
       
  2680     int nb_args, i, len;
       
  2681     const char *ptype, *str;
       
  2682     const term_cmd_t *cmd;
       
  2683     const KeyDef *key;
       
  2684 
       
  2685     parse_cmdline(cmdline, &nb_args, args);
       
  2686 #ifdef DEBUG_COMPLETION
       
  2687     for(i = 0; i < nb_args; i++) {
       
  2688         term_printf("arg%d = '%s'\n", i, (char *)args[i]);
       
  2689     }
       
  2690 #endif
       
  2691 
       
  2692     /* if the line ends with a space, it means we want to complete the
       
  2693        next arg */
       
  2694     len = strlen(cmdline);
       
  2695     if (len > 0 && qemu_isspace(cmdline[len - 1])) {
       
  2696         if (nb_args >= MAX_ARGS)
       
  2697             return;
       
  2698         args[nb_args++] = qemu_strdup("");
       
  2699     }
       
  2700     if (nb_args <= 1) {
       
  2701         /* command completion */
       
  2702         if (nb_args == 0)
       
  2703             cmdname = "";
       
  2704         else
       
  2705             cmdname = args[0];
       
  2706         completion_index = strlen(cmdname);
       
  2707         for(cmd = term_cmds; cmd->name != NULL; cmd++) {
       
  2708             cmd_completion(cmdname, cmd->name);
       
  2709         }
       
  2710     } else {
       
  2711         /* find the command */
       
  2712         for(cmd = term_cmds; cmd->name != NULL; cmd++) {
       
  2713             if (compare_cmd(args[0], cmd->name))
       
  2714                 goto found;
       
  2715         }
       
  2716         return;
       
  2717     found:
       
  2718         ptype = cmd->args_type;
       
  2719         for(i = 0; i < nb_args - 2; i++) {
       
  2720             if (*ptype != '\0') {
       
  2721                 ptype++;
       
  2722                 while (*ptype == '?')
       
  2723                     ptype++;
       
  2724             }
       
  2725         }
       
  2726         str = args[nb_args - 1];
       
  2727         switch(*ptype) {
       
  2728         case 'F':
       
  2729             /* file completion */
       
  2730             completion_index = strlen(str);
       
  2731             file_completion(str);
       
  2732             break;
       
  2733         case 'B':
       
  2734             /* block device name completion */
       
  2735             completion_index = strlen(str);
       
  2736             bdrv_iterate(block_completion_it, (void *)str);
       
  2737             break;
       
  2738         case 's':
       
  2739             /* XXX: more generic ? */
       
  2740             if (!strcmp(cmd->name, "info")) {
       
  2741                 completion_index = strlen(str);
       
  2742                 for(cmd = info_cmds; cmd->name != NULL; cmd++) {
       
  2743                     cmd_completion(str, cmd->name);
       
  2744                 }
       
  2745             } else if (!strcmp(cmd->name, "sendkey")) {
       
  2746                 completion_index = strlen(str);
       
  2747                 for(key = key_defs; key->name != NULL; key++) {
       
  2748                     cmd_completion(str, key->name);
       
  2749                 }
       
  2750             }
       
  2751             break;
       
  2752         default:
       
  2753             break;
       
  2754         }
       
  2755     }
       
  2756     for(i = 0; i < nb_args; i++)
       
  2757         qemu_free(args[i]);
       
  2758 }
       
  2759 
       
  2760 static int term_can_read(void *opaque)
       
  2761 {
       
  2762     return 128;
       
  2763 }
       
  2764 
       
  2765 static void term_read(void *opaque, const uint8_t *buf, int size)
       
  2766 {
       
  2767     int i;
       
  2768     for(i = 0; i < size; i++)
       
  2769         readline_handle_byte(buf[i]);
       
  2770 }
       
  2771 
       
  2772 static int monitor_suspended;
       
  2773 
       
  2774 static void monitor_handle_command1(void *opaque, const char *cmdline)
       
  2775 {
       
  2776     monitor_handle_command(cmdline);
       
  2777     if (!monitor_suspended)
       
  2778         monitor_start_input();
       
  2779     else
       
  2780         monitor_suspended = 2;
       
  2781 }
       
  2782 
       
  2783 void monitor_suspend(void)
       
  2784 {
       
  2785     monitor_suspended = 1;
       
  2786 }
       
  2787 
       
  2788 void monitor_resume(void)
       
  2789 {
       
  2790     if (monitor_suspended == 2)
       
  2791         monitor_start_input();
       
  2792     monitor_suspended = 0;
       
  2793 }
       
  2794 
       
  2795 static void monitor_start_input(void)
       
  2796 {
       
  2797     readline_start("(qemu) ", 0, monitor_handle_command1, NULL);
       
  2798 }
       
  2799 
       
  2800 static void term_event(void *opaque, int event)
       
  2801 {
       
  2802     if (event != CHR_EVENT_RESET)
       
  2803 	return;
       
  2804 
       
  2805     if (!hide_banner)
       
  2806 	    term_printf("QEMU %s monitor - type 'help' for more information\n",
       
  2807 			QEMU_VERSION);
       
  2808     monitor_start_input();
       
  2809 }
       
  2810 
       
  2811 static int is_first_init = 1;
       
  2812 
       
  2813 void monitor_init(CharDriverState *hd, int show_banner)
       
  2814 {
       
  2815     int i;
       
  2816 
       
  2817     if (is_first_init) {
       
  2818         key_timer = qemu_new_timer(vm_clock, release_keys, NULL);
       
  2819         if (!key_timer)
       
  2820             return;
       
  2821         for (i = 0; i < MAX_MON; i++) {
       
  2822             monitor_hd[i] = NULL;
       
  2823         }
       
  2824         is_first_init = 0;
       
  2825     }
       
  2826     for (i = 0; i < MAX_MON; i++) {
       
  2827         if (monitor_hd[i] == NULL) {
       
  2828             monitor_hd[i] = hd;
       
  2829             break;
       
  2830         }
       
  2831     }
       
  2832 
       
  2833     hide_banner = !show_banner;
       
  2834 
       
  2835     qemu_chr_add_handlers(hd, term_can_read, term_read, term_event, NULL);
       
  2836 
       
  2837     readline_start("", 0, monitor_handle_command1, NULL);
       
  2838 }
       
  2839 
       
  2840 /* XXX: use threads ? */
       
  2841 /* modal monitor readline */
       
  2842 static int monitor_readline_started;
       
  2843 static char *monitor_readline_buf;
       
  2844 static int monitor_readline_buf_size;
       
  2845 
       
  2846 static void monitor_readline_cb(void *opaque, const char *input)
       
  2847 {
       
  2848     pstrcpy(monitor_readline_buf, monitor_readline_buf_size, input);
       
  2849     monitor_readline_started = 0;
       
  2850 }
       
  2851 
       
  2852 void monitor_readline(const char *prompt, int is_password,
       
  2853                       char *buf, int buf_size)
       
  2854 {
       
  2855     int i;
       
  2856     int old_focus[MAX_MON];
       
  2857 
       
  2858     if (is_password) {
       
  2859         for (i = 0; i < MAX_MON; i++) {
       
  2860             old_focus[i] = 0;
       
  2861             if (monitor_hd[i]) {
       
  2862                 old_focus[i] = monitor_hd[i]->focus;
       
  2863                 monitor_hd[i]->focus = 0;
       
  2864                 qemu_chr_send_event(monitor_hd[i], CHR_EVENT_FOCUS);
       
  2865             }
       
  2866         }
       
  2867     }
       
  2868 
       
  2869     readline_start(prompt, is_password, monitor_readline_cb, NULL);
       
  2870     monitor_readline_buf = buf;
       
  2871     monitor_readline_buf_size = buf_size;
       
  2872     monitor_readline_started = 1;
       
  2873     while (monitor_readline_started) {
       
  2874         main_loop_wait(10);
       
  2875     }
       
  2876     /* restore original focus */
       
  2877     if (is_password) {
       
  2878         for (i = 0; i < MAX_MON; i++)
       
  2879             if (old_focus[i])
       
  2880                 monitor_hd[i]->focus = old_focus[i];
       
  2881     }
       
  2882 }