Ticket #7994: 0001-mips-fix-errno-setting-after-syscall.patch

File 0001-mips-fix-errno-setting-after-syscall.patch, 3.1 KB (added by Alexander Gordeev <lasaine@…>, 6 years ago)

patch that fixes the error

  • libc/sysdeps/linux/mips/sysdep.h

    From 28ac0e37cec9ca5655d03097bee2864a3981bbfd Mon Sep 17 00:00:00 2001
    From: Alexander Gordeev <lasaine@lvk.cs.msu.su>
    Date: Tue, 5 Oct 2010 03:14:11 +0400
    Subject: [PATCH] mips: fix errno setting after syscall
    
    If there was an error during syscall then after it's completion a3
    register holds a non-zero value and v0 holds an actual error code which
    should be saved in errno. This can be achieved by calling
    __syscall_error with the value from v0 as a parameter. So this value
    should be stored in a0, but the appropriate assembly instructions are
    missing. Fixed this now by adding "move a0, v0".
    
    I think it was once fixed by 58c5f8ba4cdf62342d05a546d15404cbbb3c4e07
    but then something went wrong. Again...
    
    Signed-off-by: Alexander Gordeev <lasaine@lvk.cs.msu.su>
    ---
     libc/sysdeps/linux/mips/sysdep.h                   |    6 ++++--
     .../sysdeps/unix/sysv/linux/mips/sysdep-cancel.h   |    3 ++-
     .../sysdeps/unix/sysv/linux/mips/sysdep-cancel.h   |    4 ++--
     3 files changed, 8 insertions(+), 5 deletions(-)
    
    diff --git a/libc/sysdeps/linux/mips/sysdep.h b/libc/sysdeps/linux/mips/sysdep.h
    index 0860c1a..9de4f1a 100644
    a b  
    9898#ifdef __PIC__ 
    9999#define PSEUDO(name, syscall_name, args)                \ 
    100100  .align 2;                                             \ 
    101   99: la t9,__syscall_error;                            \ 
     101  99: move a0, v0;                                      \ 
     102  la t9,__syscall_error;                                \ 
    102103  jr t9;                                                \ 
    103104  ENTRY(name)                                           \ 
    104105  .set noreorder;                                       \ 
    L(syse1): 
    112113#define PSEUDO(name, syscall_name, args)                \ 
    113114  .set noreorder;                                       \ 
    114115  .align 2;                                             \ 
    115   99: j __syscall_error;                                \ 
     116  99: move a0, v0;                                      \ 
     117  j __syscall_error;                                    \ 
    116118  nop;                                                  \ 
    117119  ENTRY(name)                                           \ 
    118120  .set noreorder;                                       \ 
  • libpthread/linuxthreads/sysdeps/unix/sysv/linux/mips/sysdep-cancel.h

    diff --git a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/mips/sysdep-cancel.h b/libpthread/linuxthreads/sysdeps/unix/sysv/linux/mips/sysdep-cancel.h
    index 1fff782..b2c0dfe 100644
    a b  
    2828# undef PSEUDO 
    2929# define PSEUDO(name, syscall_name, args)                                     \ 
    3030  .align 2;                                                                   \ 
    31   99: la t9,__syscall_error;                                                  \ 
     31  99: move a0, v0;                                                            \ 
     32  la t9,__syscall_error;                                                      \ 
    3233  jr t9;                                                                      \ 
    3334  ENTRY (name)                                                                \ 
    3435    .set noreorder;                                                           \ 
  • libpthread/nptl/sysdeps/unix/sysv/linux/mips/sysdep-cancel.h

    diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/mips/sysdep-cancel.h b/libpthread/nptl/sysdeps/unix/sysv/linux/mips/sysdep-cancel.h
    index 1cf625f..c2cd14f 100644
    a b  
    2626 
    2727# ifdef __PIC__ 
    2828#  define PSEUDO_CPLOAD .cpload t9; 
    29 #  define PSEUDO_ERRJMP la t9, __syscall_error; jr t9; 
     29#  define PSEUDO_ERRJMP move a0, v0; la t9, __syscall_error; jr t9; 
    3030#  define PSEUDO_SAVEGP sw gp, 32(sp); cfi_rel_offset (gp, 32); 
    3131#  define PSEUDO_LOADGP lw gp, 32(sp); 
    3232# else 
    3333#  define PSEUDO_CPLOAD 
    34 #  define PSEUDO_ERRJMP j __syscall_error; 
     34#  define PSEUDO_ERRJMP move a0, v0; j __syscall_error; 
    3535#  define PSEUDO_SAVEGP 
    3636#  define PSEUDO_LOADGP 
    3737# endif