authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-04-07 19:08:07+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-04-11 02:28:35+02:00
log3df67dc4148b9d2db8cd4b95a64048123b2a3b58
tree826d055e38593c06e152eaf6c7e19d69cd348fe8
parent30200edc1e65c2be37430f1267b94b414b37d9c7
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

musl: Add hexagon-linux-musl sources.

This is from Qualcomm's fork: https://github.com/quic/musl I maintain a fork of musl where I rebase Qualcomm's changes on top of the latest musl release, which I then use as the basis for musl updates in Zig. My fork can be found here: https://github.com/alexrp/musl/tree/hexagon

28 files changed, 1069 insertions(+), 0 deletions(-)

lib/libc/musl/arch/hexagon/atomic_arch.h created+191
...@@ -0,0 +1,191 @@
1#define a_ctz_32 a_ctz_32
2static inline int a_ctz_32(unsigned long x)
3{
4 __asm__(
5 "%0 = ct0(%0)\n\t"
6 : "+r"(x));
7 return x;
8}
9
10#define a_ctz_64 a_ctz_64
11static inline int a_ctz_64(uint64_t x)
12{
13 int count;
14 __asm__(
15 "%0 = ct0(%1)\n\t"
16 : "=r"(count) : "r"(x));
17 return count;
18}
19#define a_clz_64 a_clz_64
20static inline int a_clz_64(uint64_t x)
21{
22 __asm__(
23 "%0 = brev(%0)\n\t"
24 : "+r"(x));
25 return a_ctz_64(x);
26}
27
28#define a_cas a_cas
29static inline int a_cas(volatile int *p, int t, int s)
30{
31 int dummy;
32 __asm__ __volatile__(
33 "1: %0 = memw_locked(%1)\n\t"
34 " { p0 = cmp.eq(%0, %2)\n\t"
35 " if (!p0.new) jump:nt 2f }\n\t"
36 " memw_locked(%1, p0) = %3\n\t"
37 " if (!p0) jump 1b\n\t"
38 "2: \n\t"
39 : "=&r"(dummy)
40 : "r"(p), "r"(t), "r"(s)
41 : "p0", "memory" );
42 return dummy;
43}
44
45#define a_cas_p a_cas_p
46static inline void *a_cas_p(volatile void *p, void *t, void *s)
47{
48 return (void *)a_cas(p, (int)t, (int)s);
49}
50
51#define a_swap a_swap
52static inline int a_swap(volatile int *x, int v)
53{
54 int old, dummy;
55 __asm__ __volatile__(
56 " %1 = %3\n\t"
57 "1: %0 = memw_locked(%2)\n\t"
58 " memw_locked(%2, p0) = %1\n\t"
59 " if (!p0) jump 1b\n\t"
60 : "=&r"(old), "=&r"(dummy)
61 : "r"(x), "r"(v)
62 : "p0", "memory" );
63 return old;
64}
65
66#define a_fetch_add a_fetch_add
67static inline int a_fetch_add(volatile int *x, int v)
68{
69 int old, dummy;
70 __asm__ __volatile__(
71 "1: %0 = memw_locked(%2)\n\t"
72 " %1 = add(%0, %3)\n\t"
73 " memw_locked(%2, p0) = %1\n\t"
74 " if (!p0) jump 1b\n\t"
75 : "=&r"(old), "=&r"(dummy)
76 : "r"(x), "r"(v)
77 : "p0", "memory" );
78 return old;
79}
80
81#define a_inc a_inc
82static inline void a_inc(volatile int *x)
83{
84 a_fetch_add(x, 1);
85}
86
87#define a_dec a_dec
88static inline void a_dec(volatile int *x)
89{
90 int dummy;
91 __asm__ __volatile__(
92 "1: %0 = memw_locked(%1)\n\t"
93 " %0 = add(%0, #-1)\n\t"
94 " memw_locked(%1, p0) = %0\n\t"
95 " if (!p0) jump 1b\n\t"
96 : "=&r"(dummy)
97 : "r"(x)
98 : "p0", "memory" );
99}
100
101#define a_store a_store
102static inline void a_store(volatile int *p, int x)
103{
104 int dummy;
105 __asm__ __volatile__(
106 "1: %0 = memw_locked(%1)\n\t"
107 " memw_locked(%1, p0) = %2\n\t"
108 " if (!p0) jump 1b\n\t"
109 : "=&r"(dummy)
110 : "r"(p), "r"(x)
111 : "p0", "memory" );
112}
113
114#define a_barrier a_barrier
115static inline void a_barrier()
116{
117 __asm__ __volatile__ ("barrier" ::: "memory");
118}
119#define a_spin a_spin
120static inline void a_spin()
121{
122 __asm__ __volatile__ ("pause(#255)" :::);
123}
124
125#define a_crash a_crash
126static inline void a_crash()
127{
128 *(volatile char *)0=0;
129}
130
131#define a_and a_and
132static inline void a_and(volatile int *p, int v)
133{
134 int dummy;
135 __asm__ __volatile__(
136 "1: %0 = memw_locked(%1)\n\t"
137 " %0 = and(%0, %2)\n\t"
138 " memw_locked(%1, p0) = %0\n\t"
139 " if (!p0) jump 1b\n\t"
140 : "=&r"(dummy)
141 : "r"(p), "r"(v)
142 : "p0", "memory" );
143}
144
145#define a_or a_or
146static inline void a_or(volatile int *p, int v)
147{
148 int dummy;
149 __asm__ __volatile__(
150 "1: %0 = memw_locked(%1)\n\t"
151 " %0 = or(%0, %2)\n\t"
152 " memw_locked(%1, p0) = %0\n\t"
153 " if (!p0) jump 1b\n\t"
154 : "=&r"(dummy)
155 : "r"(p), "r"(v)
156 : "p0", "memory" );
157}
158
159#define a_or_l a_or_l
160static inline void a_or_l(volatile void *p, long v)
161{
162 a_or(p, v);
163}
164
165#define a_and_64 a_and_64
166static inline void a_and_64(volatile uint64_t *p, uint64_t v)
167{
168 uint64_t dummy;
169 __asm__ __volatile__(
170 "1: %0 = memd_locked(%1)\n\t"
171 " %0 = and(%0, %2)\n\t"
172 " memd_locked(%1, p0) = %0\n\t"
173 " if (!p0) jump 1b\n\t"
174 : "=&r"(dummy)
175 : "r"(p), "r"(v)
176 : "p0", "memory" );
177}
178
179#define a_or_64 a_or_64
180static inline void a_or_64(volatile uint64_t *p, uint64_t v)
181{
182 uint64_t dummy;
183 __asm__ __volatile__(
184 "1: %0 = memd_locked(%1)\n\t"
185 " %0 = or(%0, %2)\n\t"
186 " memd_locked(%1, p0) = %0\n\t"
187 " if (!p0) jump 1b\n\t"
188 : "=&r"(dummy)
189 : "r"(p), "r"(v)
190 : "p0", "memory" );
191}
lib/libc/musl/arch/hexagon/bits/fenv.h created+20
...@@ -0,0 +1,20 @@
1#define FE_INVALID (1 << 1)
2#define FE_DIVBYZERO (1 << 2)
3#define FE_OVERFLOW (1 << 3)
4#define FE_UNDERFLOW (1 << 4)
5#define FE_INEXACT (1 << 5)
6#define FE_ALL_EXCEPT (FE_DIVBYZERO | FE_INEXACT | FE_INVALID | \
7 FE_OVERFLOW | FE_UNDERFLOW)
8
9#define FE_TONEAREST 0x00
10#define FE_TOWARDZERO 0x01
11#define FE_DOWNWARD 0x02
12#define FE_UPWARD 0x03
13
14typedef unsigned long fexcept_t;
15
16typedef struct {
17 unsigned long __cw;
18} fenv_t;
19
20#define FE_DFL_ENV ((const fenv_t *) -1)
lib/libc/musl/arch/hexagon/bits/float.h created+16
...@@ -0,0 +1,16 @@
1#define FLT_EVAL_METHOD 0
2
3#define LDBL_TRUE_MIN 4.94065645841246544177e-324L
4#define LDBL_MIN 2.22507385850720138309e-308L
5#define LDBL_MAX 1.79769313486231570815e+308L
6#define LDBL_EPSILON 2.22044604925031308085e-16L
7
8#define LDBL_MANT_DIG 53
9#define LDBL_MIN_EXP (-1021)
10#define LDBL_MAX_EXP 1024
11
12#define LDBL_DIG 15
13#define LDBL_MIN_10_EXP (-307)
14#define LDBL_MAX_10_EXP 308
15
16#define DECIMAL_DIG 17
lib/libc/musl/arch/hexagon/bits/ipcstat.h created+1
...@@ -0,0 +1 @@
1#define IPC_STAT 0x102
lib/libc/musl/arch/hexagon/bits/msg.h created+18
...@@ -0,0 +1,18 @@
1struct msqid_ds {
2 struct ipc_perm msg_perm;
3 unsigned long __msg_stime_lo;
4 unsigned long __msg_stime_hi;
5 unsigned long __msg_rtime_lo;
6 unsigned long __msg_rtime_hi;
7 unsigned long __msg_ctime_lo;
8 unsigned long __msg_ctime_hi;
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 time_t msg_stime;
16 time_t msg_rtime;
17 time_t msg_ctime;
18};
lib/libc/musl/arch/hexagon/bits/posix.h created+2
...@@ -0,0 +1,2 @@
1#define _POSIX_V6_ILP32_OFFBIG 1
2#define _POSIX_V7_ILP32_OFFBIG 1
lib/libc/musl/arch/hexagon/bits/sem.h created+13
...@@ -0,0 +1,13 @@
1struct semid_ds {
2 struct ipc_perm sem_perm;
3 unsigned long __sem_otime_lo;
4 unsigned long __sem_otime_hi;
5 unsigned long __sem_ctime_lo;
6 unsigned long __sem_ctime_hi;
7 unsigned short sem_nsems;
8 char __sem_nsems_pad[sizeof(long)-sizeof(short)];
9 long __unused3;
10 long __unused4;
11 time_t sem_otime;
12 time_t sem_ctime;
13};
lib/libc/musl/arch/hexagon/bits/setjmp.h created+1
...@@ -0,0 +1 @@
1typedef long long __jmp_buf[8];
lib/libc/musl/arch/hexagon/bits/shm.h created+31
...@@ -0,0 +1,31 @@
1#define SHMLBA 4096
2
3struct shmid_ds {
4 struct ipc_perm shm_perm;
5 size_t shm_segsz;
6 unsigned long __shm_atime_lo;
7 unsigned long __shm_atime_hi;
8 unsigned long __shm_dtime_lo;
9 unsigned long __shm_dtime_hi;
10 unsigned long __shm_ctime_lo;
11 unsigned long __shm_ctime_hi;
12 pid_t shm_cpid;
13 pid_t shm_lpid;
14 unsigned long shm_nattch;
15 unsigned long __pad1;
16 unsigned long __pad2;
17 unsigned long __pad3;
18 time_t shm_atime;
19 time_t shm_dtime;
20 time_t shm_ctime;
21};
22
23struct shminfo {
24 unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4];
25};
26
27struct shm_info {
28 int __used_ids;
29 unsigned long shm_tot, shm_rss, shm_swp;
30 unsigned long __swap_attempts, __swap_successes;
31};
lib/libc/musl/arch/hexagon/bits/signal.h created+103
...@@ -0,0 +1,103 @@
1#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
2 || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
3
4#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
5#define MINSIGSTKSZ 2048
6#define SIGSTKSZ 8192
7#endif
8
9#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
10typedef int greg_t, gregset_t[18];
11typedef struct sigcontext
12{
13 unsigned long r0, r1, r2, r3;
14 unsigned long r4, r5, r6, r7;
15 unsigned long r8, r9, r10, r11;
16 unsigned long r12, r13, r14, r15;
17 unsigned long r16, r17, r18, r19;
18 unsigned long r20, r21, r22, r23;
19 unsigned long r24, r25, r26, r27;
20 unsigned long r28, r29, r30, r31;
21 unsigned long sa0;
22 unsigned long lc0;
23 unsigned long sa1;
24 unsigned long lc1;
25 unsigned long m0;
26 unsigned long m1;
27 unsigned long usr;
28 unsigned long p3_0;
29 unsigned long gp;
30 unsigned long ugp;
31 unsigned long pc;
32 unsigned long cause;
33 unsigned long badva;
34 unsigned long pad1;
35 unsigned long long pad2;
36} mcontext_t;
37#else
38typedef struct {
39 unsigned long __regs[48];
40} __attribute__((__aligned__(8))) mcontext_t;
41#endif
42
43struct sigaltstack {
44 void *ss_sp;
45 int ss_flags;
46 size_t ss_size;
47};
48
49typedef struct __ucontext {
50 unsigned long uc_flags;
51 struct __ucontext *uc_link;
52 stack_t uc_stack;
53 mcontext_t uc_mcontext;
54 sigset_t uc_sigmask;
55} ucontext_t;
56
57#define SA_NOCLDSTOP 1
58#define SA_NOCLDWAIT 2
59#define SA_SIGINFO 4
60#define SA_ONSTACK 0x08000000
61#define SA_RESTART 0x10000000
62#define SA_NODEFER 0x40000000
63#define SA_RESETHAND 0x80000000
64#define SA_RESTORER 0x04000000
65
66#endif
67
68#define SIGHUP 1
69#define SIGINT 2
70#define SIGQUIT 3
71#define SIGILL 4
72#define SIGTRAP 5
73#define SIGABRT 6
74#define SIGIOT SIGABRT
75#define SIGBUS 7
76#define SIGFPE 8
77#define SIGKILL 9
78#define SIGUSR1 10
79#define SIGSEGV 11
80#define SIGUSR2 12
81#define SIGPIPE 13
82#define SIGALRM 14
83#define SIGTERM 15
84#define SIGSTKFLT 16
85#define SIGCHLD 17
86#define SIGCONT 18
87#define SIGSTOP 19
88#define SIGTSTP 20
89#define SIGTTIN 21
90#define SIGTTOU 22
91#define SIGURG 23
92#define SIGXCPU 24
93#define SIGXFSZ 25
94#define SIGVTALRM 26
95#define SIGPROF 27
96#define SIGWINCH 28
97#define SIGIO 29
98#define SIGPOLL 29
99#define SIGPWR 30
100#define SIGSYS 31
101#define SIGUNUSED SIGSYS
102
103#define _NSIG 65
lib/libc/musl/arch/hexagon/bits/stat.h created+20
...@@ -0,0 +1,20 @@
1/* copied from kernel definition, but with padding replaced
2 * by the corresponding correctly-sized userspace types. */
3struct stat {
4 dev_t st_dev;
5 ino_t st_ino;
6 mode_t st_mode;
7 nlink_t st_nlink;
8 uid_t st_uid;
9 gid_t st_gid;
10 dev_t st_rdev;
11 unsigned long __pad;
12 off_t st_size;
13 blksize_t st_blksize;
14 int __pad2;
15 blkcnt_t st_blocks;
16 struct timespec st_atim;
17 struct timespec st_mtim;
18 struct timespec st_ctim;
19 unsigned __unused[2];
20};
lib/libc/musl/arch/hexagon/bits/stdint.h created+20
...@@ -0,0 +1,20 @@
1typedef int32_t int_fast16_t;
2typedef int32_t int_fast32_t;
3typedef uint32_t uint_fast16_t;
4typedef uint32_t uint_fast32_t;
5
6#define INT_FAST16_MIN INT32_MIN
7#define INT_FAST32_MIN INT32_MIN
8
9#define INT_FAST16_MAX INT32_MAX
10#define INT_FAST32_MAX INT32_MAX
11
12#define UINT_FAST16_MAX UINT32_MAX
13#define UINT_FAST32_MAX UINT32_MAX
14
15#define INTPTR_MIN INT32_MIN
16#define INTPTR_MAX INT32_MAX
17#define UINTPTR_MAX UINT32_MAX
18#define PTRDIFF_MIN INT32_MIN
19#define PTRDIFF_MAX INT32_MAX
20#define SIZE_MAX UINT32_MAX
lib/libc/musl/arch/hexagon/bits/user.h created+60
...@@ -0,0 +1,60 @@
1#ifndef HEXAGON_ASM_USER_H
2#define HEXAGON_ASM_USER_H
3
4struct user_regs_struct {
5 unsigned long r0;
6 unsigned long r1;
7 unsigned long r2;
8 unsigned long r3;
9 unsigned long r4;
10 unsigned long r5;
11 unsigned long r6;
12 unsigned long r7;
13 unsigned long r8;
14 unsigned long r9;
15 unsigned long r10;
16 unsigned long r11;
17 unsigned long r12;
18 unsigned long r13;
19 unsigned long r14;
20 unsigned long r15;
21 unsigned long r16;
22 unsigned long r17;
23 unsigned long r18;
24 unsigned long r19;
25 unsigned long r20;
26 unsigned long r21;
27 unsigned long r22;
28 unsigned long r23;
29 unsigned long r24;
30 unsigned long r25;
31 unsigned long r26;
32 unsigned long r27;
33 unsigned long r28;
34 unsigned long r29;
35 unsigned long r30;
36 unsigned long r31;
37 unsigned long sa0;
38 unsigned long lc0;
39 unsigned long sa1;
40 unsigned long lc1;
41 unsigned long m0;
42 unsigned long m1;
43 unsigned long usr;
44 unsigned long p3_0;
45 unsigned long gp;
46 unsigned long ugp;
47 unsigned long pc;
48 unsigned long cause;
49 unsigned long badva;
50 unsigned long cs0;
51 unsigned long cs1;
52 unsigned long pad1;
53};
54
55#define ELF_NGREG 48
56typedef unsigned long elf_greg_t, elf_gregset_t[ELF_NGREG];
57
58typedef unsigned long elf_fpregset_t;
59
60#endif
lib/libc/musl/arch/hexagon/crt_arch.h created+22
...@@ -0,0 +1,22 @@
1__asm__(
2".weak _DYNAMIC \n"
3".hidden _DYNAMIC \n"
4".text \n"
5".global " START " \n"
6".type " START ", %function \n"
7START ": \n"
8" // Find _DYNAMIC\n"
9" jump 1f\n"
10".word _DYNAMIC - .\n"
11"1: r2 = pc\n"
12" r2 = add(r2, #-4)\n"
13" r1 = memw(r2)\n"
14" r1 = add(r2, r1)\n"
15" r30 = #0 // Signals the end of backtrace\n"
16" r0 = r29 // Pointer to argc/argv\n"
17" r29 = and(r29, #-16) // Align\n"
18" memw(r29+#-8) = r29\n"
19" r29 = add(r29, #-8)\n"
20" call " START "_c \n"
21".size " START ", .-" START "\n"
22);
lib/libc/musl/arch/hexagon/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/hexagon/pthread_arch.h created+13
...@@ -0,0 +1,13 @@
1// Hexagon supports variant 2 TLS.
2static inline uintptr_t __get_tp()
3{
4 uintptr_t tp;
5 __asm__ ( "%0 = ugp" : "=r"(tp));
6 return tp;
7}
8
9#define TP_ADJ(p) (p)
10
11#define CANCEL_REG_IP 43
12
13#define MC_PC pc
lib/libc/musl/arch/hexagon/reloc.h created+16
...@@ -0,0 +1,16 @@
1#include <endian.h>
2
3#define LDSO_ARCH "hexagon"
4#define TPOFF_K 0
5
6#define REL_SYMBOLIC R_HEX_32
7#define REL_GOT R_HEX_GLOB_DAT
8#define REL_PLT R_HEX_JMP_SLOT
9#define REL_RELATIVE R_HEX_RELATIVE
10#define REL_COPY R_HEX_COPY
11#define REL_DTPMOD R_HEX_DTPMOD_32
12#define REL_TPOFF R_HEX_TPREL_32
13#define REL_DTPOFF R_HEX_DTPREL_32
14
15#define CRTJMP(pc,sp) __asm__ __volatile__( \
16 "r29 = %1 ; jumpr %0" : : "r"(pc), "r"(sp) : "memory" )
lib/libc/musl/arch/hexagon/syscall_arch.h created+78
...@@ -0,0 +1,78 @@
1
2#define __SYSCALL_LL_E(x) \
3((union { long long ll; long l[2]; }){ .ll = x }).l[0], \
4((union { long long ll; long l[2]; }){ .ll = x }).l[1]
5#define __SYSCALL_LL_O(x) 0, __SYSCALL_LL_E((x))
6
7#define __asm_syscall(...) do { \
8 __asm__ __volatile__ ( "trap0(#1)" \
9 : "=r"(r0) : __VA_ARGS__ : "memory"); \
10 return r0; \
11 } while (0)
12
13static inline long __syscall0(long n)
14{
15 register long r6 __asm__("r6") = n;
16 register long r0 __asm__("r0");
17 __asm_syscall("r"(r6));
18}
19
20static inline long __syscall1(long n, long a)
21{
22 register long r6 __asm__("r6") = n;
23 register long r0 __asm__("r0") = a;
24 __asm_syscall("r"(r6), "0"(r0));
25}
26
27static inline long __syscall2(long n, long a, long b)
28{
29 register long r6 __asm__("r6") = n;
30 register long r0 __asm__("r0") = a;
31 register long r1 __asm__("r1") = b;
32 __asm_syscall("r"(r6), "0"(r0), "r"(r1));
33}
34
35static inline long __syscall3(long n, long a, long b, long c)
36{
37 register long r6 __asm__("r6") = n;
38 register long r0 __asm__("r0") = a;
39 register long r1 __asm__("r1") = b;
40 register long r2 __asm__("r2") = c;
41 __asm_syscall("r"(r6), "0"(r0), "r"(r1), "r"(r2));
42}
43
44static inline long __syscall4(long n, long a, long b, long c, long d)
45{
46 register long r6 __asm__("r6") = n;
47 register long r0 __asm__("r0") = a;
48 register long r1 __asm__("r1") = b;
49 register long r2 __asm__("r2") = c;
50 register long r3 __asm__("r3") = d;
51 __asm_syscall("r"(r6), "0"(r0), "r"(r1), "r"(r2), "r"(r3));
52}
53
54static inline long __syscall5(long n, long a, long b, long c, long d, long e)
55{
56 register long r6 __asm__("r6") = n;
57 register long r0 __asm__("r0") = a;
58 register long r1 __asm__("r1") = b;
59 register long r2 __asm__("r2") = c;
60 register long r3 __asm__("r3") = d;
61 register long r4 __asm__("r4") = e;
62 __asm_syscall("r"(r6), "0"(r0), "r"(r1), "r"(r2), "r"(r3), "r"(r4));
63}
64
65static inline long __syscall6(long n, long a, long b, long c, long d, long e,
66 long f)
67{
68 register long r6 __asm__("r6") = n;
69 register long r0 __asm__("r0") = a;
70 register long r1 __asm__("r1") = b;
71 register long r2 __asm__("r2") = c;
72 register long r3 __asm__("r3") = d;
73 register long r4 __asm__("r4") = e;
74 register long r5 __asm__("r5") = f;
75 __asm_syscall("r"(r6), "0"(r0), "r"(r1), "r"(r2), "r"(r3), "r"(r4), "r"(r5));
76}
77
78#define SYSCALL_FADVISE_6_ARG
lib/libc/musl/include/elf.h+101
...@@ -3406,6 +3406,107 @@ enum...@@ -3406,6 +3406,107 @@ enum
3406#define R_LARCH_32_PCREL 993406#define R_LARCH_32_PCREL 99
3407#define R_LARCH_RELAX 1003407#define R_LARCH_RELAX 100
34083408
3409#define R_HEX_NONE 0
3410#define R_HEX_B22_PCREL 1
3411#define R_HEX_B15_PCREL 2
3412#define R_HEX_B7_PCREL 3
3413#define R_HEX_LO16 4
3414#define R_HEX_HI16 5
3415#define R_HEX_32 6
3416#define R_HEX_16 7
3417#define R_HEX_8 8
3418#define R_HEX_GPREL16_0 9
3419#define R_HEX_GPREL16_1 10
3420#define R_HEX_GPREL16_2 11
3421#define R_HEX_GPREL16_3 12
3422#define R_HEX_HL16 13
3423#define R_HEX_B13_PCREL 14
3424#define R_HEX_B9_PCREL 15
3425#define R_HEX_B32_PCREL_X 16
3426#define R_HEX_32_6_X 17
3427#define R_HEX_B22_PCREL_X 18
3428#define R_HEX_B15_PCREL_X 19
3429#define R_HEX_B13_PCREL_X 20
3430#define R_HEX_B9_PCREL_X 21
3431#define R_HEX_B7_PCREL_X 22
3432#define R_HEX_16_X 23
3433#define R_HEX_12_X 24
3434#define R_HEX_11_X 25
3435#define R_HEX_10_X 26
3436#define R_HEX_9_X 27
3437#define R_HEX_8_X 28
3438#define R_HEX_7_X 29
3439#define R_HEX_6_X 30
3440#define R_HEX_32_PCREL 31
3441#define R_HEX_COPY 32
3442#define R_HEX_GLOB_DAT 33
3443#define R_HEX_JMP_SLOT 34
3444#define R_HEX_RELATIVE 35
3445#define R_HEX_PLT_B22_PCREL 36
3446#define R_HEX_GOTOFF_LO16 37
3447#define R_HEX_GOTOFF_HI16 38
3448#define R_HEX_GOTOFF_32 39
3449#define R_HEX_GOT_LO16 40
3450#define R_HEX_GOT_HI16 41
3451#define R_HEX_GOT_32 42
3452#define R_HEX_GOT_16 43
3453#define R_HEX_DTPMOD_32 44
3454#define R_HEX_DTPREL_LO16 45
3455#define R_HEX_DTPREL_HI16 46
3456#define R_HEX_DTPREL_32 47
3457#define R_HEX_DTPREL_16 48
3458#define R_HEX_GD_PLT_B22_PCREL 49
3459#define R_HEX_GD_GOT_LO16 50
3460#define R_HEX_GD_GOT_HI16 51
3461#define R_HEX_GD_GOT_32 52
3462#define R_HEX_GD_GOT_16 53
3463#define R_HEX_IE_LO16 54
3464#define R_HEX_IE_HI16 55
3465#define R_HEX_IE_32 56
3466#define R_HEX_IE_GOT_LO16 57
3467#define R_HEX_IE_GOT_HI16 58
3468#define R_HEX_IE_GOT_32 59
3469#define R_HEX_IE_GOT_16 60
3470#define R_HEX_TPREL_LO16 61
3471#define R_HEX_TPREL_HI16 62
3472#define R_HEX_TPREL_32 63
3473#define R_HEX_TPREL_16 64
3474#define R_HEX_6_PCREL_X 65
3475#define R_HEX_GOTREL_32_6_X 66
3476#define R_HEX_GOTREL_16_X 67
3477#define R_HEX_GOTREL_11_X 68
3478#define R_HEX_GOT_32_6_X 69
3479#define R_HEX_GOT_16_X 70
3480#define R_HEX_GOT_11_X 71
3481#define R_HEX_DTPREL_32_6_X 72
3482#define R_HEX_DTPREL_16_X 73
3483#define R_HEX_DTPREL_11_X 74
3484#define R_HEX_GD_GOT_32_6_X 75
3485#define R_HEX_GD_GOT_16_X 76
3486#define R_HEX_GD_GOT_11_X 77
3487#define R_HEX_IE_32_6_X 78
3488#define R_HEX_IE_16_X 79
3489#define R_HEX_IE_GOT_32_6_X 80
3490#define R_HEX_IE_GOT_16_X 81
3491#define R_HEX_IE_GOT_11_X 82
3492#define R_HEX_TPREL_32_6_X 83
3493#define R_HEX_TPREL_16_X 84
3494#define R_HEX_TPREL_11_X 85
3495#define R_HEX_LD_PLT_B22_PCREL 86
3496#define R_HEX_LD_GOT_LO16 87
3497#define R_HEX_LD_GOT_HI16 88
3498#define R_HEX_LD_GOT_32 89
3499#define R_HEX_LD_GOT_16 90
3500#define R_HEX_LD_GOT_32_6_X 91
3501#define R_HEX_LD_GOT_16_X 92
3502#define R_HEX_LD_GOT_11_X 93
3503#define R_HEX_23_REG 94
3504#define R_HEX_GD_PLT_B22_PCREL_X 95
3505#define R_HEX_GD_PLT_B32_PCREL_X 96
3506#define R_HEX_LD_PLT_B22_PCREL_X 97
3507#define R_HEX_LD_PLT_B32_PCREL_X 98
3508
3509
3409#ifdef __cplusplus3510#ifdef __cplusplus
3410}3511}
3411#endif3512#endif
lib/libc/musl/src/fenv/hexagon/fenv.S created+144
...@@ -0,0 +1,144 @@
1/*
2 * The Hexagon user status register includes five status fields which work
3 * as sticky flags for the five IEEE-defined exception conditions:
4 * inexact, overflow, underflow, divide by zero, and invalid.
5 * A sticky flag is set when the corresponding exception occurs,
6 * and remains set until explicitly cleared.
7 *
8 * usr:23:22 - Rounding Mode
9 * 00: Round toward nearest
10 * 01: Round toward zero
11 * 10: Downward Round toward negative infinity
12 * 11: Upward Round toward positive infinity
13 *
14 * usr:5 - Floating-point IEEE Inexact Sticky Flag.
15 * usr:4 - Floating-point IEEE Underflow Sticky Flag.
16 * usr:3 - Floating-point IEEE Overflow Sticky Flag.
17 * usr:2 - Floating-point IEEE Divide-By-Zero Sticky Flag.
18 * usr:1 - Floating-point IEEE Invalid Sticky Flag.
19 * usr:0 - Sticky Saturation Overflow, when 1 saturation occurred.
20 */
21
22#define FE_ALL_EXCEPT 0x3f
23
24#define USR_FE_MASK 0x3fc0003f
25#define RND_MASK (0x3 << 22)
26#define RND_NEAR (0x0 << 22)
27#define RND_ZERO (0x1 << 22)
28#define RND_DOWN (0x2 << 22)
29#define RND_UP (0x3 << 22)
30
31/*
32 * int feclearexcept(int mask)
33 */
34.global feclearexcept
35.type feclearexcept,@function
36feclearexcept:
37 {
38 r0 = and(r0, #FE_ALL_EXCEPT) // Only touch the IEEE flag bits.
39 r1 = usr
40 }
41 r1 = and(r1, ~r0)
42 {
43 usr = r1
44 r0 = #0
45 jumpr r31
46 }
47
48/*
49 * int feraiseexcept(int mask)
50 */
51.global feraiseexcept
52.type feraiseexcept,@function
53feraiseexcept:
54 {
55 r0 = and(r0, #FE_ALL_EXCEPT) // Only touch the IEEE flag bits.
56 r1 = usr
57 }
58 r1 = or(r1, r0)
59 {
60 usr = r1
61 r0 = #0
62 jumpr r31
63 }
64
65
66/*
67 * int fetestexcept(int mask)
68 */
69.global fetestexcept
70.type fetestexcept,@function
71fetestexcept:
72 {
73 r0 = and(r0, #FE_ALL_EXCEPT) // Only touch the IEEE flag bits.
74 r1 = usr
75 }
76 {
77 r0 = and(r1, r0)
78 jumpr r31
79 }
80
81/*
82 *int fegetround(void)
83 */
84.global fegetround
85.type fegetround,@function
86fegetround:
87 r0 = usr
88 r0 = and(r0, ##RND_MASK)
89 r0 = lsr(r0, #22);
90 jumpr r31
91
92/*
93 * int __fesetround(int r)
94 */
95.global __fesetround
96.type __fesetround,@function
97__fesetround:
98 {
99 r0 = and(r0, #0x3) // Can only be 0,1,2, or 3
100 r1 = usr
101 r2 = ##RND_MASK
102 }
103 {
104 r1 = and (r1, ~r2) // Clear the current rounding bits.
105 r0 = asl (r0, #22)
106 }
107 r1 = or(r1, r0)
108 usr = r1
109 {
110 r0 = #0; jumpr r31
111 }
112
113/*
114 * int fegetenv(fenv_t *envp)
115 */
116.global fegetenv
117.type fegetenv,@function
118fegetenv:
119 r1 = usr
120 memw(r0) = r1
121 {
122 r0 = #0
123 jumpr r31
124 }
125
126/*
127 * int fesetenv(const fenv_t *envp)
128 */
129.global fesetenv
130.type fesetenv,@function
131fesetenv:
132 { p0 = cmp.eq(r0, #-1); if (p0.new) r1 = #0 } /* The default mode */
133 if (!p0) r1 = memw(r0) /* stored in fenv_t */
134
135 r2 = ##USR_FE_MASK // USR:FE bit mask
136 r1 = and(r1, r2) // MASK the input bits with the FE bits
137 r3 = usr
138 r3 = and(r3, ~r2) // Clear any currently set FE bits
139 r3 = or(r3, r1) // Set the newbits
140 usr = r3
141 {
142 r0 = #0
143 jumpr r31
144 }
lib/libc/musl/src/setjmp/hexagon/longjmp.s created+25
...@@ -0,0 +1,25 @@
1.text
2.global _longjmp
3.global longjmp
4.type _longjmp,%function
5.type longjmp,%function
6_longjmp:
7longjmp:
8 { r17:16=memd(r0+#0)
9 r19:18=memd(r0+#8) }
10 { r21:20=memd(r0+#16)
11 r23:22=memd(r0+#24) }
12 { r25:24=memd(r0+#32)
13 r27:26=memd(r0+#40) }
14 { r29:28=memd(r0+#48)
15 r31:30=memd(r0+#56) }
16
17 r0 = r1
18 r1 = #0
19 p0 = cmp.eq(r0,r1)
20 if (!p0) jumpr r31
21 r0 = #1
22
23 jumpr r31
24.size _longjmp, .-_longjmp
25.size longjmp, .-longjmp
lib/libc/musl/src/setjmp/hexagon/setjmp.s created+24
...@@ -0,0 +1,24 @@
1.text
2.global __setjmp
3.global _setjmp
4.global setjmp
5.type __setjmp,@function
6.type _setjmp,@function
7.type setjmp,@function
8__setjmp:
9_setjmp:
10setjmp:
11 { memd(r0+#0)=r17:16
12 memd(r0+#8)=r19:18 }
13 { memd(r0+#16)=r21:20
14 memd(r0+#24)=r23:22 }
15 { memd(r0+#32)=r25:24
16 memd(r0+#40)=r27:26 }
17 { memd(r0+#48)=r29:28
18 memd(r0+#56)=r31:30 }
19
20 r0 = #0
21 jumpr r31
22.size __setjmp, .-__setjmp
23.size _setjmp, .-_setjmp
24.size setjmp, .-setjmp
lib/libc/musl/src/signal/hexagon/restore.s created+11
...@@ -0,0 +1,11 @@
1// TODO - Test this if sa_restorer is ever supported in our kernel
2.global __restore
3.type __restore,%function
4.global __restore_rt
5.type __restore_rt,%function
6__restore:
7__restore_rt:
8 r6 = #139 // SYS_rt_sigreturn
9 trap0(#0)
10.size __restore, .-__restore
11.size __restore_rt, .-__restore_rt
lib/libc/musl/src/signal/hexagon/sigsetjmp.s created+28
...@@ -0,0 +1,28 @@
1.global sigsetjmp
2.global __sigsetjmp
3.type sigsetjmp,@function
4.type __sigsetjmp,@function
5.balign 4
6sigsetjmp:
7__sigsetjmp:
8 // if savemask is 0 sigsetjmp behaves like setjmp
9 {
10 p0 = cmp.eq(r1, #0)
11 if (p0.new) jump:t ##setjmp
12 }
13 {
14 memw(r0+#64+4+8) = r16 // save r16 in __ss[2]
15 memw(r0+#64) = r31 // save linkregister in __fl
16 r16 = r0
17 }
18 call ##setjmp
19 {
20 r1 = r0;
21 r0 = r16 // restore r0
22 r31 = memw(r16+#64) // restore linkregister
23 r16 = memw(r16+#64+4+8) // restore r16 from __ss[2]
24 }
25.hidden __sigsetjmp_tail
26 jump ##__sigsetjmp_tail
27
28.size sigsetjmp, .-sigsetjmp
lib/libc/musl/src/thread/hexagon/__set_thread_area.s created+7
...@@ -0,0 +1,7 @@
1.global __set_thread_area
2.type __set_thread_area,@function
3__set_thread_area:
4 { ugp = r0
5 r0 = #0
6 jumpr r31 }
7.size __set_thread_area, .-__set_thread_area
lib/libc/musl/src/thread/hexagon/__unmapself.s created+11
...@@ -0,0 +1,11 @@
1#include <syscall.h>
2
3.global __unmapself
4.type __unmapself,%function
5__unmapself:
6 r6 = #215 // SYS_munmap
7 trap0(#1)
8 r6 = #93 // SYS_exit
9 trap0(#1)
10 jumpr r31
11.size __unmapself, .-__unmapself
lib/libc/musl/src/thread/hexagon/clone.s created+37
...@@ -0,0 +1,37 @@
1// __clone(func, stack, flags, arg, ptid, tls, ctid)
2// r0, r1, r2, r3, r4, r5, stack
3
4// tid = syscall(SYS_clone, flags, stack, ptid, ctid, tls)
5// r6, r0, r1, r2, r3, r4
6// if (tid != 0) return
7// func(arg)
8// syscall(SYS_exit)
9
10.text
11.global __clone
12.type __clone,%function
13__clone:
14 allocframe(#8)
15 // Save pointers for later
16 { r11 = r0
17 r10 = r3 }
18
19 // Set up syscall args - The stack must be 8 byte aligned.
20 { r0 = r2
21 r1 = and(r1, ##0xfffffff8)
22 r2 = r4 }
23 {
24 r3 = memw(r30+#8)
25 r4 = r5 }
26 r6 = #220 // SYS_clone
27 trap0(#1)
28
29 p0 = cmp.eq(r0, #0)
30 if (!p0) dealloc_return
31
32 { r0 = r10
33 callr r11 }
34
35 r6 = #93 // SYS_exit
36 trap0(#1)
37.size __clone, .-__clone
lib/libc/musl/src/thread/hexagon/syscall_cp.s created+35
...@@ -0,0 +1,35 @@
1// __syscall_cp_asm(&self->cancel, nr, u, v, w, x, y, z)
2// r0 r1 r2 r3 r4 r5 stack stack
3
4// syscall(nr, u, v, w, x, y, z)
5// r6 r0 r1 r2 r3 r4 r5
6
7.text
8.global __cp_begin
9.hidden __cp_begin
10.global __cp_end
11.hidden __cp_end
12.global __cp_cancel
13.hidden __cp_cancel
14.hidden __cancel
15.global __syscall_cp_asm
16.hidden __syscall_cp_asm
17.type __syscall_cp_asm,%function
18__syscall_cp_asm:
19__cp_begin:
20 r0 = memw(r0+#0)
21 {
22 p0 = cmp.eq(r0, #0); if (!p0.new) jump:nt __cancel
23 }
24 { r6 = r1
25 r1:0 = combine(r3, r2)
26 r3:2 = combine(r5, r4) }
27 { r4 = memw(r29+#0)
28 r5 = memw(r29+#4) }
29 trap0(#1)
30__cp_end:
31 jumpr r31
32.size __syscall_cp_asm, .-__syscall_cp_asm
33__cp_cancel:
34 jump __cancel
35.size __cp_cancel, .-__cp_cancel