Le 11/06/2020 à 17:51, Filip Bozuta a écrit : > From: Filip Bozuta <filip.boz...@syrmia.com> > > Structure "struct syscallname" in file "strace.c" is used for "-strace" > to print arguments and return values of syscalls. The last field of > this structure "result" represents the calling function that prints the > return values. This field was extended in this patch so that this > functions > takes all syscalls arguments beside the return value. In this way, it > enables > "-strace" to print arguments of syscalls that have changed after the > syscall > execution. This extension will be useful as there are many syscalls that > return values inside their arguments (i.e. listxattr() that returns the > list > of extended attributes inside the "list" argument). > > Implementation notes: > > Since there are already three existing "print_syscall_ret*" functions > inside > "strace.c" ("print_syscall_ret_addr()", "print_syscall_ret_adjtimex()", > "print_syscall_ret_newselect()"), they were changed to have all syscall > arguments > beside the return value. This was done so that these functions don't > cause build > errors (even though syscall arguments are not used in these functions). > There is code repetition in these functions for checking the return value > and printing the approppriate error message (this code is also located in > print_syscall_ret() at the end of "strace.c"). That is the reason why a > generic > function SYSCALL_RET_ERR() was added for this code and put inside these > functions. > > Signed-off-by: Filip Bozuta <filip.boz...@syrmia.com> > --- > linux-user/qemu.h | 4 ++- > linux-user/strace.c | 71 ++++++++++++++++++++++++++------------------ > linux-user/syscall.c | 2 +- > 3 files changed, 46 insertions(+), 31 deletions(-) > > diff --git a/linux-user/qemu.h b/linux-user/qemu.h > index ce902f5132..8f938b8105 100644 > --- a/linux-user/qemu.h > +++ b/linux-user/qemu.h > @@ -383,7 +383,9 @@ int host_to_target_waitstatus(int status); > void print_syscall(int num, > abi_long arg1, abi_long arg2, abi_long arg3, > abi_long arg4, abi_long arg5, abi_long arg6); > -void print_syscall_ret(int num, abi_long arg1); > +void print_syscall_ret(int num, abi_long ret, > + abi_long arg1, abi_long arg2, abi_long arg3, > + abi_long arg4, abi_long arg5, abi_long arg6); > /** > * print_taken_signal: > * @target_signum: target signal being taken > diff --git a/linux-user/strace.c b/linux-user/strace.c > index 0d9095c674..8678a2aeac 100644 > --- a/linux-user/strace.c > +++ b/linux-user/strace.c > @@ -19,7 +19,9 @@ struct syscallname { > void (*call)(const struct syscallname *, > abi_long, abi_long, abi_long, > abi_long, abi_long, abi_long); > - void (*result)(const struct syscallname *, abi_long); > + void (*result)(const struct syscallname *, abi_long, > + abi_long, abi_long, abi_long, > + abi_long, abi_long, abi_long); > }; > > #ifdef __GNUC__ > @@ -735,18 +737,29 @@ print_ipc(const struct syscallname *name, > * Variants for the return value output function > */ > > +#define SYSCALL_RET_ERR(ret, errstr) \ > +{ \ > + qemu_log(" = "); \ > + if (ret < 0) { \ > + qemu_log("-1 errno=%d", errno); \ > + errstr = target_strerror(-ret); \ > + if (errstr) { \ > + qemu_log(" (%s)", errstr); \ > + } \ > + } \ > +}
You should move the declaration of errstr into this block, and then I think it would be better to have function rather than a macro. Thanks, Laurent