diff options
| -rw-r--r-- | libc/sysdeps/linux/microblaze/sysdep.h | 29 | ||||
| -rw-r--r-- | libpthread/nptl/sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h | 48 | 
2 files changed, 59 insertions, 18 deletions
diff --git a/libc/sysdeps/linux/microblaze/sysdep.h b/libc/sysdeps/linux/microblaze/sysdep.h index a463d339e..d4b4e90f2 100644 --- a/libc/sysdeps/linux/microblaze/sysdep.h +++ b/libc/sysdeps/linux/microblaze/sysdep.h @@ -65,6 +65,35 @@    SYSCALL_ERROR_HANDLER;                            \    END (name) +# undef PSEUDO_NOERRNO +# define PSEUDO_NOERRNO(name, syscall_name, args)   \ +  .text;                                            \ +  ENTRY (name)                                      \ +    DO_CALL (syscall_name, args); + +# undef PSEUDO_END_NOERRNO +# define PSEUDO_END_NOERRNO(name)                   \ +  END (name) + +/* The function has to return the error code.  */ +# undef  PSEUDO_ERRVAL +# define PSEUDO_ERRVAL(name, syscall_name, args)    \ +  .text;                                            \ +  ENTRY (name)                                      \ +    DO_CALL (syscall_name, args);                   \ + +# undef  PSEUDO_END_ERRVAL +# define PSEUDO_END_ERRVAL(name)                    \ +  END (name) + +# undef ret_NOERRNO +# define ret_NOERRNO                                \ +  rtsd r15,8; addk r0,r0,r0; + +# undef ret_ERRVAL +# define ret_ERRVAL                                 \ +  rtsd r15,8; rsubk r3,r3,r0; +  #ifdef __PIC__  # define SYSCALL_ERROR_LABEL_DCL 0  # if defined _LIBC_REENTRANT diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h b/libpthread/nptl/sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h index 2af79cab5..a03e42a40 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h @@ -23,12 +23,7 @@  #if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt -#ifdef __ASSEMBLER__ - -#undef ret -#define ret - -# if !IS_IN_librt || !defined(PIC) +# if !defined IS_IN_librt || !defined(PIC)  #  define AC_STACK_SIZE  16  /* space for r15, async_cancel arg and 2 temp words */  #  define AC_SET_GOT /* empty */  #  define AC_RESTORE_GOT /* empty */ @@ -54,9 +49,7 @@ __##syscall_name##_nocancel:                                         \      DO_CALL (syscall_name, args);                                    \      addik r4, r0, -4095;                                             \      cmpu  r4, r4, r3;                                                \ -    rsubk   r3,r3,r0;						     \ -    rtsd    r15,8;						     \ -    addik   r3,r0,-1;						     \ +    bgei  r4, SYSCALL_ERROR_LABEL;                                   \      rtsd  r15, 8;                                                    \      nop;                                                             \    .size __##syscall_name##_nocancel, .-__##syscall_name##_nocancel;  \ @@ -78,9 +71,7 @@ L(pseudo_cancel):                                                    \      addik r1, r1, AC_STACK_SIZE;                                     \      addik r4, r0, -4095;                                             \      cmpu  r4, r4, r3;                                                \ -    rsubk   r3,r3,r0;						     \ -    rtsd    r15,8;						     \ -    addik   r3,r0,-1;						     \ +    bgei  r4, SYSCALL_ERROR_LABEL;                                   \      rtsd  r15, 8;                                                    \      nop; @@ -126,14 +117,35 @@ L(pseudo_cancel):                                                    \  #  error Unsupported library  # endif -#define SINGLE_THREAD_P(reg)                                         \ -     lwi reg, r0, MULTIPLE_THREADS_OFFSET(reg) - -#else /* !__ASSEMBLER__ */ -# define SINGLE_THREAD_P                                             \ +#if !defined NOT_IN_libc || defined IS_IN_libpthread +#  ifndef __ASSEMBLER__ +extern int __local_multiple_threads attribute_hidden; +#   define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1) +#  else +#   if !defined PIC +#    define SINGLE_THREAD_P(reg) lwi reg, r0, __local_multiple_threads; +#   else +#    define SINGLE_THREAD_P(reg)                                     \ +      mfs   reg, rpc;                                                \ +      addik reg, reg, _GLOBAL_OFFSET_TABLE_+8;                       \ +      lwi   reg, reg, __local_multiple_threads@GOT;                  \ +      lwi   reg, reg, 0; +#   endif +#  endif +# else +#  ifndef __ASSEMBLER__ +#   define SINGLE_THREAD_P                                           \    __builtin_expect (THREAD_GETMEM (THREAD_SELF,                      \                                     header.multiple_threads) == 0, 1) +#  else +#   define SINGLE_THREAD_P(reg)                                      \ +     lwi reg, r0, MULTIPLE_THREADS_OFFSET(reg) +#  endif +# endif + +#elif !defined __ASSEMBLER__ -#endif /* __ASSEMBLER__ */ +# define SINGLE_THREAD_P (1) +# define NO_CANCELLATION (1)  #endif  | 
