authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-10-17 11:55:43-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-10-17 11:55:43-04:00
log88b95794881a58540693f3f9dd2f1978b3506e2a
tree4677b3db2e4f19b522af36b97be3c00f9319dce3
parent1135c9523b6696910ecb8c0cfd39bb7512b9aa43
signaturelock-open Commit is signed but in an unrecognized format.

update musl src to v1.1.24


181 files changed, 1978 insertions(+), 948 deletions(-)

lib/libc/musl/arch/aarch64/bits/hwcap.h+8
......@@ -30,3 +30,11 @@
3030#define HWCAP_SB (1 << 29)
3131#define HWCAP_PACA (1 << 30)
3232#define HWCAP_PACG (1UL << 31)
33
34#define HWCAP2_DCPODP (1 << 0)
35#define HWCAP2_SVE2 (1 << 1)
36#define HWCAP2_SVEAES (1 << 2)
37#define HWCAP2_SVEPMULL (1 << 3)
38#define HWCAP2_SVEBITPERM (1 << 4)
39#define HWCAP2_SVESHA3 (1 << 5)
40#define HWCAP2_SVESM4 (1 << 6)
lib/libc/musl/arch/aarch64/bits/ipc.h deleted-14
......@@ -1,14 +0,0 @@
1struct ipc_perm {
2 key_t __ipc_perm_key;
3 uid_t uid;
4 gid_t gid;
5 uid_t cuid;
6 gid_t cgid;
7 mode_t mode;
8 unsigned short __ipc_perm_seq;
9
10 unsigned long __pad1;
11 unsigned long __pad2;
12};
13
14#define IPC_64 0
lib/libc/musl/arch/aarch64/bits/msg.h deleted-13
......@@ -1,13 +0,0 @@
1struct msqid_ds {
2 struct ipc_perm msg_perm;
3 time_t msg_stime;
4 time_t msg_rtime;
5 time_t msg_ctime;
6 unsigned long msg_cbytes;
7 msgqnum_t msg_qnum;
8 msglen_t msg_qbytes;
9 pid_t msg_lspid;
10 pid_t msg_lrpid;
11 unsigned long __pad1;
12 unsigned long __pad2;
13};
lib/libc/musl/arch/aarch64/bits/sem.h deleted-14
......@@ -1,14 +0,0 @@
1struct semid_ds {
2 struct ipc_perm sem_perm;
3 time_t sem_otime;
4 time_t sem_ctime;
5#if __BYTE_ORDER == __LITTLE_ENDIAN
6 unsigned short sem_nsems;
7 char __sem_nsems_pad[sizeof(time_t)-sizeof(short)];
8#else
9 char __sem_nsems_pad[sizeof(time_t)-sizeof(short)];
10 unsigned short sem_nsems;
11#endif
12 time_t __unused3;
13 time_t __unused4;
14};
lib/libc/musl/arch/aarch64/bits/shm.h deleted-24
......@@ -1,24 +0,0 @@
1#define SHMLBA 4096
2
3struct shmid_ds {
4 struct ipc_perm shm_perm;
5 size_t shm_segsz;
6 time_t shm_atime;
7 time_t shm_dtime;
8 time_t shm_ctime;
9 pid_t shm_cpid;
10 pid_t shm_lpid;
11 unsigned long shm_nattch;
12 unsigned long __pad1;
13 unsigned long __pad2;
14};
15
16struct shminfo {
17 unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4];
18};
19
20struct shm_info {
21 int __used_ids;
22 unsigned long shm_tot, shm_rss, shm_swp;
23 unsigned long __swap_attempts, __swap_successes;
24};
lib/libc/musl/arch/aarch64/bits/syscall.h.in+6
......@@ -281,4 +281,10 @@
281281#define __NR_io_uring_setup 425
282282#define __NR_io_uring_enter 426
283283#define __NR_io_uring_register 427
284#define __NR_open_tree 428
285#define __NR_move_mount 429
286#define __NR_fsopen 430
287#define __NR_fsconfig 431
288#define __NR_fsmount 432
289#define __NR_fspick 433
284290
lib/libc/musl/arch/aarch64/kstat.h created+21
......@@ -0,0 +1,21 @@
1struct kstat {
2 dev_t st_dev;
3 ino_t st_ino;
4 mode_t st_mode;
5 nlink_t st_nlink;
6 uid_t st_uid;
7 gid_t st_gid;
8 dev_t st_rdev;
9 unsigned long __pad;
10 off_t st_size;
11 blksize_t st_blksize;
12 int __pad2;
13 blkcnt_t st_blocks;
14 long st_atime_sec;
15 long st_atime_nsec;
16 long st_mtime_sec;
17 long st_mtime_nsec;
18 long st_ctime_sec;
19 long st_ctime_nsec;
20 unsigned __unused[2];
21};
lib/libc/musl/arch/aarch64/syscall_arch.h+2
......@@ -74,3 +74,5 @@ static inline long __syscall6(long n, long a, long b, long c, long d, long e, lo
7474#define VDSO_USEFUL
7575#define VDSO_CGT_SYM "__kernel_clock_gettime"
7676#define VDSO_CGT_VER "LINUX_2.6.39"
77
78#define IPC_64 0
lib/libc/musl/arch/arm/bits/ipcstat.h created+1
......@@ -0,0 +1 @@
1#define IPC_STAT 2
lib/libc/musl/arch/arm/bits/msg.h created+15
......@@ -0,0 +1,15 @@
1struct msqid_ds {
2 struct ipc_perm msg_perm;
3 time_t msg_stime;
4 int __unused1;
5 time_t msg_rtime;
6 int __unused2;
7 time_t msg_ctime;
8 int __unused3;
9 unsigned long msg_cbytes;
10 msgqnum_t msg_qnum;
11 msglen_t msg_qbytes;
12 pid_t msg_lspid;
13 pid_t msg_lrpid;
14 unsigned long __unused[2];
15};
lib/libc/musl/arch/arm/bits/sem.h created+16
......@@ -0,0 +1,16 @@
1struct semid_ds {
2 struct ipc_perm sem_perm;
3 time_t sem_otime;
4 long __unused1;
5 time_t sem_ctime;
6 long __unused2;
7#if __BYTE_ORDER == __LITTLE_ENDIAN
8 unsigned short sem_nsems;
9 char __sem_nsems_pad[sizeof(long)-sizeof(short)];
10#else
11 char __sem_nsems_pad[sizeof(long)-sizeof(short)];
12 unsigned short sem_nsems;
13#endif
14 long __unused3;
15 long __unused4;
16};
lib/libc/musl/arch/arm/bits/shm.h created+27
......@@ -0,0 +1,27 @@
1#define SHMLBA 4096
2
3struct shmid_ds {
4 struct ipc_perm shm_perm;
5 size_t shm_segsz;
6 time_t shm_atime;
7 int __unused1;
8 time_t shm_dtime;
9 int __unused2;
10 time_t shm_ctime;
11 int __unused3;
12 pid_t shm_cpid;
13 pid_t shm_lpid;
14 unsigned long shm_nattch;
15 unsigned long __pad1;
16 unsigned long __pad2;
17};
18
19struct shminfo {
20 unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4];
21};
22
23struct shm_info {
24 int __used_ids;
25 unsigned long shm_tot, shm_rss, shm_swp;
26 unsigned long __swap_attempts, __swap_successes;
27};
lib/libc/musl/arch/arm/bits/syscall.h.in+6
......@@ -381,6 +381,12 @@
381381#define __NR_io_uring_setup 425
382382#define __NR_io_uring_enter 426
383383#define __NR_io_uring_register 427
384#define __NR_open_tree 428
385#define __NR_move_mount 429
386#define __NR_fsopen 430
387#define __NR_fsconfig 431
388#define __NR_fsmount 432
389#define __NR_fspick 433
384390
385391#define __ARM_NR_breakpoint 0x0f0001
386392#define __ARM_NR_cacheflush 0x0f0002
lib/libc/musl/arch/arm/kstat.h created+21
......@@ -0,0 +1,21 @@
1struct kstat {
2 dev_t st_dev;
3 int __st_dev_padding;
4 long __st_ino_truncated;
5 mode_t st_mode;
6 nlink_t st_nlink;
7 uid_t st_uid;
8 gid_t st_gid;
9 dev_t st_rdev;
10 int __st_rdev_padding;
11 off_t st_size;
12 blksize_t st_blksize;
13 blkcnt_t st_blocks;
14 long st_atime_sec;
15 long st_atime_nsec;
16 long st_mtime_sec;
17 long st_mtime_nsec;
18 long st_ctime_sec;
19 long st_ctime_nsec;
20 ino_t st_ino;
21};
lib/libc/musl/arch/generic/bits/ipc.h-2
......@@ -9,5 +9,3 @@ struct ipc_perm {
99 long __pad1;
1010 long __pad2;
1111};
12
13#define IPC_64 0x100
lib/libc/musl/arch/generic/bits/ipcstat.h created+1
......@@ -0,0 +1 @@
1#define IPC_STAT 2
lib/libc/musl/arch/generic/bits/msg.h-3
......@@ -1,11 +1,8 @@
11struct msqid_ds {
22 struct ipc_perm msg_perm;
33 time_t msg_stime;
4 int __unused1;
54 time_t msg_rtime;
6 int __unused2;
75 time_t msg_ctime;
8 int __unused3;
96 unsigned long msg_cbytes;
107 msgqnum_t msg_qnum;
118 msglen_t msg_qbytes;
lib/libc/musl/arch/generic/bits/sem.h+4-6
......@@ -1,16 +1,14 @@
11struct semid_ds {
22 struct ipc_perm sem_perm;
33 time_t sem_otime;
4 time_t __unused1;
54 time_t sem_ctime;
6 time_t __unused2;
75#if __BYTE_ORDER == __LITTLE_ENDIAN
86 unsigned short sem_nsems;
9 char __sem_nsems_pad[sizeof(time_t)-sizeof(short)];
7 char __sem_nsems_pad[sizeof(long)-sizeof(short)];
108#else
11 char __sem_nsems_pad[sizeof(time_t)-sizeof(short)];
9 char __sem_nsems_pad[sizeof(long)-sizeof(short)];
1210 unsigned short sem_nsems;
1311#endif
14 time_t __unused3;
15 time_t __unused4;
12 long __unused3;
13 long __unused4;
1614};
lib/libc/musl/arch/generic/bits/shm.h-4
......@@ -4,11 +4,8 @@ struct shmid_ds {
44 struct ipc_perm shm_perm;
55 size_t shm_segsz;
66 time_t shm_atime;
7 int __unused1;
87 time_t shm_dtime;
9 int __unused2;
108 time_t shm_ctime;
11 int __unused3;
129 pid_t shm_cpid;
1310 pid_t shm_lpid;
1411 unsigned long shm_nattch;
......@@ -25,4 +22,3 @@ struct shm_info {
2522 unsigned long shm_tot, shm_rss, shm_swp;
2623 unsigned long __swap_attempts, __swap_successes;
2724};
28
lib/libc/musl/arch/i386/bits/ipcstat.h created+1
......@@ -0,0 +1 @@
1#define IPC_STAT 2
lib/libc/musl/arch/i386/bits/msg.h created+15
......@@ -0,0 +1,15 @@
1struct msqid_ds {
2 struct ipc_perm msg_perm;
3 time_t msg_stime;
4 int __unused1;
5 time_t msg_rtime;
6 int __unused2;
7 time_t msg_ctime;
8 int __unused3;
9 unsigned long msg_cbytes;
10 msgqnum_t msg_qnum;
11 msglen_t msg_qbytes;
12 pid_t msg_lspid;
13 pid_t msg_lrpid;
14 unsigned long __unused[2];
15};
lib/libc/musl/arch/i386/bits/sem.h created+11
......@@ -0,0 +1,11 @@
1struct semid_ds {
2 struct ipc_perm sem_perm;
3 time_t sem_otime;
4 long __unused1;
5 time_t sem_ctime;
6 long __unused2;
7 unsigned short sem_nsems;
8 char __sem_nsems_pad[sizeof(long)-sizeof(short)];
9 long __unused3;
10 long __unused4;
11};
lib/libc/musl/arch/i386/bits/shm.h created+27
......@@ -0,0 +1,27 @@
1#define SHMLBA 4096
2
3struct shmid_ds {
4 struct ipc_perm shm_perm;
5 size_t shm_segsz;
6 time_t shm_atime;
7 int __unused1;
8 time_t shm_dtime;
9 int __unused2;
10 time_t shm_ctime;
11 int __unused3;
12 pid_t shm_cpid;
13 pid_t shm_lpid;
14 unsigned long shm_nattch;
15 unsigned long __pad1;
16 unsigned long __pad2;
17};
18
19struct shminfo {
20 unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4];
21};
22
23struct shm_info {
24 int __used_ids;
25 unsigned long shm_tot, shm_rss, shm_swp;
26 unsigned long __swap_attempts, __swap_successes;
27};
lib/libc/musl/arch/i386/bits/syscall.h.in+6
......@@ -418,4 +418,10 @@
418418#define __NR_io_uring_setup 425
419419#define __NR_io_uring_enter 426
420420#define __NR_io_uring_register 427
421#define __NR_open_tree 428
422#define __NR_move_mount 429
423#define __NR_fsopen 430
424#define __NR_fsconfig 431
425#define __NR_fsmount 432
426#define __NR_fspick 433
421427
lib/libc/musl/arch/i386/kstat.h created+21
......@@ -0,0 +1,21 @@
1struct kstat {
2 dev_t st_dev;
3 int __st_dev_padding;
4 long __st_ino_truncated;
5 mode_t st_mode;
6 nlink_t st_nlink;
7 uid_t st_uid;
8 gid_t st_gid;
9 dev_t st_rdev;
10 int __st_rdev_padding;
11 off_t st_size;
12 blksize_t st_blksize;
13 blkcnt_t st_blocks;
14 long st_atime_sec;
15 long st_atime_nsec;
16 long st_mtime_sec;
17 long st_mtime_nsec;
18 long st_ctime_sec;
19 long st_ctime_nsec;
20 ino_t st_ino;
21};
lib/libc/musl/arch/mips/bits/ipcstat.h created+1
......@@ -0,0 +1 @@
1#define IPC_STAT 2
lib/libc/musl/arch/mips/bits/sem.h+4-4
......@@ -4,11 +4,11 @@ struct semid_ds {
44 time_t sem_ctime;
55#if __BYTE_ORDER == __LITTLE_ENDIAN
66 unsigned short sem_nsems;
7 char __sem_nsems_pad[sizeof(time_t)-sizeof(short)];
7 char __sem_nsems_pad[sizeof(long)-sizeof(short)];
88#else
9 char __sem_nsems_pad[sizeof(time_t)-sizeof(short)];
9 char __sem_nsems_pad[sizeof(long)-sizeof(short)];
1010 unsigned short sem_nsems;
1111#endif
12 time_t __unused3;
13 time_t __unused4;
12 long __unused3;
13 long __unused4;
1414};
lib/libc/musl/arch/mips/bits/shm.h-1
......@@ -22,4 +22,3 @@ struct shm_info {
2222 unsigned long shm_tot, shm_rss, shm_swp;
2323 unsigned long __swap_attempts, __swap_successes;
2424};
25
lib/libc/musl/arch/mips/bits/syscall.h.in+6
......@@ -400,4 +400,10 @@
400400#define __NR_io_uring_setup 4425
401401#define __NR_io_uring_enter 4426
402402#define __NR_io_uring_register 4427
403#define __NR_open_tree 4428
404#define __NR_move_mount 4429
405#define __NR_fsopen 4430
406#define __NR_fsconfig 4431
407#define __NR_fsmount 4432
408#define __NR_fspick 4433
403409
lib/libc/musl/arch/mips/kstat.h created+22
......@@ -0,0 +1,22 @@
1struct kstat {
2 unsigned st_dev;
3 long __st_padding1[3];
4 ino_t st_ino;
5 mode_t st_mode;
6 nlink_t st_nlink;
7 uid_t st_uid;
8 gid_t st_gid;
9 unsigned st_rdev;
10 long __st_padding2[3];
11 off_t st_size;
12 long st_atime_sec;
13 long st_atime_nsec;
14 long st_mtime_sec;
15 long st_mtime_nsec;
16 long st_ctime_sec;
17 long st_ctime_nsec;
18 blksize_t st_blksize;
19 long __st_padding3;
20 blkcnt_t st_blocks;
21 long __st_padding4[14];
22};
lib/libc/musl/arch/mips/syscall_arch.h+56-84
......@@ -5,27 +5,25 @@
55
66#define SYSCALL_RLIM_INFINITY (-1UL/2)
77
8#if _MIPSEL || __MIPSEL || __MIPSEL__
9#define __stat_fix(st) ((st),(void)0)
8#if __mips_isa_rev >= 6
9#define SYSCALL_CLOBBERLIST \
10 "$1", "$3", "$11", "$12", "$13", \
11 "$14", "$15", "$24", "$25", "memory"
1012#else
11#include <sys/stat.h>
12static inline void __stat_fix(long p)
13{
14 struct stat *st = (struct stat *)p;
15 st->st_dev >>= 32;
16 st->st_rdev >>= 32;
17}
13#define SYSCALL_CLOBBERLIST \
14 "$1", "$3", "$11", "$12", "$13", \
15 "$14", "$15", "$24", "$25", "hi", "lo", "memory"
1816#endif
1917
2018static inline long __syscall0(long n)
2119{
2220 register long r7 __asm__("$7");
23 register long r2 __asm__("$2");
21 register long r2 __asm__("$2") = n;
2422 __asm__ __volatile__ (
25 "addu $2,$0,%2 ; syscall"
26 : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7)
27 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
28 "$14", "$15", "$24", "$25", "hi", "lo", "memory");
23 "syscall"
24 : "+r"(r2), "=r"(r7)
25 :
26 : SYSCALL_CLOBBERLIST, "$8", "$9", "$10");
2927 return r7 ? -r2 : r2;
3028}
3129
......@@ -33,13 +31,12 @@ static inline long __syscall1(long n, long a)
3331{
3432 register long r4 __asm__("$4") = a;
3533 register long r7 __asm__("$7");
36 register long r2 __asm__("$2");
34 register long r2 __asm__("$2") = n;
3735 __asm__ __volatile__ (
38 "addu $2,$0,%2 ; syscall"
39 : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
40 "r"(r4)
41 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
42 "$14", "$15", "$24", "$25", "hi", "lo", "memory");
36 "syscall"
37 : "+r"(r2), "=r"(r7)
38 : "r"(r4)
39 : SYSCALL_CLOBBERLIST, "$8", "$9", "$10");
4340 return r7 ? -r2 : r2;
4441}
4542
......@@ -48,17 +45,13 @@ static inline long __syscall2(long n, long a, long b)
4845 register long r4 __asm__("$4") = a;
4946 register long r5 __asm__("$5") = b;
5047 register long r7 __asm__("$7");
51 register long r2 __asm__("$2");
48 register long r2 __asm__("$2") = n;
5249 __asm__ __volatile__ (
53 "addu $2,$0,%2 ; syscall"
54 : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
55 "r"(r4), "r"(r5)
56 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
57 "$14", "$15", "$24", "$25", "hi", "lo", "memory");
58 if (r7) return -r2;
59 long ret = r2;
60 if (n == SYS_stat64 || n == SYS_fstat64 || n == SYS_lstat64) __stat_fix(b);
61 return ret;
50 "syscall"
51 : "+r"(r2), "=r"(r7)
52 : "r"(r4), "r"(r5)
53 : SYSCALL_CLOBBERLIST, "$8", "$9", "$10");
54 return r7 ? -r2 : r2;
6255}
6356
6457static inline long __syscall3(long n, long a, long b, long c)
......@@ -67,17 +60,13 @@ static inline long __syscall3(long n, long a, long b, long c)
6760 register long r5 __asm__("$5") = b;
6861 register long r6 __asm__("$6") = c;
6962 register long r7 __asm__("$7");
70 register long r2 __asm__("$2");
63 register long r2 __asm__("$2") = n;
7164 __asm__ __volatile__ (
72 "addu $2,$0,%2 ; syscall"
73 : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
74 "r"(r4), "r"(r5), "r"(r6)
75 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
76 "$14", "$15", "$24", "$25", "hi", "lo", "memory");
77 if (r7) return -r2;
78 long ret = r2;
79 if (n == SYS_stat64 || n == SYS_fstat64 || n == SYS_lstat64) __stat_fix(b);
80 return ret;
65 "syscall"
66 : "+r"(r2), "=r"(r7)
67 : "r"(r4), "r"(r5), "r"(r6)
68 : SYSCALL_CLOBBERLIST, "$8", "$9", "$10");
69 return r7 ? -r2 : r2;
8170}
8271
8372static inline long __syscall4(long n, long a, long b, long c, long d)
......@@ -86,18 +75,13 @@ static inline long __syscall4(long n, long a, long b, long c, long d)
8675 register long r5 __asm__("$5") = b;
8776 register long r6 __asm__("$6") = c;
8877 register long r7 __asm__("$7") = d;
89 register long r2 __asm__("$2");
78 register long r2 __asm__("$2") = n;
9079 __asm__ __volatile__ (
91 "addu $2,$0,%2 ; syscall"
92 : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
93 "r"(r4), "r"(r5), "r"(r6)
94 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
95 "$14", "$15", "$24", "$25", "hi", "lo", "memory");
96 if (r7) return -r2;
97 long ret = r2;
98 if (n == SYS_stat64 || n == SYS_fstat64 || n == SYS_lstat64) __stat_fix(b);
99 if (n == SYS_fstatat64) __stat_fix(c);
100 return ret;
80 "syscall"
81 : "+r"(r2), "+r"(r7)
82 : "r"(r4), "r"(r5), "r"(r6)
83 : SYSCALL_CLOBBERLIST, "$8", "$9", "$10");
84 return r7 ? -r2 : r2;
10185}
10286
10387static inline long __syscall5(long n, long a, long b, long c, long d, long e)
......@@ -107,20 +91,15 @@ static inline long __syscall5(long n, long a, long b, long c, long d, long e)
10791 register long r6 __asm__("$6") = c;
10892 register long r7 __asm__("$7") = d;
10993 register long r8 __asm__("$8") = e;
110 register long r2 __asm__("$2");
94 register long r2 __asm__("$2") = n;
11195 __asm__ __volatile__ (
11296 "subu $sp,$sp,32 ; sw $8,16($sp) ; "
113 "addu $2,$0,%3 ; syscall ;"
97 "syscall ;"
11498 "addu $sp,$sp,32"
115 : "=&r"(r2), "=r"(r7), "+r"(r8)
116 : "ir"(n), "0"(r2), "1"(r7), "r"(r4), "r"(r5), "r"(r6)
117 : "$1", "$3", "$9", "$10", "$11", "$12", "$13",
118 "$14", "$15", "$24", "$25", "hi", "lo", "memory");
119 if (r7) return -r2;
120 long ret = r2;
121 if (n == SYS_stat64 || n == SYS_fstat64 || n == SYS_lstat64) __stat_fix(b);
122 if (n == SYS_fstatat64) __stat_fix(c);
123 return r2;
99 : "+r"(r2), "+r"(r7), "+r"(r8)
100 : "r"(r4), "r"(r5), "r"(r6)
101 : SYSCALL_CLOBBERLIST, "$9", "$10");
102 return r7 ? -r2 : r2;
124103}
125104
126105static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
......@@ -131,20 +110,15 @@ static inline long __syscall6(long n, long a, long b, long c, long d, long e, lo
131110 register long r7 __asm__("$7") = d;
132111 register long r8 __asm__("$8") = e;
133112 register long r9 __asm__("$9") = f;
134 register long r2 __asm__("$2");
113 register long r2 __asm__("$2") = n;
135114 __asm__ __volatile__ (
136115 "subu $sp,$sp,32 ; sw $8,16($sp) ; sw $9,20($sp) ; "
137 "addu $2,$0,%4 ; syscall ;"
116 "syscall ;"
138117 "addu $sp,$sp,32"
139 : "=&r"(r2), "=r"(r7), "+r"(r8), "+r"(r9)
140 : "ir"(n), "0"(r2), "1"(r7), "r"(r4), "r"(r5), "r"(r6)
141 : "$1", "$3", "$10", "$11", "$12", "$13",
142 "$14", "$15", "$24", "$25", "hi", "lo", "memory");
143 if (r7) return -r2;
144 long ret = r2;
145 if (n == SYS_stat64 || n == SYS_fstat64 || n == SYS_lstat64) __stat_fix(b);
146 if (n == SYS_fstatat64) __stat_fix(c);
147 return r2;
118 : "+r"(r2), "+r"(r7), "+r"(r8), "+r"(r9)
119 : "r"(r4), "r"(r5), "r"(r6)
120 : SYSCALL_CLOBBERLIST, "$10");
121 return r7 ? -r2 : r2;
148122}
149123
150124static inline long __syscall7(long n, long a, long b, long c, long d, long e, long f, long g)
......@@ -156,22 +130,20 @@ static inline long __syscall7(long n, long a, long b, long c, long d, long e, lo
156130 register long r8 __asm__("$8") = e;
157131 register long r9 __asm__("$9") = f;
158132 register long r10 __asm__("$10") = g;
159 register long r2 __asm__("$2");
133 register long r2 __asm__("$2") = n;
160134 __asm__ __volatile__ (
161135 "subu $sp,$sp,32 ; sw $8,16($sp) ; sw $9,20($sp) ; sw $10,24($sp) ; "
162 "addu $2,$0,%5 ; syscall ;"
136 "syscall ;"
163137 "addu $sp,$sp,32"
164 : "=&r"(r2), "=r"(r7), "+r"(r8), "+r"(r9), "+r"(r10)
165 : "ir"(n), "0"(r2), "1"(r7), "r"(r4), "r"(r5), "r"(r6)
166 : "$1", "$3", "$11", "$12", "$13",
167 "$14", "$15", "$24", "$25", "hi", "lo", "memory");
168 if (r7) return -r2;
169 long ret = r2;
170 if (n == SYS_stat64 || n == SYS_fstat64 || n == SYS_lstat64) __stat_fix(b);
171 if (n == SYS_fstatat64) __stat_fix(c);
172 return r2;
138 : "+r"(r2), "+r"(r7), "+r"(r8), "+r"(r9), "+r"(r10)
139 : "r"(r4), "r"(r5), "r"(r6)
140 : SYSCALL_CLOBBERLIST);
141 return r7 ? -r2 : r2;
173142}
174143
175144#define VDSO_USEFUL
176145#define VDSO_CGT_SYM "__vdso_clock_gettime"
177146#define VDSO_CGT_VER "LINUX_2.6"
147
148#define SO_SNDTIMEO_OLD 0x1005
149#define SO_RCVTIMEO_OLD 0x1006
lib/libc/musl/arch/mips64/bits/ipc.h-2
......@@ -10,5 +10,3 @@ struct ipc_perm {
1010 unsigned long __unused1;
1111 unsigned long __unused2;
1212};
13
14#define IPC_64 0x100
lib/libc/musl/arch/mips64/bits/msg.h deleted-13
......@@ -1,13 +0,0 @@
1struct msqid_ds {
2 struct ipc_perm msg_perm;
3 time_t msg_stime;
4 time_t msg_rtime;
5 time_t msg_ctime;
6 unsigned long msg_cbytes;
7 msgqnum_t msg_qnum;
8 msglen_t msg_qbytes;
9 pid_t msg_lspid;
10 pid_t msg_lrpid;
11 unsigned long __pad1;
12 unsigned long __pad2;
13};
lib/libc/musl/arch/mips64/bits/sem.h deleted-14
......@@ -1,14 +0,0 @@
1struct semid_ds {
2 struct ipc_perm sem_perm;
3 time_t sem_otime;
4 time_t sem_ctime;
5#if __BYTE_ORDER == __LITTLE_ENDIAN
6 unsigned short sem_nsems;
7 char __sem_nsems_pad[sizeof(time_t)-sizeof(short)];
8#else
9 char __sem_nsems_pad[sizeof(time_t)-sizeof(short)];
10 unsigned short sem_nsems;
11#endif
12 time_t __unused3;
13 time_t __unused4;
14};
lib/libc/musl/arch/mips64/bits/shm.h deleted-24
......@@ -1,24 +0,0 @@
1#define SHMLBA 4096
2
3struct shmid_ds {
4 struct ipc_perm shm_perm;
5 size_t shm_segsz;
6 time_t shm_atime;
7 time_t shm_dtime;
8 time_t shm_ctime;
9 pid_t shm_cpid;
10 pid_t shm_lpid;
11 unsigned long shm_nattch;
12 unsigned long __pad1;
13 unsigned long __pad2;
14};
15
16struct shminfo {
17 unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4];
18};
19
20struct shm_info {
21 int __used_ids;
22 unsigned long shm_tot, shm_rss, shm_swp;
23 unsigned long __swap_attempts, __swap_successes;
24};
lib/libc/musl/arch/mips64/bits/stat.h-3
......@@ -1,6 +1,3 @@
1#include <string.h>
2#include <bits/alltypes.h>
3
41struct stat {
52 dev_t st_dev;
63 int __pad1[3];
lib/libc/musl/arch/mips64/bits/syscall.h.in+6
......@@ -330,4 +330,10 @@
330330#define __NR_io_uring_setup 5425
331331#define __NR_io_uring_enter 5426
332332#define __NR_io_uring_register 5427
333#define __NR_open_tree 5428
334#define __NR_move_mount 5429
335#define __NR_fsopen 5430
336#define __NR_fsconfig 5431
337#define __NR_fsmount 5432
338#define __NR_fspick 5433
333339
lib/libc/musl/arch/mips64/kstat.h created+21
......@@ -0,0 +1,21 @@
1struct kstat {
2 unsigned st_dev;
3 int __pad1[3];
4 ino_t st_ino;
5 mode_t st_mode;
6 unsigned st_nlink;
7 uid_t st_uid;
8 gid_t st_gid;
9 unsigned st_rdev;
10 int __pad2[3];
11 off_t st_size;
12 int st_atime_sec;
13 int st_atime_nsec;
14 int st_mtime_sec;
15 int st_mtime_nsec;
16 int st_ctime_sec;
17 int st_ctime_nsec;
18 unsigned st_blksize;
19 unsigned __pad3;
20 blkcnt_t st_blocks;
21};
lib/libc/musl/arch/mips64/syscall_arch.h+52-160
......@@ -3,58 +3,25 @@
33
44#define SYSCALL_RLIM_INFINITY (-1UL/2)
55
6#include <sys/stat.h>
7struct kernel_stat {
8 unsigned int st_dev;
9 unsigned int __pad1[3];
10 unsigned long long st_ino;
11 unsigned int st_mode;
12 unsigned int st_nlink;
13 int st_uid;
14 int st_gid;
15 unsigned int st_rdev;
16 unsigned int __pad2[3];
17 long long st_size;
18 unsigned int st_atime_sec;
19 unsigned int st_atime_nsec;
20 unsigned int st_mtime_sec;
21 unsigned int st_mtime_nsec;
22 unsigned int st_ctime_sec;
23 unsigned int st_ctime_nsec;
24 unsigned int st_blksize;
25 unsigned int __pad3;
26 unsigned long long st_blocks;
27};
28
29static void __stat_fix(struct kernel_stat *kst, struct stat *st)
30{
31 st->st_dev = kst->st_dev;
32 st->st_ino = kst->st_ino;
33 st->st_mode = kst->st_mode;
34 st->st_nlink = kst->st_nlink;
35 st->st_uid = kst->st_uid;
36 st->st_gid = kst->st_gid;
37 st->st_rdev = kst->st_rdev;
38 st->st_size = kst->st_size;
39 st->st_atim.tv_sec = kst->st_atime_sec;
40 st->st_atim.tv_nsec = kst->st_atime_nsec;
41 st->st_mtim.tv_sec = kst->st_mtime_sec;
42 st->st_mtim.tv_nsec = kst->st_mtime_nsec;
43 st->st_ctim.tv_sec = kst->st_ctime_sec;
44 st->st_ctim.tv_nsec = kst->st_ctime_nsec;
45 st->st_blksize = kst->st_blksize;
46 st->st_blocks = kst->st_blocks;
47}
6#if __mips_isa_rev >= 6
7#define SYSCALL_CLOBBERLIST \
8 "$1", "$3", "$10", "$11", "$12", "$13", \
9 "$14", "$15", "$24", "$25", "memory"
10#else
11#define SYSCALL_CLOBBERLIST \
12 "$1", "$3", "$10", "$11", "$12", "$13", \
13 "$14", "$15", "$24", "$25", "hi", "lo", "memory"
14#endif
4815
4916static inline long __syscall0(long n)
5017{
5118 register long r7 __asm__("$7");
52 register long r2 __asm__("$2");
19 register long r2 __asm__("$2") = n;
5320 __asm__ __volatile__ (
54 "daddu $2,$0,%2 ; syscall"
55 : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7)
56 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
57 "$14", "$15", "$24", "$25", "hi", "lo", "memory");
21 "syscall"
22 : "+&r"(r2), "=r"(r7)
23 :
24 : SYSCALL_CLOBBERLIST);
5825 return r7 ? -r2 : r2;
5926}
6027
......@@ -62,175 +29,100 @@ static inline long __syscall1(long n, long a)
6229{
6330 register long r4 __asm__("$4") = a;
6431 register long r7 __asm__("$7");
65 register long r2 __asm__("$2");
32 register long r2 __asm__("$2") = n;
6633 __asm__ __volatile__ (
67 "daddu $2,$0,%2 ; syscall"
68 : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
69 "r"(r4)
70 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
71 "$14", "$15", "$24", "$25", "hi", "lo", "memory");
34 "syscall"
35 : "+&r"(r2), "=r"(r7)
36 : "r"(r4)
37 : SYSCALL_CLOBBERLIST);
7238 return r7 ? -r2 : r2;
7339}
7440
7541static inline long __syscall2(long n, long a, long b)
7642{
77 struct kernel_stat kst;
78 long ret;
7943 register long r4 __asm__("$4") = a;
8044 register long r5 __asm__("$5") = b;
8145 register long r7 __asm__("$7");
82 register long r2 __asm__("$2");
83
84 if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
85 r5 = (long) &kst;
46 register long r2 __asm__("$2") = n;
8647
8748 __asm__ __volatile__ (
88 "daddu $2,$0,%2 ; syscall"
89 : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
90 "r"(r4), "r"(r5)
91 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
92 "$14", "$15", "$24", "$25", "hi", "lo", "memory");
93
94 if (r7) return -r2;
95 ret = r2;
96
97 if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
98 __stat_fix(&kst, (struct stat *)b);
99
100 return ret;
49 "syscall"
50 : "+&r"(r2), "=r"(r7)
51 : "r"(r4), "r"(r5)
52 : SYSCALL_CLOBBERLIST);
53 return r7 ? -r2 : r2;
10154}
10255
10356static inline long __syscall3(long n, long a, long b, long c)
10457{
105 struct kernel_stat kst;
106 long ret;
10758 register long r4 __asm__("$4") = a;
10859 register long r5 __asm__("$5") = b;
10960 register long r6 __asm__("$6") = c;
11061 register long r7 __asm__("$7");
111 register long r2 __asm__("$2");
112
113 if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
114 r5 = (long) &kst;
62 register long r2 __asm__("$2") = n;
11563
11664 __asm__ __volatile__ (
117 "daddu $2,$0,%2 ; syscall"
118 : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
119 "r"(r4), "r"(r5), "r"(r6)
120 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
121 "$14", "$15", "$24", "$25", "hi", "lo", "memory");
122
123 if (r7) return -r2;
124 ret = r2;
125
126 if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
127 __stat_fix(&kst, (struct stat *)b);
128
129 return ret;
65 "syscall"
66 : "+&r"(r2), "=r"(r7)
67 : "r"(r4), "r"(r5), "r"(r6)
68 : SYSCALL_CLOBBERLIST);
69 return r7 ? -r2 : r2;
13070}
13171
13272static inline long __syscall4(long n, long a, long b, long c, long d)
13373{
134 struct kernel_stat kst;
135 long ret;
13674 register long r4 __asm__("$4") = a;
13775 register long r5 __asm__("$5") = b;
13876 register long r6 __asm__("$6") = c;
13977 register long r7 __asm__("$7") = d;
140 register long r2 __asm__("$2");
141
142 if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
143 r5 = (long) &kst;
144 if (n == SYS_newfstatat)
145 r6 = (long) &kst;
78 register long r2 __asm__("$2") = n;
14679
14780 __asm__ __volatile__ (
148 "daddu $2,$0,%2 ; syscall"
149 : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
150 "r"(r4), "r"(r5), "r"(r6)
151 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
152 "$14", "$15", "$24", "$25", "hi", "lo", "memory");
153
154 if (r7) return -r2;
155 ret = r2;
156
157 if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
158 __stat_fix(&kst, (struct stat *)b);
159 if (n == SYS_newfstatat)
160 __stat_fix(&kst, (struct stat *)c);
161
162 return ret;
81 "syscall"
82 : "+&r"(r2), "+r"(r7)
83 : "r"(r4), "r"(r5), "r"(r6)
84 : SYSCALL_CLOBBERLIST);
85 return r7 ? -r2 : r2;
16386}
16487
16588static inline long __syscall5(long n, long a, long b, long c, long d, long e)
16689{
167 struct kernel_stat kst;
168 long ret;
16990 register long r4 __asm__("$4") = a;
17091 register long r5 __asm__("$5") = b;
17192 register long r6 __asm__("$6") = c;
17293 register long r7 __asm__("$7") = d;
17394 register long r8 __asm__("$8") = e;
174 register long r2 __asm__("$2");
175
176 if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
177 r5 = (long) &kst;
178 if (n == SYS_newfstatat)
179 r6 = (long) &kst;
95 register long r2 __asm__("$2") = n;
18096
18197 __asm__ __volatile__ (
182 "daddu $2,$0,%2 ; syscall"
183 : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
184 "r"(r4), "r"(r5), "r"(r6), "r"(r8)
185 : "$1", "$3", "$9", "$10", "$11", "$12", "$13",
186 "$14", "$15", "$24", "$25", "hi", "lo", "memory");
187
188 if (r7) return -r2;
189 ret = r2;
190
191 if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
192 __stat_fix(&kst, (struct stat *)b);
193 if (n == SYS_newfstatat)
194 __stat_fix(&kst, (struct stat *)c);
195
196 return ret;
98 "syscall"
99 : "+&r"(r2), "+r"(r7)
100 : "r"(r4), "r"(r5), "r"(r6), "r"(r8)
101 : SYSCALL_CLOBBERLIST);
102 return r7 ? -r2 : r2;
197103}
198104
199105static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
200106{
201 struct kernel_stat kst;
202 long ret;
203107 register long r4 __asm__("$4") = a;
204108 register long r5 __asm__("$5") = b;
205109 register long r6 __asm__("$6") = c;
206110 register long r7 __asm__("$7") = d;
207111 register long r8 __asm__("$8") = e;
208112 register long r9 __asm__("$9") = f;
209 register long r2 __asm__("$2");
210
211 if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
212 r5 = (long) &kst;
213 if (n == SYS_newfstatat)
214 r6 = (long) &kst;
113 register long r2 __asm__("$2") = n;
215114
216115 __asm__ __volatile__ (
217 "daddu $2,$0,%2 ; syscall"
218 : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
219 "r"(r4), "r"(r5), "r"(r6), "r"(r8), "r"(r9)
220 : "$1", "$3", "$10", "$11", "$12", "$13",
221 "$14", "$15", "$24", "$25", "hi", "lo", "memory");
222
223 if (r7) return -r2;
224 ret = r2;
225
226 if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
227 __stat_fix(&kst, (struct stat *)b);
228 if (n == SYS_newfstatat)
229 __stat_fix(&kst, (struct stat *)c);
230
231 return ret;
116 "syscall"
117 : "+&r"(r2), "+r"(r7)
118 : "r"(r4), "r"(r5), "r"(r6), "r"(r8), "r"(r9)
119 : SYSCALL_CLOBBERLIST);
120 return r7 ? -r2 : r2;
232121}
233122
234123#define VDSO_USEFUL
235124#define VDSO_CGT_SYM "__vdso_clock_gettime"
236125#define VDSO_CGT_VER "LINUX_2.6"
126
127#define SO_SNDTIMEO_OLD 0x1005
128#define SO_RCVTIMEO_OLD 0x1006
lib/libc/musl/arch/powerpc/bits/alltypes.h.in+4
......@@ -6,8 +6,12 @@ TYPEDEF __builtin_va_list va_list;
66TYPEDEF __builtin_va_list __isoc_va_list;
77
88#ifndef __cplusplus
9#ifdef __WCHAR_TYPE__
10TYPEDEF __WCHAR_TYPE__ wchar_t;
11#else
912TYPEDEF long wchar_t;
1013#endif
14#endif
1115
1216TYPEDEF float float_t;
1317TYPEDEF double double_t;
lib/libc/musl/arch/powerpc/bits/ipc.h-3
......@@ -10,6 +10,3 @@ struct ipc_perm {
1010 long long __pad2;
1111 long long __pad3;
1212};
13
14#define IPC_64 0x100
15
lib/libc/musl/arch/powerpc/bits/ipcstat.h created+1
......@@ -0,0 +1 @@
1#define IPC_STAT 2
lib/libc/musl/arch/powerpc/bits/shm.h-1
......@@ -26,4 +26,3 @@ struct shm_info {
2626 unsigned long shm_tot, shm_rss, shm_swp;
2727 unsigned long __swap_attempts, __swap_successes;
2828};
29
lib/libc/musl/arch/powerpc/bits/syscall.h.in+6
......@@ -407,4 +407,10 @@
407407#define __NR_io_uring_setup 425
408408#define __NR_io_uring_enter 426
409409#define __NR_io_uring_register 427
410#define __NR_open_tree 428
411#define __NR_move_mount 429
412#define __NR_fsopen 430
413#define __NR_fsconfig 431
414#define __NR_fsmount 432
415#define __NR_fspick 433
410416
lib/libc/musl/arch/powerpc/bits/user.h+4-6
......@@ -1,10 +1,8 @@
1struct pt_regs {
2 unsigned long gpr[32], nip, msr, orig_gpr3, ctr, link, xer, ccr, mq;
3 unsigned long trap, dar, dsisr, result;
4};
5
61struct user {
7 struct pt_regs regs;
2 struct {
3 unsigned long gpr[32], nip, msr, orig_gpr3, ctr, link, xer, ccr, mq;
4 unsigned long trap, dar, dsisr, result;
5 } regs;
86 unsigned long u_tsize, u_dsize, u_ssize;
97 unsigned long start_code, start_data, start_stack;
108 long signal;
lib/libc/musl/arch/powerpc/kstat.h created+20
......@@ -0,0 +1,20 @@
1struct kstat {
2 dev_t st_dev;
3 ino_t st_ino;
4 mode_t st_mode;
5 nlink_t st_nlink;
6 uid_t st_uid;
7 gid_t st_gid;
8 dev_t st_rdev;
9 short __st_rdev_padding;
10 off_t st_size;
11 blksize_t st_blksize;
12 blkcnt_t st_blocks;
13 long st_atime_sec;
14 long st_atime_nsec;
15 long st_mtime_sec;
16 long st_mtime_nsec;
17 long st_ctime_sec;
18 long st_ctime_nsec;
19 unsigned __unused[2];
20};
lib/libc/musl/arch/powerpc/reloc.h+1
......@@ -9,6 +9,7 @@
99#define TPOFF_K (-0x7000)
1010
1111#define REL_SYMBOLIC R_PPC_ADDR32
12#define REL_USYMBOLIC R_PPC_UADDR32
1213#define REL_GOT R_PPC_GLOB_DAT
1314#define REL_PLT R_PPC_JMP_SLOT
1415#define REL_RELATIVE R_PPC_RELATIVE
lib/libc/musl/arch/powerpc/syscall_arch.h+3
......@@ -89,3 +89,6 @@ static inline long __syscall6(long n, long a, long b, long c, long d, long e, lo
8989}
9090
9191#define SYSCALL_FADVISE_6_ARG
92
93#define SO_RCVTIMEO_OLD 18
94#define SO_SNDTIMEO_OLD 19
lib/libc/musl/arch/powerpc64/bits/ipc.h-3
......@@ -10,6 +10,3 @@ struct ipc_perm {
1010 long long __pad2;
1111 long long __pad3;
1212};
13
14#define IPC_64 0x100
15
lib/libc/musl/arch/powerpc64/bits/msg.h deleted-12
......@@ -1,12 +0,0 @@
1struct msqid_ds {
2 struct ipc_perm msg_perm;
3 time_t msg_stime;
4 time_t msg_rtime;
5 time_t msg_ctime;
6 unsigned long msg_cbytes;
7 msgqnum_t msg_qnum;
8 msglen_t msg_qbytes;
9 pid_t msg_lspid;
10 pid_t msg_lrpid;
11 unsigned long __unused[2];
12};
lib/libc/musl/arch/powerpc64/bits/sem.h deleted-13
......@@ -1,13 +0,0 @@
1#include <endian.h>
2
3struct semid_ds {
4 struct ipc_perm sem_perm;
5 time_t sem_otime;
6 time_t sem_ctime;
7#if __BYTE_ORDER == __BIG_ENDIAN
8 unsigned short __pad[3], sem_nsems;
9#else
10 unsigned short sem_nsems, __pad[3];
11#endif
12 unsigned long __unused[2];
13};
lib/libc/musl/arch/powerpc64/bits/shm.h-1
......@@ -21,4 +21,3 @@ struct shm_info {
2121 unsigned long shm_tot, shm_rss, shm_swp;
2222 unsigned long __swap_attempts, __swap_successes;
2323};
24
lib/libc/musl/arch/powerpc64/bits/syscall.h.in+6
......@@ -379,4 +379,10 @@
379379#define __NR_io_uring_setup 425
380380#define __NR_io_uring_enter 426
381381#define __NR_io_uring_register 427
382#define __NR_open_tree 428
383#define __NR_move_mount 429
384#define __NR_fsopen 430
385#define __NR_fsconfig 431
386#define __NR_fsmount 432
387#define __NR_fspick 433
382388
lib/libc/musl/arch/powerpc64/bits/user.h+4-6
......@@ -1,10 +1,8 @@
1struct pt_regs {
2 unsigned long gpr[32], nip, msr, orig_gpr3, ctr, link, xer, ccr, softe;
3 unsigned long trap, dar, dsisr, result;
4};
5
61struct user {
7 struct pt_regs regs;
2 struct {
3 unsigned long gpr[32], nip, msr, orig_gpr3, ctr, link, xer, ccr, softe;
4 unsigned long trap, dar, dsisr, result;
5 } regs;
86 unsigned long u_tsize, u_dsize, u_ssize;
97 unsigned long start_code, start_data, start_stack;
108 long signal;
lib/libc/musl/arch/powerpc64/kstat.h created+19
......@@ -0,0 +1,19 @@
1struct kstat {
2 dev_t st_dev;
3 ino_t st_ino;
4 nlink_t st_nlink;
5 mode_t st_mode;
6 uid_t st_uid;
7 gid_t st_gid;
8 dev_t st_rdev;
9 off_t st_size;
10 blksize_t st_blksize;
11 blkcnt_t st_blocks;
12 long st_atime_sec;
13 long st_atime_nsec;
14 long st_mtime_sec;
15 long st_mtime_nsec;
16 long st_ctime_sec;
17 long st_ctime_nsec;
18 unsigned long __unused[3];
19};
lib/libc/musl/arch/powerpc64/reloc.h+1
......@@ -11,6 +11,7 @@
1111#define TPOFF_K (-0x7000)
1212
1313#define REL_SYMBOLIC R_PPC64_ADDR64
14#define REL_USYMBOLIC R_PPC64_UADDR64
1415#define REL_GOT R_PPC64_GLOB_DAT
1516#define REL_PLT R_PPC64_JMP_SLOT
1617#define REL_RELATIVE R_PPC64_RELATIVE
lib/libc/musl/arch/powerpc64/syscall_arch.h+3
......@@ -85,3 +85,6 @@ static inline long __syscall6(long n, long a, long b, long c, long d, long e, lo
8585 :: "memory", "cr0", "r9", "r10", "r11", "r12");
8686 return r3;
8787}
88
89#define SO_RCVTIMEO_OLD 18
90#define SO_SNDTIMEO_OLD 19
lib/libc/musl/arch/riscv64/atomic_arch.h+2-2
......@@ -14,7 +14,7 @@ static inline int a_cas(volatile int *p, int t, int s)
1414 " sc.w.aqrl %1, %4, (%2)\n"
1515 " bnez %1, 1b\n"
1616 "1:"
17 : "=&r"(old), "=r"(tmp)
17 : "=&r"(old), "=&r"(tmp)
1818 : "r"(p), "r"(t), "r"(s)
1919 : "memory");
2020 return old;
......@@ -31,7 +31,7 @@ static inline void *a_cas_p(volatile void *p, void *t, void *s)
3131 " sc.d.aqrl %1, %4, (%2)\n"
3232 " bnez %1, 1b\n"
3333 "1:"
34 : "=&r"(old), "=r"(tmp)
34 : "=&r"(old), "=&r"(tmp)
3535 : "r"(p), "r"(t), "r"(s)
3636 : "memory");
3737 return old;
lib/libc/musl/arch/riscv64/bits/ipc.h deleted-14
......@@ -1,14 +0,0 @@
1struct ipc_perm {
2 key_t __ipc_perm_key;
3 uid_t uid;
4 gid_t gid;
5 uid_t cuid;
6 gid_t cgid;
7 mode_t mode;
8 unsigned short __ipc_perm_seq;
9
10 unsigned long __pad1;
11 unsigned long __pad2;
12};
13
14#define IPC_64 0
lib/libc/musl/arch/riscv64/bits/msg.h deleted-13
......@@ -1,13 +0,0 @@
1struct msqid_ds {
2 struct ipc_perm msg_perm;
3 time_t msg_stime;
4 time_t msg_rtime;
5 time_t msg_ctime;
6 unsigned long msg_cbytes;
7 msgqnum_t msg_qnum;
8 msglen_t msg_qbytes;
9 pid_t msg_lspid;
10 pid_t msg_lrpid;
11 unsigned long __pad1;
12 unsigned long __pad2;
13};
lib/libc/musl/arch/riscv64/bits/sem.h deleted-9
......@@ -1,9 +0,0 @@
1struct semid_ds {
2 struct ipc_perm sem_perm;
3 time_t sem_otime;
4 time_t sem_ctime;
5 unsigned short sem_nsems;
6 char __sem_nsems_pad[sizeof(time_t)-sizeof(short)];
7 time_t __unused3;
8 time_t __unused4;
9};
lib/libc/musl/arch/riscv64/bits/shm.h deleted-25
......@@ -1,25 +0,0 @@
1#define SHMLBA 4096
2
3struct shmid_ds
4{
5 struct ipc_perm shm_perm;
6 size_t shm_segsz;
7 time_t shm_atime;
8 time_t shm_dtime;
9 time_t shm_ctime;
10 pid_t shm_cpid;
11 pid_t shm_lpid;
12 unsigned long shm_nattch;
13 unsigned long __pad1;
14 unsigned long __pad2;
15};
16
17struct shminfo {
18 unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4];
19};
20
21struct shm_info {
22 int __used_ids;
23 unsigned long shm_tot, shm_rss, shm_swp;
24 unsigned long __swap_attempts, __swap_successes;
25};
lib/libc/musl/arch/riscv64/bits/signal.h+27-30
......@@ -6,46 +6,43 @@
66# define SIGSTKSZ 8192
77#endif
88
9/* gregs[0] holds the program counter. */
9typedef unsigned long __riscv_mc_gp_state[32];
1010
11#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
12typedef unsigned long greg_t;
13typedef unsigned long gregset_t[32];
14
15struct __riscv_f_ext_state {
16 unsigned int f[32];
17 unsigned int fcsr;
11struct __riscv_mc_f_ext_state {
12 unsigned int __f[32];
13 unsigned int __fcsr;
1814};
1915
20struct __riscv_d_ext_state {
21 unsigned long long f[32];
22 unsigned int fcsr;
16struct __riscv_mc_d_ext_state {
17 unsigned long long __f[32];
18 unsigned int __fcsr;
2319};
2420
25struct __riscv_q_ext_state {
26 unsigned long long f[64] __attribute__((aligned(16)));
27 unsigned int fcsr;
28 unsigned int reserved[3];
21struct __riscv_mc_q_ext_state {
22 unsigned long long __f[64] __attribute__((aligned(16)));
23 unsigned int __fcsr;
24 unsigned int __reserved[3];
2925};
3026
31union __riscv_fp_state {
32 struct __riscv_f_ext_state f;
33 struct __riscv_d_ext_state d;
34 struct __riscv_q_ext_state q;
27union __riscv_mc_fp_state {
28 struct __riscv_mc_f_ext_state __f;
29 struct __riscv_mc_d_ext_state __d;
30 struct __riscv_mc_q_ext_state __q;
3531};
3632
37typedef union __riscv_fp_state fpregset_t;
33typedef struct mcontext_t {
34 __riscv_mc_gp_state __gregs;
35 union __riscv_mc_fp_state __fpregs;
36} mcontext_t;
3837
39typedef struct sigcontext {
38#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
39typedef unsigned long greg_t;
40typedef unsigned long gregset_t[32];
41typedef union __riscv_mc_fp_state fpregset_t;
42struct sigcontext {
4043 gregset_t gregs;
4144 fpregset_t fpregs;
42} mcontext_t;
43
44#else
45typedef struct {
46 unsigned long gregs[32];
47 unsigned long long fpregs[66];
48} mcontext_t;
45};
4946#endif
5047
5148struct sigaltstack {
......@@ -54,10 +51,10 @@ struct sigaltstack {
5451 size_t ss_size;
5552};
5653
57typedef struct __ucontext
54typedef struct ucontext_t
5855{
5956 unsigned long uc_flags;
60 struct __ucontext *uc_link;
57 struct ucontext_t *uc_link;
6158 stack_t uc_stack;
6259 sigset_t uc_sigmask;
6360 mcontext_t uc_mcontext;
lib/libc/musl/arch/riscv64/bits/syscall.h.in+15
......@@ -273,5 +273,20 @@
273273#define __NR_pkey_mprotect 288
274274#define __NR_pkey_alloc 289
275275#define __NR_pkey_free 290
276#define __NR_statx 291
277#define __NR_io_pgetevents 292
278#define __NR_rseq 293
279#define __NR_kexec_file_load 294
280#define __NR_pidfd_send_signal 424
281#define __NR_io_uring_setup 425
282#define __NR_io_uring_enter 426
283#define __NR_io_uring_register 427
284#define __NR_open_tree 428
285#define __NR_move_mount 429
286#define __NR_fsopen 430
287#define __NR_fsconfig 431
288#define __NR_fsmount 432
289#define __NR_fspick 433
290
276291#define __NR_sysriscv __NR_arch_specific_syscall
277292#define __NR_riscv_flush_icache (__NR_sysriscv + 15)
lib/libc/musl/arch/riscv64/bits/user.h+2-40
......@@ -1,43 +1,5 @@
1struct user_regs_struct {
2 unsigned long pc;
3 unsigned long ra;
4 unsigned long sp;
5 unsigned long gp;
6 unsigned long tp;
7 unsigned long t0;
8 unsigned long t1;
9 unsigned long t2;
10 unsigned long s0;
11 unsigned long s1;
12 unsigned long a0;
13 unsigned long a1;
14 unsigned long a2;
15 unsigned long a3;
16 unsigned long a4;
17 unsigned long a5;
18 unsigned long a6;
19 unsigned long a7;
20 unsigned long s2;
21 unsigned long s3;
22 unsigned long s4;
23 unsigned long s5;
24 unsigned long s6;
25 unsigned long s7;
26 unsigned long s8;
27 unsigned long s9;
28 unsigned long s10;
29 unsigned long s11;
30 unsigned long t3;
31 unsigned long t4;
32 unsigned long t5;
33 unsigned long t6;
34};
35
36struct user_fpregs_struct {
37 double f[32];
38 unsigned int fcsr;
39};
1#include <signal.h>
402
413#define ELF_NGREG 32
424typedef unsigned long elf_greg_t, elf_gregset_t[ELF_NGREG];
43typedef struct user_fpregs_struct elf_fpregset_t;
5typedef union __riscv_mc_fp_state elf_fpregset_t;
lib/libc/musl/arch/riscv64/kstat.h created+21
......@@ -0,0 +1,21 @@
1struct kstat {
2 dev_t st_dev;
3 ino_t st_ino;
4 mode_t st_mode;
5 nlink_t st_nlink;
6 uid_t st_uid;
7 gid_t st_gid;
8 dev_t st_rdev;
9 unsigned long __pad;
10 off_t st_size;
11 blksize_t st_blksize;
12 int __pad2;
13 blkcnt_t st_blocks;
14 long st_atime_sec;
15 long st_atime_nsec;
16 long st_mtime_sec;
17 long st_mtime_nsec;
18 long st_ctime_sec;
19 long st_ctime_nsec;
20 unsigned __unused[2];
21};
lib/libc/musl/arch/riscv64/pthread_arch.h+1-1
......@@ -11,4 +11,4 @@ static inline struct pthread *__pthread_self()
1111
1212#define DTP_OFFSET 0x800
1313
14#define MC_PC gregs[0]
14#define MC_PC __gregs[0]
lib/libc/musl/arch/riscv64/syscall_arch.h+2
......@@ -74,3 +74,5 @@ static inline long __syscall6(long n, long a, long b, long c, long d, long e, lo
7474/* We don't have a clock_gettime function.
7575#define VDSO_CGT_SYM "__vdso_clock_gettime"
7676#define VDSO_CGT_VER "LINUX_2.6" */
77
78#define IPC_64 0
lib/libc/musl/arch/s390x/bits/ipc.h deleted-14
......@@ -1,14 +0,0 @@
1struct ipc_perm {
2 key_t __ipc_perm_key;
3 uid_t uid;
4 gid_t gid;
5 uid_t cuid;
6 gid_t cgid;
7 mode_t mode;
8 unsigned short __pad1;
9 unsigned short __ipc_perm_seq;
10 unsigned long __pad2;
11 unsigned long __pad3;
12};
13
14#define IPC_64 0x100
lib/libc/musl/arch/s390x/bits/msg.h deleted-12
......@@ -1,12 +0,0 @@
1struct msqid_ds {
2 struct ipc_perm msg_perm;
3 time_t msg_stime;
4 time_t msg_rtime;
5 time_t msg_ctime;
6 unsigned long msg_cbytes;
7 msgqnum_t msg_qnum;
8 msglen_t msg_qbytes;
9 pid_t msg_lspid;
10 pid_t msg_lrpid;
11 unsigned long __unused[2];
12};
lib/libc/musl/arch/s390x/bits/sem.h deleted-7
......@@ -1,7 +0,0 @@
1struct semid_ds {
2 struct ipc_perm sem_perm;
3 time_t sem_otime;
4 time_t sem_ctime;
5 unsigned short __pad[3], sem_nsems;
6 unsigned long __unused[2];
7};
lib/libc/musl/arch/s390x/bits/shm.h deleted-25
......@@ -1,25 +0,0 @@
1#define SHMLBA 4096
2
3struct shmid_ds {
4 struct ipc_perm shm_perm;
5 size_t shm_segsz;
6 time_t shm_atime;
7 time_t shm_dtime;
8 time_t shm_ctime;
9 pid_t shm_cpid;
10 pid_t shm_lpid;
11 unsigned long shm_nattch;
12 unsigned long __pad1;
13 unsigned long __pad2;
14};
15
16struct shminfo {
17 unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4];
18};
19
20struct shm_info {
21 int __used_ids;
22 unsigned long shm_tot, shm_rss, shm_swp;
23 unsigned long __swap_attempts, __swap_successes;
24};
25
lib/libc/musl/arch/s390x/bits/syscall.h.in+6
......@@ -344,4 +344,10 @@
344344#define __NR_io_uring_setup 425
345345#define __NR_io_uring_enter 426
346346#define __NR_io_uring_register 427
347#define __NR_open_tree 428
348#define __NR_move_mount 429
349#define __NR_fsopen 430
350#define __NR_fsconfig 431
351#define __NR_fsmount 432
352#define __NR_fspick 433
347353
lib/libc/musl/arch/s390x/kstat.h created+19
......@@ -0,0 +1,19 @@
1struct kstat {
2 dev_t st_dev;
3 ino_t st_ino;
4 nlink_t st_nlink;
5 mode_t st_mode;
6 uid_t st_uid;
7 gid_t st_gid;
8 dev_t st_rdev;
9 off_t st_size;
10 long st_atime_sec;
11 long st_atime_nsec;
12 long st_mtime_sec;
13 long st_mtime_nsec;
14 long st_ctime_sec;
15 long st_ctime_nsec;
16 blksize_t st_blksize;
17 blkcnt_t st_blocks;
18 unsigned long __unused[3];
19};
lib/libc/musl/arch/x86_64/bits/ipc.h deleted-13
......@@ -1,13 +0,0 @@
1struct ipc_perm {
2 key_t __ipc_perm_key;
3 uid_t uid;
4 gid_t gid;
5 uid_t cuid;
6 gid_t cgid;
7 mode_t mode;
8 int __ipc_perm_seq;
9 long __pad1;
10 long __pad2;
11};
12
13#define IPC_64 0
lib/libc/musl/arch/x86_64/bits/msg.h deleted-12
......@@ -1,12 +0,0 @@
1struct msqid_ds {
2 struct ipc_perm msg_perm;
3 time_t msg_stime;
4 time_t msg_rtime;
5 time_t msg_ctime;
6 unsigned long msg_cbytes;
7 msgqnum_t msg_qnum;
8 msglen_t msg_qbytes;
9 pid_t msg_lspid;
10 pid_t msg_lrpid;
11 unsigned long __unused[2];
12};
lib/libc/musl/arch/x86_64/bits/sem.h created+11
......@@ -0,0 +1,11 @@
1struct semid_ds {
2 struct ipc_perm sem_perm;
3 time_t sem_otime;
4 long __unused1;
5 time_t sem_ctime;
6 long __unused2;
7 unsigned short sem_nsems;
8 char __sem_nsems_pad[sizeof(long)-sizeof(short)];
9 long __unused3;
10 long __unused4;
11};
lib/libc/musl/arch/x86_64/bits/shm.h deleted-25
......@@ -1,25 +0,0 @@
1#define SHMLBA 4096
2
3struct shmid_ds {
4 struct ipc_perm shm_perm;
5 size_t shm_segsz;
6 time_t shm_atime;
7 time_t shm_dtime;
8 time_t shm_ctime;
9 pid_t shm_cpid;
10 pid_t shm_lpid;
11 unsigned long shm_nattch;
12 unsigned long __pad1;
13 unsigned long __pad2;
14};
15
16struct shminfo {
17 unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4];
18};
19
20struct shm_info {
21 int __used_ids;
22 unsigned long shm_tot, shm_rss, shm_swp;
23 unsigned long __swap_attempts, __swap_successes;
24};
25
lib/libc/musl/arch/x86_64/bits/syscall.h.in+6
......@@ -337,4 +337,10 @@
337337#define __NR_io_uring_setup 425
338338#define __NR_io_uring_enter 426
339339#define __NR_io_uring_register 427
340#define __NR_open_tree 428
341#define __NR_move_mount 429
342#define __NR_fsopen 430
343#define __NR_fsconfig 431
344#define __NR_fsmount 432
345#define __NR_fspick 433
340346
lib/libc/musl/arch/x86_64/kstat.h created+22
......@@ -0,0 +1,22 @@
1struct kstat {
2 dev_t st_dev;
3 ino_t st_ino;
4 nlink_t st_nlink;
5
6 mode_t st_mode;
7 uid_t st_uid;
8 gid_t st_gid;
9 unsigned int __pad0;
10 dev_t st_rdev;
11 off_t st_size;
12 blksize_t st_blksize;
13 blkcnt_t st_blocks;
14
15 long st_atime_sec;
16 long st_atime_nsec;
17 long st_mtime_sec;
18 long st_mtime_nsec;
19 long st_ctime_sec;
20 long st_ctime_nsec;
21 long __unused[3];
22};
lib/libc/musl/arch/x86_64/syscall_arch.h+2
......@@ -66,3 +66,5 @@ static __inline long __syscall6(long n, long a1, long a2, long a3, long a4, long
6666#define VDSO_CGT_VER "LINUX_2.6"
6767#define VDSO_GETCPU_SYM "__vdso_getcpu"
6868#define VDSO_GETCPU_VER "LINUX_2.6"
69
70#define IPC_64 0
lib/libc/musl/include/fcntl.h+5
......@@ -100,6 +100,11 @@ int posix_fallocate(int, off_t, off_t);
100100#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
101101#define AT_NO_AUTOMOUNT 0x800
102102#define AT_EMPTY_PATH 0x1000
103#define AT_STATX_SYNC_TYPE 0x6000
104#define AT_STATX_SYNC_AS_STAT 0x0000
105#define AT_STATX_FORCE_SYNC 0x2000
106#define AT_STATX_DONT_SYNC 0x4000
107#define AT_RECURSIVE 0x8000
103108
104109#define FAPPEND O_APPEND
105110#define FFSYNC O_SYNC
lib/libc/musl/include/glob.h+3
......@@ -31,6 +31,9 @@ void globfree(glob_t *);
3131#define GLOB_NOESCAPE 0x40
3232#define GLOB_PERIOD 0x80
3333
34#define GLOB_TILDE 0x1000
35#define GLOB_TILDE_CHECK 0x4000
36
3437#define GLOB_NOSPACE 1
3538#define GLOB_ABORTED 2
3639#define GLOB_NOMATCH 3
lib/libc/musl/include/netinet/if_ether.h+1
......@@ -76,6 +76,7 @@
7676#define ETH_P_QINQ2 0x9200
7777#define ETH_P_QINQ3 0x9300
7878#define ETH_P_EDSA 0xDADA
79#define ETH_P_DSA_8021Q 0xDADB
7980#define ETH_P_IFE 0xED3E
8081#define ETH_P_AF_IUCV 0xFBFB
8182
lib/libc/musl/include/sched.h+7-4
......@@ -18,10 +18,12 @@ extern "C" {
1818
1919struct sched_param {
2020 int sched_priority;
21 int sched_ss_low_priority;
22 struct timespec sched_ss_repl_period;
23 struct timespec sched_ss_init_budget;
24 int sched_ss_max_repl;
21 int __reserved1;
22 struct {
23 time_t __reserved1;
24 long __reserved2;
25 } __reserved2[2];
26 int __reserved3;
2527};
2628
2729int sched_get_priority_max(int);
......@@ -47,6 +49,7 @@ int sched_yield(void);
4749#define CLONE_FS 0x00000200
4850#define CLONE_FILES 0x00000400
4951#define CLONE_SIGHAND 0x00000800
52#define CLONE_PIDFD 0x00001000
5053#define CLONE_PTRACE 0x00002000
5154#define CLONE_VFORK 0x00004000
5255#define CLONE_PARENT 0x00008000
lib/libc/musl/include/spawn.h+5
......@@ -71,6 +71,11 @@ int posix_spawn_file_actions_addopen(posix_spawn_file_actions_t *__restrict, int
7171int posix_spawn_file_actions_addclose(posix_spawn_file_actions_t *, int);
7272int posix_spawn_file_actions_adddup2(posix_spawn_file_actions_t *, int, int);
7373
74#if defined(_BSD_SOURCE) || defined(_GNU_SOURCE)
75int posix_spawn_file_actions_addchdir_np(posix_spawn_file_actions_t *__restrict, const char *__restrict);
76int posix_spawn_file_actions_addfchdir_np(posix_spawn_file_actions_t *, int);
77#endif
78
7479#ifdef __cplusplus
7580}
7681#endif
lib/libc/musl/include/stdlib.h+1
......@@ -152,6 +152,7 @@ int ptsname_r(int, char *, size_t);
152152char *ecvt(double, int, int *, int *);
153153char *fcvt(double, int, int *, int *);
154154char *gcvt(double, int, char *);
155char *secure_getenv(const char *);
155156struct __locale_struct;
156157float strtof_l(const char *__restrict, char **__restrict, struct __locale_struct *);
157158double strtod_l(const char *__restrict, char **__restrict, struct __locale_struct *);
lib/libc/musl/include/sys/ipc.h+1-1
......@@ -22,6 +22,7 @@ extern "C" {
2222#endif
2323
2424#include <bits/ipc.h>
25#include <bits/ipcstat.h>
2526
2627#define IPC_CREAT 01000
2728#define IPC_EXCL 02000
......@@ -29,7 +30,6 @@ extern "C" {
2930
3031#define IPC_RMID 0
3132#define IPC_SET 1
32#define IPC_STAT 2
3333#define IPC_INFO 3
3434
3535#define IPC_PRIVATE ((key_t) 0)
lib/libc/musl/include/sys/msg.h+2-2
......@@ -25,9 +25,9 @@ typedef unsigned long msglen_t;
2525#define MSG_NOERROR 010000
2626#define MSG_EXCEPT 020000
2727
28#define MSG_STAT 11
28#define MSG_STAT (11 | (IPC_STAT & 0x100))
2929#define MSG_INFO 12
30#define MSG_STAT_ANY 13
30#define MSG_STAT_ANY (13 | (IPC_STAT & 0x100))
3131
3232struct msginfo {
3333 int msgpool, msgmap, msgmax, msgmnb, msgmni, msgssz, msgtql;
lib/libc/musl/include/sys/sem.h+2-2
......@@ -31,9 +31,9 @@ extern "C" {
3131
3232#define _SEM_SEMUN_UNDEFINED 1
3333
34#define SEM_STAT 18
34#define SEM_STAT (18 | (IPC_STAT & 0x100))
3535#define SEM_INFO 19
36#define SEM_STAT_ANY 20
36#define SEM_STAT_ANY (20 | (IPC_STAT & 0x100))
3737
3838struct seminfo {
3939 int semmap;
lib/libc/musl/include/sys/shm.h+2-2
......@@ -33,9 +33,9 @@ extern "C" {
3333
3434#define SHM_LOCK 11
3535#define SHM_UNLOCK 12
36#define SHM_STAT 13
36#define SHM_STAT (13 | (IPC_STAT & 0x100))
3737#define SHM_INFO 14
38#define SHM_STAT_ANY 15
38#define SHM_STAT_ANY (15 | (IPC_STAT & 0x100))
3939#define SHM_DEST 01000
4040#define SHM_LOCKED 02000
4141#define SHM_HUGETLB 04000
lib/libc/musl/include/unistd.h+2
......@@ -176,6 +176,7 @@ long syscall(long, ...);
176176int execvpe(const char *, char *const [], char *const []);
177177int issetugid(void);
178178int getentropy(void *, size_t);
179extern int optreset;
179180#endif
180181
181182#ifdef _GNU_SOURCE
......@@ -188,6 +189,7 @@ char *get_current_dir_name(void);
188189int syncfs(int);
189190int euidaccess(const char *, int);
190191int eaccess(const char *, int);
192ssize_t copy_file_range(int, off_t *, int, off_t *, size_t, unsigned);
191193#endif
192194
193195#if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)
lib/libc/musl/src/env/secure_getenv.c created+8
......@@ -0,0 +1,8 @@
1#define _GNU_SOURCE
2#include <stdlib.h>
3#include "libc.h"
4
5char *secure_getenv(const char *name)
6{
7 return libc.secure ? NULL : getenv(name);
8}
lib/libc/musl/src/include/time.h+1
......@@ -4,6 +4,7 @@
44#include "../../include/time.h"
55
66hidden int __clock_gettime(clockid_t, struct timespec *);
7hidden int __clock_nanosleep(clockid_t, int, const struct timespec *, struct timespec *);
78
89hidden char *__asctime_r(const struct tm *, char *);
910hidden struct tm *__gmtime_r(const time_t *restrict, struct tm *restrict);
lib/libc/musl/src/include/unistd.h+1
......@@ -9,5 +9,6 @@ hidden int __dup3(int, int, int);
99hidden int __mkostemps(char *, int, int);
1010hidden int __execvpe(const char *, char *const *, char *const *);
1111hidden int __aio_close(int);
12hidden off_t __lseek(int, off_t, int);
1213
1314#endif
lib/libc/musl/src/internal/dynlink.h+1
......@@ -28,6 +28,7 @@ typedef Elf64_Sym Sym;
2828enum {
2929 REL_NONE = 0,
3030 REL_SYMBOLIC = -100,
31 REL_USYMBOLIC,
3132 REL_GOT,
3233 REL_PLT,
3334 REL_RELATIVE,
lib/libc/musl/src/internal/pthread_impl.h-1
......@@ -125,7 +125,6 @@ struct __timer {
125125 0x80000000 })
126126
127127void *__tls_get_addr(tls_mod_off_t *);
128hidden void *__tls_get_new(tls_mod_off_t *);
129128hidden int __init_tp(void *);
130129hidden void *__copy_tls(unsigned char *);
131130hidden void __reset_tls();
lib/libc/musl/src/internal/syscall.h+103-6
......@@ -43,8 +43,8 @@ hidden long __syscall_ret(unsigned long),
4343#define __syscall(...) __SYSCALL_DISP(__syscall,__VA_ARGS__)
4444#define syscall(...) __syscall_ret(__syscall(__VA_ARGS__))
4545
46#define socketcall __socketcall
47#define socketcall_cp __socketcall_cp
46#define socketcall(nm,a,b,c,d,e,f) __syscall_ret(__socketcall(nm,a,b,c,d,e,f))
47#define socketcall_cp(nm,a,b,c,d,e,f) __syscall_ret(__socketcall_cp(nm,a,b,c,d,e,f))
4848
4949#define __syscall_cp0(n) (__syscall_cp)(n,0,0,0,0,0,0)
5050#define __syscall_cp1(n,a) (__syscall_cp)(n,__scc(a),0,0,0,0,0)
......@@ -58,12 +58,12 @@ hidden long __syscall_ret(unsigned long),
5858#define syscall_cp(...) __syscall_ret(__syscall_cp(__VA_ARGS__))
5959
6060#ifndef SYSCALL_USE_SOCKETCALL
61#define __socketcall(nm,a,b,c,d,e,f) syscall(SYS_##nm, a, b, c, d, e, f)
62#define __socketcall_cp(nm,a,b,c,d,e,f) syscall_cp(SYS_##nm, a, b, c, d, e, f)
61#define __socketcall(nm,a,b,c,d,e,f) __syscall(SYS_##nm, a, b, c, d, e, f)
62#define __socketcall_cp(nm,a,b,c,d,e,f) __syscall_cp(SYS_##nm, a, b, c, d, e, f)
6363#else
64#define __socketcall(nm,a,b,c,d,e,f) syscall(SYS_socketcall, __SC_##nm, \
64#define __socketcall(nm,a,b,c,d,e,f) __syscall(SYS_socketcall, __SC_##nm, \
6565 ((long [6]){ (long)a, (long)b, (long)c, (long)d, (long)e, (long)f }))
66#define __socketcall_cp(nm,a,b,c,d,e,f) syscall_cp(SYS_socketcall, __SC_##nm, \
66#define __socketcall_cp(nm,a,b,c,d,e,f) __syscall_cp(SYS_socketcall, __SC_##nm, \
6767 ((long [6]){ (long)a, (long)b, (long)c, (long)d, (long)e, (long)f }))
6868#endif
6969
......@@ -193,6 +193,89 @@ hidden long __syscall_ret(unsigned long),
193193#define SYS_sendfile SYS_sendfile64
194194#endif
195195
196
197/* Ensure that the plain syscall names are defined even for "time64-only"
198 * archs. These facilitate callers passing null time arguments, and make
199 * tests for establishing which to use/fallback-to more consistent when
200 * they do need to be called with time arguments. */
201
202#ifndef SYS_clock_gettime
203#define SYS_clock_gettime SYS_clock_gettime64
204#endif
205
206#ifndef SYS_clock_settime
207#define SYS_clock_settime SYS_clock_settime64
208#endif
209
210#ifndef SYS_clock_adjtime
211#define SYS_clock_adjtime SYS_clock_adjtime64
212#endif
213
214#ifndef SYS_clock_getres
215#define SYS_clock_getres SYS_clock_getres_time64
216#endif
217
218#ifndef SYS_clock_nanosleep
219#define SYS_clock_nanosleep SYS_clock_nanosleep_time64
220#endif
221
222#ifndef SYS_timer_gettime
223#define SYS_timer_gettime SYS_timer_gettime64
224#endif
225
226#ifndef SYS_timer_settime
227#define SYS_timer_settime SYS_timer_settime64
228#endif
229
230#ifndef SYS_timerfd_gettime
231#define SYS_timerfd_gettime SYS_timerfd_gettime64
232#endif
233
234#ifndef SYS_timerfd_settime
235#define SYS_timerfd_settime SYS_timerfd_settime64
236#endif
237
238#ifndef SYS_utimensat
239#define SYS_utimensat SYS_utimensat_time64
240#endif
241
242#ifndef SYS_pselect6
243#define SYS_pselect6 SYS_pselect6_time64
244#endif
245
246#ifndef SYS_ppoll
247#define SYS_ppoll SYS_ppoll_time64
248#endif
249
250#ifndef SYS_recvmmsg
251#define SYS_recvmmsg SYS_recvmmsg_time64
252#endif
253
254#ifndef SYS_mq_timedsend
255#define SYS_mq_timedsend SYS_mq_timedsend_time64
256#endif
257
258#ifndef SYS_mq_timedreceive
259#define SYS_mq_timedreceive SYS_mq_timedreceive_time64
260#endif
261
262/* SYS_semtimedop omitted because SYS_ipc may provide it */
263
264#ifndef SYS_rt_sigtimedwait
265#define SYS_rt_sigtimedwait SYS_rt_sigtimedwait_time64
266#endif
267
268#ifndef SYS_futex
269#define SYS_futex SYS_futex_time64
270#endif
271
272#ifndef SYS_sched_rr_get_interval
273#define SYS_sched_rr_get_interval SYS_sched_rr_get_interval_time64
274#endif
275
276
277
278
196279/* socketcall calls */
197280
198281#define __SC_socket 1
......@@ -216,6 +299,20 @@ hidden long __syscall_ret(unsigned long),
216299#define __SC_recvmmsg 19
217300#define __SC_sendmmsg 20
218301
302#ifndef SO_RCVTIMEO_OLD
303#define SO_RCVTIMEO_OLD 20
304#endif
305#ifndef SO_SNDTIMEO_OLD
306#define SO_SNDTIMEO_OLD 21
307#endif
308
309#ifndef SIOCGSTAMP_OLD
310#define SIOCGSTAMP_OLD 0x8906
311#endif
312#ifndef SIOCGSTAMPNS_OLD
313#define SIOCGSTAMPNS_OLD 0x8907
314#endif
315
219316#ifdef SYS_open
220317#define __sys_open2(x,pn,fl) __syscall2(SYS_open, pn, (fl)|O_LARGEFILE)
221318#define __sys_open3(x,pn,fl,mo) __syscall3(SYS_open, pn, (fl)|O_LARGEFILE, mo)
lib/libc/musl/src/internal/version.h+1-1
......@@ -1 +1 @@
1#define VERSION "1.1.23"
1#define VERSION "1.1.24"
lib/libc/musl/src/ipc/ipc.h+12
......@@ -1,3 +1,5 @@
1#include "syscall.h"
2
13#define IPCOP_semop 1
24#define IPCOP_semget 2
35#define IPCOP_semctl 3
......@@ -10,3 +12,13 @@
1012#define IPCOP_shmdt 22
1113#define IPCOP_shmget 23
1214#define IPCOP_shmctl 24
15
16#ifndef IPC_64
17#define IPC_64 0x100
18#endif
19
20#define IPC_TIME64 (IPC_STAT & 0x100)
21
22#define IPC_CMD(cmd) (((cmd) & ~IPC_TIME64) | IPC_64)
23
24#define IPC_HILO(b,t) ((b)->t = (b)->__##t##_lo | 0LL+(b)->__##t##_hi<<32)
lib/libc/musl/src/ipc/msgctl.c+10-3
......@@ -18,17 +18,24 @@ int msgctl(int q, int cmd, struct msqid_ds *buf)
1818 }
1919#endif
2020#ifndef SYS_ipc
21 int r = __syscall(SYS_msgctl, q, cmd | IPC_64, buf);
21 int r = __syscall(SYS_msgctl, q, IPC_CMD(cmd), buf);
2222#else
23 int r = __syscall(SYS_ipc, IPCOP_msgctl, q, cmd | IPC_64, 0, buf, 0);
23 int r = __syscall(SYS_ipc, IPCOP_msgctl, q, IPC_CMD(cmd), 0, buf, 0);
2424#endif
2525#ifdef SYSCALL_IPC_BROKEN_MODE
26 if (r >= 0) switch (cmd) {
26 if (r >= 0) switch (cmd | IPC_TIME64) {
2727 case IPC_STAT:
2828 case MSG_STAT:
2929 case MSG_STAT_ANY:
3030 buf->msg_perm.mode >>= 16;
3131 }
32#endif
33#if IPC_TIME64
34 if (r >= 0 && (cmd&IPC_TIME64)) {
35 IPC_HILO(buf, msg_stime);
36 IPC_HILO(buf, msg_rtime);
37 IPC_HILO(buf, msg_ctime);
38 }
3239#endif
3340 return __syscall_ret(r);
3441}
lib/libc/musl/src/ipc/semctl.c+15-6
......@@ -18,9 +18,12 @@ int semctl(int id, int num, int cmd, ...)
1818{
1919 union semun arg = {0};
2020 va_list ap;
21 switch (cmd) {
22 case SETVAL: case GETALL: case SETALL: case IPC_STAT: case IPC_SET:
23 case IPC_INFO: case SEM_INFO: case SEM_STAT:
21 switch (cmd & ~IPC_TIME64) {
22 case SETVAL: case GETALL: case SETALL: case IPC_SET:
23 case IPC_INFO: case SEM_INFO:
24 case IPC_STAT & ~IPC_TIME64:
25 case SEM_STAT & ~IPC_TIME64:
26 case SEM_STAT_ANY & ~IPC_TIME64:
2427 va_start(ap, cmd);
2528 arg = va_arg(ap, union semun);
2629 va_end(ap);
......@@ -34,17 +37,23 @@ int semctl(int id, int num, int cmd, ...)
3437 }
3538#endif
3639#ifndef SYS_ipc
37 int r = __syscall(SYS_semctl, id, num, cmd | IPC_64, arg.buf);
40 int r = __syscall(SYS_semctl, id, num, IPC_CMD(cmd), arg.buf);
3841#else
39 int r = __syscall(SYS_ipc, IPCOP_semctl, id, num, cmd | IPC_64, &arg.buf);
42 int r = __syscall(SYS_ipc, IPCOP_semctl, id, num, IPC_CMD(cmd), &arg.buf);
4043#endif
4144#ifdef SYSCALL_IPC_BROKEN_MODE
42 if (r >= 0) switch (cmd) {
45 if (r >= 0) switch (cmd | IPC_TIME64) {
4346 case IPC_STAT:
4447 case SEM_STAT:
4548 case SEM_STAT_ANY:
4649 arg.buf->sem_perm.mode >>= 16;
4750 }
51#endif
52#if IPC_TIME64
53 if (r >= 0 && (cmd&IPC_TIME64)) {
54 IPC_HILO(arg.buf, sem_otime);
55 IPC_HILO(arg.buf, sem_ctime);
56 }
4857#endif
4958 return __syscall_ret(r);
5059}
lib/libc/musl/src/ipc/semtimedop.c+24-2
......@@ -1,13 +1,35 @@
11#define _GNU_SOURCE
22#include <sys/sem.h>
3#include <errno.h>
34#include "syscall.h"
45#include "ipc.h"
56
7#define IS32BIT(x) !((x)+0x80000000ULL>>32)
8#define CLAMP(x) (int)(IS32BIT(x) ? (x) : 0x7fffffffU+((0ULL+(x))>>63))
9
10#if !defined(SYS_semtimedop) && !defined(SYS_ipc)
11#define NO_TIME32 1
12#else
13#define NO_TIME32 0
14#endif
15
616int semtimedop(int id, struct sembuf *buf, size_t n, const struct timespec *ts)
717{
8#ifndef SYS_ipc
18#ifdef SYS_semtimedop_time64
19 time_t s = ts ? ts->tv_sec : 0;
20 long ns = ts ? ts->tv_nsec : 0;
21 int r = -ENOSYS;
22 if (NO_TIME32 || !IS32BIT(s))
23 r = __syscall(SYS_semtimedop_time64, id, buf, n,
24 ts ? ((long long[]){s, ns}) : 0);
25 if (NO_TIME32 || r!=-ENOSYS) return __syscall_ret(r);
26 ts = ts ? (void *)(long[]){CLAMP(s), ns} : 0;
27#endif
28#if defined(SYS_ipc)
29 return syscall(SYS_ipc, IPCOP_semtimedop, id, n, 0, buf, ts);
30#elif defined(SYS_semtimedop)
931 return syscall(SYS_semtimedop, id, buf, n, ts);
1032#else
11 return syscall(SYS_ipc, IPCOP_semtimedop, id, n, 0, buf, ts);
33 return __syscall_ret(-ENOSYS);
1234#endif
1335}
lib/libc/musl/src/ipc/shmctl.c+10-3
......@@ -18,17 +18,24 @@ int shmctl(int id, int cmd, struct shmid_ds *buf)
1818 }
1919#endif
2020#ifndef SYS_ipc
21 int r = __syscall(SYS_shmctl, id, cmd | IPC_64, buf);
21 int r = __syscall(SYS_shmctl, id, IPC_CMD(cmd), buf);
2222#else
23 int r = __syscall(SYS_ipc, IPCOP_shmctl, id, cmd | IPC_64, 0, buf, 0);
23 int r = __syscall(SYS_ipc, IPCOP_shmctl, id, IPC_CMD(cmd), 0, buf, 0);
2424#endif
2525#ifdef SYSCALL_IPC_BROKEN_MODE
26 if (r >= 0) switch (cmd) {
26 if (r >= 0) switch (cmd | IPC_TIME64) {
2727 case IPC_STAT:
2828 case SHM_STAT:
2929 case SHM_STAT_ANY:
3030 buf->shm_perm.mode >>= 16;
3131 }
32#endif
33#if IPC_TIME64
34 if (r >= 0 && (cmd&IPC_TIME64)) {
35 IPC_HILO(buf, shm_atime);
36 IPC_HILO(buf, shm_dtime);
37 IPC_HILO(buf, shm_ctime);
38 }
3239#endif
3340 return __syscall_ret(r);
3441}
lib/libc/musl/src/ldso/aarch64/tlsdesc.s+1-5
......@@ -9,15 +9,11 @@ __tlsdesc_static:
99 ldr x0,[x0,#8]
1010 ret
1111
12.hidden __tls_get_new
13
1412// size_t __tlsdesc_dynamic(size_t *a)
1513// {
1614// struct {size_t modidx,off;} *p = (void*)a[1];
1715// size_t *dtv = *(size_t**)(tp - 8);
18// if (p->modidx <= dtv[0])
19// return dtv[p->modidx] + p->off - tp;
20// return __tls_get_new(p) - tp;
16// return dtv[p->modidx] + p->off - tp;
2117// }
2218.global __tlsdesc_dynamic
2319.hidden __tlsdesc_dynamic
lib/libc/musl/src/ldso/arm/tlsdesc.S+4-2
......@@ -8,8 +8,6 @@ __tlsdesc_static:
88 ldr r0,[r0]
99 bx lr
1010
11.hidden __tls_get_new
12
1311.global __tlsdesc_dynamic
1412.hidden __tlsdesc_dynamic
1513.type __tlsdesc_dynamic,%function
......@@ -29,8 +27,12 @@ __tlsdesc_dynamic:
29272:
3028#if __ARM_ARCH >= 5
3129 blx r0 // r0 = tp
30#else
31#if __thumb__
32 add lr,pc,#1
3233#else
3334 mov lr,pc
35#endif
3436 bx r0
3537#endif
3638#endif
lib/libc/musl/src/ldso/i386/tlsdesc.s-2
......@@ -6,8 +6,6 @@ __tlsdesc_static:
66 mov 4(%eax),%eax
77 ret
88
9.hidden __tls_get_new
10
119.global __tlsdesc_dynamic
1210.hidden __tlsdesc_dynamic
1311.type __tlsdesc_dynamic,@function
lib/libc/musl/src/ldso/x86_64/tlsdesc.s-2
......@@ -6,8 +6,6 @@ __tlsdesc_static:
66 mov 8(%rax),%rax
77 ret
88
9.hidden __tls_get_new
10
119.global __tlsdesc_dynamic
1210.hidden __tlsdesc_dynamic
1311.type __tlsdesc_dynamic,@function
lib/libc/musl/src/linux/adjtime.c+1-1
......@@ -15,7 +15,7 @@ int adjtime(const struct timeval *in, struct timeval *out)
1515 tx.offset = in->tv_sec*1000000 + in->tv_usec;
1616 tx.modes = ADJ_OFFSET_SINGLESHOT;
1717 }
18 if (syscall(SYS_adjtimex, &tx) < 0) return -1;
18 if (adjtimex(&tx) < 0) return -1;
1919 if (out) {
2020 out->tv_sec = tx.offset / 1000000;
2121 if ((out->tv_usec = tx.offset % 1000000) < 0) {
lib/libc/musl/src/linux/adjtimex.c+2-2
......@@ -1,7 +1,7 @@
11#include <sys/timex.h>
2#include "syscall.h"
2#include <time.h>
33
44int adjtimex(struct timex *tx)
55{
6 return syscall(SYS_adjtimex, tx);
6 return clock_adjtime(CLOCK_REALTIME, tx);
77}
lib/libc/musl/src/linux/clock_adjtime.c+112
......@@ -1,7 +1,119 @@
11#include <sys/timex.h>
2#include <time.h>
3#include <errno.h>
24#include "syscall.h"
35
6#define IS32BIT(x) !((x)+0x80000000ULL>>32)
7
8struct ktimex64 {
9 unsigned modes;
10 int :32;
11 long long offset, freq, maxerror, esterror;
12 int status;
13 int :32;
14 long long constant, precision, tolerance;
15 long long time_sec, time_usec;
16 long long tick, ppsfreq, jitter;
17 int shift;
18 int :32;
19 long long stabil, jitcnt, calcnt, errcnt, stbcnt;
20 int tai;
21 int __padding[11];
22};
23
24struct ktimex {
25 unsigned modes;
26 long offset, freq, maxerror, esterror;
27 int status;
28 long constant, precision, tolerance;
29 long time_sec, time_usec;
30 long tick, ppsfreq, jitter;
31 int shift;
32 long stabil, jitcnt, calcnt, errcnt, stbcnt;
33 int tai;
34 int __padding[11];
35};
36
437int clock_adjtime (clockid_t clock_id, struct timex *utx)
538{
39 int r = -ENOSYS;
40#ifdef SYS_clock_adjtime64
41 if (SYS_clock_adjtime == SYS_clock_adjtime64 ||
42 (utx->modes & ADJ_SETOFFSET) && !IS32BIT(utx->time.tv_sec)) {
43 struct ktimex64 ktx = {
44 .modes = utx->modes,
45 .offset = utx->offset,
46 .freq = utx->freq,
47 .maxerror = utx->maxerror,
48 .esterror = utx->esterror,
49 .status = utx->status,
50 .constant = utx->constant,
51 .precision = utx->precision,
52 .tolerance = utx->tolerance,
53 .time_sec = utx->time.tv_sec,
54 .time_usec = utx->time.tv_usec,
55 .tick = utx->tick,
56 .ppsfreq = utx->ppsfreq,
57 .jitter = utx->jitter,
58 .shift = utx->shift,
59 .stabil = utx->stabil,
60 .jitcnt = utx->jitcnt,
61 .calcnt = utx->calcnt,
62 .errcnt = utx->errcnt,
63 .stbcnt = utx->stbcnt,
64 .tai = utx->tai,
65 };
66 r = __syscall(SYS_clock_adjtime, clock_id, &ktx);
67 if (r>=0) {
68 utx->modes = ktx.modes;
69 utx->offset = ktx.offset;
70 utx->freq = ktx.freq;
71 utx->maxerror = ktx.maxerror;
72 utx->esterror = ktx.esterror;
73 utx->status = ktx.status;
74 utx->constant = ktx.constant;
75 utx->precision = ktx.precision;
76 utx->tolerance = ktx.tolerance;
77 utx->time.tv_sec = ktx.time_sec;
78 utx->time.tv_usec = ktx.time_usec;
79 utx->tick = ktx.tick;
80 utx->ppsfreq = ktx.ppsfreq;
81 utx->jitter = ktx.jitter;
82 utx->shift = ktx.shift;
83 utx->stabil = ktx.stabil;
84 utx->jitcnt = ktx.jitcnt;
85 utx->calcnt = ktx.calcnt;
86 utx->errcnt = ktx.errcnt;
87 utx->stbcnt = ktx.stbcnt;
88 utx->tai = ktx.tai;
89 }
90 }
91 if (SYS_clock_adjtime == SYS_clock_adjtime64 || r!=-ENOSYS)
92 return __syscall_ret(r);
93 if ((utx->modes & ADJ_SETOFFSET) && !IS32BIT(utx->time.tv_sec))
94 return __syscall_ret(-ENOTSUP);
95#endif
96 if (sizeof(time_t) > sizeof(long)) {
97 union {
98 struct timex utx;
99 struct ktimex ktx;
100 } u = { *utx };
101 u.ktx.time_sec = utx->time.tv_sec;
102 u.ktx.time_usec = utx->time.tv_usec;
103#ifdef SYS_adjtimex
104 if (clock_id==CLOCK_REALTIME) r = __syscall(SYS_adjtimex, &u);
105 else
106#endif
107 r = __syscall(SYS_clock_adjtime, clock_id, &u);
108 if (r>=0) {
109 *utx = u.utx;
110 utx->time.tv_sec = u.ktx.time_sec;
111 utx->time.tv_usec = u.ktx.time_usec;
112 }
113 return __syscall_ret(r);
114 }
115#ifdef SYS_adjtimex
116 if (clock_id==CLOCK_REALTIME) return syscall(SYS_adjtimex, utx);
117#endif
6118 return syscall(SYS_clock_adjtime, clock_id, utx);
7119}
lib/libc/musl/src/linux/copy_file_range.c created+8
......@@ -0,0 +1,8 @@
1#define _GNU_SOURCE
2#include <unistd.h>
3#include "syscall.h"
4
5ssize_t copy_file_range(int fd_in, off_t *off_in, int fd_out, off_t *off_out, size_t len, unsigned flags)
6{
7 return syscall(SYS_copy_file_range, fd_in, off_in, fd_out, off_out, len, flags);
8}
lib/libc/musl/src/linux/ppoll.c+17-1
......@@ -1,10 +1,26 @@
11#define _GNU_SOURCE
22#include <poll.h>
33#include <signal.h>
4#include <errno.h>
45#include "syscall.h"
56
7#define IS32BIT(x) !((x)+0x80000000ULL>>32)
8#define CLAMP(x) (int)(IS32BIT(x) ? (x) : 0x7fffffffU+((0ULL+(x))>>63))
9
610int ppoll(struct pollfd *fds, nfds_t n, const struct timespec *to, const sigset_t *mask)
711{
12 time_t s = to ? to->tv_sec : 0;
13 long ns = to ? to->tv_nsec : 0;
14#ifdef SYS_ppoll_time64
15 int r = -ENOSYS;
16 if (SYS_ppoll == SYS_ppoll_time64 || !IS32BIT(s))
17 r = __syscall_cp(SYS_ppoll_time64, fds, n,
18 to ? ((long long[]){s, ns}) : 0,
19 mask, _NSIG/8);
20 if (SYS_ppoll == SYS_ppoll_time64 || r != -ENOSYS)
21 return __syscall_ret(r);
22 s = CLAMP(s);
23#endif
824 return syscall_cp(SYS_ppoll, fds, n,
9 to ? (struct timespec []){*to} : 0, mask, _NSIG/8);
25 to ? ((long[]){s, ns}) : 0, mask, _NSIG/8);
1026}
lib/libc/musl/src/linux/settimeofday.c+6-1
......@@ -1,8 +1,13 @@
11#define _BSD_SOURCE
22#include <sys/time.h>
3#include <time.h>
4#include <errno.h>
35#include "syscall.h"
46
57int settimeofday(const struct timeval *tv, const struct timezone *tz)
68{
7 return syscall(SYS_settimeofday, tv, 0);
9 if (!tv) return 0;
10 if (tv->tv_usec >= 1000000ULL) return __syscall_ret(-EINVAL);
11 return clock_settime(CLOCK_REALTIME, &((struct timespec){
12 .tv_sec = tv->tv_sec, .tv_nsec = tv->tv_usec * 1000}));
813}
lib/libc/musl/src/linux/timerfd.c+42
......@@ -1,6 +1,9 @@
11#include <sys/timerfd.h>
2#include <errno.h>
23#include "syscall.h"
34
5#define IS32BIT(x) !((x)+0x80000000ULL>>32)
6
47int timerfd_create(int clockid, int flags)
58{
69 return syscall(SYS_timerfd_create, clockid, flags);
......@@ -8,10 +11,49 @@ int timerfd_create(int clockid, int flags)
811
912int timerfd_settime(int fd, int flags, const struct itimerspec *new, struct itimerspec *old)
1013{
14#ifdef SYS_timerfd_settime64
15 time_t is = new->it_interval.tv_sec, vs = new->it_value.tv_sec;
16 long ins = new->it_interval.tv_nsec, vns = new->it_value.tv_nsec;
17 int r = -ENOSYS;
18 if (SYS_timerfd_settime == SYS_timerfd_settime64
19 || !IS32BIT(is) || !IS32BIT(vs) || (sizeof(time_t)>4 && old))
20 r = __syscall(SYS_timerfd_settime64, fd, flags,
21 ((long long[]){is, ins, vs, vns}), old);
22 if (SYS_timerfd_settime == SYS_timerfd_settime64 || r!=-ENOSYS)
23 return __syscall_ret(r);
24 if (!IS32BIT(is) || !IS32BIT(vs))
25 return __syscall_ret(-ENOTSUP);
26 long old32[4];
27 r = __syscall(SYS_timerfd_settime, fd, flags,
28 ((long[]){is, ins, vs, vns}), old32);
29 if (!r && old) {
30 old->it_interval.tv_sec = old32[0];
31 old->it_interval.tv_nsec = old32[1];
32 old->it_value.tv_sec = old32[2];
33 old->it_value.tv_nsec = old32[3];
34 }
35 return __syscall_ret(r);
36#endif
1137 return syscall(SYS_timerfd_settime, fd, flags, new, old);
1238}
1339
1440int timerfd_gettime(int fd, struct itimerspec *cur)
1541{
42#ifdef SYS_timerfd_gettime64
43 int r = -ENOSYS;
44 if (sizeof(time_t) > 4)
45 r = __syscall(SYS_timerfd_gettime64, fd, cur);
46 if (SYS_timerfd_gettime == SYS_timerfd_gettime64 || r!=-ENOSYS)
47 return __syscall_ret(r);
48 long cur32[4];
49 r = __syscall(SYS_timerfd_gettime, fd, cur32);
50 if (!r) {
51 cur->it_interval.tv_sec = cur32[0];
52 cur->it_interval.tv_nsec = cur32[1];
53 cur->it_value.tv_sec = cur32[2];
54 cur->it_value.tv_nsec = cur32[3];
55 }
56 return __syscall_ret(r);
57#endif
1658 return syscall(SYS_timerfd_gettime, fd, cur);
1759}
lib/libc/musl/src/locale/catclose.c+8
......@@ -1,6 +1,14 @@
1#define _BSD_SOURCE
12#include <nl_types.h>
3#include <stdint.h>
4#include <endian.h>
5#include <sys/mman.h>
6
7#define V(p) be32toh(*(uint32_t *)(p))
28
39int catclose (nl_catd catd)
410{
11 char *map = (char *)catd;
12 munmap(map, V(map+8)+20);
513 return 0;
614}
lib/libc/musl/src/locale/catgets.c+33-1
......@@ -1,6 +1,38 @@
1#define _BSD_SOURCE
12#include <nl_types.h>
3#include <endian.h>
4#include <stdlib.h>
5#include <stdint.h>
6#include <errno.h>
7
8#define V(p) be32toh(*(uint32_t *)(p))
9
10static int cmp(const void *a, const void *b)
11{
12 uint32_t x = V(a), y = V(b);
13 return x<y ? -1 : x>y ? 1 : 0;
14}
215
316char *catgets (nl_catd catd, int set_id, int msg_id, const char *s)
417{
5 return (char *)s;
18 const char *map = (const char *)catd;
19 uint32_t nsets = V(map+4);
20 const char *sets = map+20;
21 const char *msgs = map+20+V(map+12);
22 const char *strings = map+20+V(map+16);
23 uint32_t set_id_be = htobe32(set_id);
24 uint32_t msg_id_be = htobe32(msg_id);
25 const char *set = bsearch(&set_id_be, sets, nsets, 12, cmp);
26 if (!set) {
27 errno = ENOMSG;
28 return (char *)s;
29 }
30 uint32_t nmsgs = V(set+4);
31 msgs += 12*V(set+8);
32 const char *msg = bsearch(&msg_id_be, msgs, nmsgs, 12, cmp);
33 if (!msg) {
34 errno = ENOMSG;
35 return (char *)s;
36 }
37 return (char *)(strings + V(msg+8));
638}
lib/libc/musl/src/locale/catopen.c+73-2
......@@ -1,8 +1,79 @@
1#define _BSD_SOURCE
12#include <nl_types.h>
3#include <string.h>
4#include <stdint.h>
5#include <endian.h>
26#include <errno.h>
7#include <langinfo.h>
8#include <locale.h>
9#include <sys/mman.h>
10#include "libc.h"
311
4nl_catd catopen (const char *name, int oflag)
12#define V(p) be32toh(*(uint32_t *)(p))
13
14static nl_catd do_catopen(const char *name)
15{
16 size_t size;
17 const unsigned char *map = __map_file(name, &size);
18 /* Size recorded in the file must match file size; otherwise
19 * the information needed to unmap the file will be lost. */
20 if (!map || V(map) != 0xff88ff89 || 20+V(map+8) != size) {
21 if(map) munmap((void *)map, size);
22 errno = ENOENT;
23 return (nl_catd)-1;
24 }
25 return (nl_catd)map;
26}
27
28nl_catd catopen(const char *name, int oflag)
529{
6 errno = EOPNOTSUPP;
30 nl_catd catd;
31
32 if (strchr(name, '/')) return do_catopen(name);
33
34 char buf[PATH_MAX];
35 size_t i;
36 const char *path, *lang, *p, *z;
37 if (libc.secure || !(path = getenv("NLSPATH"))) {
38 errno = ENOENT;
39 return (nl_catd)-1;
40 }
41 lang = oflag ? nl_langinfo(_NL_LOCALE_NAME(LC_MESSAGES)) : getenv("LANG");
42 if (!lang) lang = "";
43 for (p=path; *p; p=z) {
44 i = 0;
45 z = __strchrnul(p, ':');
46 for (; p<z; p++) {
47 const char *v;
48 size_t l;
49 if (*p!='%') v=p, l=1;
50 else switch (*++p) {
51 case 'N': v=name; l=strlen(v); break;
52 case 'L': v=lang; l=strlen(v); break;
53 case 'l': v=lang; l=strcspn(v,"_.@"); break;
54 case 't':
55 v=__strchrnul(lang,'_');
56 if (*v) v++;
57 l=strcspn(v,".@");
58 break;
59 case 'c': v="UTF-8"; l=5; break;
60 case '%': v="%"; l=1; break;
61 default: v=0;
62 }
63 if (!v || l >= sizeof buf - i) {
64 break;
65 }
66 memcpy(buf+i, v, l);
67 i += l;
68 }
69 if (!*z && (p<z || !i)) break;
70 if (p<z) continue;
71 if (*z) z++;
72 buf[i] = 0;
73 /* Leading : or :: in NLSPATH is same as %N */
74 catd = do_catopen(i ? buf : name);
75 if (catd != (nl_catd)-1) return catd;
76 }
77 errno = ENOENT;
778 return (nl_catd)-1;
879}
lib/libc/musl/src/math/i386/asin.s+2-8
......@@ -7,13 +7,10 @@ asinf:
77 cmp $0x01000000,%eax
88 jae 1f
99 # subnormal x, return x with underflow
10 fnstsw %ax
11 and $16,%ax
12 jnz 2f
1310 fld %st(0)
1411 fmul %st(1)
1512 fstps 4(%esp)
162: ret
13 ret
1714
1815.global asinl
1916.type asinl,@function
......@@ -30,11 +27,8 @@ asin:
3027 cmp $0x00200000,%eax
3128 jae 1f
3229 # subnormal x, return x with underflow
33 fnstsw %ax
34 and $16,%ax
35 jnz 2f
3630 fsts 4(%esp)
372: ret
31 ret
38321: fld %st(0)
3933 fld1
4034 fsub %st(0),%st(1)
lib/libc/musl/src/math/i386/atan.s+2-5
......@@ -10,8 +10,5 @@ atan:
1010 fpatan
1111 ret
1212 # subnormal x, return x with underflow
131: fnstsw %ax
14 and $16,%ax
15 jnz 2f
16 fsts 4(%esp)
172: ret
131: fsts 4(%esp)
14 ret
lib/libc/musl/src/math/i386/atan2.s-3
......@@ -10,8 +10,5 @@ atan2:
1010 cmp $0x00200000,%eax
1111 jae 1f
1212 # subnormal x, return x with underflow
13 fnstsw %ax
14 and $16,%ax
15 jnz 1f
1613 fsts 4(%esp)
17141: ret
lib/libc/musl/src/math/i386/atan2f.s-3
......@@ -10,9 +10,6 @@ atan2f:
1010 cmp $0x01000000,%eax
1111 jae 1f
1212 # subnormal x, return x with underflow
13 fnstsw %ax
14 and $16,%ax
15 jnz 1f
1613 fld %st(0)
1714 fmul %st(1)
1815 fstps 4(%esp)
lib/libc/musl/src/math/i386/atanf.s+2-5
......@@ -10,10 +10,7 @@ atanf:
1010 fpatan
1111 ret
1212 # subnormal x, return x with underflow
131: fnstsw %ax
14 and $16,%ax
15 jnz 2f
16 fld %st(0)
131: fld %st(0)
1714 fmul %st(1)
1815 fstps 4(%esp)
192: ret
16 ret
lib/libc/musl/src/math/i386/exp.s+2-8
......@@ -7,13 +7,10 @@ expm1f:
77 cmp $0x01000000,%eax
88 jae 1f
99 # subnormal x, return x with underflow
10 fnstsw %ax
11 and $16,%ax
12 jnz 2f
1310 fld %st(0)
1411 fmul %st(1)
1512 fstps 4(%esp)
162: ret
13 ret
1714
1815.global expm1l
1916.type expm1l,@function
......@@ -30,11 +27,8 @@ expm1:
3027 cmp $0x00200000,%eax
3128 jae 1f
3229 # subnormal x, return x with underflow
33 fnstsw %ax
34 and $16,%ax
35 jnz 2f
3630 fsts 4(%esp)
372: ret
31 ret
38321: fldl2e
3933 fmulp
4034 mov $0xc2820000,%eax
lib/libc/musl/src/math/i386/log1p.s+2-5
......@@ -16,9 +16,6 @@ log1p:
1616 fyl2x
1717 ret
1818 # subnormal x, return x with underflow
192: fnstsw %ax
20 and $16,%ax
21 jnz 1f
22 fsts 4(%esp)
192: fsts 4(%esp)
2320 fstp %st(1)
241: ret
21 ret
lib/libc/musl/src/math/i386/log1pf.s+2-5
......@@ -16,10 +16,7 @@ log1pf:
1616 fyl2x
1717 ret
1818 # subnormal x, return x with underflow
192: fnstsw %ax
20 and $16,%ax
21 jnz 1f
22 fxch
192: fxch
2320 fmul %st(1)
2421 fstps 4(%esp)
251: ret
22 ret
lib/libc/musl/src/math/lrint.c+27-1
......@@ -1,5 +1,6 @@
11#include <limits.h>
22#include <fenv.h>
3#include <math.h>
34#include "libm.h"
45
56/*
......@@ -26,7 +27,18 @@ as a double.
2627*/
2728
2829#if LONG_MAX < 1U<<53 && defined(FE_INEXACT)
29long lrint(double x)
30#include <float.h>
31#include <stdint.h>
32#if FLT_EVAL_METHOD==0 || FLT_EVAL_METHOD==1
33#define EPS DBL_EPSILON
34#elif FLT_EVAL_METHOD==2
35#define EPS LDBL_EPSILON
36#endif
37#ifdef __GNUC__
38/* avoid stack frame in lrint */
39__attribute__((noinline))
40#endif
41static long lrint_slow(double x)
3042{
3143 #pragma STDC FENV_ACCESS ON
3244 int e;
......@@ -38,6 +50,20 @@ long lrint(double x)
3850 /* conversion */
3951 return x;
4052}
53
54long lrint(double x)
55{
56 uint32_t abstop = asuint64(x)>>32 & 0x7fffffff;
57 uint64_t sign = asuint64(x) & (1ULL << 63);
58
59 if (abstop < 0x41dfffff) {
60 /* |x| < 0x7ffffc00, no overflow */
61 double_t toint = asdouble(asuint64(1/EPS) | sign);
62 double_t y = x + toint - toint;
63 return (long)y;
64 }
65 return lrint_slow(x);
66}
4167#else
4268long lrint(double x)
4369{
lib/libc/musl/src/math/sqrt.c+1-2
......@@ -179,7 +179,6 @@ double sqrt(double x)
179179 ix1 = q1>>1;
180180 if (q&1)
181181 ix1 |= sign;
182 ix0 += m << 20;
183 INSERT_WORDS(z, ix0, ix1);
182 INSERT_WORDS(z, ix0 + ((uint32_t)m << 20), ix1);
184183 return z;
185184}
lib/libc/musl/src/math/sqrtf.c+1-2
......@@ -78,7 +78,6 @@ float sqrtf(float x)
7878 }
7979 }
8080 ix = (q>>1) + 0x3f000000;
81 ix += m << 23;
82 SET_FLOAT_WORD(z, ix);
81 SET_FLOAT_WORD(z, ix + ((uint32_t)m << 23));
8382 return z;
8483}
lib/libc/musl/src/misc/getopt.c+1
......@@ -1,3 +1,4 @@
1#define _BSD_SOURCE
12#include <unistd.h>
23#include <wchar.h>
34#include <string.h>
lib/libc/musl/src/misc/ioctl.c+24-1
......@@ -1,5 +1,8 @@
11#include <sys/ioctl.h>
22#include <stdarg.h>
3#include <errno.h>
4#include <time.h>
5#include <sys/time.h>
36#include "syscall.h"
47
58int ioctl(int fd, int req, ...)
......@@ -9,5 +12,25 @@ int ioctl(int fd, int req, ...)
912 va_start(ap, req);
1013 arg = va_arg(ap, void *);
1114 va_end(ap);
12 return syscall(SYS_ioctl, fd, req, arg);
15 int r = __syscall(SYS_ioctl, fd, req, arg);
16 if (r==-ENOTTY) switch (req) {
17 case SIOCGSTAMP:
18 case SIOCGSTAMPNS:
19 if (SIOCGSTAMP==SIOCGSTAMP_OLD) break;
20 if (req==SIOCGSTAMP) req=SIOCGSTAMP_OLD;
21 if (req==SIOCGSTAMPNS) req=SIOCGSTAMPNS_OLD;
22 long t32[2];
23 r = __syscall(SYS_ioctl, fd, req, t32);
24 if (r<0) break;
25 if (req==SIOCGSTAMP_OLD) {
26 struct timeval *tv = arg;
27 tv->tv_sec = t32[0];
28 tv->tv_usec = t32[1];
29 } else {
30 struct timespec *ts = arg;
31 ts->tv_sec = t32[0];
32 ts->tv_nsec = t32[1];
33 }
34 }
35 return __syscall_ret(r);
1336}
lib/libc/musl/src/mq/mq_timedreceive.c+17
......@@ -1,7 +1,24 @@
11#include <mqueue.h>
2#include <errno.h>
23#include "syscall.h"
34
5#define IS32BIT(x) !((x)+0x80000000ULL>>32)
6#define CLAMP(x) (int)(IS32BIT(x) ? (x) : 0x7fffffffU+((0ULL+(x))>>63))
7
48ssize_t mq_timedreceive(mqd_t mqd, char *restrict msg, size_t len, unsigned *restrict prio, const struct timespec *restrict at)
59{
10#ifdef SYS_mq_timedreceive_time64
11 time_t s = at ? at->tv_sec : 0;
12 long ns = at ? at->tv_nsec : 0;
13 long r = -ENOSYS;
14 if (SYS_mq_timedreceive == SYS_mq_timedreceive_time64 || !IS32BIT(s))
15 r = __syscall_cp(SYS_mq_timedreceive_time64, mqd, msg, len, prio,
16 at ? ((long long []){at->tv_sec, at->tv_nsec}) : 0);
17 if (SYS_mq_timedreceive == SYS_mq_timedreceive_time64 || r != -ENOSYS)
18 return __syscall_ret(r);
19 return syscall_cp(SYS_mq_timedreceive, mqd, msg, len, prio,
20 at ? ((long[]){CLAMP(s), ns}) : 0);
21#else
622 return syscall_cp(SYS_mq_timedreceive, mqd, msg, len, prio, at);
23#endif
724}
lib/libc/musl/src/mq/mq_timedsend.c+17
......@@ -1,7 +1,24 @@
11#include <mqueue.h>
2#include <errno.h>
23#include "syscall.h"
34
5#define IS32BIT(x) !((x)+0x80000000ULL>>32)
6#define CLAMP(x) (int)(IS32BIT(x) ? (x) : 0x7fffffffU+((0ULL+(x))>>63))
7
48int mq_timedsend(mqd_t mqd, const char *msg, size_t len, unsigned prio, const struct timespec *at)
59{
10#ifdef SYS_mq_timedsend_time64
11 time_t s = at ? at->tv_sec : 0;
12 long ns = at ? at->tv_nsec : 0;
13 long r = -ENOSYS;
14 if (SYS_mq_timedsend == SYS_mq_timedsend_time64 || !IS32BIT(s))
15 r = __syscall_cp(SYS_mq_timedsend_time64, mqd, msg, len, prio,
16 at ? ((long long []){at->tv_sec, at->tv_nsec}) : 0);
17 if (SYS_mq_timedsend == SYS_mq_timedsend_time64 || r != -ENOSYS)
18 return __syscall_ret(r);
19 return syscall_cp(SYS_mq_timedsend, mqd, msg, len, prio,
20 at ? ((long[]){CLAMP(s), ns}) : 0);
21#else
622 return syscall_cp(SYS_mq_timedsend, mqd, msg, len, prio, at);
23#endif
724}
lib/libc/musl/src/multibyte/mbsrtowcs.c+8-2
......@@ -38,12 +38,15 @@ size_t mbsrtowcs(wchar_t *restrict ws, const char **restrict src, size_t wn, mbs
3838 }
3939
4040 if (!ws) for (;;) {
41#ifdef __GNUC__
42 typedef uint32_t __attribute__((__may_alias__)) w32;
4143 if (*s-1u < 0x7f && (uintptr_t)s%4 == 0) {
42 while (!(( *(uint32_t*)s | *(uint32_t*)s-0x01010101) & 0x80808080)) {
44 while (!(( *(w32*)s | *(w32*)s-0x01010101) & 0x80808080)) {
4345 s += 4;
4446 wn -= 4;
4547 }
4648 }
49#endif
4750 if (*s-1u < 0x7f) {
4851 s++;
4952 wn--;
......@@ -69,8 +72,10 @@ resume0:
6972 *src = (const void *)s;
7073 return wn0;
7174 }
75#ifdef __GNUC__
76 typedef uint32_t __attribute__((__may_alias__)) w32;
7277 if (*s-1u < 0x7f && (uintptr_t)s%4 == 0) {
73 while (wn>=5 && !(( *(uint32_t*)s | *(uint32_t*)s-0x01010101) & 0x80808080)) {
78 while (wn>=5 && !(( *(w32*)s | *(w32*)s-0x01010101) & 0x80808080)) {
7479 *ws++ = *s++;
7580 *ws++ = *s++;
7681 *ws++ = *s++;
......@@ -78,6 +83,7 @@ resume0:
7883 wn -= 4;
7984 }
8085 }
86#endif
8187 if (*s-1u < 0x7f) {
8288 *ws++ = *s++;
8389 wn--;
lib/libc/musl/src/network/getsockopt.c+26-1
......@@ -1,7 +1,32 @@
11#include <sys/socket.h>
2#include <sys/time.h>
3#include <errno.h>
24#include "syscall.h"
35
46int getsockopt(int fd, int level, int optname, void *restrict optval, socklen_t *restrict optlen)
57{
6 return socketcall(getsockopt, fd, level, optname, optval, optlen, 0);
8 long tv32[2];
9 struct timeval *tv;
10
11 int r = __socketcall(getsockopt, fd, level, optname, optval, optlen, 0);
12
13 if (r==-ENOPROTOOPT) switch (level) {
14 case SOL_SOCKET:
15 switch (optname) {
16 case SO_RCVTIMEO:
17 case SO_SNDTIMEO:
18 if (SO_RCVTIMEO == SO_RCVTIMEO_OLD) break;
19 if (*optlen < sizeof *tv) return __syscall_ret(-EINVAL);
20 if (optname==SO_RCVTIMEO) optname=SO_RCVTIMEO_OLD;
21 if (optname==SO_SNDTIMEO) optname=SO_SNDTIMEO_OLD;
22 r = __socketcall(getsockopt, fd, level, optname,
23 tv32, (socklen_t[]){sizeof tv32}, 0);
24 if (r<0) break;
25 tv = optval;
26 tv->tv_sec = tv32[0];
27 tv->tv_usec = tv32[1];
28 *optlen = sizeof *tv;
29 }
30 }
31 return __syscall_ret(r);
732}
lib/libc/musl/src/network/recvmmsg.c+18
......@@ -1,8 +1,13 @@
11#define _GNU_SOURCE
22#include <sys/socket.h>
33#include <limits.h>
4#include <errno.h>
5#include <time.h>
46#include "syscall.h"
57
8#define IS32BIT(x) !((x)+0x80000000ULL>>32)
9#define CLAMP(x) (int)(IS32BIT(x) ? (x) : 0x7fffffffU+((0ULL+(x))>>63))
10
611int recvmmsg(int fd, struct mmsghdr *msgvec, unsigned int vlen, unsigned int flags, struct timespec *timeout)
712{
813#if LONG_MAX > INT_MAX
......@@ -11,5 +16,18 @@ int recvmmsg(int fd, struct mmsghdr *msgvec, unsigned int vlen, unsigned int fla
1116 for (i = vlen; i; i--, mh++)
1217 mh->msg_hdr.__pad1 = mh->msg_hdr.__pad2 = 0;
1318#endif
19#ifdef SYS_recvmmsg_time64
20 time_t s = timeout ? timeout->tv_sec : 0;
21 long ns = timeout ? timeout->tv_nsec : 0;
22 int r = -ENOSYS;
23 if (SYS_recvmmsg == SYS_recvmmsg_time64 || !IS32BIT(s))
24 r = __syscall_cp(SYS_recvmmsg_time64, fd, msgvec, vlen, flags,
25 timeout ? ((long long[]){s, ns}) : 0);
26 if (SYS_recvmmsg == SYS_recvmmsg_time64 || r!=-ENOSYS)
27 return __syscall_ret(r);
28 return syscall_cp(SYS_recvmmsg, fd, msgvec, vlen, flags,
29 timeout ? ((long[]){CLAMP(s), ns}) : 0);
30#else
1431 return syscall_cp(SYS_recvmmsg, fd, msgvec, vlen, flags, timeout);
32#endif
1533}
lib/libc/musl/src/network/setsockopt.c+31-1
......@@ -1,7 +1,37 @@
11#include <sys/socket.h>
2#include <sys/time.h>
3#include <errno.h>
24#include "syscall.h"
35
6#define IS32BIT(x) !((x)+0x80000000ULL>>32)
7#define CLAMP(x) (int)(IS32BIT(x) ? (x) : 0x7fffffffU+((0ULL+(x))>>63))
8
49int setsockopt(int fd, int level, int optname, const void *optval, socklen_t optlen)
510{
6 return socketcall(setsockopt, fd, level, optname, optval, optlen, 0);
11 const struct timeval *tv;
12 time_t s;
13 suseconds_t us;
14
15 int r = __socketcall(setsockopt, fd, level, optname, optval, optlen, 0);
16
17 if (r==-ENOPROTOOPT) switch (level) {
18 case SOL_SOCKET:
19 switch (optname) {
20 case SO_RCVTIMEO:
21 case SO_SNDTIMEO:
22 if (SO_RCVTIMEO == SO_RCVTIMEO_OLD) break;
23 if (optlen < sizeof *tv) return __syscall_ret(-EINVAL);
24 tv = optval;
25 s = tv->tv_sec;
26 us = tv->tv_usec;
27 if (!IS32BIT(s)) return __syscall_ret(-ENOTSUP);
28
29 if (optname==SO_RCVTIMEO) optname=SO_RCVTIMEO_OLD;
30 if (optname==SO_SNDTIMEO) optname=SO_SNDTIMEO_OLD;
31
32 r = __socketcall(setsockopt, fd, level, optname,
33 ((long[]){s, CLAMP(us)}), 2*sizeof(long), 0);
34 }
35 }
36 return __syscall_ret(r);
737}
lib/libc/musl/src/process/fdop.h+2
......@@ -1,6 +1,8 @@
11#define FDOP_CLOSE 1
22#define FDOP_DUP2 2
33#define FDOP_OPEN 3
4#define FDOP_CHDIR 4
5#define FDOP_FCHDIR 5
46
57struct fdop {
68 struct fdop *next, *prev;
lib/libc/musl/src/process/posix_spawn.c+8
......@@ -125,6 +125,14 @@ static int child(void *args_vp)
125125 __syscall(SYS_close, fd);
126126 }
127127 break;
128 case FDOP_CHDIR:
129 ret = __syscall(SYS_chdir, op->path);
130 if (ret<0) goto fail;
131 break;
132 case FDOP_FCHDIR:
133 ret = __syscall(SYS_fchdir, op->fd);
134 if (ret<0) goto fail;
135 break;
128136 }
129137 }
130138 }
lib/libc/musl/src/process/posix_spawn_file_actions_addchdir.c created+18
......@@ -0,0 +1,18 @@
1#include <spawn.h>
2#include <stdlib.h>
3#include <string.h>
4#include <errno.h>
5#include "fdop.h"
6
7int posix_spawn_file_actions_addchdir_np(posix_spawn_file_actions_t *restrict fa, const char *restrict path)
8{
9 struct fdop *op = malloc(sizeof *op + strlen(path) + 1);
10 if (!op) return ENOMEM;
11 op->cmd = FDOP_CHDIR;
12 op->fd = -1;
13 strcpy(op->path, path);
14 if ((op->next = fa->__actions)) op->next->prev = op;
15 op->prev = 0;
16 fa->__actions = op;
17 return 0;
18}
lib/libc/musl/src/process/posix_spawn_file_actions_addfchdir.c created+17
......@@ -0,0 +1,17 @@
1#include <spawn.h>
2#include <stdlib.h>
3#include <string.h>
4#include <errno.h>
5#include "fdop.h"
6
7int posix_spawn_file_actions_addfchdir_np(posix_spawn_file_actions_t *fa, int fd)
8{
9 struct fdop *op = malloc(sizeof *op);
10 if (!op) return ENOMEM;
11 op->cmd = FDOP_FCHDIR;
12 op->fd = fd;
13 if ((op->next = fa->__actions)) op->next->prev = op;
14 op->prev = 0;
15 fa->__actions = op;
16 return 0;
17}
lib/libc/musl/src/regex/glob.c+53-6
......@@ -8,6 +8,8 @@
88#include <stdlib.h>
99#include <errno.h>
1010#include <stddef.h>
11#include <unistd.h>
12#include <pwd.h>
1113
1214struct match
1315{
......@@ -90,16 +92,23 @@ static int do_glob(char *buf, size_t pos, int type, char *pat, int flags, int (*
9092 if (!*pat) {
9193 /* If we consumed any components above, or if GLOB_MARK is
9294 * requested and we don't yet know if the match is a dir,
93 * we must call stat to confirm the file exists and/or
94 * determine its type. */
95 * we must confirm the file exists and/or determine its type.
96 *
97 * If marking dirs, symlink type is inconclusive; we need the
98 * type for the symlink target, and therefore must try stat
99 * first unless type is known not to be a symlink. Otherwise,
100 * or if that fails, use lstat for determining existence to
101 * avoid false negatives in the case of broken symlinks. */
95102 struct stat st;
96 if ((flags & GLOB_MARK) && type==DT_LNK) type = 0;
97 if (!type && stat(buf, &st)) {
103 if ((flags & GLOB_MARK) && (!type||type==DT_LNK) && !stat(buf, &st)) {
104 if (S_ISDIR(st.st_mode)) type = DT_DIR;
105 else type = DT_REG;
106 }
107 if (!type && lstat(buf, &st)) {
98108 if (errno!=ENOENT && (errfunc(buf, errno) || (flags & GLOB_ERR)))
99109 return GLOB_ABORTED;
100110 return 0;
101111 }
102 if (!type && S_ISDIR(st.st_mode)) type = DT_DIR;
103112 if (append(tail, buf, pos, (flags & GLOB_MARK) && type==DT_DIR))
104113 return GLOB_NOSPACE;
105114 return 0;
......@@ -182,6 +191,39 @@ static int sort(const void *a, const void *b)
182191 return strcmp(*(const char **)a, *(const char **)b);
183192}
184193
194static int expand_tilde(char **pat, char *buf, size_t *pos)
195{
196 char *p = *pat + 1;
197 size_t i = 0;
198
199 char delim, *name_end = __strchrnul(p, '/');
200 if ((delim = *name_end)) *name_end++ = 0;
201 *pat = name_end;
202
203 char *home = *p ? NULL : getenv("HOME");
204 if (!home) {
205 struct passwd pw, *res;
206 switch (*p ? getpwnam_r(p, &pw, buf, PATH_MAX, &res)
207 : getpwuid_r(getuid(), &pw, buf, PATH_MAX, &res)) {
208 case ENOMEM:
209 return GLOB_NOSPACE;
210 case 0:
211 if (!res)
212 default:
213 return GLOB_NOMATCH;
214 }
215 home = pw.pw_dir;
216 }
217 while (i < PATH_MAX - 2 && *home)
218 buf[i++] = *home++;
219 if (*home)
220 return GLOB_NOMATCH;
221 if ((buf[i] = delim))
222 buf[++i] = 0;
223 *pos = i;
224 return 0;
225}
226
185227int glob(const char *restrict pat, int flags, int (*errfunc)(const char *path, int err), glob_t *restrict g)
186228{
187229 struct match head = { .next = NULL }, *tail = &head;
......@@ -202,7 +244,12 @@ int glob(const char *restrict pat, int flags, int (*errfunc)(const char *path, i
202244 char *p = strdup(pat);
203245 if (!p) return GLOB_NOSPACE;
204246 buf[0] = 0;
205 error = do_glob(buf, 0, 0, p, flags, errfunc, &tail);
247 size_t pos = 0;
248 char *s = p;
249 if ((flags & (GLOB_TILDE | GLOB_TILDE_CHECK)) && *p == '~')
250 error = expand_tilde(&s, buf, &pos);
251 if (!error)
252 error = do_glob(buf, pos, 0, s, flags, errfunc, &tail);
206253 free(p);
207254 }
208255
lib/libc/musl/src/sched/sched_rr_get_interval.c+14
......@@ -3,5 +3,19 @@
33
44int sched_rr_get_interval(pid_t pid, struct timespec *ts)
55{
6#ifdef SYS_sched_rr_get_interval_time64
7 /* On a 32-bit arch, use the old syscall if it exists. */
8 if (SYS_sched_rr_get_interval != SYS_sched_rr_get_interval_time64) {
9 long ts32[2];
10 int r = __syscall(SYS_sched_rr_get_interval, pid, ts32);
11 if (!r) {
12 ts->tv_sec = ts32[0];
13 ts->tv_nsec = ts32[1];
14 }
15 return __syscall_ret(r);
16 }
17#endif
18 /* If reaching this point, it's a 64-bit arch or time64-only
19 * 32-bit arch and we can get result directly into timespec. */
620 return syscall(SYS_sched_rr_get_interval, pid, ts);
721}
lib/libc/musl/src/select/pselect.c+17-3
......@@ -1,12 +1,26 @@
11#include <sys/select.h>
22#include <signal.h>
33#include <stdint.h>
4#include <errno.h>
45#include "syscall.h"
56
7#define IS32BIT(x) !((x)+0x80000000ULL>>32)
8#define CLAMP(x) (int)(IS32BIT(x) ? (x) : 0x7fffffffU+((0ULL+(x))>>63))
9
610int pselect(int n, fd_set *restrict rfds, fd_set *restrict wfds, fd_set *restrict efds, const struct timespec *restrict ts, const sigset_t *restrict mask)
711{
812 syscall_arg_t data[2] = { (uintptr_t)mask, _NSIG/8 };
9 struct timespec ts_tmp;
10 if (ts) ts_tmp = *ts;
11 return syscall_cp(SYS_pselect6, n, rfds, wfds, efds, ts ? &ts_tmp : 0, data);
13 time_t s = ts ? ts->tv_sec : 0;
14 long ns = ts ? ts->tv_nsec : 0;
15#ifdef SYS_pselect6_time64
16 int r = -ENOSYS;
17 if (SYS_pselect6 == SYS_pselect6_time64 || !IS32BIT(s))
18 r = __syscall_cp(SYS_pselect6_time64, n, rfds, wfds, efds,
19 ts ? ((long long[]){s, ns}) : 0, data);
20 if (SYS_pselect6 == SYS_pselect6_time64 || r!=-ENOSYS)
21 return __syscall_ret(r);
22 s = CLAMP(s);
23#endif
24 return syscall_cp(SYS_pselect6, n, rfds, wfds, efds,
25 ts ? ((long[]){s, ns}) : 0, data);
1226}
lib/libc/musl/src/select/select.c+32-13
......@@ -4,22 +4,41 @@
44#include <errno.h>
55#include "syscall.h"
66
7#define IS32BIT(x) !((x)+0x80000000ULL>>32)
8#define CLAMP(x) (int)(IS32BIT(x) ? (x) : 0x7fffffffU+((0ULL+(x))>>63))
9
710int select(int n, fd_set *restrict rfds, fd_set *restrict wfds, fd_set *restrict efds, struct timeval *restrict tv)
811{
12 time_t s = tv ? tv->tv_sec : 0;
13 suseconds_t us = tv ? tv->tv_usec : 0;
14 long ns;
15 const time_t max_time = (1ULL<<8*sizeof(time_t)-1)-1;
16
17 if (s<0 || us<0) return __syscall_ret(-EINVAL);
18 if (us/1000000 > max_time - s) {
19 s = max_time;
20 us = 999999;
21 ns = 999999999;
22 } else {
23 s += us/1000000;
24 us %= 1000000;
25 ns = us*1000;
26 }
27
28#ifdef SYS_pselect6_time64
29 int r = -ENOSYS;
30 if (SYS_pselect6 == SYS_pselect6_time64 || !IS32BIT(s))
31 r = __syscall_cp(SYS_pselect6_time64, n, rfds, wfds, efds,
32 tv ? ((long long[]){s, ns}) : 0,
33 ((syscall_arg_t[]){ 0, _NSIG/8 }));
34 if (SYS_pselect6 == SYS_pselect6_time64 || r!=-ENOSYS)
35 return __syscall_ret(r);
36#endif
937#ifdef SYS_select
10 return syscall_cp(SYS_select, n, rfds, wfds, efds, tv);
38 return syscall_cp(SYS_select, n, rfds, wfds, efds,
39 tv ? ((long[]){s, us}) : 0);
1140#else
12 syscall_arg_t data[2] = { 0, _NSIG/8 };
13 struct timespec ts;
14 if (tv) {
15 if (tv->tv_sec < 0 || tv->tv_usec < 0)
16 return __syscall_ret(-EINVAL);
17 time_t extra_secs = tv->tv_usec / 1000000;
18 ts.tv_nsec = tv->tv_usec % 1000000 * 1000;
19 const time_t max_time = (1ULL<<8*sizeof(time_t)-1)-1;
20 ts.tv_sec = extra_secs > max_time - tv->tv_sec ?
21 max_time : tv->tv_sec + extra_secs;
22 }
23 return syscall_cp(SYS_pselect6, n, rfds, wfds, efds, tv ? &ts : 0, data);
41 return syscall_cp(SYS_pselect6, n, rfds, wfds, efds,
42 tv ? ((long[]){s, ns}) : 0, ((syscall_arg_t[]){ 0, _NSIG/8 }));
2443#endif
2544}
lib/libc/musl/src/signal/getitimer.c+11
......@@ -3,5 +3,16 @@
33
44int getitimer(int which, struct itimerval *old)
55{
6 if (sizeof(time_t) > sizeof(long)) {
7 long old32[4];
8 int r = __syscall(SYS_getitimer, which, old32);
9 if (!r) {
10 old->it_interval.tv_sec = old32[0];
11 old->it_interval.tv_usec = old32[1];
12 old->it_value.tv_sec = old32[2];
13 old->it_value.tv_usec = old32[3];
14 }
15 return __syscall_ret(r);
16 }
617 return syscall(SYS_getitimer, which, old);
718}
lib/libc/musl/src/signal/setitimer.c+19
......@@ -1,7 +1,26 @@
11#include <sys/time.h>
2#include <errno.h>
23#include "syscall.h"
34
5#define IS32BIT(x) !((x)+0x80000000ULL>>32)
6
47int setitimer(int which, const struct itimerval *restrict new, struct itimerval *restrict old)
58{
9 if (sizeof(time_t) > sizeof(long)) {
10 time_t is = new->it_interval.tv_sec, vs = new->it_value.tv_sec;
11 long ius = new->it_interval.tv_usec, vus = new->it_value.tv_usec;
12 if (!IS32BIT(is) || !IS32BIT(vs))
13 return __syscall_ret(-ENOTSUP);
14 long old32[4];
15 int r = __syscall(SYS_setitimer, which,
16 ((long[]){is, ius, vs, vus}), old32);
17 if (!r && old) {
18 old->it_interval.tv_sec = old32[0];
19 old->it_interval.tv_usec = old32[1];
20 old->it_value.tv_sec = old32[2];
21 old->it_value.tv_usec = old32[3];
22 }
23 return __syscall_ret(r);
24 }
625 return syscall(SYS_setitimer, which, new, old);
726}
lib/libc/musl/src/signal/sigaction.c+1-1
......@@ -7,7 +7,7 @@
77#include "lock.h"
88#include "ksigaction.h"
99
10volatile int dummy_lock[1] = { 0 };
10static volatile int dummy_lock[1] = { 0 };
1111
1212extern hidden volatile int __abort_lock[1];
1313
lib/libc/musl/src/signal/sigtimedwait.c+24-4
......@@ -2,11 +2,31 @@
22#include <errno.h>
33#include "syscall.h"
44
5#define IS32BIT(x) !((x)+0x80000000ULL>>32)
6#define CLAMP(x) (int)(IS32BIT(x) ? (x) : 0x7fffffffU+((0ULL+(x))>>63))
7
8static int do_sigtimedwait(const sigset_t *restrict mask, siginfo_t *restrict si, const struct timespec *restrict ts)
9{
10#ifdef SYS_rt_sigtimedwait_time64
11 time_t s = ts ? ts->tv_sec : 0;
12 long ns = ts ? ts->tv_nsec : 0;
13 int r = -ENOSYS;
14 if (SYS_rt_sigtimedwait == SYS_rt_sigtimedwait_time64 || !IS32BIT(s))
15 r = __syscall_cp(SYS_rt_sigtimedwait_time64, mask, si,
16 ts ? ((long long[]){s, ns}) : 0, _NSIG/8);
17 if (SYS_rt_sigtimedwait == SYS_rt_sigtimedwait_time64 || r!=-ENOSYS)
18 return r;
19 return __syscall_cp(SYS_rt_sigtimedwait, mask, si,
20 ts ? ((long[]){CLAMP(s), ns}) : 0, _NSIG/8);;
21#else
22 return __syscall_cp(SYS_rt_sigtimedwait, mask, si, ts, _NSIG/8);
23#endif
24}
25
526int sigtimedwait(const sigset_t *restrict mask, siginfo_t *restrict si, const struct timespec *restrict timeout)
627{
728 int ret;
8 do ret = syscall_cp(SYS_rt_sigtimedwait, mask,
9 si, timeout, _NSIG/8);
10 while (ret<0 && errno==EINTR);
11 return ret;
29 do ret = do_sigtimedwait(mask, si, timeout);
30 while (ret==-EINTR);
31 return __syscall_ret(ret);
1232}
lib/libc/musl/src/signal/x32/getitimer.c created+7
......@@ -0,0 +1,7 @@
1#include <sys/time.h>
2#include "syscall.h"
3
4int getitimer(int which, struct itimerval *old)
5{
6 return syscall(SYS_getitimer, which, old);
7}
lib/libc/musl/src/signal/x32/setitimer.c created+7
......@@ -0,0 +1,7 @@
1#include <sys/time.h>
2#include "syscall.h"
3
4int setitimer(int which, const struct itimerval *restrict new, struct itimerval *restrict old)
5{
6 return syscall(SYS_setitimer, which, new, old);
7}
lib/libc/musl/src/stat/fstat.c+3-11
......@@ -1,3 +1,4 @@
1#define _BSD_SOURCE
12#include <sys/stat.h>
23#include <errno.h>
34#include <fcntl.h>
......@@ -5,17 +6,8 @@
56
67int fstat(int fd, struct stat *st)
78{
8 int ret = __syscall(SYS_fstat, fd, st);
9 if (ret != -EBADF || __syscall(SYS_fcntl, fd, F_GETFD) < 0)
10 return __syscall_ret(ret);
11
12 char buf[15+3*sizeof(int)];
13 __procfdname(buf, fd);
14#ifdef SYS_stat
15 return syscall(SYS_stat, buf, st);
16#else
17 return syscall(SYS_fstatat, AT_FDCWD, buf, st, 0);
18#endif
9 if (fd<0) return __syscall_ret(-EBADF);
10 return fstatat(fd, "", st, AT_EMPTY_PATH);
1911}
2012
2113weak_alias(fstat, fstat64);
lib/libc/musl/src/stat/fstatat.c+122-2
......@@ -1,9 +1,129 @@
1#define _BSD_SOURCE
12#include <sys/stat.h>
3#include <string.h>
4#include <fcntl.h>
5#include <errno.h>
6#include <stdint.h>
7#include <sys/sysmacros.h>
28#include "syscall.h"
9#include "kstat.h"
310
4int fstatat(int fd, const char *restrict path, struct stat *restrict buf, int flag)
11struct statx {
12 uint32_t stx_mask;
13 uint32_t stx_blksize;
14 uint64_t stx_attributes;
15 uint32_t stx_nlink;
16 uint32_t stx_uid;
17 uint32_t stx_gid;
18 uint16_t stx_mode;
19 uint16_t pad1;
20 uint64_t stx_ino;
21 uint64_t stx_size;
22 uint64_t stx_blocks;
23 uint64_t stx_attributes_mask;
24 struct {
25 int64_t tv_sec;
26 uint32_t tv_nsec;
27 int32_t pad;
28 } stx_atime, stx_btime, stx_ctime, stx_mtime;
29 uint32_t stx_rdev_major;
30 uint32_t stx_rdev_minor;
31 uint32_t stx_dev_major;
32 uint32_t stx_dev_minor;
33 uint64_t spare[14];
34};
35
36static int fstatat_statx(int fd, const char *restrict path, struct stat *restrict st, int flag)
37{
38 struct statx stx;
39
40 int ret = __syscall(SYS_statx, fd, path, flag, 0x7ff, &stx);
41 if (ret) return ret;
42
43 *st = (struct stat){
44 .st_dev = makedev(stx.stx_dev_major, stx.stx_dev_minor),
45 .st_ino = stx.stx_ino,
46 .st_mode = stx.stx_mode,
47 .st_nlink = stx.stx_nlink,
48 .st_uid = stx.stx_uid,
49 .st_gid = stx.stx_gid,
50 .st_rdev = makedev(stx.stx_rdev_major, stx.stx_rdev_minor),
51 .st_size = stx.stx_size,
52 .st_blksize = stx.stx_blksize,
53 .st_blocks = stx.stx_blocks,
54 .st_atim.tv_sec = stx.stx_atime.tv_sec,
55 .st_atim.tv_nsec = stx.stx_atime.tv_nsec,
56 .st_mtim.tv_sec = stx.stx_mtime.tv_sec,
57 .st_mtim.tv_nsec = stx.stx_mtime.tv_nsec,
58 .st_ctim.tv_sec = stx.stx_ctime.tv_sec,
59 .st_ctim.tv_nsec = stx.stx_ctime.tv_nsec,
60 };
61 return 0;
62}
63
64static int fstatat_kstat(int fd, const char *restrict path, struct stat *restrict st, int flag)
65{
66 int ret;
67 struct kstat kst;
68
69 if (flag==AT_EMPTY_PATH && fd>=0 && !*path) {
70 ret = __syscall(SYS_fstat, fd, &kst);
71 if (ret==-EBADF && __syscall(SYS_fcntl, fd, F_GETFD)>=0) {
72 ret = __syscall(SYS_fstatat, fd, path, &kst, flag);
73 if (ret==-EINVAL) {
74 char buf[15+3*sizeof(int)];
75 __procfdname(buf, fd);
76#ifdef SYS_stat
77 ret = __syscall(SYS_stat, buf, &kst);
78#else
79 ret = __syscall(SYS_fstatat, AT_FDCWD, buf, &kst, 0);
80#endif
81 }
82 }
83 }
84#ifdef SYS_lstat
85 else if ((fd == AT_FDCWD || *path=='/') && flag==AT_SYMLINK_NOFOLLOW)
86 ret = __syscall(SYS_lstat, path, &kst);
87#endif
88#ifdef SYS_stat
89 else if ((fd == AT_FDCWD || *path=='/') && !flag)
90 ret = __syscall(SYS_stat, path, &kst);
91#endif
92 else ret = __syscall(SYS_fstatat, fd, path, &kst, flag);
93
94 if (ret) return ret;
95
96 *st = (struct stat){
97 .st_dev = kst.st_dev,
98 .st_ino = kst.st_ino,
99 .st_mode = kst.st_mode,
100 .st_nlink = kst.st_nlink,
101 .st_uid = kst.st_uid,
102 .st_gid = kst.st_gid,
103 .st_rdev = kst.st_rdev,
104 .st_size = kst.st_size,
105 .st_blksize = kst.st_blksize,
106 .st_blocks = kst.st_blocks,
107 .st_atim.tv_sec = kst.st_atime_sec,
108 .st_atim.tv_nsec = kst.st_atime_nsec,
109 .st_mtim.tv_sec = kst.st_mtime_sec,
110 .st_mtim.tv_nsec = kst.st_mtime_nsec,
111 .st_ctim.tv_sec = kst.st_ctime_sec,
112 .st_ctim.tv_nsec = kst.st_ctime_nsec,
113 };
114
115 return 0;
116}
117
118int fstatat(int fd, const char *restrict path, struct stat *restrict st, int flag)
5119{
6 return syscall(SYS_fstatat, fd, path, buf, flag);
120 int ret;
121 if (sizeof((struct kstat){0}.st_atime_sec) < sizeof(time_t)) {
122 ret = fstatat_statx(fd, path, st, flag);
123 if (ret!=-ENOSYS) return __syscall_ret(ret);
124 }
125 ret = fstatat_kstat(fd, path, st, flag);
126 return __syscall_ret(ret);
7127}
8128
9129weak_alias(fstatat, fstatat64);
lib/libc/musl/src/stat/lstat.c+1-6
......@@ -1,14 +1,9 @@
11#include <sys/stat.h>
22#include <fcntl.h>
3#include "syscall.h"
43
54int lstat(const char *restrict path, struct stat *restrict buf)
65{
7#ifdef SYS_lstat
8 return syscall(SYS_lstat, path, buf);
9#else
10 return syscall(SYS_fstatat, AT_FDCWD, path, buf, AT_SYMLINK_NOFOLLOW);
11#endif
6 return fstatat(AT_FDCWD, path, buf, AT_SYMLINK_NOFOLLOW);
127}
138
149weak_alias(lstat, lstat64);
lib/libc/musl/src/stat/stat.c+1-6
......@@ -1,14 +1,9 @@
11#include <sys/stat.h>
22#include <fcntl.h>
3#include "syscall.h"
43
54int stat(const char *restrict path, struct stat *restrict buf)
65{
7#ifdef SYS_stat
8 return syscall(SYS_stat, path, buf);
9#else
10 return syscall(SYS_fstatat, AT_FDCWD, path, buf, 0);
11#endif
6 return fstatat(AT_FDCWD, path, buf, 0);
127}
138
149weak_alias(stat, stat64);
lib/libc/musl/src/stat/utimensat.c+33-10
......@@ -4,28 +4,51 @@
44#include <errno.h>
55#include "syscall.h"
66
7#define IS32BIT(x) !((x)+0x80000000ULL>>32)
8#define NS_SPECIAL(ns) ((ns)==UTIME_NOW || (ns)==UTIME_OMIT)
9
710int utimensat(int fd, const char *path, const struct timespec times[2], int flags)
811{
9 int r = __syscall(SYS_utimensat, fd, path, times, flags);
12 int r;
13 if (times && times[0].tv_nsec==UTIME_NOW && times[1].tv_nsec==UTIME_NOW)
14 times = 0;
15#ifdef SYS_utimensat_time64
16 r = -ENOSYS;
17 time_t s0=0, s1=0;
18 long ns0=0, ns1=0;
19 if (times) {
20 ns0 = times[0].tv_nsec;
21 ns1 = times[1].tv_nsec;
22 if (!NS_SPECIAL(ns0)) s0 = times[0].tv_sec;
23 if (!NS_SPECIAL(ns1)) s1 = times[1].tv_sec;
24 }
25 if (SYS_utimensat == SYS_utimensat_time64 || !IS32BIT(s0) || !IS32BIT(s1))
26 r = __syscall(SYS_utimensat_time64, fd, path, times ?
27 ((long long[]){s0, ns0, s1, ns1}) : 0, flags);
28 if (SYS_utimensat == SYS_utimensat_time64 || r!=-ENOSYS)
29 return __syscall_ret(r);
30 if (!IS32BIT(s0) || !IS32BIT(s1))
31 return __syscall_ret(-ENOTSUP);
32 r = __syscall(SYS_utimensat, fd, path,
33 times ? ((long[]){s0, ns0, s1, ns1}) : 0, flags);
34#else
35 r = __syscall(SYS_utimensat, fd, path, times, flags);
36#endif
37
1038#ifdef SYS_futimesat
1139 if (r != -ENOSYS || flags) return __syscall_ret(r);
12 struct timeval *tv = 0, tmp[2];
40 long *tv=0, tmp[4];
1341 if (times) {
1442 int i;
1543 tv = tmp;
1644 for (i=0; i<2; i++) {
1745 if (times[i].tv_nsec >= 1000000000ULL) {
18 if (times[i].tv_nsec == UTIME_NOW &&
19 times[1-i].tv_nsec == UTIME_NOW) {
20 tv = 0;
21 break;
22 }
23 if (times[i].tv_nsec == UTIME_OMIT)
46 if (NS_SPECIAL(times[i].tv_nsec))
2447 return __syscall_ret(-ENOSYS);
2548 return __syscall_ret(-EINVAL);
2649 }
27 tmp[i].tv_sec = times[i].tv_sec;
28 tmp[i].tv_usec = times[i].tv_nsec / 1000;
50 tmp[2*i+0] = times[i].tv_sec;
51 tmp[2*i+1] = times[i].tv_nsec / 1000;
2952 }
3053 }
3154
lib/libc/musl/src/stdio/__stdio_seek.c+2-8
......@@ -1,13 +1,7 @@
11#include "stdio_impl.h"
2#include <unistd.h>
23
34off_t __stdio_seek(FILE *f, off_t off, int whence)
45{
5 off_t ret;
6#ifdef SYS__llseek
7 if (syscall(SYS__llseek, f->fd, off>>32, off, &ret, whence)<0)
8 ret = -1;
9#else
10 ret = syscall(SYS_lseek, f->fd, off, whence);
11#endif
12 return ret;
6 return __lseek(f->fd, off, whence);
137}
lib/libc/musl/src/stdio/vfwprintf.c+2
......@@ -53,6 +53,8 @@ static const unsigned char states[]['z'-'A'+1] = {
5353 }, { /* 1: l-prefixed */
5454 S('d') = LONG, S('i') = LONG,
5555 S('o') = ULONG, S('u') = ULONG, S('x') = ULONG, S('X') = ULONG,
56 S('e') = DBL, S('f') = DBL, S('g') = DBL, S('a') = DBL,
57 S('E') = DBL, S('F') = DBL, S('G') = DBL, S('A') = DBL,
5658 S('c') = INT, S('s') = PTR, S('n') = PTR,
5759 S('l') = LLPRE,
5860 }, { /* 2: ll-prefixed */
lib/libc/musl/src/thread/__timedwait.c+22-2
......@@ -5,6 +5,27 @@
55#include "syscall.h"
66#include "pthread_impl.h"
77
8#define IS32BIT(x) !((x)+0x80000000ULL>>32)
9#define CLAMP(x) (int)(IS32BIT(x) ? (x) : 0x7fffffffU+((0ULL+(x))>>63))
10
11static int __futex4_cp(volatile void *addr, int op, int val, const struct timespec *to)
12{
13 int r;
14#ifdef SYS_futex_time64
15 time_t s = to ? to->tv_sec : 0;
16 long ns = to ? to->tv_nsec : 0;
17 r = -ENOSYS;
18 if (SYS_futex == SYS_futex_time64 || !IS32BIT(s))
19 r = __syscall_cp(SYS_futex_time64, addr, op, val,
20 to ? ((long long[]){s, ns}) : 0);
21 if (SYS_futex == SYS_futex_time64 || r!=-ENOSYS) return r;
22 to = to ? (void *)(long[]){CLAMP(s), ns} : 0;
23#endif
24 r = __syscall_cp(SYS_futex, addr, op, val, to);
25 if (r != -ENOSYS) return r;
26 return __syscall_cp(SYS_futex, addr, op & ~FUTEX_PRIVATE, val, to);
27}
28
829static volatile int dummy = 0;
930weak_alias(dummy, __eintr_valid_flag);
1031
......@@ -28,8 +49,7 @@ int __timedwait_cp(volatile int *addr, int val,
2849 top = &to;
2950 }
3051
31 r = -__syscall_cp(SYS_futex, addr, FUTEX_WAIT|priv, val, top);
32 if (r == ENOSYS) r = -__syscall_cp(SYS_futex, addr, FUTEX_WAIT, val, top);
52 r = -__futex4_cp(addr, FUTEX_WAIT|priv, val, top);
3353 if (r != EINTR && r != ETIMEDOUT && r != ECANCELED) r = 0;
3454 /* Mitigate bug in old kernels wrongly reporting EINTR for non-
3555 * interrupting (SA_RESTART) signal handlers. This is only practical
lib/libc/musl/src/thread/arm/atomics.s+2-2
......@@ -15,10 +15,10 @@ __a_barrier_oldkuser:
1515 mov r1,r0
1616 mov r2,sp
1717 ldr ip,=0xffff0fc0
18 mov lr,pc
19 mov pc,ip
18 bl 1f
2019 pop {r0,r1,r2,r3,ip,lr}
2120 bx lr
211: bx ip
2222
2323.global __a_barrier_v6
2424.hidden __a_barrier_v6
lib/libc/musl/src/thread/arm/clone.s+3-7
......@@ -20,13 +20,9 @@ __clone:
2020 bx lr
2121
22221: mov r0,r6
23 tst r5,#1
24 bne 1f
25 mov lr,pc
26 mov pc,r5
23 bl 3f
27242: mov r7,#1
2825 svc 0
29
301: mov lr,pc
31 bx r5
3226 b 2b
27
283: bx r5
lib/libc/musl/src/thread/arm/syscall_cp.s+4-4
......@@ -11,19 +11,19 @@
1111.type __syscall_cp_asm,%function
1212__syscall_cp_asm:
1313 mov ip,sp
14 stmfd sp!,{r4,r5,r6,r7,lr}
14 stmfd sp!,{r4,r5,r6,r7}
1515__cp_begin:
1616 ldr r0,[r0]
1717 cmp r0,#0
18 blne __cp_cancel
18 bne __cp_cancel
1919 mov r7,r1
2020 mov r0,r2
2121 mov r1,r3
2222 ldmfd ip,{r2,r3,r4,r5,r6}
2323 svc 0
2424__cp_end:
25 ldmfd sp!,{r4,r5,r6,r7,lr}
25 ldmfd sp!,{r4,r5,r6,r7}
2626 bx lr
2727__cp_cancel:
28 ldmfd sp!,{r4,r5,r6,r7,lr}
28 ldmfd sp!,{r4,r5,r6,r7}
2929 b __cancel
lib/libc/musl/src/thread/pthread_create.c+27-30
......@@ -172,23 +172,20 @@ void __do_cleanup_pop(struct __ptcb *cb)
172172struct start_args {
173173 void *(*start_func)(void *);
174174 void *start_arg;
175 pthread_attr_t *attr;
176 volatile int *perr;
175 volatile int control;
177176 unsigned long sig_mask[_NSIG/8/sizeof(long)];
178177};
179178
180179static int start(void *p)
181180{
182181 struct start_args *args = p;
183 if (args->attr) {
184 pthread_t self = __pthread_self();
185 int ret = -__syscall(SYS_sched_setscheduler, self->tid,
186 args->attr->_a_policy, &args->attr->_a_prio);
187 if (a_swap(args->perr, ret)==-2)
188 __wake(args->perr, 1, 1);
189 if (ret) {
190 self->detach_state = DT_DETACHED;
191 __pthread_exit(0);
182 int state = args->control;
183 if (state) {
184 if (a_cas(&args->control, 1, 2)==1)
185 __wait(&args->control, 0, 2, 1);
186 if (args->control) {
187 __syscall(SYS_set_tid_address, &args->control);
188 for (;;) __syscall(SYS_exit, 0);
192189 }
193190 }
194191 __syscall(SYS_rt_sigprocmask, SIG_SETMASK, &args->sig_mask, 0, _NSIG/8);
......@@ -233,7 +230,6 @@ int __pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict att
233230 | CLONE_PARENT_SETTID | CLONE_CHILD_CLEARTID | CLONE_DETACHED;
234231 pthread_attr_t attr = { 0 };
235232 sigset_t set;
236 volatile int err = -1;
237233
238234 if (!libc.can_do_threads) return ENOSYS;
239235 self = __pthread_self();
......@@ -325,13 +321,7 @@ int __pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict att
325321 struct start_args *args = (void *)stack;
326322 args->start_func = entry;
327323 args->start_arg = arg;
328 if (attr._a_sched) {
329 args->attr = &attr;
330 args->perr = &err;
331 } else {
332 args->attr = 0;
333 args->perr = 0;
334 }
324 args->control = attr._a_sched ? 1 : 0;
335325
336326 /* Application signals (but not the synccall signal) must be
337327 * blocked before the thread list lock can be taken, to ensure
......@@ -349,29 +339,36 @@ int __pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict att
349339 libc.threads_minus_1++;
350340 ret = __clone((c11 ? start_c11 : start), stack, flags, args, &new->tid, TP_ADJ(new), &__thread_list_lock);
351341
352 /* If clone succeeded, new thread must be linked on the thread
353 * list before unlocking it, even if scheduling may still fail. */
342 /* All clone failures translate to EAGAIN. If explicit scheduling
343 * was requested, attempt it before unlocking the thread list so
344 * that the failed thread is never exposed and so that we can
345 * clean up all transient resource usage before returning. */
346 if (ret < 0) {
347 ret = -EAGAIN;
348 } else if (attr._a_sched) {
349 ret = __syscall(SYS_sched_setscheduler,
350 new->tid, attr._a_policy, &attr._a_prio);
351 if (a_swap(&args->control, ret ? 3 : 0)==2)
352 __wake(&args->control, 1, 1);
353 if (ret)
354 __wait(&args->control, 0, 3, 0);
355 }
356
354357 if (ret >= 0) {
355358 new->next = self->next;
356359 new->prev = self;
357360 new->next->prev = new;
358361 new->prev->next = new;
362 } else {
363 libc.threads_minus_1--;
359364 }
360365 __tl_unlock();
361366 __restore_sigs(&set);
362367 __release_ptc();
363368
364369 if (ret < 0) {
365 libc.threads_minus_1--;
366370 if (map) __munmap(map, size);
367 return EAGAIN;
368 }
369
370 if (attr._a_sched) {
371 if (a_cas(&err, -1, -2)==-1)
372 __wait(&err, 0, -2, 1);
373 ret = err;
374 if (ret) return ret;
371 return -ret;
375372 }
376373
377374 *res = new;
lib/libc/musl/src/thread/pthread_join.c+1
......@@ -1,3 +1,4 @@
1#define _GNU_SOURCE
12#include "pthread_impl.h"
23#include <sys/mman.h>
34
lib/libc/musl/src/thread/pthread_mutex_timedlock.c+19-1
......@@ -1,5 +1,23 @@
11#include "pthread_impl.h"
22
3#define IS32BIT(x) !((x)+0x80000000ULL>>32)
4#define CLAMP(x) (int)(IS32BIT(x) ? (x) : 0x7fffffffU+((0ULL+(x))>>63))
5
6static int __futex4(volatile void *addr, int op, int val, const struct timespec *to)
7{
8#ifdef SYS_futex_time64
9 time_t s = to ? to->tv_sec : 0;
10 long ns = to ? to->tv_nsec : 0;
11 int r = -ENOSYS;
12 if (SYS_futex == SYS_futex_time64 || !IS32BIT(s))
13 r = __syscall(SYS_futex_time64, addr, op, val,
14 to ? ((long long[]){s, ns}) : 0);
15 if (SYS_futex == SYS_futex_time64 || r!=-ENOSYS) return r;
16 to = to ? (void *)(long[]){CLAMP(s), ns} : 0;
17#endif
18 return __syscall(SYS_futex, addr, op, val, to);
19}
20
321static int pthread_mutex_timedlock_pi(pthread_mutex_t *restrict m, const struct timespec *restrict at)
422{
523 int type = m->_m_type;
......@@ -9,7 +27,7 @@ static int pthread_mutex_timedlock_pi(pthread_mutex_t *restrict m, const struct
927
1028 if (!priv) self->robust_list.pending = &m->_m_next;
1129
12 do e = -__syscall(SYS_futex, &m->_m_lock, FUTEX_LOCK_PI|priv, 0, at);
30 do e = -__futex4(&m->_m_lock, FUTEX_LOCK_PI|priv, 0, at);
1331 while (e==EINTR);
1432 if (e) self->robust_list.pending = 0;
1533
lib/libc/musl/src/thread/thrd_sleep.c+2-1
......@@ -1,10 +1,11 @@
11#include <threads.h>
2#include <time.h>
23#include <errno.h>
34#include "syscall.h"
45
56int thrd_sleep(const struct timespec *req, struct timespec *rem)
67{
7 int ret = __syscall(SYS_nanosleep, req, rem);
8 int ret = -__clock_nanosleep(CLOCK_REALTIME, 0, req, rem);
89 switch (ret) {
910 case 0: return 0;
1011 case -EINTR: return -1; /* value specified by C11 */
lib/libc/musl/src/thread/x32/syscall_cp.s+4-4
......@@ -6,10 +6,10 @@
66.global __cp_cancel
77.hidden __cp_cancel
88.hidden __cancel
9.global __syscall_cp_internal
10.hidden __syscall_cp_internal
11.type __syscall_cp_internal,@function
12__syscall_cp_internal:
9.global __syscall_cp_asm
10.hidden __syscall_cp_asm
11.type __syscall_cp_asm,@function
12__syscall_cp_asm:
1313
1414__cp_begin:
1515 mov (%rdi),%eax
lib/libc/musl/src/thread/x32/syscall_cp_fixup.c deleted-39
......@@ -1,39 +0,0 @@
1#include <sys/syscall.h>
2#include <features.h>
3
4hidden long __syscall_cp_internal(volatile void*, long long, long long,
5 long long, long long, long long,
6 long long, long long);
7
8struct __timespec { long long tv_sec; long tv_nsec; };
9struct __timespec_kernel { long long tv_sec; long long tv_nsec; };
10#define __tsc(X) ((struct __timespec*)(unsigned long)(X))
11#define __fixup(X) do { if(X) { \
12 ts->tv_sec = __tsc(X)->tv_sec; \
13 ts->tv_nsec = __tsc(X)->tv_nsec; \
14 (X) = (unsigned long)ts; } } while(0)
15
16hidden long __syscall_cp_asm (volatile void * foo, long long n, long long a1,
17 long long a2, long long a3, long long a4,
18 long long a5, long long a6)
19{
20 struct __timespec_kernel ts[1];
21 switch (n) {
22 case SYS_mq_timedsend: case SYS_mq_timedreceive: case SYS_pselect6:
23 __fixup(a5);
24 break;
25 case SYS_futex:
26 if((a2 & (~128 /* FUTEX_PRIVATE_FLAG */)) == 0 /* FUTEX_WAIT */)
27 __fixup(a4);
28 break;
29 case SYS_clock_nanosleep:
30 case SYS_rt_sigtimedwait: case SYS_ppoll:
31 __fixup(a3);
32 break;
33 case SYS_nanosleep:
34 __fixup(a1);
35 break;
36 }
37 return __syscall_cp_internal(foo, n, a1, a2, a3, a4, a5, a6);
38}
39
lib/libc/musl/src/time/clock_getres.c+14
......@@ -3,5 +3,19 @@
33
44int clock_getres(clockid_t clk, struct timespec *ts)
55{
6#ifdef SYS_clock_getres_time64
7 /* On a 32-bit arch, use the old syscall if it exists. */
8 if (SYS_clock_getres != SYS_clock_getres_time64) {
9 long ts32[2];
10 int r = __syscall(SYS_clock_getres, clk, ts32);
11 if (!r && ts) {
12 ts->tv_sec = ts32[0];
13 ts->tv_nsec = ts32[1];
14 }
15 return __syscall_ret(r);
16 }
17#endif
18 /* If reaching this point, it's a 64-bit arch or time64-only
19 * 32-bit arch and we can get result directly into timespec. */
620 return syscall(SYS_clock_getres, clk, ts);
721}
lib/libc/musl/src/time/clock_gettime.c+52
......@@ -8,9 +8,41 @@
88
99static void *volatile vdso_func;
1010
11#ifdef VDSO_CGT32_SYM
12static void *volatile vdso_func_32;
13static int cgt_time32_wrap(clockid_t clk, struct timespec *ts)
14{
15 long ts32[2];
16 int (*f)(clockid_t, long[2]) =
17 (int (*)(clockid_t, long[2]))vdso_func_32;
18 int r = f(clk, ts32);
19 if (!r) {
20 /* Fallback to syscalls if time32 overflowed. Maybe
21 * we lucked out and somehow migrated to a kernel with
22 * time64 syscalls available. */
23 if (ts32[0] < 0) {
24 a_cas_p(&vdso_func, (void *)cgt_time32_wrap, 0);
25 return -ENOSYS;
26 }
27 ts->tv_sec = ts32[0];
28 ts->tv_nsec = ts32[1];
29 }
30 return r;
31}
32#endif
33
1134static int cgt_init(clockid_t clk, struct timespec *ts)
1235{
1336 void *p = __vdsosym(VDSO_CGT_VER, VDSO_CGT_SYM);
37#ifdef VDSO_CGT32_SYM
38 if (!p) {
39 void *q = __vdsosym(VDSO_CGT32_VER, VDSO_CGT32_SYM);
40 if (q) {
41 a_cas_p(&vdso_func_32, 0, q);
42 p = cgt_time32_wrap;
43 }
44 }
45#endif
1446 int (*f)(clockid_t, struct timespec *) =
1547 (int (*)(clockid_t, struct timespec *))p;
1648 a_cas_p(&vdso_func, (void *)cgt_init, p);
......@@ -40,6 +72,25 @@ int __clock_gettime(clockid_t clk, struct timespec *ts)
4072 }
4173#endif
4274
75#ifdef SYS_clock_gettime64
76 r = -ENOSYS;
77 if (sizeof(time_t) > 4)
78 r = __syscall(SYS_clock_gettime64, clk, ts);
79 if (SYS_clock_gettime == SYS_clock_gettime64 || r!=-ENOSYS)
80 return __syscall_ret(r);
81 long ts32[2];
82 r = __syscall(SYS_clock_gettime, clk, ts32);
83 if (r==-ENOSYS && clk==CLOCK_REALTIME) {
84 r = __syscall(SYS_gettimeofday, ts32, 0);
85 ts32[1] *= 1000;
86 }
87 if (!r) {
88 ts->tv_sec = ts32[0];
89 ts->tv_nsec = ts32[1];
90 return r;
91 }
92 return __syscall_ret(r);
93#else
4394 r = __syscall(SYS_clock_gettime, clk, ts);
4495 if (r == -ENOSYS) {
4596 if (clk == CLOCK_REALTIME) {
......@@ -50,6 +101,7 @@ int __clock_gettime(clockid_t clk, struct timespec *ts)
50101 r = -EINVAL;
51102 }
52103 return __syscall_ret(r);
104#endif
53105}
54106
55107weak_alias(__clock_gettime, clock_gettime);
lib/libc/musl/src/time/clock_nanosleep.c+32-3
......@@ -2,8 +2,37 @@
22#include <errno.h>
33#include "syscall.h"
44
5int clock_nanosleep(clockid_t clk, int flags, const struct timespec *req, struct timespec *rem)
5#define IS32BIT(x) !((x)+0x80000000ULL>>32)
6#define CLAMP(x) (int)(IS32BIT(x) ? (x) : 0x7fffffffU+((0ULL+(x))>>63))
7
8int __clock_nanosleep(clockid_t clk, int flags, const struct timespec *req, struct timespec *rem)
69{
7 int r = -__syscall_cp(SYS_clock_nanosleep, clk, flags, req, rem);
8 return clk == CLOCK_THREAD_CPUTIME_ID ? EINVAL : r;
10 if (clk == CLOCK_THREAD_CPUTIME_ID) return EINVAL;
11#ifdef SYS_clock_nanosleep_time64
12 time_t s = req->tv_sec;
13 long ns = req->tv_nsec;
14 int r = -ENOSYS;
15 if (SYS_clock_nanosleep == SYS_clock_nanosleep_time64 || !IS32BIT(s))
16 r = __syscall_cp(SYS_clock_nanosleep_time64, clk, flags,
17 ((long long[]){s, ns}), rem);
18 if (SYS_clock_nanosleep == SYS_clock_nanosleep_time64 || r!=-ENOSYS)
19 return -r;
20 long long extra = s - CLAMP(s);
21 long ts32[2] = { CLAMP(s), ns };
22 if (clk == CLOCK_REALTIME && !flags)
23 r = __syscall_cp(SYS_nanosleep, &ts32, &ts32);
24 else
25 r = __syscall_cp(SYS_clock_nanosleep, clk, flags, &ts32, &ts32);
26 if (r==-EINTR && rem && !(flags & TIMER_ABSTIME)) {
27 rem->tv_sec = ts32[0] + extra;
28 rem->tv_nsec = ts32[1];
29 }
30 return -r;
31#else
32 if (clk == CLOCK_REALTIME && !flags)
33 return -__syscall_cp(SYS_nanosleep, req, rem);
34 return -__syscall_cp(SYS_clock_nanosleep, clk, flags, req, rem);
35#endif
936}
37
38weak_alias(__clock_nanosleep, clock_nanosleep);
lib/libc/musl/src/time/clock_settime.c+17
......@@ -1,7 +1,24 @@
11#include <time.h>
2#include <errno.h>
23#include "syscall.h"
34
5#define IS32BIT(x) !((x)+0x80000000ULL>>32)
6
47int clock_settime(clockid_t clk, const struct timespec *ts)
58{
9#ifdef SYS_clock_settime64
10 time_t s = ts->tv_sec;
11 long ns = ts->tv_nsec;
12 int r = -ENOSYS;
13 if (SYS_clock_settime == SYS_clock_settime64 || !IS32BIT(s))
14 r = __syscall(SYS_clock_settime64, clk,
15 ((long long[]){s, ns}));
16 if (SYS_clock_settime == SYS_clock_settime64 || r!=-ENOSYS)
17 return __syscall_ret(r);
18 if (!IS32BIT(s))
19 return __syscall_ret(-ENOTSUP);
20 return syscall(SYS_clock_settime, clk, ((long[]){s, ns}));
21#else
622 return syscall(SYS_clock_settime, clk, ts);
23#endif
724}
lib/libc/musl/src/time/nanosleep.c+1-1
......@@ -3,5 +3,5 @@
33
44int nanosleep(const struct timespec *req, struct timespec *rem)
55{
6 return syscall_cp(SYS_nanosleep, req, rem);
6 return __syscall_ret(-__clock_nanosleep(CLOCK_REALTIME, 0, req, rem));
77}
lib/libc/musl/src/time/timer_create.c+2-2
......@@ -1,5 +1,6 @@
11#include <time.h>
22#include <setjmp.h>
3#include <limits.h>
34#include "pthread_impl.h"
45
56struct ksigevent {
......@@ -48,7 +49,6 @@ static void *start(void *arg)
4849{
4950 pthread_t self = __pthread_self();
5051 struct start_args *args = arg;
51 int id = self->timer_id;
5252 jmp_buf jb;
5353
5454 void (*notify)(union sigval) = args->sev->sigev_notify_function;
......@@ -65,7 +65,7 @@ static void *start(void *arg)
6565 }
6666 if (self->timer_id < 0) break;
6767 }
68 __syscall(SYS_timer_delete, id);
68 __syscall(SYS_timer_delete, self->timer_id & INT_MAX);
6969 return 0;
7070}
7171
lib/libc/musl/src/time/timer_gettime.c+16
......@@ -8,5 +8,21 @@ int timer_gettime(timer_t t, struct itimerspec *val)
88 pthread_t td = (void *)((uintptr_t)t << 1);
99 t = (void *)(uintptr_t)(td->timer_id & INT_MAX);
1010 }
11#ifdef SYS_timer_gettime64
12 int r = -ENOSYS;
13 if (sizeof(time_t) > 4)
14 r = __syscall(SYS_timer_gettime64, t, val);
15 if (SYS_timer_gettime == SYS_timer_gettime64 || r!=-ENOSYS)
16 return __syscall_ret(r);
17 long val32[4];
18 r = __syscall(SYS_timer_gettime, t, val32);
19 if (!r) {
20 val->it_interval.tv_sec = val32[0];
21 val->it_interval.tv_nsec = val32[1];
22 val->it_value.tv_sec = val32[2];
23 val->it_value.tv_nsec = val32[3];
24 }
25 return __syscall_ret(r);
26#endif
1127 return syscall(SYS_timer_gettime, t, val);
1228}
lib/libc/musl/src/time/timer_settime.c+25
......@@ -2,11 +2,36 @@
22#include <limits.h>
33#include "pthread_impl.h"
44
5#define IS32BIT(x) !((x)+0x80000000ULL>>32)
6
57int timer_settime(timer_t t, int flags, const struct itimerspec *restrict val, struct itimerspec *restrict old)
68{
79 if ((intptr_t)t < 0) {
810 pthread_t td = (void *)((uintptr_t)t << 1);
911 t = (void *)(uintptr_t)(td->timer_id & INT_MAX);
1012 }
13#ifdef SYS_timer_settime64
14 time_t is = val->it_interval.tv_sec, vs = val->it_value.tv_sec;
15 long ins = val->it_interval.tv_nsec, vns = val->it_value.tv_nsec;
16 int r = -ENOSYS;
17 if (SYS_timer_settime == SYS_timer_settime64
18 || !IS32BIT(is) || !IS32BIT(vs) || (sizeof(time_t)>4 && old))
19 r = __syscall(SYS_timer_settime64, t, flags,
20 ((long long[]){is, ins, vs, vns}), old);
21 if (SYS_timer_settime == SYS_timer_settime64 || r!=-ENOSYS)
22 return __syscall_ret(r);
23 if (!IS32BIT(is) || !IS32BIT(vs))
24 return __syscall_ret(-ENOTSUP);
25 long old32[4];
26 r = __syscall(SYS_timer_settime, t, flags,
27 ((long[]){is, ins, vs, vns}), old32);
28 if (!r && old) {
29 old->it_interval.tv_sec = old32[0];
30 old->it_interval.tv_nsec = old32[1];
31 old->it_value.tv_sec = old32[2];
32 old->it_value.tv_nsec = old32[3];
33 }
34 return __syscall_ret(r);
35#endif
1136 return syscall(SYS_timer_settime, t, flags, val, old);
1237}
lib/libc/musl/src/unistd/alarm.c+3-3
......@@ -4,7 +4,7 @@
44
55unsigned alarm(unsigned seconds)
66{
7 struct itimerval it = { .it_value.tv_sec = seconds };
8 __syscall(SYS_setitimer, ITIMER_REAL, &it, &it);
9 return it.it_value.tv_sec + !!it.it_value.tv_usec;
7 struct itimerval it = { .it_value.tv_sec = seconds }, old = { 0 };
8 setitimer(ITIMER_REAL, &it, &old);
9 return old.it_value.tv_sec + !!old.it_value.tv_usec;
1010}
lib/libc/musl/src/unistd/lseek.c+3-2
......@@ -1,7 +1,7 @@
11#include <unistd.h>
22#include "syscall.h"
33
4off_t lseek(int fd, off_t offset, int whence)
4off_t __lseek(int fd, off_t offset, int whence)
55{
66#ifdef SYS__llseek
77 off_t result;
......@@ -11,4 +11,5 @@ off_t lseek(int fd, off_t offset, int whence)
1111#endif
1212}
1313
14weak_alias(lseek, lseek64);
14weak_alias(__lseek, lseek);
15weak_alias(__lseek, lseek64);
lib/libc/musl/src/unistd/mipsn32/lseek.c created+20
......@@ -0,0 +1,20 @@
1#include <unistd.h>
2#include "syscall.h"
3
4off_t __lseek(int fd, off_t offset, int whence)
5{
6 register long long r4 __asm__("$4") = fd;
7 register long long r5 __asm__("$5") = offset;
8 register long long r6 __asm__("$6") = whence;
9 register long long r7 __asm__("$7");
10 register long long r2 __asm__("$2") = SYS_lseek;
11 __asm__ __volatile__ (
12 "syscall"
13 : "+&r"(r2), "=r"(r7)
14 : "r"(r4), "r"(r5), "r"(r6)
15 : SYSCALL_CLOBBERLIST);
16 return r7 ? __syscall_ret(-r2) : r2;
17}
18
19weak_alias(__lseek, lseek);
20weak_alias(__lseek, lseek64);
lib/libc/musl/src/unistd/x32/lseek.c created+15
......@@ -0,0 +1,15 @@
1#include <unistd.h>
2#include "syscall.h"
3
4off_t __lseek(int fd, off_t offset, int whence)
5{
6 off_t ret;
7 __asm__ __volatile__ ("syscall"
8 : "=a"(ret)
9 : "a"(SYS_lseek), "D"(fd), "S"(offset), "d"(whence)
10 : "rcx", "r11", "memory");
11 return ret < 0 ? __syscall_ret(ret) : ret;
12}
13
14weak_alias(__lseek, lseek);
15weak_alias(__lseek, lseek64);
src/install_files.h+8-1
......@@ -148,6 +148,7 @@ static const char *ZIG_MUSL_SRC_FILES[] = {
148148"musl/src/env/clearenv.c",
149149"musl/src/env/getenv.c",
150150"musl/src/env/putenv.c",
151"musl/src/env/secure_getenv.c",
151152"musl/src/env/setenv.c",
152153"musl/src/env/unsetenv.c",
153154"musl/src/errno/__errno_location.c",
......@@ -311,6 +312,7 @@ static const char *ZIG_MUSL_SRC_FILES[] = {
311312"musl/src/linux/chroot.c",
312313"musl/src/linux/clock_adjtime.c",
313314"musl/src/linux/clone.c",
315"musl/src/linux/copy_file_range.c",
314316"musl/src/linux/epoll.c",
315317"musl/src/linux/eventfd.c",
316318"musl/src/linux/fallocate.c",
......@@ -1098,8 +1100,10 @@ static const char *ZIG_MUSL_SRC_FILES[] = {
10981100"musl/src/process/fork.c",
10991101"musl/src/process/i386/vfork.s",
11001102"musl/src/process/posix_spawn.c",
1103"musl/src/process/posix_spawn_file_actions_addchdir.c",
11011104"musl/src/process/posix_spawn_file_actions_addclose.c",
11021105"musl/src/process/posix_spawn_file_actions_adddup2.c",
1106"musl/src/process/posix_spawn_file_actions_addfchdir.c",
11031107"musl/src/process/posix_spawn_file_actions_addopen.c",
11041108"musl/src/process/posix_spawn_file_actions_destroy.c",
11051109"musl/src/process/posix_spawn_file_actions_init.c",
......@@ -1251,7 +1255,9 @@ static const char *ZIG_MUSL_SRC_FILES[] = {
12511255"musl/src/signal/sigtimedwait.c",
12521256"musl/src/signal/sigwait.c",
12531257"musl/src/signal/sigwaitinfo.c",
1258"musl/src/signal/x32/getitimer.c",
12541259"musl/src/signal/x32/restore.s",
1260"musl/src/signal/x32/setitimer.c",
12551261"musl/src/signal/x32/sigsetjmp.s",
12561262"musl/src/signal/x86_64/restore.s",
12571263"musl/src/signal/x86_64/sigsetjmp.s",
......@@ -1707,7 +1713,6 @@ static const char *ZIG_MUSL_SRC_FILES[] = {
17071713"musl/src/thread/x32/__unmapself.s",
17081714"musl/src/thread/x32/clone.s",
17091715"musl/src/thread/x32/syscall_cp.s",
1710"musl/src/thread/x32/syscall_cp_fixup.c",
17111716"musl/src/thread/x86_64/__set_thread_area.s",
17121717"musl/src/thread/x86_64/__unmapself.s",
17131718"musl/src/thread/x86_64/clone.s",
......@@ -1791,6 +1796,7 @@ static const char *ZIG_MUSL_SRC_FILES[] = {
17911796"musl/src/unistd/lseek.c",
17921797"musl/src/unistd/mips/pipe.s",
17931798"musl/src/unistd/mips64/pipe.s",
1799"musl/src/unistd/mipsn32/lseek.c",
17941800"musl/src/unistd/mipsn32/pipe.s",
17951801"musl/src/unistd/nice.c",
17961802"musl/src/unistd/pause.c",
......@@ -1835,5 +1841,6 @@ static const char *ZIG_MUSL_SRC_FILES[] = {
18351841"musl/src/unistd/usleep.c",
18361842"musl/src/unistd/write.c",
18371843"musl/src/unistd/writev.c",
1844"musl/src/unistd/x32/lseek.c",
18381845};
18391846#endif