This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] sim: Don't overwrite stored errno in sim_syscall_multi


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=c5ebe0ff706521b4a5fb66a5e764031825276ad5

commit c5ebe0ff706521b4a5fb66a5e764031825276ad5
Author: Andrew Burgess <andrew.burgess@embecosm.com>
Date:   Mon Feb 5 11:15:38 2018 +0000

    sim: Don't overwrite stored errno in sim_syscall_multi
    
    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.

Diff:
---
 sim/common/ChangeLog     | 5 +++++
 sim/common/sim-syscall.c | 5 -----
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/sim/common/ChangeLog b/sim/common/ChangeLog
index e59ee01..01ee122 100644
--- a/sim/common/ChangeLog
+++ b/sim/common/ChangeLog
@@ -1,3 +1,8 @@
+2018-12-18  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+	* sim-syscall.c (sim_syscall_multi): Don't update sc->errcode at
+	this point, it should have already been set in cb_syscall.
+
 2018-10-05  Stafford Horne  <shorne@gmail.com>
 
 	* cgen-ops.h (ADDCFDI): New function, add carry flag DI variant.
diff --git a/sim/common/sim-syscall.c b/sim/common/sim-syscall.c
index 7923160..34d2f0e 100644
--- a/sim/common/sim-syscall.c
+++ b/sim/common/sim-syscall.c
@@ -97,11 +97,6 @@ sim_syscall_multi (SIM_CPU *cpu, int func, long arg1, long arg2, long arg3,
 
   if (cb_target_to_host_syscall (cb, func) == CB_SYS_exit)
     sim_engine_halt (sd, cpu, NULL, sim_pc_get (cpu), sim_exited, arg1);
-  else if (sc.result == -1)
-    {
-      cb->last_errno = errno;
-      sc.errcode = cb->get_errno (cb);
-    }
 
   *result = sc.result;
   *result2 = sc.result2;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]