s390x: Info skeys sub-command
Provide an info skeys hmp sub-command to allow the end user to dump a storage key for a given address. This is useful for guest operating system developers. Reviewed-by: Thomas Huth <thuth@linux.vnet.ibm.com> Reviewed-by: David Hildenbrand <dahi@linux.vnet.ibm.com> Signed-off-by: Jason J. Herne <jjherne@linux.vnet.ibm.com> Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
This commit is contained in:
parent
a4538a5cc5
commit
a08f0081c9
@ -1806,6 +1806,8 @@ show roms
|
|||||||
show the TPM device
|
show the TPM device
|
||||||
@item info memory-devices
|
@item info memory-devices
|
||||||
show the memory devices
|
show the memory devices
|
||||||
|
@item info skeys
|
||||||
|
Display the value of a storage key (s390 only)
|
||||||
@end table
|
@end table
|
||||||
ETEXI
|
ETEXI
|
||||||
|
|
||||||
|
@ -66,6 +66,29 @@ static void write_keys(QEMUFile *f, uint8_t *keys, uint64_t startgfn,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void hmp_info_skeys(Monitor *mon, const QDict *qdict)
|
||||||
|
{
|
||||||
|
S390SKeysState *ss = s390_get_skeys_device();
|
||||||
|
S390SKeysClass *skeyclass = S390_SKEYS_GET_CLASS(ss);
|
||||||
|
uint64_t addr = qdict_get_int(qdict, "addr");
|
||||||
|
uint8_t key;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
/* Quick check to see if guest is using storage keys*/
|
||||||
|
if (!skeyclass->skeys_enabled(ss)) {
|
||||||
|
monitor_printf(mon, "Error: This guest is not using storage keys\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = skeyclass->get_skeys(ss, addr / TARGET_PAGE_SIZE, 1, &key);
|
||||||
|
if (r < 0) {
|
||||||
|
monitor_printf(mon, "Error: %s\n", strerror(-r));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
monitor_printf(mon, " key: 0x%X\n", key);
|
||||||
|
}
|
||||||
|
|
||||||
void hmp_dump_skeys(Monitor *mon, const QDict *qdict)
|
void hmp_dump_skeys(Monitor *mon, const QDict *qdict)
|
||||||
{
|
{
|
||||||
const char *filename = qdict_get_str(qdict, "filename");
|
const char *filename = qdict_get_str(qdict, "filename");
|
||||||
|
@ -54,4 +54,6 @@ void s390_skeys_init(void);
|
|||||||
S390SKeysState *s390_get_skeys_device(void);
|
S390SKeysState *s390_get_skeys_device(void);
|
||||||
|
|
||||||
void hmp_dump_skeys(Monitor *mon, const QDict *qdict);
|
void hmp_dump_skeys(Monitor *mon, const QDict *qdict);
|
||||||
|
void hmp_info_skeys(Monitor *mon, const QDict *qdict);
|
||||||
|
|
||||||
#endif /* __S390_STORAGE_KEYS_H */
|
#endif /* __S390_STORAGE_KEYS_H */
|
||||||
|
@ -2881,6 +2881,15 @@ static mon_cmd_t info_cmds[] = {
|
|||||||
.help = "Show rocker OF-DPA groups",
|
.help = "Show rocker OF-DPA groups",
|
||||||
.mhandler.cmd = hmp_rocker_of_dpa_groups,
|
.mhandler.cmd = hmp_rocker_of_dpa_groups,
|
||||||
},
|
},
|
||||||
|
#if defined(TARGET_S390X)
|
||||||
|
{
|
||||||
|
.name = "skeys",
|
||||||
|
.args_type = "addr:l",
|
||||||
|
.params = "address",
|
||||||
|
.help = "Display the value of a storage key",
|
||||||
|
.mhandler.cmd = hmp_info_skeys,
|
||||||
|
},
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
.name = NULL,
|
.name = NULL,
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user