mirror of https://github.com/xemu-project/xemu.git
linux-user: Add an api to print enumareted argument values with strace
This patch introduces a type 'struct enums' and function 'print_enums()' that can be used to print enumerated argument values of some syscalls in strace. This can be used in future strace implementations. Also, macros 'ENUM_GENERIC()', 'ENUM_TARGET()' and 'ENUM_END', are introduced to enable automatic generation of aproppriate enumarated values and their repsective string representations (these macros are exactly the same as 'FLAG_GENERIC()', 'FLAG_TARGET()' and 'FLAG_END'). Future patches are planned to modify all existing print functions in 'strace.c' that print arguments of syscalls with enumerated values to use this new api. Signed-off-by: Filip Bozuta <Filip.Bozuta@syrmia.com> Reviewed-by: Laurent Vivier <laurent@vivier.eu> Message-Id: <20200811164553.27713-5-Filip.Bozuta@syrmia.com> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
This commit is contained in:
parent
02e5d7d78e
commit
45f567994c
|
@ -52,9 +52,23 @@ struct flags {
|
||||||
/* end of flags array */
|
/* end of flags array */
|
||||||
#define FLAG_END { 0, NULL }
|
#define FLAG_END { 0, NULL }
|
||||||
|
|
||||||
|
/* Structure used to translate enumerated values into strings */
|
||||||
|
struct enums {
|
||||||
|
abi_long e_value; /* enum value */
|
||||||
|
const char *e_string; /* stringified enum */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* common enums for all architectures */
|
||||||
|
#define ENUM_GENERIC(name) { name, #name }
|
||||||
|
/* target specific enums */
|
||||||
|
#define ENUM_TARGET(name) { TARGET_ ## name, #name }
|
||||||
|
/* end of enums array */
|
||||||
|
#define ENUM_END { 0, NULL }
|
||||||
|
|
||||||
UNUSED static const char *get_comma(int);
|
UNUSED static const char *get_comma(int);
|
||||||
UNUSED static void print_pointer(abi_long, int);
|
UNUSED static void print_pointer(abi_long, int);
|
||||||
UNUSED static void print_flags(const struct flags *, abi_long, int);
|
UNUSED static void print_flags(const struct flags *, abi_long, int);
|
||||||
|
UNUSED static void print_enums(const struct enums *, abi_long, int);
|
||||||
UNUSED static void print_at_dirfd(abi_long, int);
|
UNUSED static void print_at_dirfd(abi_long, int);
|
||||||
UNUSED static void print_file_mode(abi_long, int);
|
UNUSED static void print_file_mode(abi_long, int);
|
||||||
UNUSED static void print_open_flags(abi_long, int);
|
UNUSED static void print_open_flags(abi_long, int);
|
||||||
|
@ -1252,6 +1266,23 @@ print_flags(const struct flags *f, abi_long flags, int last)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_enums(const struct enums *e, abi_long enum_arg, int last)
|
||||||
|
{
|
||||||
|
for (; e->e_string != NULL; e++) {
|
||||||
|
if (e->e_value == enum_arg) {
|
||||||
|
qemu_log("%s", e->e_string);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e->e_string == NULL) {
|
||||||
|
qemu_log("%#x", (unsigned int)enum_arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
qemu_log("%s", get_comma(last));
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_at_dirfd(abi_long dirfd, int last)
|
print_at_dirfd(abi_long dirfd, int last)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue