diff options
Diffstat (limited to 'libc/sysdeps/linux/x86_64')
-rw-r--r-- | libc/sysdeps/linux/x86_64/__syscall_error.c | 4 | ||||
-rw-r--r-- | libc/sysdeps/linux/x86_64/bits/fcntl.h | 7 | ||||
-rw-r--r-- | libc/sysdeps/linux/x86_64/bits/fenv.h | 10 | ||||
-rw-r--r-- | libc/sysdeps/linux/x86_64/bits/kernel_stat.h | 2 | ||||
-rw-r--r-- | libc/sysdeps/linux/x86_64/bits/msq.h | 10 | ||||
-rw-r--r-- | libc/sysdeps/linux/x86_64/bits/sem.h | 8 | ||||
-rw-r--r-- | libc/sysdeps/linux/x86_64/bits/shm.h | 18 | ||||
-rw-r--r-- | libc/sysdeps/linux/x86_64/bits/stat.h | 8 | ||||
-rw-r--r-- | libc/sysdeps/linux/x86_64/bits/uClibc_arch_features.h | 3 | ||||
-rw-r--r-- | libc/sysdeps/linux/x86_64/crt1.S | 16 |
10 files changed, 53 insertions, 33 deletions
diff --git a/libc/sysdeps/linux/x86_64/__syscall_error.c b/libc/sysdeps/linux/x86_64/__syscall_error.c index 448f50983..7f0f388c4 100644 --- a/libc/sysdeps/linux/x86_64/__syscall_error.c +++ b/libc/sysdeps/linux/x86_64/__syscall_error.c @@ -10,8 +10,8 @@ /* This routine is jumped to by all the syscall handlers, to stash * an error number into errno. */ -int __syscall_error(void) attribute_hidden; -int __syscall_error(void) +long __syscall_error(void) attribute_hidden; +long __syscall_error(void) { register int err_no __asm__ ("%rcx"); __asm__ ("mov %rax, %rcx\n\t" diff --git a/libc/sysdeps/linux/x86_64/bits/fcntl.h b/libc/sysdeps/linux/x86_64/bits/fcntl.h index bb75b76e0..3547a2046 100644 --- a/libc/sysdeps/linux/x86_64/bits/fcntl.h +++ b/libc/sysdeps/linux/x86_64/bits/fcntl.h @@ -54,6 +54,7 @@ # define O_DIRECT 040000 /* Direct disk access. */ # define O_NOATIME 01000000 /* Do not set atime. */ # define O_PATH 010000000 /* Resolve pathname but do not open file. */ +# define O_TMPFILE 020200000 /* Atomically create nameless file. */ #endif /* For now Linux has synchronisity options for data and read operations. @@ -115,11 +116,13 @@ # define F_SETLEASE 1024 /* Set a lease. */ # define F_GETLEASE 1025 /* Enquire what lease is active. */ # define F_NOTIFY 1026 /* Request notfications on a directory. */ -# define F_DUPFD_CLOEXEC 1030 /* Duplicate file descriptor with - close-on-exit set on new fd. */ # define F_SETPIPE_SZ 1031 /* Set pipe page size array. */ # define F_GETPIPE_SZ 1032 /* Get pipe page size array. */ #endif +#if defined __USE_XOPEN2K8 || defined __USE_GNU +# define F_DUPFD_CLOEXEC 1030 /* Duplicate file descriptor with + close-on-exit set on new fd. */ +#endif /* For F_[GET|SET]FD. */ #define FD_CLOEXEC 1 /* actually anything with low bit set goes */ diff --git a/libc/sysdeps/linux/x86_64/bits/fenv.h b/libc/sysdeps/linux/x86_64/bits/fenv.h index 8e38c16ec..f16b64ad3 100644 --- a/libc/sysdeps/linux/x86_64/bits/fenv.h +++ b/libc/sysdeps/linux/x86_64/bits/fenv.h @@ -69,18 +69,18 @@ typedef unsigned short int fexcept_t; typedef struct { unsigned short int __control_word; - unsigned short int __unused1; + unsigned short int __uclibc_unused1; unsigned short int __status_word; - unsigned short int __unused2; + unsigned short int __uclibc_unused2; unsigned short int __tags; - unsigned short int __unused3; + unsigned short int __uclibc_unused3; unsigned int __eip; unsigned short int __cs_selector; unsigned int __opcode:11; - unsigned int __unused4:5; + unsigned int __uclibc_unused4:5; unsigned int __data_offset; unsigned short int __data_selector; - unsigned short int __unused5; + unsigned short int __uclibc_unused5; #if __WORDSIZE == 64 unsigned int __mxcsr; #endif diff --git a/libc/sysdeps/linux/x86_64/bits/kernel_stat.h b/libc/sysdeps/linux/x86_64/bits/kernel_stat.h index e194a7f76..d01d81d69 100644 --- a/libc/sysdeps/linux/x86_64/bits/kernel_stat.h +++ b/libc/sysdeps/linux/x86_64/bits/kernel_stat.h @@ -21,7 +21,7 @@ struct kernel_stat { struct timespec st_atim; struct timespec st_mtim; struct timespec st_ctim; - long __unused[3]; + long __uclibc_unused[3]; }; /* x86-64 stat64 is same as stat */ diff --git a/libc/sysdeps/linux/x86_64/bits/msq.h b/libc/sysdeps/linux/x86_64/bits/msq.h index 838910713..3141266bc 100644 --- a/libc/sysdeps/linux/x86_64/bits/msq.h +++ b/libc/sysdeps/linux/x86_64/bits/msq.h @@ -39,23 +39,23 @@ struct msqid_ds struct ipc_perm msg_perm; /* structure describing operation permission */ __time_t msg_stime; /* time of last msgsnd command */ #if __WORDSIZE == 32 - unsigned long int __unused1; + unsigned long int __uclibc_unused1; #endif __time_t msg_rtime; /* time of last msgrcv command */ #if __WORDSIZE == 32 - unsigned long int __unused2; + unsigned long int __uclibc_unused2; #endif __time_t msg_ctime; /* time of last change */ #if __WORDSIZE == 32 - unsigned long int __unused3; + unsigned long int __uclibc_unused3; #endif unsigned long int __msg_cbytes; /* current number of bytes on queue */ msgqnum_t msg_qnum; /* number of messages currently on queue */ msglen_t msg_qbytes; /* max number of bytes allowed on queue */ __pid_t msg_lspid; /* pid of last msgsnd() */ __pid_t msg_lrpid; /* pid of last msgrcv() */ - unsigned long int __unused4; - unsigned long int __unused5; + unsigned long int __uclibc_unused4; + unsigned long int __uclibc_unused5; }; #ifdef __USE_MISC diff --git a/libc/sysdeps/linux/x86_64/bits/sem.h b/libc/sysdeps/linux/x86_64/bits/sem.h index 8c09031c7..9dfab87cb 100644 --- a/libc/sysdeps/linux/x86_64/bits/sem.h +++ b/libc/sysdeps/linux/x86_64/bits/sem.h @@ -39,12 +39,12 @@ struct semid_ds { struct ipc_perm sem_perm; /* operation permission struct */ __time_t sem_otime; /* last semop() time */ - unsigned long int __unused1; + unsigned long int __uclibc_unused1; __time_t sem_ctime; /* last time changed by semctl() */ - unsigned long int __unused2; + unsigned long int __uclibc_unused2; unsigned long int sem_nsems; /* number of semaphores in set */ - unsigned long int __unused3; - unsigned long int __unused4; + unsigned long int __uclibc_unused3; + unsigned long int __uclibc_unused4; }; /* The user should define a union like the following to use it for arguments diff --git a/libc/sysdeps/linux/x86_64/bits/shm.h b/libc/sysdeps/linux/x86_64/bits/shm.h index 3a25de562..316895853 100644 --- a/libc/sysdeps/linux/x86_64/bits/shm.h +++ b/libc/sysdeps/linux/x86_64/bits/shm.h @@ -52,21 +52,21 @@ struct shmid_ds size_t shm_segsz; /* size of segment in bytes */ __time_t shm_atime; /* time of last shmat() */ #if __WORDSIZE == 32 - unsigned long int __unused1; + unsigned long int __uclibc_unused1; #endif __time_t shm_dtime; /* time of last shmdt() */ #if __WORDSIZE == 32 - unsigned long int __unused2; + unsigned long int __uclibc_unused2; #endif __time_t shm_ctime; /* time of last change by shmctl() */ #if __WORDSIZE == 32 - unsigned long int __unused3; + unsigned long int __uclibc_unused3; #endif __pid_t shm_cpid; /* pid of creator */ __pid_t shm_lpid; /* pid of last shmop */ shmatt_t shm_nattch; /* number of current attaches */ - unsigned long int __unused4; - unsigned long int __unused5; + unsigned long int __uclibc_unused4; + unsigned long int __uclibc_unused5; }; #ifdef __USE_MISC @@ -88,10 +88,10 @@ struct shminfo unsigned long int shmmni; unsigned long int shmseg; unsigned long int shmall; - unsigned long int __unused1; - unsigned long int __unused2; - unsigned long int __unused3; - unsigned long int __unused4; + unsigned long int __uclibc_unused1; + unsigned long int __uclibc_unused2; + unsigned long int __uclibc_unused3; + unsigned long int __uclibc_unused4; }; struct shm_info diff --git a/libc/sysdeps/linux/x86_64/bits/stat.h b/libc/sysdeps/linux/x86_64/bits/stat.h index e25f01521..a7412c8f9 100644 --- a/libc/sysdeps/linux/x86_64/bits/stat.h +++ b/libc/sysdeps/linux/x86_64/bits/stat.h @@ -99,11 +99,11 @@ struct stat unsigned long int st_ctimensec; /* Nsecs of last status change. */ #endif #if __WORDSIZE == 64 - long int __unused[3]; + long int __uclibc_unused[3]; #else # ifndef __USE_FILE_OFFSET64 - unsigned long int __unused4; - unsigned long int __unused5; + unsigned long int __uclibc_unused4; + unsigned long int __uclibc_unused5; # else __ino64_t st_ino; /* File serial number. */ # endif @@ -160,7 +160,7 @@ struct stat64 unsigned long int st_ctimensec; /* Nsecs of last status change. */ #endif #if __WORDSIZE == 64 - long int __unused[3]; + long int __uclibc_unused[3]; #else __ino64_t st_ino; /* File serial number. */ #endif diff --git a/libc/sysdeps/linux/x86_64/bits/uClibc_arch_features.h b/libc/sysdeps/linux/x86_64/bits/uClibc_arch_features.h index 43801699e..400cfe3b9 100644 --- a/libc/sysdeps/linux/x86_64/bits/uClibc_arch_features.h +++ b/libc/sysdeps/linux/x86_64/bits/uClibc_arch_features.h @@ -11,6 +11,9 @@ /* can your target use syscall6() for mmap ? */ #define __UCLIBC_MMAP_HAS_6_ARGS__ +/* does your target use statx */ +#undef __UCLIBC_HAVE_STATX__ + /* does your target align 64bit values in register pairs ? (32bit arches only) */ #undef __UCLIBC_SYSCALL_ALIGN_64BIT__ diff --git a/libc/sysdeps/linux/x86_64/crt1.S b/libc/sysdeps/linux/x86_64/crt1.S index 87777dd5d..701cbf2f6 100644 --- a/libc/sysdeps/linux/x86_64/crt1.S +++ b/libc/sysdeps/linux/x86_64/crt1.S @@ -80,6 +80,20 @@ _start: the outermost frame obviously. */ xorl %ebp, %ebp +#ifdef L_rcrt1 + pushq %rdi /* save rdi (but should be 0...) */ + pushq %rdx /* store rdx (rtld_fini) */ + xorq %rcx, %rcx /* ensure rcx is 0 */ + addq _start@GOTPCREL(%rip), %rcx /* get offset of _start from beginning of file */ + movq _start@GOTPCREL(%rip), %rax /* get run time address of _start */ + subq %rcx, %rax /* calculate run time load offset */ + movq %rax, %rdi /* load offset -> param 1 */ + call reloc_static_pie /* relocate dynamic addrs */ + xorq %rax, %rax /* cleanup */ + popq %rdx + popq %rdi +#endif + /* Extract the arguments as encoded on the stack and set up the arguments for __libc_start_main (int (*main) (int, char **, char **), int argc, char *argv, @@ -107,7 +121,7 @@ _start: which grow downwards). */ pushq %rsp -#if defined(L_Scrt1) +#if defined(L_Scrt1) || defined(L_rcrt1) /* Give address for main() */ movq main@GOTPCREL(%rip), %rdi |