sysdep.S 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. /* Copyright (C) 2001-2019 Free Software Foundation, Inc.
  2. This file is part of the GNU C Library.
  3. The GNU C Library is free software; you can redistribute it and/or
  4. modify it under the terms of the GNU Lesser General Public
  5. License as published by the Free Software Foundation; either
  6. version 2.1 of the License, or (at your option) any later version.
  7. The GNU C Library is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  10. Lesser General Public License for more details.
  11. You should have received a copy of the GNU Lesser General Public
  12. License along with the GNU C Library; if not, see
  13. <http://www.gnu.org/licenses/>. */
  14. #include <sysdep.h>
  15. #define _ERRNO_H
  16. #include <bits/errno.h>
  17. #include <tls.h>
  18. #if IS_IN (rtld)
  19. # include <dl-sysdep.h> /* Defines RTLD_PRIVATE_ERRNO. */
  20. #endif
  21. .globl C_SYMBOL_NAME(errno)
  22. .globl syscall_error
  23. __syscall_error:
  24. #if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN
  25. /* We translate the system's EWOULDBLOCK error into EAGAIN.
  26. The GNU C library always defines EWOULDBLOCK==EAGAIN.
  27. EWOULDBLOCK_sys is the original number. */
  28. cmp $EWOULDBLOCK_sys, %RAX_LP /* Is it the old EWOULDBLOCK? */
  29. jne notb /* Branch if not. */
  30. movl $EAGAIN, %eax /* Yes; translate it to EAGAIN. */
  31. notb:
  32. #endif
  33. #ifdef PIC
  34. movq C_SYMBOL_NAME(errno@GOTTPOFF)(%rip), %rcx
  35. movl %eax, %fs:0(%rcx)
  36. #else
  37. movl %eax, %fs:C_SYMBOL_NAME(errno@TPOFF)
  38. #endif
  39. or $-1, %RAX_LP
  40. ret
  41. #undef __syscall_error
  42. END (__syscall_error)