| author | |
| committer | |
| log | 3df67dc4148b9d2db8cd4b95a64048123b2a3b58 |
| tree | 826d055e38593c06e152eaf6c7e19d69cd348fe8 |
| parent | 30200edc1e65c2be37430f1267b94b414b37d9c7 |
| signature |
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/hexagon28 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 | |
| 2 | static 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 | |
| 11 | static 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 | |
| 20 | static 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 | |
| 29 | static 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 | |
| 46 | static 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 | |
| 52 | static 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 | |
| 67 | static 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 | |
| 82 | static inline void a_inc(volatile int *x) | |
| 83 | { | |
| 84 | 	a_fetch_add(x, 1); | |
| 85 | } | |
| 86 | ||
| 87 | #define a_dec a_dec | |
| 88 | static 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 | |
| 102 | static 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 | |
| 115 | static inline void a_barrier() | |
| 116 | { | |
| 117 | 	__asm__ __volatile__ ("barrier" ::: "memory"); | |
| 118 | } | |
| 119 | #define a_spin a_spin | |
| 120 | static inline void a_spin() | |
| 121 | { | |
| 122 | 	__asm__ __volatile__ ("pause(#255)" :::); | |
| 123 | } | |
| 124 | ||
| 125 | #define a_crash a_crash | |
| 126 | static inline void a_crash() | |
| 127 | { | |
| 128 | 	*(volatile char *)0=0; | |
| 129 | } | |
| 130 | ||
| 131 | #define a_and a_and | |
| 132 | static 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 | |
| 146 | static 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 | |
| 160 | static 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 | |
| 166 | static 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 | |
| 180 | static 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 | ||
| 14 | typedef unsigned long fexcept_t; | |
| 15 | ||
| 16 | typedef 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 @@ |
| 1 | struct 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 @@ |
| 1 | struct 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 @@ |
| 1 | typedef	long long __jmp_buf[8]; |
lib/libc/musl/arch/hexagon/bits/shm.h created+31| ... | ... | @@ -0,0 +1,31 @@ |
| 1 | #define SHMLBA 4096 | |
| 2 | ||
| 3 | struct 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 | ||
| 23 | struct shminfo { | |
| 24 | 	unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4]; | |
| 25 | }; | |
| 26 | ||
| 27 | struct 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) | |
| 10 | typedef int greg_t, gregset_t[18]; | |
| 11 | typedef 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 | |
| 38 | typedef struct { | |
| 39 | 	unsigned long __regs[48]; | |
| 40 | } __attribute__((__aligned__(8))) mcontext_t; | |
| 41 | #endif | |
| 42 | ||
| 43 | struct sigaltstack { | |
| 44 | 	void *ss_sp; | |
| 45 | 	int ss_flags; | |
| 46 | 	size_t ss_size; | |
| 47 | }; | |
| 48 | ||
| 49 | typedef 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. */ | |
| 3 | struct 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 @@ |
| 1 | typedef int32_t int_fast16_t; | |
| 2 | typedef int32_t int_fast32_t; | |
| 3 | typedef uint32_t uint_fast16_t; | |
| 4 | typedef 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 | ||
| 4 | struct 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 | |
| 56 | typedef unsigned long elf_greg_t, elf_gregset_t[ELF_NGREG]; | |
| 57 | ||
| 58 | typedef 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" | |
| 7 | START ": \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 @@ |
| 1 | struct 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. | |
| 2 | static 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 | ||
| 13 | static 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 | ||
| 20 | static 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 | ||
| 27 | static 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 | ||
| 35 | static 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 | ||
| 44 | static 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 | ||
| 54 | static 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 | ||
| 65 | static 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 | 3406 | #define R_LARCH_32_PCREL 99 |
| 3407 | 3407 | #define R_LARCH_RELAX 100 |
| 3408 | 3408 | |
| 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 | 3510 | #ifdef __cplusplus |
| 3410 | 3511 | } |
| 3411 | 3512 | #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 | |
| 36 | feclearexcept: | |
| 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 | |
| 53 | feraiseexcept: | |
| 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 | |
| 71 | fetestexcept: | |
| 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 | |
| 86 | fegetround: | |
| 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 | |
| 118 | fegetenv: | |
| 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 | |
| 131 | fesetenv: | |
| 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: | |
| 7 | longjmp: | |
| 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: | |
| 10 | setjmp: | |
| 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 | |
| 6 | sigsetjmp: | |
| 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 |