mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-18 19:10:06 +00:00
28b48696d1
Define errno in .tbss. * sysdeps/unix/x86_64/sysdep.S [USE_TLS && HAVE___THREAD]: Use TLS access for setting errno. * sysdeps/unix/x86_64/sysdep.S: Store 32 bits at errno, not 64 bits. AFAICT, it was just blind luck that the word following errno in .bss was just alignment padding and not some other variable to be clobbered.
76 lines
2.1 KiB
ArmAsm
76 lines
2.1 KiB
ArmAsm
/* Copyright (C) 2001, 2002 Free Software Foundation, Inc.
|
|
This file is part of the GNU C Library.
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
The GNU C Library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with the GNU C Library; if not, write to the Free
|
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
|
02111-1307 USA. */
|
|
|
|
#include <sysdep.h>
|
|
#define _ERRNO_H
|
|
#include <bits/errno.h>
|
|
#include <bp-asm.h>
|
|
#include <bp-sym.h>
|
|
#include <tls.h>
|
|
|
|
.globl C_SYMBOL_NAME(errno)
|
|
.globl syscall_error
|
|
|
|
#undef syscall_error
|
|
#ifdef NO_UNDERSCORES
|
|
__syscall_error:
|
|
#else
|
|
syscall_error:
|
|
#endif
|
|
#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN
|
|
/* We translate the system's EWOULDBLOCK error into EAGAIN.
|
|
The GNU C library always defines EWOULDBLOCK==EAGAIN.
|
|
EWOULDBLOCK_sys is the original number. */
|
|
cmpq $EWOULDBLOCK_sys, %rax /* Is it the old EWOULDBLOCK? */
|
|
jne notb /* Branch if not. */
|
|
movq $EAGAIN, %rax /* Yes; translate it to EAGAIN. */
|
|
notb:
|
|
#endif
|
|
#if USE_TLS && HAVE___THREAD
|
|
movq C_SYMBOL_NAME(errno)@GOTTPOFF(%rip), %rcx
|
|
movl %eax, %fs:0(%rcx)
|
|
#elif !defined PIC
|
|
# ifndef _LIBC_REENTRANT
|
|
movl %eax, C_SYMBOL_NAME(errno)
|
|
# else
|
|
pushq %rax
|
|
PUSH_ERRNO_LOCATION_RETURN
|
|
call BP_SYM (__errno_location)
|
|
POP_ERRNO_LOCATION_RETURN
|
|
popq %rcx
|
|
movl %ecx, (%rax)
|
|
# endif
|
|
#else
|
|
# ifndef _LIBC_REENTRANT
|
|
movq C_SYMBOL_NAME(errno)@GOTPCREL(%rip), %rcx
|
|
movl %eax, (%rcx)
|
|
# else
|
|
pushq %rax
|
|
PUSH_ERRNO_LOCATION_RETURN
|
|
call C_SYMBOL_NAME (BP_SYM (__errno_location)@PLT)
|
|
POP_ERRNO_LOCATION_RETURN
|
|
popq %rcx
|
|
movl %ecx, (%rax)
|
|
# endif
|
|
#endif
|
|
movq $-1, %rax
|
|
ret
|
|
|
|
#undef __syscall_error
|
|
END (__syscall_error)
|