plugins/hwprofile: adapt to the new plugin arguments scheme

Parsing boolean arguments correctly (e.g. pattern=on or source=false).
Introduced a new "track" argument that takes a [read|write] value. This
substitutes passing read or write to "arg=" that is deprecated.

Also, matches are now taken one by one through the "match" argument.

Signed-off-by: Mahmoud Mandour <ma.mandourr@gmail.com>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Tested-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20210730135817.17816-7-ma.mandourr@gmail.com>
This commit is contained in:
Mahmoud Mandour 2021-07-30 15:58:10 +02:00 committed by Alex Bennée
parent b18a0cad81
commit 60753843f6
2 changed files with 31 additions and 16 deletions

View File

@ -259,27 +259,42 @@ int qemu_plugin_install(qemu_plugin_id_t id, const qemu_info_t *info,
int argc, char **argv) int argc, char **argv)
{ {
int i; int i;
g_autoptr(GString) matches_raw = g_string_new("");
for (i = 0; i < argc; i++) { for (i = 0; i < argc; i++) {
char *opt = argv[i]; char *opt = argv[i];
if (g_strcmp0(opt, "read") == 0) { g_autofree char **tokens = g_strsplit(opt, "=", 2);
rw = QEMU_PLUGIN_MEM_R;
} else if (g_strcmp0(opt, "write") == 0) { if (g_strcmp0(tokens[0], "track") == 0) {
rw = QEMU_PLUGIN_MEM_W; if (g_strcmp0(tokens[1], "read") == 0) {
} else if (g_strcmp0(opt, "pattern") == 0) { rw = QEMU_PLUGIN_MEM_R;
pattern = true; } else if (g_strcmp0(tokens[1], "write") == 0) {
} else if (g_strcmp0(opt, "source") == 0) { rw = QEMU_PLUGIN_MEM_W;
source = true; } else {
} else if (g_str_has_prefix(opt, "match")) { fprintf(stderr, "invalid value for track: %s\n", tokens[1]);
gchar **parts = g_strsplit(opt, "=", 2); return -1;
}
} else if (g_strcmp0(tokens[0], "pattern") == 0) {
if (!qemu_plugin_bool_parse(tokens[0], tokens[1], &pattern)) {
fprintf(stderr, "boolean argument parsing failed: %s\n", opt);
return -1;
}
} else if (g_strcmp0(tokens[0], "source") == 0) {
if (!qemu_plugin_bool_parse(tokens[0], tokens[1], &source)) {
fprintf(stderr, "boolean argument parsing failed: %s\n", opt);
return -1;
}
} else if (g_strcmp0(tokens[0], "match") == 0) {
check_match = true; check_match = true;
matches = g_strsplit(parts[1], ",", -1); g_string_append_printf(matches_raw, "%s,", tokens[1]);
g_strfreev(parts);
} else { } else {
fprintf(stderr, "option parsing failed: %s\n", opt); fprintf(stderr, "option parsing failed: %s\n", opt);
return -1; return -1;
} }
} }
if (check_match) {
matches = g_strsplit(matches_raw->str, ",", -1);
}
if (source && pattern) { if (source && pattern) {
fprintf(stderr, "can only currently track either source or pattern.\n"); fprintf(stderr, "can only currently track either source or pattern.\n");

View File

@ -306,22 +306,22 @@ which will eventually report::
The hwprofile tool can only be used with system emulation and allows The hwprofile tool can only be used with system emulation and allows
the user to see what hardware is accessed how often. It has a number of options: the user to see what hardware is accessed how often. It has a number of options:
* arg=read or arg=write * track=read or track=write
By default the plugin tracks both reads and writes. You can use one By default the plugin tracks both reads and writes. You can use one
of these options to limit the tracking to just one class of accesses. of these options to limit the tracking to just one class of accesses.
* arg=source * source
Will include a detailed break down of what the guest PC that made the Will include a detailed break down of what the guest PC that made the
access was. Not compatible with arg=pattern. Example output:: access was. Not compatible with the pattern option. Example output::
cirrus-low-memory @ 0xfffffd00000a0000 cirrus-low-memory @ 0xfffffd00000a0000
pc:fffffc0000005cdc, 1, 256 pc:fffffc0000005cdc, 1, 256
pc:fffffc0000005ce8, 1, 256 pc:fffffc0000005ce8, 1, 256
pc:fffffc0000005cec, 1, 256 pc:fffffc0000005cec, 1, 256
* arg=pattern * pattern
Instead break down the accesses based on the offset into the HW Instead break down the accesses based on the offset into the HW
region. This can be useful for seeing the most used registers of a region. This can be useful for seeing the most used registers of a