diff --git a/Makefile b/Makefile index d6b9dc1..a59523c 100644 --- a/Makefile +++ b/Makefile @@ -211,7 +211,7 @@ util/module.o-cflags = -D'CONFIG_BLOCK_MODULES=$(block-modules)' qemu-img.o: qemu-img-cmds.h -qemu-img$(EXESUF): qemu-img.o $(block-obj-y) libqemuutil.a libqemustub.a +qemu-img$(EXESUF): qemu-img.o $(block-obj-y) libqemuutil.a libqemustub.a -lcrypt qemu-nbd$(EXESUF): qemu-nbd.o $(block-obj-y) libqemuutil.a libqemustub.a qemu-io$(EXESUF): qemu-io.o $(block-obj-y) libqemuutil.a libqemustub.a diff --git a/qemu-img-cmds.hx b/qemu-img-cmds.hx index ae64b3d..7601b9a 100644 --- a/qemu-img-cmds.hx +++ b/qemu-img-cmds.hx @@ -15,6 +15,12 @@ STEXI @item bench [-q] [-f @var{fmt]} [-n] [-t @var{cache}] filename ETEXI +DEF("co_bench", co_bench, + "co_bench -c count -q -b") +STEXI address@hidden co_bench [-c] @var{count} [-b] [-q] +ETEXI + DEF("check", img_check, "check [-q] [-f fmt] [--output=ofmt] [-r [leaks | all]] filename") STEXI diff --git a/qemu-img.c b/qemu-img.c index 92e9529..d73b171 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -366,6 +366,106 @@ static int add_old_style_options(const char *fmt, QemuOpts *opts, return 0; } +struct crypt_data { + unsigned long sum; + bool bypass; +}; + +static unsigned long crypt_and_sum(const char *key, const char *salt) +{ + char *enc = crypt(key, salt); + int len = strlen(enc); + int i; + unsigned long sum = 0; + + for (i = 0; i < len; i++) + sum += enc[i]; + + return sum; +} + +static void gen_key(char *key, int len) +{ + char set[] = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', + 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', + 's', 't', 'w', 'x', 'y', 'z', '_', '-', ' ', + '*', '$', '#', '%', + }; + int cnt = sizeof(set) / sizeof(set[0]); + int i; + + for (i = 0; i < len; i++) { + key[i] = set[rand() % cnt]; + } +} + +static void crypt_bench(void *opaque) +{ + struct crypt_data *data = opaque; + const int len = 8; + char key1[8]; + char key2[8]; + char salt[3]; + + gen_key(key1, len); + gen_key(key2, len); + salt[0] = key1[0]; + salt[1] = key2[7]; + salt[2] = '0'; + + data->sum += crypt_and_sum(key1, salt); + data->sum += crypt_and_sum(key2, salt); + + if (!data->bypass) { + qemu_coroutine_yield(); + } +} + +static int co_bench(int argc, char **argv) +{ + int c; + bool bypass = false; + unsigned long cnt = 1; + int num = 1; + unsigned long i; + struct crypt_data data = { + .sum = 0, + .bypass = bypass, + }; + + for(;;) { + c = getopt(argc, argv, "bc:q"); + if (c == -1) { + break; + } + switch(c) { + case 'b': + bypass = true; + break; + case 'c': + num = atoi(optarg); + break; + } + } + + data.bypass = bypass; + + srand((unsigned int)&i); + srand(rand()); + for (i = 0; i < num * cnt; i++) { + Coroutine *co; + if (!data.bypass) { + co = qemu_coroutine_create(crypt_bench); + qemu_coroutine_enter(co, &data); + } else { + crypt_bench(&data); + } + } + return (int)data.sum; +} + static int img_create(int argc, char **argv) { int c;