| 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,6 +3406,107 @@ enum |
| 3406 | #define R_LARCH_32_PCREL 99 | 3406 | #define R_LARCH_32_PCREL 99 |
| 3407 | #define R_LARCH_RELAX 100 | 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 | #ifdef __cplusplus | 3510 | #ifdef __cplusplus |
| 3410 | } | 3511 | } |
| 3411 | #endif | 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 | ||