summaryrefslogtreecommitdiffstats
ModeNameSize
-rw-r--r--.dir-locals.el75logstatsplainblame
-rw-r--r--.exrc220logstatsplainblame
-rw-r--r--.gitignore1852logstatsplainblame
-rw-r--r--.gitmodules1010logstatsplainblame
-rw-r--r--.mailmap1288logstatsplainblame
-rw-r--r--.travis.yml2362logstatsplainblame
-rw-r--r--CODING_STYLE4039logstatsplainblame
-rw-r--r--COPYING17992logstatsplainblame
-rw-r--r--COPYING.LIB26426logstatsplainblame
-rw-r--r--Changelog23150logstatsplainblame
-rw-r--r--HACKING9350logstatsplainblame
-rw-r--r--LICENSE840logstatsplainblame
-rw-r--r--MAINTAINERS32650logstatsplainblame
-rw-r--r--Makefile22840logstatsplainblame
-rw-r--r--Makefile.objs3597logstatsplainblame
-rw-r--r--Makefile.target7031logstatsplainblame
-rw-r--r--README3795logstatsplainblame
-rw-r--r--VERSION7logstatsplainblame
-rw-r--r--accel.c4475logstatsplainblame
-rw-r--r--aio-posix.c13256logstatsplainblame
-rw-r--r--aio-win32.c10484logstatsplainblame
-rw-r--r--arch_init.c8133logstatsplainblame
-rw-r--r--async.c9677logstatsplainblame
d---------audio956logstatsplain
d---------backends412logstatsplain
-rw-r--r--balloon.c3426logstatsplainblame
-rw-r--r--block.c117382logstatsplainblame
d---------block2319logstatsplain
-rw-r--r--blockdev-nbd.c4766logstatsplainblame
-rw-r--r--blockdev.c132417logstatsplainblame
-rw-r--r--blockjob.c14650logstatsplainblame
-rw-r--r--bootdevice.c9460logstatsplainblame
d---------bsd-user714logstatsplain
-rw-r--r--bt-host.c5300logstatsplainblame
-rw-r--r--bt-vhci.c4600logstatsplainblame
-rwxr-xr-xconfigure156467logstatsplainblame
d---------contrib82logstatsplain
-rw-r--r--cpu-exec-common.c2808logstatsplainblame
-rw-r--r--cpu-exec.c20802logstatsplainblame
-rw-r--r--cpus.c45162logstatsplainblame
-rw-r--r--cputlb.c14693logstatsplainblame
d---------crypto1498logstatsplain
d---------default-configs3052logstatsplain
-rw-r--r--device-hotplug.c2613logstatsplainblame
-rw-r--r--device_tree.c13163logstatsplainblame
-rw-r--r--disas.c11623logstatsplainblame
d---------disas662logstatsplain
-rw-r--r--dma-helpers.c6921logstatsplainblame
d---------docs1935logstatsplain
m---------dtc @ 65cc4d20logstatsblame
-rw-r--r--dump.c54523logstatsplainblame
-rw-r--r--exec.c109110logstatsplainblame
d---------fpu135logstatsplain
d---------fsdev521logstatsplain
d---------gdb-xml819logstatsplain
-rw-r--r--gdbstub.c46140logstatsplainblame
-rw-r--r--hmp-commands-info.hx16316logstatsplainblame
-rw-r--r--hmp-commands.hx51026logstatsplainblame
-rw-r--r--hmp.c73500logstatsplainblame
-rw-r--r--hmp.h7209logstatsplainblame
d---------hw1815logstatsplain
d---------include813logstatsplain
d---------io458logstatsplain
-rw-r--r--iohandler.c3576logstatsplainblame
-rw-r--r--ioport.c9205logstatsplainblame
-rw-r--r--iothread.c4581logstatsplainblame
-rw-r--r--kvm-all.c64098logstatsplainblame
-rw-r--r--kvm-stub.c2733logstatsplainblame
d---------libdecnumber109logstatsplain
d---------linux-headers351logstatsplain
d---------linux-user1481logstatsplain
-rw-r--r--main-loop.c14159logstatsplainblame
-rw-r--r--memory.c79260logstatsplainblame
-rw-r--r--memory_mapping.c10791logstatsplainblame
d---------migration685logstatsplain
-rw-r--r--module-common.c113logstatsplainblame
-rw-r--r--monitor.c116165logstatsplainblame
d---------nbd191logstatsplain
d---------net1064logstatsplain
-rw-r--r--numa.c16576logstatsplainblame
-rw-r--r--os-posix.c8223logstatsplainblame
-rw-r--r--os-win32.c3716logstatsplainblame
-rw-r--r--page_cache.c5901logstatsplainblame
d---------pc-bios2143logstatsplain
m---------pixman @ 87eea990logstatsblame
d---------po282logstatsplain
-rw-r--r--qapi-schema.json107971logstatsplainblame
d---------qapi853logstatsplain
-rw-r--r--qdev-monitor.c25206logstatsplainblame
-rw-r--r--qdict-test-data.txt90568logstatsplainblame
-rw-r--r--qemu-bridge-helper.c11280logstatsplainblame
-rw-r--r--qemu-char.c126391logstatsplainblame
-rw-r--r--qemu-doc.texi98424logstatsplainblame
-rw-r--r--qemu-ga.texi3284logstatsplainblame
-rw-r--r--qemu-img-cmds.hx3742logstatsplainblame
-rw-r--r--qemu-img.c105254logstatsplainblame
-rw-r--r--qemu-img.texi23131logstatsplainblame
-rw-r--r--qemu-io-cmds.c62848logstatsplainblame
-rw-r--r--qemu-io.c16001logstatsplainblame
-rw-r--r--qemu-nbd.c29600logstatsplainblame
-rw-r--r--qemu-nbd.texi4053logstatsplainblame
-rw-r--r--qemu-options-wrapper.h1058logstatsplainblame
-rw-r--r--qemu-options.h1405logstatsplainblame
-rw-r--r--qemu-options.hx156130logstatsplainblame
-rw-r--r--qemu-seccomp.c9038logstatsplainblame
-rw-r--r--qemu-tech.texi23151logstatsplainblame
-rw-r--r--qemu-timer.c17728logstatsplainblame
-rw-r--r--qemu.nsi7515logstatsplainblame
-rw-r--r--qemu.sasl1364logstatsplainblame
d---------qga705logstatsplain
-rw-r--r--qjson.c2653logstatsplainblame
-rw-r--r--qmp-commands.hx138471logstatsplainblame
-rw-r--r--qmp.c19207logstatsplainblame
d---------qobject484logstatsplain
d---------qom237logstatsplain
-rw-r--r--qtest.c18511logstatsplainblame
d---------replay334logstatsplain
d---------roms764logstatsplain
-rw-r--r--rules.mak13162logstatsplainblame
d---------scripts1830logstatsplain
d---------slirp1698logstatsplain
-rw-r--r--softmmu_template.h21383logstatsplainblame
-rw-r--r--spice-qemu-char.c11103logstatsplainblame
d---------stubs1827logstatsplain
d---------target-alpha563logstatsplain
d---------target-arm1297logstatsplain
d---------target-cris606logstatsplain
d---------target-i3861321logstatsplain
d---------target-lm32473logstatsplain
d---------target-m68k407logstatsplain
d---------target-microblaze444logstatsplain
d---------target-mips713logstatsplain
d---------target-moxie358logstatsplain
d---------target-openrisc658logstatsplain
d---------target-ppc1262logstatsplain
d---------target-s390x800logstatsplain
d---------target-sh4406logstatsplain
d---------target-sparc722logstatsplain
d---------target-tilegx342logstatsplain
d---------target-tricore457logstatsplain
d---------target-unicore32373logstatsplain
d---------target-xtensa724logstatsplain
-rw-r--r--tcg-runtime.c2738logstatsplainblame
d---------tcg757logstatsplain
-rw-r--r--tci.c37330logstatsplainblame
d---------tests6113logstatsplain
-rw-r--r--thread-pool.c9228logstatsplainblame
-rw-r--r--thunk.c9261logstatsplainblame
-rw-r--r--tpm.c7725logstatsplainblame
-rw-r--r--trace-events131586logstatsplainblame
d---------trace382logstatsplain
-rw-r--r--translate-all.c60610logstatsplainblame
-rw-r--r--translate-all.h1266logstatsplainblame
-rw-r--r--translate-common.c1733logstatsplainblame
d---------ui2531logstatsplain
-rw-r--r--user-exec.c21611logstatsplainblame
d---------util2116logstatsplain
-rw-r--r--version.rc797logstatsplainblame
-rw-r--r--vl.c137778logstatsplainblame
-rw-r--r--xen-common-stub.c334logstatsplainblame
-rw-r--r--xen-common.c3875logstatsplainblame
-rw-r--r--xen-hvm-stub.c1215logstatsplainblame
-rw-r--r--xen-hvm.c42319logstatsplainblame
-rw-r--r--xen-mapcache.c13292logstatsplainblame
class="hl opt">} else if (ct->argmin == ct->argmax) { fprintf(stderr, "bad argument count %d to %s, expected %d arguments\n", argc-1, cmd, ct->argmin); } else { fprintf(stderr, "bad argument count %d to %s, expected between %d and %d arguments\n", argc-1, cmd, ct->argmin, ct->argmax); } return 0; } /* Request additional permissions if necessary for this command. The caller * is responsible for restoring the original permissions afterwards if this * is what it wants. */ if (ct->perm && blk_is_available(blk)) { uint64_t orig_perm, orig_shared_perm; blk_get_perm(blk, &orig_perm, &orig_shared_perm); if (ct->perm & ~orig_perm) { uint64_t new_perm; Error *local_err = NULL; int ret; new_perm = orig_perm | ct->perm; ret = blk_set_perm(blk, new_perm, orig_shared_perm, &local_err); if (ret < 0) { error_report_err(local_err); return 0; } } } optind = 0; return ct->cfunc(blk, argc, argv); } static const cmdinfo_t *find_command(const char *cmd) { cmdinfo_t *ct; for (ct = cmdtab; ct < &cmdtab[ncmds]; ct++) { if (strcmp(ct->name, cmd) == 0 || (ct->altname && strcmp(ct->altname, cmd) == 0)) { return (const cmdinfo_t *)ct; } } return NULL; } /* Invoke fn() for commands with a matching prefix */ void qemuio_complete_command(const char *input, void (*fn)(const char *cmd, void *opaque), void *opaque) { cmdinfo_t *ct; size_t input_len = strlen(input); for (ct = cmdtab; ct < &cmdtab[ncmds]; ct++) { if (strncmp(input, ct->name, input_len) == 0) { fn(ct->name, opaque); } } } static char **breakline(char *input, int *count) { int c = 0; char *p; char **rval = g_new0(char *, 1); while (rval && (p = qemu_strsep(&input, " ")) != NULL) { if (!*p) { continue; } c++; rval = g_renew(char *, rval, (c + 1)); rval[c - 1] = p; rval[c] = NULL; } *count = c; return rval; } static int64_t cvtnum(const char *s) { int err; uint64_t value; err = qemu_strtosz(s, NULL, &value); if (err < 0) { return err; } if (value > INT64_MAX) { return -ERANGE; } return value; } static void print_cvtnum_err(int64_t rc, const char *arg) { switch (rc) { case -EINVAL: printf("Parsing error: non-numeric argument," " or extraneous/unrecognized suffix -- %s\n", arg); break; case -ERANGE: printf("Parsing error: argument too large -- %s\n", arg); break; default: printf("Parsing error: %s\n", arg); } } #define EXABYTES(x) ((long long)(x) << 60) #define PETABYTES(x) ((long long)(x) << 50) #define TERABYTES(x) ((long long)(x) << 40) #define GIGABYTES(x) ((long long)(x) << 30) #define MEGABYTES(x) ((long long)(x) << 20) #define KILOBYTES(x) ((long long)(x) << 10) #define TO_EXABYTES(x) ((x) / EXABYTES(1)) #define TO_PETABYTES(x) ((x) / PETABYTES(1)) #define TO_TERABYTES(x) ((x) / TERABYTES(1)) #define TO_GIGABYTES(x) ((x) / GIGABYTES(1)) #define TO_MEGABYTES(x) ((x) / MEGABYTES(1)) #define TO_KILOBYTES(x) ((x) / KILOBYTES(1)) static void cvtstr(double value, char *str, size_t size) { char *trim; const char *suffix; if (value >= EXABYTES(1)) { suffix = " EiB"; snprintf(str, size - 4, "%.3f", TO_EXABYTES(value)); } else if (value >= PETABYTES(1)) { suffix = " PiB"; snprintf(str, size - 4, "%.3f", TO_PETABYTES(value)); } else if (value >= TERABYTES(1)) { suffix = " TiB"; snprintf(str, size - 4, "%.3f", TO_TERABYTES(value)); } else if (value >= GIGABYTES(1)) { suffix = " GiB"; snprintf(str, size - 4, "%.3f", TO_GIGABYTES(value)); } else if (value >= MEGABYTES(1)) { suffix = " MiB"; snprintf(str, size - 4, "%.3f", TO_MEGABYTES(value)); } else if (value >= KILOBYTES(1)) { suffix = " KiB"; snprintf(str, size - 4, "%.3f", TO_KILOBYTES(value)); } else { suffix = " bytes"; snprintf(str, size - 6, "%f", value); } trim = strstr(str, ".000"); if (trim) { strcpy(trim, suffix); } else { strcat(str, suffix); } } static struct timeval tsub(struct timeval t1, struct timeval t2) { t1.tv_usec -= t2.tv_usec; if (t1.tv_usec < 0) { t1.tv_usec += 1000000; t1.tv_sec--; } t1.tv_sec -= t2.tv_sec; return t1; } static double tdiv(double value, struct timeval tv) { return value / ((double)tv.tv_sec + ((double)tv.tv_usec / 1000000.0)); } #define HOURS(sec) ((sec) / (60 * 60)) #define MINUTES(sec) (((sec) % (60 * 60)) / 60) #define SECONDS(sec) ((sec) % 60) enum { DEFAULT_TIME = 0x0, TERSE_FIXED_TIME = 0x1, VERBOSE_FIXED_TIME = 0x2, }; static void timestr(struct timeval *tv, char *ts, size_t size, int format) { double usec = (double)tv->tv_usec / 1000000.0; if (format & TERSE_FIXED_TIME) { if (!HOURS(tv->tv_sec)) { snprintf(ts, size, "%u:%02u.%02u", (unsigned int) MINUTES(tv->tv_sec), (unsigned int) SECONDS(tv->tv_sec), (unsigned int) (usec * 100)); return; } format |= VERBOSE_FIXED_TIME; /* fallback if hours needed */ } if ((format & VERBOSE_FIXED_TIME) || tv->tv_sec) { snprintf(ts, size, "%u:%02u:%02u.%02u", (unsigned int) HOURS(tv->tv_sec), (unsigned int) MINUTES(tv->tv_sec), (unsigned int) SECONDS(tv->tv_sec), (unsigned int) (usec * 100)); } else { snprintf(ts, size, "0.%04u sec", (unsigned int) (usec * 10000)); } } /* * Parse the pattern argument to various sub-commands. * * Because the pattern is used as an argument to memset it must evaluate * to an unsigned integer that fits into a single byte. */ static int parse_pattern(const char *arg) { char *endptr = NULL; long pattern; pattern = strtol(arg, &endptr, 0); if (pattern < 0 || pattern > UCHAR_MAX || *endptr != '\0') { printf("%s is not a valid pattern byte\n", arg); return -1; } return pattern; } /* * Memory allocation helpers. * * Make sure memory is aligned by default, or purposefully misaligned if * that is specified on the command line. */ #define MISALIGN_OFFSET 16 static void *qemu_io_alloc(BlockBackend *blk, size_t len, int pattern) { void *buf; if (qemuio_misalign) { len += MISALIGN_OFFSET; } buf = blk_blockalign(blk, len); memset(buf, pattern, len); if (qemuio_misalign) { buf += MISALIGN_OFFSET; } return buf; } static void qemu_io_free(void *p) { if (qemuio_misalign) { p -= MISALIGN_OFFSET; } qemu_vfree(p); } static void dump_buffer(const void *buffer, int64_t offset, int64_t len) { uint64_t i; int j; const uint8_t *p; for (i = 0, p = buffer; i < len; i += 16) { const uint8_t *s = p; printf("%08" PRIx64 ": ", offset + i); for (j = 0; j < 16 && i + j < len; j++, p++) { printf("%02x ", *p); } printf(" "); for (j = 0; j < 16 && i + j < len; j++, s++) { if (isalnum(*s)) { printf("%c", *s); } else { printf("."); } } printf("\n"); } } static void print_report(const char *op, struct timeval *t, int64_t offset, int64_t count, int64_t total, int cnt, bool Cflag) { char s1[64], s2[64], ts[64]; timestr(t, ts, sizeof(ts), Cflag ? VERBOSE_FIXED_TIME : 0); if (!Cflag) { cvtstr((double)total, s1, sizeof(s1)); cvtstr(tdiv((double)total, *t), s2, sizeof(s2)); printf("%s %"PRId64"/%"PRId64" bytes at offset %" PRId64 "\n", op, total, count, offset); printf("%s, %d ops; %s (%s/sec and %.4f ops/sec)\n", s1, cnt, ts, s2, tdiv((double)cnt, *t)); } else {/* bytes,ops,time,bytes/sec,ops/sec */ printf("%"PRId64",%d,%s,%.3f,%.3f\n", total, cnt, ts, tdiv((double)total, *t), tdiv((double)cnt, *t)); } } /* * Parse multiple length statements for vectored I/O, and construct an I/O * vector matching it. */ static void * create_iovec(BlockBackend *blk, QEMUIOVector *qiov, char **argv, int nr_iov, int pattern) { size_t *sizes = g_new0(size_t, nr_iov); size_t count = 0; void *buf = NULL; void *p; int i; for (i = 0; i < nr_iov; i++) { char *arg = argv[i]; int64_t len; len = cvtnum(arg); if (len < 0) { print_cvtnum_err(len, arg); goto fail; } if (len > BDRV_REQUEST_MAX_BYTES) { printf("Argument '%s' exceeds maximum size %" PRIu64 "\n", arg, (uint64_t)BDRV_REQUEST_MAX_BYTES); goto fail; } if (count > BDRV_REQUEST_MAX_BYTES - len) { printf("The total number of bytes exceed the maximum size %" PRIu64 "\n", (uint64_t)BDRV_REQUEST_MAX_BYTES); goto fail; } sizes[i] = len; count += len; } qemu_iovec_init(qiov, nr_iov); buf = p = qemu_io_alloc(blk, count, pattern); for (i = 0; i < nr_iov; i++) { qemu_iovec_add(qiov, p, sizes[i]); p += sizes[i]; } fail: g_free(sizes); return buf; } static int do_pread(BlockBackend *blk, char *buf, int64_t offset, int64_t bytes, int64_t *total) { if (bytes > INT_MAX) { return -ERANGE; } *total = blk_pread(blk, offset, (uint8_t *)buf, bytes); if (*total < 0) { return *total; } return 1; } static int do_pwrite(BlockBackend *blk, char *buf, int64_t offset, int64_t bytes, int flags, int64_t *total) { if (bytes > INT_MAX) { return -ERANGE; } *total = blk_pwrite(blk, offset, (uint8_t *)buf, bytes, flags); if (*total < 0) { return *total; } return 1; } typedef struct { BlockBackend *blk; int64_t offset; int64_t bytes; int64_t *total; int flags; int ret; bool done; } CoWriteZeroes; static void coroutine_fn co_pwrite_zeroes_entry(void *opaque) { CoWriteZeroes *data = opaque; data->ret = blk_co_pwrite_zeroes(data->blk, data->offset, data->bytes, data->flags); data->done = true; if (data->ret < 0) { *data->total = data->ret; return; } *data->total = data->bytes; } static int do_co_pwrite_zeroes(BlockBackend *blk, int64_t offset, int64_t bytes, int flags, int64_t *total) { Coroutine *co; CoWriteZeroes data = { .blk = blk, .offset = offset, .bytes = bytes, .total = total, .flags = flags, .done = false, }; if (bytes > INT_MAX) { return -ERANGE; } co = qemu_coroutine_create(co_pwrite_zeroes_entry, &data); bdrv_coroutine_enter(blk_bs(blk), co); while (!data.done) { aio_poll(blk_get_aio_context(blk), true); } if (data.ret < 0) { return data.ret; } else { return 1; } } static int do_write_compressed(BlockBackend *blk, char *buf, int64_t offset, int64_t bytes, int64_t *total) { int ret; if (bytes >> 9 > BDRV_REQUEST_MAX_SECTORS) { return -ERANGE; } ret = blk_pwrite_compressed(blk, offset, buf, bytes); if (ret < 0) { return ret; } *total = bytes; return 1; } static int do_load_vmstate(BlockBackend *blk, char *buf, int64_t offset, int64_t count, int64_t *total) { if (count > INT_MAX) { return -ERANGE; } *total = blk_load_vmstate(blk, (uint8_t *)buf, offset, count); if (*total < 0) { return *total; } return 1; } static int do_save_vmstate(BlockBackend *blk, char *buf, int64_t offset, int64_t count, int64_t *total) { if (count > INT_MAX) { return -ERANGE; } *total = blk_save_vmstate(blk, (uint8_t *)buf, offset, count); if (*total < 0) { return *total; } return 1; } #define NOT_DONE 0x7fffffff static void aio_rw_done(void *opaque, int ret) { *(int *)opaque = ret; } static int do_aio_readv(BlockBackend *blk, QEMUIOVector *qiov, int64_t offset, int *total) { int async_ret = NOT_DONE; blk_aio_preadv(blk, offset, qiov, 0, aio_rw_done, &async_ret); while (async_ret == NOT_DONE) { main_loop_wait(false); } *total = qiov->size; return async_ret < 0 ? async_ret : 1; } static int do_aio_writev(BlockBackend *blk, QEMUIOVector *qiov, int64_t offset, int flags, int *total) { int async_ret = NOT_DONE; blk_aio_pwritev(blk, offset, qiov, flags, aio_rw_done, &async_ret); while (async_ret == NOT_DONE) { main_loop_wait(false); } *total = qiov->size; return async_ret < 0 ? async_ret : 1; } static void read_help(void) { printf( "\n" " reads a range of bytes from the given offset\n" "\n" " Example:\n"