[PATCHv2] sim: Don't overwrite stored errno in sim_syscall_multi

Simon Marchi simon.marchi@polymtl.ca
Fri Dec 14 21:52:00 GMT 2018


On 2018-12-12 18:41, Andrew Burgess wrote:
> I originally posted this patch back in February and figured it might
> be worth giving it a refresh.  Here's the original submission, it
> hasn't changed:
> 
>     https://sourceware.org/ml/gdb-patches/2018-02/msg00062.html
> 
> The sim/ maintainer has been rather absent of late, so I'm hoping
> someone else might approve this.
> 
> I've been using this patch with an out-of-tree RISC-V simulator for
> over a year now without any problems.
> 
> Thanks,
> Andrew
> 
> ---
> 
> The host syscall callback mechanism should take care of updating the
> errcode within the CB_SYSCALL struct, and we should not be adjusting
> the error code once the syscall has completed.  We especially, should
> not be rewriting the syscall errcode based on the value of errno some
> time after running the host syscall, as there is no guarantee that
> errno has not be overwritten.
> 
> To perform a syscall we call cb_syscall (in syscall.c).  To return
> from cb_syscall control passes through one of two exit paths these are
> labeled FinishSyscall and ErrorFinish and are reached using goto
> statements scattered throughout the cb_syscall function.
> 
> In FinishSyscall we store the syscall result in 'sc->result', and the
> error code is transated to target encoding, and stored in
> 'sc->errcode'.
> 
> In ErrorFinish, we again store the syscall result in 'sc->result', and
> fill in 'sc->errcode' by fetching the actual errno from the host with
> the 'cb->get_errno' callback.
> 
> In both cases 'sc->errcode' will have been filled in with an
> appropriate value.
> 
> Further, if we look at a specific syscall example, CB_SYS_open, in
> this case the first thing we do is fetch the path to open from the
> target with 'get_path', if this fails then the errcode is returned,
> and we jump to FinishSyscall.  Notice that in this case, no host
> syscall may have been performed, for example a failure to read the
> path to open out of simulated memory can return EINVAL without
> performing any host syscall.  Given that no host syscall has been
> performed, reading the host errno makes absolutely no sense.
> 
> This commit removes from sim_syscall_multi the rewriting of
> sc->errcode based on the value of errno, and instead relies on the
> value stored in the cb_syscall.
> 
> sim/common/ChangeLog:
> 
> 	* sim-syscall.c (sim_syscall_multi): Don't update sc->errcode at
> 	this point, it should have already been set in cb_syscall.
> ---
>  sim/common/ChangeLog     | 5 +++++
>  sim/common/sim-syscall.c | 5 -----
>  2 files changed, 5 insertions(+), 5 deletions(-)

Hi Andrew,

I took some time to familiarize myself with the issue, I think what you 
say make sense and that your patch is fine, please push.

I would have liked to try it, but none of the currently upstream arches 
that use sim_syscall_multi are easy for me to use (m32r, lm32, mn10300).

Simon



More information about the Gdb-patches mailing list