@@ -1905,3 +1905,23 @@
'data': { 'json-args': 'str'},
'returns': 'HumanReadableText',
'features': [ 'unstable' ]}
+
+##
+# @x-query-s390x-cmma:
+#
+# Query information on s390x CMMA storage attributes
+#
+# @json-args: HMP arguments encoded as JSON string.
+#
+# Features:
+#
+# @unstable: This command is meant for debugging.
+#
+# Returns: s390x CMMA storage attributes information
+#
+# Since: 9.1
+##
+{ 'command': 'x-query-s390x-cmma',
+ 'data': { 'json-args': 'str'},
+ 'returns': 'HumanReadableText',
+ 'features': [ 'unstable' ]}
@@ -19,6 +19,9 @@
#include "exec/ram_addr.h"
#include "qapi/error.h"
#include "qapi/qmp/qdict.h"
+#include "qapi/qapi-commands-machine.h"
+#include "qapi/qmp/qjson.h"
+#include "qapi/type-helpers.h"
#include "monitor/hmp-target.h"
#include "monitor/monitor.h"
#include "cpu.h"
@@ -73,10 +76,12 @@ void hmp_migrationmode(Monitor *mon, const QDict *qdict)
}
}
-void hmp_info_cmma(Monitor *mon, const QDict *qdict)
+HumanReadableText *qmp_x_query_s390x_cmma(const char *json_args, Error **errp)
{
+ g_autoptr(GString) buf = g_string_new("");
S390StAttribState *sas = s390_get_stattrib_device();
S390StAttribClass *sac = S390_STATTRIB_GET_CLASS(sas);
+ QDict *qdict = qobject_to(QDict, qobject_from_json(json_args, &error_abort));
uint64_t addr = qdict_get_int(qdict, "addr");
uint64_t buflen = qdict_get_try_int(qdict, "count", 8);
uint8_t *vals;
@@ -84,30 +89,33 @@ void hmp_info_cmma(Monitor *mon, const QDict *qdict)
vals = g_try_malloc(buflen);
if (!vals) {
- monitor_printf(mon, "Error: %s\n", strerror(errno));
- return;
+ error_setg(errp, "Failed to allocate memory");
+ return NULL;
}
len = sac->peek_stattr(sas, addr / TARGET_PAGE_SIZE, buflen, vals);
if (len < 0) {
- monitor_printf(mon, "Error: %s", strerror(-len));
+ error_setg_errno(errp, -len, "Could not get attributes");
goto out;
}
- monitor_printf(mon, " CMMA attributes, "
- "pages %" PRIu64 "+%d (0x%" PRIx64 "):\n",
- addr / TARGET_PAGE_SIZE, len, addr & ~TARGET_PAGE_MASK);
+ g_string_append_printf(buf, " CMMA attributes, "
+ "pages %" PRIu64 "+%d (0x%" PRIx64 "):\n",
+ addr / TARGET_PAGE_SIZE, len,
+ addr & ~TARGET_PAGE_MASK);
for (cx = 0; cx < len; cx++) {
if (cx % 8 == 7) {
- monitor_printf(mon, "%02x\n", vals[cx]);
+ g_string_append_printf(buf, "%02x\n", vals[cx]);
} else {
- monitor_printf(mon, "%02x", vals[cx]);
+ g_string_append_printf(buf, "%02x", vals[cx]);
}
}
- monitor_printf(mon, "\n");
+ g_string_append_c(buf, '\n');
out:
+ qobject_unref(qdict);
g_free(vals);
+ return human_readable_text_from_str(buf);
}
/* Migration support: */
@@ -720,7 +720,7 @@ ERST
.args_type = "addr:l,count:l?",
.params = "address [count]",
.help = "Display the values of the CMMA storage attributes for a range of pages",
- .cmd = hmp_info_cmma,
+ .cmd_info_hrt = qmp_x_query_s390x_cmma,
},
#endif
This is a counterpart to the HMP "info cmma" command. It is being added with an "x-" prefix because this QMP command is intended as an adhoc debugging tool and will thus not be modelled in QAPI as fully structured data, nor will it have long term guaranteed stability. The existing HMP command is rewritten to call the QMP command. Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> --- qapi/machine.json | 20 ++++++++++++++++++++ hw/s390x/s390-stattrib.c | 28 ++++++++++++++++++---------- hmp-commands-info.hx | 2 +- 3 files changed, 39 insertions(+), 11 deletions(-)