mailing list of musl libc
 help / color / mirror / code / Atom feed
* [musl] [RFC PATCH 0/5] Add support to Hexagon DSP
@ 2023-08-30 12:22 Matheus Tavares Bernardino
  2023-08-30 12:22 ` [musl] [RFC PATCH 1/5] Add support to Hexagon arch Matheus Tavares Bernardino
                   ` (6 more replies)
  0 siblings, 7 replies; 15+ messages in thread
From: Matheus Tavares Bernardino @ 2023-08-30 12:22 UTC (permalink / raw)
  To: musl; +Cc: Brian Cain, Sid Manning, Rich Felker, Fangrui Song, Szabolcs Nagy

Hi,

I'd like to restart the conversations from
https://marc.info/?l=musl&w=2&r=1&s=Hexagon+DSP+support&q=b about
adding Hexagon support to musl.

I've read the comments from the two previous iterations and it looks
like Sid has addressed them all already (please let me know if there is
something missing, though). So I've only rebased/reorganized the patches
with minor cleanup changes.

These patches are also available at my git tree:
https://github.com/quic/musl/tree/mathbern/to-upstream
You will noticed that this tree contains an extra downstream-only commit
at the tip, which is intended as a convenience for running libc-test
with musl + Hexagon (note that we use a small patch for libc-test).

Speaking of which, here is the latest src/REPORT from running the test
suite with these patches applied:
https://gist.github.com/quic-mathbern/e063344dd92e24f97c5a235e389495a3

More specifically, these are the failures we're still seeing and what
they might represent, according to a previous message from Rich
(https://marc.info/?l=musl&m=158697899609026):


"Atomics bugs or emulation being slow"
FAIL src/regression/pthread_cond-smasher-static.exe [status 1]
FAIL src/regression/pthread_cond-smasher.exe [status 1]

"Atomics bugs"
FAIL src/regression/pthread_cond_wait-cancel_ignored-static.exe [status 1]
FAIL src/regression/pthread_cond_wait-cancel_ignored.exe [status 1]

Unknown
FAIL src/functional/pthread_cancel-static.exe [timed out]
FAIL src/regression/tls_get_new-dtv.exe [status 1]

Expected: functionality not yet supported by musl?
FAIL src/functional/strptime.exe [status 1]
FAIL src/functional/strptime-static.exe [status 1]

Expected failures in qemu-user?
FAIL src/regression/malloc-brk-fail.exe [status 1]
FAIL src/functional/pthread_robust-static.exe [timed out]
FAIL src/functional/pthread_robust.exe [timed out]
FAIL src/regression/pthread-robust-detach-static.exe [status 1]
FAIL src/regression/pthread-robust-detach.exe [status 1]

Clang deficiency?
FAIL src/functional/dlopen.exe [status 1]

Target independent failures?
FAIL src/math/acoshl.exe [status 1]
FAIL src/math/asinhl.exe [status 1]
FAIL src/math/erfcl.exe [status 1]
FAIL src/math/exp2l.exe [status 1]
FAIL src/math/ilogb.exe [status 1]
FAIL src/math/ilogbf.exe [status 1]
FAIL src/math/ilogbl.exe [status 1]
FAIL src/math/lgammal.exe [status 1]
FAIL src/math/powf.exe [status 1]
FAIL src/math/powl.exe [status 1]
FAIL src/math/tgamma.exe [status 1]
FAIL src/math/tgammaf.exe [status 1]
FAIL src/math/tgammal.exe [status 1]
FAIL src/math/y0.exe [status 1]
FAIL src/math/y0f.exe [status 1]
FAIL src/math/y1.exe [status 1]
FAIL src/math/y1f.exe [status 1]
FAIL src/math/yn.exe [status 1]
FAIL src/math/ynf.exe [status 1]


I’ve revised all the hexagon atomics and they look right to me, so I
don’t know what could be causing those first four failing tests…

Any help and/or feedback will be highly appreciated!

Thanks in advance,
Matheus
(please keep me in CC, as I'm not subscribed)



Brian Cain (2):
  hexagon: add fenv header and implementation
  hexagon: add bits/user.h

Matheus Tavares Bernardino (1):
  INSTALL: add 'Hexagon' to list of supported targets

Sid Manning (2):
  Add support to Hexagon arch
  hexagon: add fma/fmaxf/fminf routines

 INSTALL                                |   2 +
 arch/hexagon/atomic_arch.h             | 191 +++++++++++++++
 arch/hexagon/bits/alltypes.h.in        |  18 ++
 arch/hexagon/bits/fenv.h               |  20 ++
 arch/hexagon/bits/float.h              |  16 ++
 arch/hexagon/bits/ipcstat.h            |   1 +
 arch/hexagon/bits/msg.h                |  18 ++
 arch/hexagon/bits/posix.h              |   2 +
 arch/hexagon/bits/sem.h                |  13 +
 arch/hexagon/bits/setjmp.h             |   1 +
 arch/hexagon/bits/shm.h                |  31 +++
 arch/hexagon/bits/signal.h             | 103 ++++++++
 arch/hexagon/bits/stat.h               |  20 ++
 arch/hexagon/bits/stdint.h             |  20 ++
 arch/hexagon/bits/syscall.h.in         | 327 +++++++++++++++++++++++++
 arch/hexagon/bits/user.h               |  60 +++++
 arch/hexagon/crt_arch.h                |  22 ++
 arch/hexagon/kstat.h                   |  21 ++
 arch/hexagon/pthread_arch.h            |  13 +
 arch/hexagon/reloc.h                   |  16 ++
 arch/hexagon/syscall_arch.h            |  78 ++++++
 configure                              |   1 +
 include/elf.h                          | 101 ++++++++
 src/fenv/hexagon/fenv.S                | 144 +++++++++++
 src/math/hexagon/fmaf.c                |   8 +
 src/math/hexagon/fmaxf.c               |   8 +
 src/math/hexagon/fminf.c               |   8 +
 src/setjmp/hexagon/longjmp.s           |  25 ++
 src/setjmp/hexagon/setjmp.s            |  24 ++
 src/signal/hexagon/restore.s           |  11 +
 src/signal/hexagon/sigsetjmp.s         |  28 +++
 src/thread/hexagon/__set_thread_area.s |   7 +
 src/thread/hexagon/__unmapself.s       |  11 +
 src/thread/hexagon/clone.s             |  37 +++
 src/thread/hexagon/syscall_cp.s        |  35 +++
 35 files changed, 1441 insertions(+)
 create mode 100644 arch/hexagon/atomic_arch.h
 create mode 100644 arch/hexagon/bits/alltypes.h.in
 create mode 100644 arch/hexagon/bits/fenv.h
 create mode 100644 arch/hexagon/bits/float.h
 create mode 100644 arch/hexagon/bits/ipcstat.h
 create mode 100644 arch/hexagon/bits/msg.h
 create mode 100644 arch/hexagon/bits/posix.h
 create mode 100644 arch/hexagon/bits/sem.h
 create mode 100644 arch/hexagon/bits/setjmp.h
 create mode 100644 arch/hexagon/bits/shm.h
 create mode 100644 arch/hexagon/bits/signal.h
 create mode 100644 arch/hexagon/bits/stat.h
 create mode 100644 arch/hexagon/bits/stdint.h
 create mode 100644 arch/hexagon/bits/syscall.h.in
 create mode 100644 arch/hexagon/bits/user.h
 create mode 100644 arch/hexagon/crt_arch.h
 create mode 100644 arch/hexagon/kstat.h
 create mode 100644 arch/hexagon/pthread_arch.h
 create mode 100644 arch/hexagon/reloc.h
 create mode 100644 arch/hexagon/syscall_arch.h
 create mode 100644 src/fenv/hexagon/fenv.S
 create mode 100644 src/math/hexagon/fmaf.c
 create mode 100644 src/math/hexagon/fmaxf.c
 create mode 100644 src/math/hexagon/fminf.c
 create mode 100644 src/setjmp/hexagon/longjmp.s
 create mode 100644 src/setjmp/hexagon/setjmp.s
 create mode 100644 src/signal/hexagon/restore.s
 create mode 100644 src/signal/hexagon/sigsetjmp.s
 create mode 100644 src/thread/hexagon/__set_thread_area.s
 create mode 100644 src/thread/hexagon/__unmapself.s
 create mode 100644 src/thread/hexagon/clone.s
 create mode 100644 src/thread/hexagon/syscall_cp.s

-- 
2.37.2


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [musl] [RFC PATCH 1/5] Add support to Hexagon arch
  2023-08-30 12:22 [musl] [RFC PATCH 0/5] Add support to Hexagon DSP Matheus Tavares Bernardino
@ 2023-08-30 12:22 ` Matheus Tavares Bernardino
  2023-08-30 12:22 ` [musl] [RFC PATCH 2/5] hexagon: add fenv header and implementation Matheus Tavares Bernardino
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 15+ messages in thread
From: Matheus Tavares Bernardino @ 2023-08-30 12:22 UTC (permalink / raw)
  To: musl; +Cc: Brian Cain, Sid Manning, Rich Felker, Fangrui Song, Szabolcs Nagy

From: Sid Manning <sidneym@quicinc.com>

This ports musl to Qualcomm's Hexagon DSP architecture:
https://developer.qualcomm.com/software/hexagon-dsp-sdk/dsp-processor
---
 arch/hexagon/atomic_arch.h             | 191 +++++++++++++++
 arch/hexagon/bits/alltypes.h.in        |  18 ++
 arch/hexagon/bits/float.h              |  16 ++
 arch/hexagon/bits/ipcstat.h            |   1 +
 arch/hexagon/bits/msg.h                |  18 ++
 arch/hexagon/bits/posix.h              |   2 +
 arch/hexagon/bits/sem.h                |  13 +
 arch/hexagon/bits/setjmp.h             |   1 +
 arch/hexagon/bits/shm.h                |  31 +++
 arch/hexagon/bits/signal.h             | 103 ++++++++
 arch/hexagon/bits/stat.h               |  20 ++
 arch/hexagon/bits/stdint.h             |  20 ++
 arch/hexagon/bits/syscall.h.in         | 327 +++++++++++++++++++++++++
 arch/hexagon/crt_arch.h                |  22 ++
 arch/hexagon/kstat.h                   |  21 ++
 arch/hexagon/pthread_arch.h            |  13 +
 arch/hexagon/reloc.h                   |  16 ++
 arch/hexagon/syscall_arch.h            |  78 ++++++
 configure                              |   1 +
 include/elf.h                          | 101 ++++++++
 src/setjmp/hexagon/longjmp.s           |  25 ++
 src/setjmp/hexagon/setjmp.s            |  24 ++
 src/signal/hexagon/restore.s           |  11 +
 src/signal/hexagon/sigsetjmp.s         |  28 +++
 src/thread/hexagon/__set_thread_area.s |   7 +
 src/thread/hexagon/__unmapself.s       |  11 +
 src/thread/hexagon/clone.s             |  37 +++
 src/thread/hexagon/syscall_cp.s        |  35 +++
 28 files changed, 1191 insertions(+)
 create mode 100644 arch/hexagon/atomic_arch.h
 create mode 100644 arch/hexagon/bits/alltypes.h.in
 create mode 100644 arch/hexagon/bits/float.h
 create mode 100644 arch/hexagon/bits/ipcstat.h
 create mode 100644 arch/hexagon/bits/msg.h
 create mode 100644 arch/hexagon/bits/posix.h
 create mode 100644 arch/hexagon/bits/sem.h
 create mode 100644 arch/hexagon/bits/setjmp.h
 create mode 100644 arch/hexagon/bits/shm.h
 create mode 100644 arch/hexagon/bits/signal.h
 create mode 100644 arch/hexagon/bits/stat.h
 create mode 100644 arch/hexagon/bits/stdint.h
 create mode 100644 arch/hexagon/bits/syscall.h.in
 create mode 100644 arch/hexagon/crt_arch.h
 create mode 100644 arch/hexagon/kstat.h
 create mode 100644 arch/hexagon/pthread_arch.h
 create mode 100644 arch/hexagon/reloc.h
 create mode 100644 arch/hexagon/syscall_arch.h
 create mode 100644 src/setjmp/hexagon/longjmp.s
 create mode 100644 src/setjmp/hexagon/setjmp.s
 create mode 100644 src/signal/hexagon/restore.s
 create mode 100644 src/signal/hexagon/sigsetjmp.s
 create mode 100644 src/thread/hexagon/__set_thread_area.s
 create mode 100644 src/thread/hexagon/__unmapself.s
 create mode 100644 src/thread/hexagon/clone.s
 create mode 100644 src/thread/hexagon/syscall_cp.s

diff --git a/arch/hexagon/atomic_arch.h b/arch/hexagon/atomic_arch.h
new file mode 100644
index 00000000..b25af3d4
--- /dev/null
+++ b/arch/hexagon/atomic_arch.h
@@ -0,0 +1,191 @@
+#define a_ctz_32 a_ctz_32
+static inline int a_ctz_32(unsigned long x)
+{
+	__asm__(
+		"%0 = ct0(%0)\n\t"
+		: "+r"(x));
+	return x;
+}
+
+#define a_ctz_64 a_ctz_64
+static inline int a_ctz_64(uint64_t x)
+{
+	int count;
+	__asm__(
+		"%0 = ct0(%1)\n\t"
+		: "=r"(count) : "r"(x));
+	return count;
+}
+#define a_clz_64 a_clz_64
+static inline int a_clz_64(uint64_t x)
+{
+        __asm__(
+                "%0 = brev(%0)\n\t"
+		: "+r"(x));
+        return a_ctz_64(x);
+}
+
+#define a_cas a_cas
+static inline int a_cas(volatile int *p, int t, int s)
+{
+	int dummy;
+	__asm__ __volatile__(
+		"1:	%0 = memw_locked(%1)\n\t"
+		"	{ p0 = cmp.eq(%0, %2)\n\t"
+		"	  if (!p0.new) jump:nt 2f }\n\t"
+		"	memw_locked(%1, p0) = %3\n\t"
+		"	if (!p0) jump 1b\n\t"
+		"2:	\n\t"
+		: "=&r"(dummy)
+		: "r"(p), "r"(t), "r"(s)
+		: "p0", "memory" );
+        return dummy;
+}
+
+#define a_cas_p a_cas_p
+static inline void *a_cas_p(volatile void *p, void *t, void *s)
+{
+	return (void *)a_cas(p, (int)t, (int)s);
+}
+
+#define a_swap a_swap
+static inline int a_swap(volatile int *x, int v)
+{
+	int old, dummy;
+	__asm__ __volatile__(
+		"	%1 = %3\n\t"
+		"1:	%0 = memw_locked(%2)\n\t"
+		"	memw_locked(%2, p0) = %1\n\t"
+		"	if (!p0) jump 1b\n\t"
+		: "=&r"(old), "=&r"(dummy)
+		: "r"(x), "r"(v)
+		: "p0", "memory" );
+        return old;
+}
+
+#define a_fetch_add a_fetch_add
+static inline int a_fetch_add(volatile int *x, int v)
+{
+	int old, dummy;
+	__asm__ __volatile__(
+		"1:	%0 = memw_locked(%2)\n\t"
+		"	%1 = add(%0, %3)\n\t"
+		"	memw_locked(%2, p0) = %1\n\t"
+		"	if (!p0) jump 1b\n\t"
+		: "=&r"(old), "=&r"(dummy)
+		: "r"(x), "r"(v)
+		: "p0", "memory" );
+        return old;
+}
+
+#define a_inc a_inc
+static inline void a_inc(volatile int *x)
+{
+	a_fetch_add(x, 1);
+}
+
+#define a_dec a_dec
+static inline void a_dec(volatile int *x)
+{
+	int dummy;
+	__asm__ __volatile__(
+		"1:	%0 = memw_locked(%1)\n\t"
+		"	%0 = add(%0, #-1)\n\t"
+		"	memw_locked(%1, p0) = %0\n\t"
+		"	if (!p0) jump 1b\n\t"
+		: "=&r"(dummy)
+		: "r"(x)
+		: "p0", "memory" );
+}
+
+#define a_store a_store
+static inline void a_store(volatile int *p, int x)
+{
+	int dummy;
+	__asm__ __volatile__(
+		"1:	%0 = memw_locked(%1)\n\t"
+		"	memw_locked(%1, p0) = %2\n\t"
+		"	if (!p0) jump 1b\n\t"
+		: "=&r"(dummy)
+		: "r"(p), "r"(x)
+		: "p0", "memory" );
+}
+
+#define a_barrier a_barrier
+static inline void a_barrier()
+{
+	__asm__ __volatile__ ("barrier" ::: "memory");
+}
+#define a_spin a_spin
+static inline void a_spin()
+{
+	__asm__ __volatile__ ("pause(#255)" :::);
+}
+
+#define a_crash a_crash
+static inline void a_crash()
+{
+	*(volatile char *)0=0;
+}
+
+#define a_and a_and
+static inline void a_and(volatile int *p, int v)
+{
+	int dummy;
+	__asm__ __volatile__(
+		"1:	%0 = memw_locked(%1)\n\t"
+		"	%0 = and(%0, %2)\n\t"
+		"	memw_locked(%1, p0) = %0\n\t"
+		"	if (!p0) jump 1b\n\t"
+		: "=&r"(dummy)
+		: "r"(p), "r"(v)
+		: "p0", "memory" );
+}
+
+#define  a_or a_or
+static inline void a_or(volatile int *p, int v)
+{
+	int dummy;
+	__asm__ __volatile__(
+		"1:	%0 = memw_locked(%1)\n\t"
+		"	%0 = or(%0, %2)\n\t"
+		"	memw_locked(%1, p0) = %0\n\t"
+		"	if (!p0) jump 1b\n\t"
+		: "=&r"(dummy)
+		: "r"(p), "r"(v)
+		: "p0", "memory" );
+}
+
+#define a_or_l a_or_l
+static inline void a_or_l(volatile void *p, long v)
+{
+	a_or(p, v);
+}
+
+#define a_and_64 a_and_64
+static inline void a_and_64(volatile uint64_t *p, uint64_t v)
+{
+	uint64_t dummy;
+	__asm__ __volatile__(
+		"1:	%0 = memd_locked(%1)\n\t"
+		"	%0 = and(%0, %2)\n\t"
+		"	memd_locked(%1, p0) = %0\n\t"
+		"	if (!p0) jump 1b\n\t"
+		: "=&r"(dummy)
+		: "r"(p), "r"(v)
+		: "p0", "memory" );
+}
+
+#define  a_or_64 a_or_64
+static inline void a_or_64(volatile uint64_t *p, uint64_t v)
+{
+	uint64_t dummy;
+	__asm__ __volatile__(
+		"1:	%0 = memd_locked(%1)\n\t"
+		"	%0 = or(%0, %2)\n\t"
+		"	memd_locked(%1, p0) = %0\n\t"
+		"	if (!p0) jump 1b\n\t"
+		: "=&r"(dummy)
+		: "r"(p), "r"(v)
+		: "p0", "memory" );
+}
diff --git a/arch/hexagon/bits/alltypes.h.in b/arch/hexagon/bits/alltypes.h.in
new file mode 100644
index 00000000..e5d9d616
--- /dev/null
+++ b/arch/hexagon/bits/alltypes.h.in
@@ -0,0 +1,18 @@
+#define _Addr int
+#define _Int64 long long
+#define _Reg int
+
+#define __BYTE_ORDER 1234
+#define __LONG_MAX 0x7fffffffL
+
+#ifndef __cplusplus
+#ifdef __WCHAR_TYPE__
+TYPEDEF __WCHAR_TYPE__ wchar_t;
+#else
+TYPEDEF long wchar_t;
+#endif
+#endif
+
+TYPEDEF float float_t;
+TYPEDEF double double_t;
+TYPEDEF struct { long long __ll; long double __ld; } max_align_t;
diff --git a/arch/hexagon/bits/float.h b/arch/hexagon/bits/float.h
new file mode 100644
index 00000000..c4a655e7
--- /dev/null
+++ b/arch/hexagon/bits/float.h
@@ -0,0 +1,16 @@
+#define FLT_EVAL_METHOD 0
+
+#define LDBL_TRUE_MIN 4.94065645841246544177e-324L
+#define LDBL_MIN 2.22507385850720138309e-308L
+#define LDBL_MAX 1.79769313486231570815e+308L
+#define LDBL_EPSILON 2.22044604925031308085e-16L
+
+#define LDBL_MANT_DIG 53
+#define LDBL_MIN_EXP (-1021)
+#define LDBL_MAX_EXP 1024
+
+#define LDBL_DIG 15
+#define LDBL_MIN_10_EXP (-307)
+#define LDBL_MAX_10_EXP 308
+
+#define DECIMAL_DIG 17
diff --git a/arch/hexagon/bits/ipcstat.h b/arch/hexagon/bits/ipcstat.h
new file mode 100644
index 00000000..4f4fcb0c
--- /dev/null
+++ b/arch/hexagon/bits/ipcstat.h
@@ -0,0 +1 @@
+#define IPC_STAT 0x102
diff --git a/arch/hexagon/bits/msg.h b/arch/hexagon/bits/msg.h
new file mode 100644
index 00000000..7bbbb2bf
--- /dev/null
+++ b/arch/hexagon/bits/msg.h
@@ -0,0 +1,18 @@
+struct msqid_ds {
+	struct ipc_perm msg_perm;
+	unsigned long __msg_stime_lo;
+	unsigned long __msg_stime_hi;
+	unsigned long __msg_rtime_lo;
+	unsigned long __msg_rtime_hi;
+	unsigned long __msg_ctime_lo;
+	unsigned long __msg_ctime_hi;
+	unsigned long msg_cbytes;
+	msgqnum_t msg_qnum;
+	msglen_t msg_qbytes;
+	pid_t msg_lspid;
+	pid_t msg_lrpid;
+	unsigned long __unused[2];
+	time_t msg_stime;
+	time_t msg_rtime;
+	time_t msg_ctime;
+};
diff --git a/arch/hexagon/bits/posix.h b/arch/hexagon/bits/posix.h
new file mode 100644
index 00000000..30a38714
--- /dev/null
+++ b/arch/hexagon/bits/posix.h
@@ -0,0 +1,2 @@
+#define _POSIX_V6_ILP32_OFFBIG  1
+#define _POSIX_V7_ILP32_OFFBIG  1
diff --git a/arch/hexagon/bits/sem.h b/arch/hexagon/bits/sem.h
new file mode 100644
index 00000000..65661542
--- /dev/null
+++ b/arch/hexagon/bits/sem.h
@@ -0,0 +1,13 @@
+struct semid_ds {
+	struct ipc_perm sem_perm;
+	unsigned long __sem_otime_lo;
+	unsigned long __sem_otime_hi;
+	unsigned long __sem_ctime_lo;
+	unsigned long __sem_ctime_hi;
+	unsigned short sem_nsems;
+	char __sem_nsems_pad[sizeof(long)-sizeof(short)];
+	long __unused3;
+	long __unused4;
+	time_t sem_otime;
+	time_t sem_ctime;
+};
diff --git a/arch/hexagon/bits/setjmp.h b/arch/hexagon/bits/setjmp.h
new file mode 100644
index 00000000..2d75319a
--- /dev/null
+++ b/arch/hexagon/bits/setjmp.h
@@ -0,0 +1 @@
+typedef	long long  __jmp_buf[8];
diff --git a/arch/hexagon/bits/shm.h b/arch/hexagon/bits/shm.h
new file mode 100644
index 00000000..725fb469
--- /dev/null
+++ b/arch/hexagon/bits/shm.h
@@ -0,0 +1,31 @@
+#define SHMLBA 4096
+
+struct shmid_ds {
+	struct ipc_perm shm_perm;
+	size_t shm_segsz;
+	unsigned long __shm_atime_lo;
+	unsigned long __shm_atime_hi;
+	unsigned long __shm_dtime_lo;
+	unsigned long __shm_dtime_hi;
+	unsigned long __shm_ctime_lo;
+	unsigned long __shm_ctime_hi;
+	pid_t shm_cpid;
+	pid_t shm_lpid;
+	unsigned long shm_nattch;
+	unsigned long __pad1;
+	unsigned long __pad2;
+	unsigned long __pad3;
+	time_t shm_atime;
+	time_t shm_dtime;
+	time_t shm_ctime;
+};
+
+struct shminfo {
+	unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4];
+};
+
+struct shm_info {
+	int __used_ids;
+	unsigned long shm_tot, shm_rss, shm_swp;
+	unsigned long __swap_attempts, __swap_successes;
+};
diff --git a/arch/hexagon/bits/signal.h b/arch/hexagon/bits/signal.h
new file mode 100644
index 00000000..b119f163
--- /dev/null
+++ b/arch/hexagon/bits/signal.h
@@ -0,0 +1,103 @@
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define MINSIGSTKSZ 2048
+#define SIGSTKSZ 8192
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+typedef int greg_t, gregset_t[18];
+typedef struct sigcontext
+{
+	unsigned long  r0,  r1,  r2,  r3;
+	unsigned long  r4,  r5,  r6,  r7;
+	unsigned long  r8,  r9, r10, r11;
+	unsigned long r12, r13, r14, r15;
+	unsigned long r16, r17, r18, r19;
+	unsigned long r20, r21, r22, r23;
+	unsigned long r24, r25, r26, r27;
+	unsigned long r28, r29, r30, r31;
+	unsigned long sa0;
+	unsigned long lc0;
+	unsigned long sa1;
+	unsigned long lc1;
+	unsigned long m0;
+	unsigned long m1;
+	unsigned long usr;
+	unsigned long p3_0;
+	unsigned long gp;
+	unsigned long ugp;
+	unsigned long pc;
+	unsigned long cause;
+	unsigned long badva;
+	unsigned long pad1;
+	unsigned long long pad2;
+} mcontext_t;
+#else
+typedef struct {
+	unsigned long __regs[48];
+} __attribute__((__aligned__(8))) mcontext_t;
+#endif
+
+struct sigaltstack {
+	void *ss_sp;
+	int ss_flags;
+	size_t ss_size;
+};
+
+typedef struct __ucontext {
+	unsigned long uc_flags;
+	struct __ucontext *uc_link;
+	stack_t uc_stack;
+	mcontext_t uc_mcontext;
+	sigset_t uc_sigmask;
+} ucontext_t;
+
+#define SA_NOCLDSTOP  1
+#define SA_NOCLDWAIT  2
+#define SA_SIGINFO    4
+#define SA_ONSTACK    0x08000000
+#define SA_RESTART    0x10000000
+#define SA_NODEFER    0x40000000
+#define SA_RESETHAND  0x80000000
+#define SA_RESTORER   0x04000000
+
+#endif
+
+#define SIGHUP    1
+#define SIGINT    2
+#define SIGQUIT   3
+#define SIGILL    4
+#define SIGTRAP   5
+#define SIGABRT   6
+#define SIGIOT    SIGABRT
+#define SIGBUS    7
+#define SIGFPE    8
+#define SIGKILL   9
+#define SIGUSR1   10
+#define SIGSEGV   11
+#define SIGUSR2   12
+#define SIGPIPE   13
+#define SIGALRM   14
+#define SIGTERM   15
+#define SIGSTKFLT 16
+#define SIGCHLD   17
+#define SIGCONT   18
+#define SIGSTOP   19
+#define SIGTSTP   20
+#define SIGTTIN   21
+#define SIGTTOU   22
+#define SIGURG    23
+#define SIGXCPU   24
+#define SIGXFSZ   25
+#define SIGVTALRM 26
+#define SIGPROF   27
+#define SIGWINCH  28
+#define SIGIO     29
+#define SIGPOLL   29
+#define SIGPWR    30
+#define SIGSYS    31
+#define SIGUNUSED SIGSYS
+
+#define _NSIG 65
diff --git a/arch/hexagon/bits/stat.h b/arch/hexagon/bits/stat.h
new file mode 100644
index 00000000..55e81fd9
--- /dev/null
+++ b/arch/hexagon/bits/stat.h
@@ -0,0 +1,20 @@
+/* copied from kernel definition, but with padding replaced
+ * by the corresponding correctly-sized userspace types. */
+struct stat {
+	dev_t st_dev;
+	ino_t st_ino;
+	mode_t st_mode;
+	nlink_t st_nlink;
+	uid_t st_uid;
+	gid_t st_gid;
+	dev_t st_rdev;
+	unsigned long __pad;
+	off_t st_size;
+	blksize_t st_blksize;
+	int __pad2;
+	blkcnt_t st_blocks;
+	struct timespec st_atim;
+	struct timespec st_mtim;
+	struct timespec st_ctim;
+	unsigned __unused[2];
+};
diff --git a/arch/hexagon/bits/stdint.h b/arch/hexagon/bits/stdint.h
new file mode 100644
index 00000000..d1b27121
--- /dev/null
+++ b/arch/hexagon/bits/stdint.h
@@ -0,0 +1,20 @@
+typedef int32_t int_fast16_t;
+typedef int32_t int_fast32_t;
+typedef uint32_t uint_fast16_t;
+typedef uint32_t uint_fast32_t;
+
+#define INT_FAST16_MIN  INT32_MIN
+#define INT_FAST32_MIN  INT32_MIN
+
+#define INT_FAST16_MAX  INT32_MAX
+#define INT_FAST32_MAX  INT32_MAX
+
+#define UINT_FAST16_MAX UINT32_MAX
+#define UINT_FAST32_MAX UINT32_MAX
+
+#define INTPTR_MIN      INT32_MIN
+#define INTPTR_MAX      INT32_MAX
+#define UINTPTR_MAX     UINT32_MAX
+#define PTRDIFF_MIN     INT32_MIN
+#define PTRDIFF_MAX     INT32_MAX
+#define SIZE_MAX        UINT32_MAX
diff --git a/arch/hexagon/bits/syscall.h.in b/arch/hexagon/bits/syscall.h.in
new file mode 100644
index 00000000..5e7b96d0
--- /dev/null
+++ b/arch/hexagon/bits/syscall.h.in
@@ -0,0 +1,327 @@
+#define __NR_io_setup 0
+#define __NR_io_destroy 1
+#define __NR_io_submit 2
+#define __NR_io_cancel 3
+#define __NR_io_getevents 4
+#define __NR_setxattr 5
+#define __NR_lsetxattr 6
+#define __NR_fsetxattr 7
+#define __NR_getxattr 8
+#define __NR_lgetxattr 9
+#define __NR_fgetxattr 10
+#define __NR_listxattr 11
+#define __NR_llistxattr 12
+#define __NR_flistxattr 13
+#define __NR_removexattr 14
+#define __NR_lremovexattr 15
+#define __NR_fremovexattr 16
+#define __NR_getcwd 17
+#define __NR_lookup_dcookie 18
+#define __NR_eventfd2 19
+#define __NR_epoll_create1 20
+#define __NR_epoll_ctl 21
+#define __NR_epoll_pwait 22
+#define __NR_dup 23
+#define __NR_dup3 24
+#define __NR_fcntl 25
+#define __NR_inotify_init1 26
+#define __NR_inotify_add_watch 27
+#define __NR_inotify_rm_watch 28
+#define __NR_ioctl 29
+#define __NR_ioprio_set 30
+#define __NR_ioprio_get 31
+#define __NR_flock 32
+#define __NR_mknodat 33
+#define __NR_mkdirat 34
+#define __NR_unlinkat 35
+#define __NR_symlinkat 36
+#define __NR_linkat 37
+#define __NR_renameat 38
+#define __NR_umount2 39
+#define __NR_mount 40
+#define __NR_pivot_root 41
+#define __NR_nfsservctl 42
+#define __NR_statfs 43
+#define __NR_fstatfs 44
+#define __NR_truncate 45
+#define __NR_ftruncate 46
+#define __NR_fallocate 47
+#define __NR_faccessat 48
+#define __NR_chdir 49
+#define __NR_fchdir 50
+#define __NR_chroot 51
+#define __NR_fchmod 52
+#define __NR_fchmodat 53
+#define __NR_fchownat 54
+#define __NR_fchown 55
+#define __NR_openat 56
+#define __NR_close 57
+#define __NR_vhangup 58
+#define __NR_pipe2 59
+#define __NR_quotactl 60
+#define __NR_getdents64 61
+#define __NR_lseek 62
+#define __NR_read 63
+#define __NR_write 64
+#define __NR_readv 65
+#define __NR_writev 66
+#define __NR_pread64 67
+#define __NR_pwrite64 68
+#define __NR_preadv 69
+#define __NR_pwritev 70
+#define __NR_sendfile 71
+#define __NR_pselect6 72
+#define __NR_ppoll 73
+#define __NR_signalfd4 74
+#define __NR_vmsplice 75
+#define __NR_splice 76
+#define __NR_tee 77
+#define __NR_readlinkat 78
+#define __NR_fstatat 79
+#define __NR_fstat 80
+#define __NR_sync 81
+#define __NR_fsync 82
+#define __NR_fdatasync 83
+#define __NR_sync_file_range2 84
+#define __NR_sync_file_range 84
+#define __NR_timerfd_create 85
+#define __NR_timerfd_settime 86
+#define __NR_timerfd_gettime 87
+#define __NR_utimensat 88
+#define __NR_acct 89
+#define __NR_capget 90
+#define __NR_capset 91
+#define __NR_personality 92
+#define __NR_exit 93
+#define __NR_exit_group 94
+#define __NR_waitid 95
+#define __NR_set_tid_address 96
+#define __NR_unshare 97
+#define __NR_futex 98
+#define __NR_set_robust_list 99
+#define __NR_get_robust_list 100
+#define __NR_nanosleep 101
+#define __NR_getitimer 102
+#define __NR_setitimer 103
+#define __NR_kexec_load 104
+#define __NR_init_module 105
+#define __NR_delete_module 106
+#define __NR_timer_create 107
+#define __NR_timer_gettime 108
+#define __NR_timer_getoverrun 109
+#define __NR_timer_settime 110
+#define __NR_timer_delete 111
+#define __NR_clock_settime 112
+#define __NR_clock_gettime32 113
+#define __NR_clock_getres 114
+#define __NR_clock_nanosleep 115
+#define __NR_syslog 116
+#define __NR_ptrace 117
+#define __NR_sched_setparam 118
+#define __NR_sched_setscheduler 119
+#define __NR_sched_getscheduler 120
+#define __NR_sched_getparam 121
+#define __NR_sched_setaffinity 122
+#define __NR_sched_getaffinity 123
+#define __NR_sched_yield 124
+#define __NR_sched_get_priority_max 125
+#define __NR_sched_get_priority_min 126
+#define __NR_sched_rr_get_interval 127
+#define __NR_restart_syscall 128
+#define __NR_kill 129
+#define __NR_tkill 130
+#define __NR_tgkill 131
+#define __NR_sigaltstack 132
+#define __NR_rt_sigsuspend 133
+#define __NR_rt_sigaction 134
+#define __NR_rt_sigprocmask 135
+#define __NR_rt_sigpending 136
+#define __NR_rt_sigtimedwait 137
+#define __NR_rt_sigqueueinfo 138
+#define __NR_rt_sigreturn 139
+#define __NR_setpriority 140
+#define __NR_getpriority 141
+#define __NR_reboot 142
+#define __NR_setregid 143
+#define __NR_setgid 144
+#define __NR_setreuid 145
+#define __NR_setuid 146
+#define __NR_setresuid 147
+#define __NR_getresuid 148
+#define __NR_setresgid 149
+#define __NR_getresgid 150
+#define __NR_setfsuid 151
+#define __NR_setfsgid 152
+#define __NR_times 153
+#define __NR_setpgid 154
+#define __NR_getpgid 155
+#define __NR_getsid 156
+#define __NR_setsid 157
+#define __NR_getgroups 158
+#define __NR_setgroups 159
+#define __NR_uname 160
+#define __NR_sethostname 161
+#define __NR_setdomainname 162
+#define __NR_getrlimit 163
+#define __NR_setrlimit 164
+#define __NR_getrusage 165
+#define __NR_umask 166
+#define __NR_prctl 167
+#define __NR_getcpu 168
+#define __NR_gettimeofday_time32 169
+#define __NR_settimeofday 170
+#define __NR_adjtimex 171
+#define __NR_getpid 172
+#define __NR_getppid 173
+#define __NR_getuid 174
+#define __NR_geteuid 175
+#define __NR_getgid 176
+#define __NR_getegid 177
+#define __NR_gettid 178
+#define __NR_sysinfo 179
+#define __NR_mq_open 180
+#define __NR_mq_unlink 181
+#define __NR_mq_timedsend 182
+#define __NR_mq_timedreceive 183
+#define __NR_mq_notify 184
+#define __NR_mq_getsetattr 185
+#define __NR_msgget 186
+#define __NR_msgctl 187
+#define __NR_msgrcv 188
+#define __NR_msgsnd 189
+#define __NR_semget 190
+#define __NR_semctl 191
+#define __NR_semtimedop 192
+#define __NR_semop 193
+#define __NR_shmget 194
+#define __NR_shmctl 195
+#define __NR_shmat 196
+#define __NR_shmdt 197
+#define __NR_socket 198
+#define __NR_socketpair 199
+#define __NR_bind 200
+#define __NR_listen 201
+#define __NR_accept 202
+#define __NR_connect 203
+#define __NR_getsockname 204
+#define __NR_getpeername 205
+#define __NR_sendto 206
+#define __NR_recvfrom 207
+#define __NR_setsockopt 208
+#define __NR_getsockopt 209
+#define __NR_shutdown 210
+#define __NR_sendmsg 211
+#define __NR_recvmsg 212
+#define __NR_readahead 213
+#define __NR_brk 214
+#define __NR_munmap 215
+#define __NR_mremap 216
+#define __NR_add_key 217
+#define __NR_request_key 218
+#define __NR_keyctl 219
+#define __NR_clone 220
+#define __NR_execve 221
+#define __NR_mmap 222
+#define __NR_fadvise64 223
+#define __NR_swapon 224
+#define __NR_swapoff 225
+#define __NR_mprotect 226
+#define __NR_msync 227
+#define __NR_mlock 228
+#define __NR_munlock 229
+#define __NR_mlockall 230
+#define __NR_munlockall 231
+#define __NR_mincore 232
+#define __NR_madvise 233
+#define __NR_remap_file_pages 234
+#define __NR_mbind 235
+#define __NR_get_mempolicy 236
+#define __NR_set_mempolicy 237
+#define __NR_migrate_pages 238
+#define __NR_move_pages 239
+#define __NR_rt_tgsigqueueinfo 240
+#define __NR_perf_event_open 241
+#define __NR_accept4 242
+#define __NR_recvmmsg 243
+#define __NR_arch_specific_syscall 244
+#define __NR_wait4 260
+#define __NR_prlimit64 261
+#define __NR_fanotify_init 262
+#define __NR_fanotify_mark 263
+#define __NR_name_to_handle_at 264
+#define __NR_open_by_handle_at 265
+#define __NR_clock_adjtime 266
+#define __NR_syncfs 267
+#define __NR_setns 268
+#define __NR_sendmmsg 269
+#define __NR_process_vm_readv 270
+#define __NR_process_vm_writev 271
+#define __NR_kcmp 272
+#define __NR_finit_module 273
+#define __NR_sched_setattr 274
+#define __NR_sched_getattr 275
+#define __NR_renameat2 276
+#define __NR_seccomp 277
+#define __NR_getrandom 278
+#define __NR_memfd_create 279
+#define __NR_bpf 280
+#define __NR_execveat 281
+#define __NR_userfaultfd 282
+#define __NR_membarrier 283
+#define __NR_mlock2 284
+#define __NR_copy_file_range 285
+#define __NR_preadv2 286
+#define __NR_pwritev2 287
+#define __NR_pkey_mprotect 288
+#define __NR_pkey_alloc 289
+#define __NR_pkey_free 290
+#define __NR_statx 291
+#define __NR_clock_gettime64 403
+#define __NR_clock_settime64 404
+#define __NR_clock_adjtime64 405
+#define __NR_clock_getres_time64 406
+#define __NR_clock_nanosleep_time64 407
+#define __NR_timer_gettime64 408
+#define __NR_timer_settime64 409
+#define __NR_timerfd_gettime64 410
+#define __NR_timerfd_settime64 411
+#define __NR_utimensat_time64 412
+#define __NR_pselect6_time64 413
+#define __NR_ppoll_time64 414
+#define __NR_io_pgetevents_time64 416
+#define __NR_recvmmsg_time64 417
+#define __NR_mq_timedsend_time64 418
+#define __NR_mq_timedreceive_time64 419
+#define __NR_semtimedop_time64 420
+#define __NR_rt_sigtimedwait_time64 421
+#define __NR_futex_time64 422
+#define __NR_sched_rr_get_interval_time64 423
+#define __NR_pidfd_send_signal 424
+#define __NR_io_uring_setup 425
+#define __NR_io_uring_enter 426
+#define __NR_io_uring_register 427
+#define __NR_open_tree 428
+#define __NR_move_mount 429
+#define __NR_fsopen 430
+#define __NR_fsconfig 431
+#define __NR_fsmount 432
+#define __NR_fspick 433
+#define __NR_pidfd_open 434
+#define __NR_close_range 436
+#define __NR_openat2 437
+#define __NR_pidfd_getfd 438
+#define __NR_faccessat2 439
+#define __NR_process_madvise 440
+#define __NR_syscalls (__NR_process_madvise+1)
+#define __NR_newfstatat  __NR_fstatat
+#define __NR_fcntl64  __NR_fcntl
+#define __NR_statfs64  __NR_statfs
+#define __NR_fstatfs64  __NR_fstatfs
+#define __NR_truncate64  __NR_truncate
+#define __NR_ftruncate64  __NR_ftruncate
+#define __NR__llseek  __NR_lseek
+#define __NR_sendfile64  __NR_sendfile
+#define __NR_fstatat64  __NR_fstatat
+#define __NR_fstat64  __NR_fstat
+#define __NR_mmap2  __NR_mmap
+#define __NR_fadvise64_64  __NR_fadvise64
diff --git a/arch/hexagon/crt_arch.h b/arch/hexagon/crt_arch.h
new file mode 100644
index 00000000..9f9428cf
--- /dev/null
+++ b/arch/hexagon/crt_arch.h
@@ -0,0 +1,22 @@
+__asm__(
+".weak _DYNAMIC \n"
+".hidden _DYNAMIC \n"
+".text \n"
+".global " START " \n"
+".type " START ", %function \n"
+START ": \n"
+"                                       // Find _DYNAMIC\n"
+"       jump 1f\n"
+".word  _DYNAMIC - .\n"
+"1:     r2 = pc\n"
+"       r2 = add(r2, #-4)\n"
+"       r1 = memw(r2)\n"
+"       r1 = add(r2, r1)\n"
+"	r30 = #0			// Signals the end of backtrace\n"
+"	r0 = r29			// Pointer to argc/argv\n"
+"	r29 = and(r29, #-16)		// Align\n"
+"	memw(r29+#-8) = r29\n"
+"	r29 = add(r29, #-8)\n"
+"	call " START "_c \n"
+".size " START ", .-" START "\n"
+);
diff --git a/arch/hexagon/kstat.h b/arch/hexagon/kstat.h
new file mode 100644
index 00000000..92625f36
--- /dev/null
+++ b/arch/hexagon/kstat.h
@@ -0,0 +1,21 @@
+struct kstat {
+	dev_t st_dev;
+	ino_t st_ino;
+	mode_t st_mode;
+	nlink_t st_nlink;
+	uid_t st_uid;
+	gid_t st_gid;
+	dev_t st_rdev;
+	unsigned long __pad;
+	off_t st_size;
+	blksize_t st_blksize;
+	int __pad2;
+	blkcnt_t st_blocks;
+	long st_atime_sec;
+	long st_atime_nsec;
+	long st_mtime_sec;
+	long st_mtime_nsec;
+	long st_ctime_sec;
+	long st_ctime_nsec;
+	unsigned __unused[2];
+};
diff --git a/arch/hexagon/pthread_arch.h b/arch/hexagon/pthread_arch.h
new file mode 100644
index 00000000..b614fdd1
--- /dev/null
+++ b/arch/hexagon/pthread_arch.h
@@ -0,0 +1,13 @@
+// Hexagon supports variant 2 TLS.
+static inline uintptr_t __get_tp()
+{
+  uintptr_t tp;
+  __asm__ ( "%0 = ugp" : "=r"(tp));
+  return tp;
+}
+
+#define TP_ADJ(p) (p)
+
+#define CANCEL_REG_IP 43
+
+#define MC_PC pc
diff --git a/arch/hexagon/reloc.h b/arch/hexagon/reloc.h
new file mode 100644
index 00000000..de171961
--- /dev/null
+++ b/arch/hexagon/reloc.h
@@ -0,0 +1,16 @@
+#include <endian.h>
+
+#define LDSO_ARCH "hexagon"
+#define TPOFF_K 0
+
+#define REL_SYMBOLIC    R_HEX_32
+#define REL_GOT         R_HEX_GLOB_DAT
+#define REL_PLT         R_HEX_JMP_SLOT
+#define REL_RELATIVE    R_HEX_RELATIVE
+#define REL_COPY        R_HEX_COPY
+#define REL_DTPMOD      R_HEX_DTPMOD_32
+#define REL_TPOFF       R_HEX_TPREL_32
+#define REL_DTPOFF      R_HEX_DTPREL_32
+
+#define CRTJMP(pc,sp) __asm__ __volatile__( \
+	"r29 = %1 ; jumpr %0" : : "r"(pc), "r"(sp) : "memory" )
diff --git a/arch/hexagon/syscall_arch.h b/arch/hexagon/syscall_arch.h
new file mode 100644
index 00000000..625ec039
--- /dev/null
+++ b/arch/hexagon/syscall_arch.h
@@ -0,0 +1,78 @@
+
+#define __SYSCALL_LL_E(x) \
+((union { long long ll; long l[2]; }){ .ll = x }).l[0], \
+((union { long long ll; long l[2]; }){ .ll = x }).l[1]
+#define __SYSCALL_LL_O(x) 0, __SYSCALL_LL_E((x))
+
+#define __asm_syscall(...) do { \
+    __asm__ __volatile__ ( "trap0(#1)" \
+    : "=r"(r0) : __VA_ARGS__ : "memory"); \
+    return r0; \
+    } while (0)
+
+static inline long __syscall0(long n)
+{
+  register long r6 __asm__("r6") = n;
+  register long r0 __asm__("r0");
+  __asm_syscall("r"(r6));
+}
+
+static inline long __syscall1(long n, long a)
+{
+  register long r6 __asm__("r6") = n;
+  register long r0 __asm__("r0") = a;
+  __asm_syscall("r"(r6), "0"(r0));
+}
+
+static inline long __syscall2(long n, long a, long b)
+{
+  register long r6 __asm__("r6") = n;
+  register long r0 __asm__("r0") = a;
+  register long r1 __asm__("r1") = b;
+  __asm_syscall("r"(r6), "0"(r0), "r"(r1));
+}
+
+static inline long __syscall3(long n, long a, long b, long c)
+{
+  register long r6 __asm__("r6") = n;
+  register long r0 __asm__("r0") = a;
+  register long r1 __asm__("r1") = b;
+  register long r2 __asm__("r2") = c;
+  __asm_syscall("r"(r6), "0"(r0), "r"(r1), "r"(r2));
+}
+
+static inline long __syscall4(long n, long a, long b, long c, long d)
+{
+  register long r6 __asm__("r6") = n;
+  register long r0 __asm__("r0") = a;
+  register long r1 __asm__("r1") = b;
+  register long r2 __asm__("r2") = c;
+  register long r3 __asm__("r3") = d;
+  __asm_syscall("r"(r6), "0"(r0), "r"(r1), "r"(r2), "r"(r3));
+}
+
+static inline long __syscall5(long n, long a, long b, long c, long d, long e)
+{
+  register long r6 __asm__("r6") = n;
+  register long r0 __asm__("r0") = a;
+  register long r1 __asm__("r1") = b;
+  register long r2 __asm__("r2") = c;
+  register long r3 __asm__("r3") = d;
+  register long r4 __asm__("r4") = e;
+  __asm_syscall("r"(r6), "0"(r0), "r"(r1), "r"(r2), "r"(r3), "r"(r4));
+}
+
+static inline long __syscall6(long n, long a, long b, long c, long d, long e,
+                              long f)
+{
+  register long r6 __asm__("r6") = n;
+  register long r0 __asm__("r0") = a;
+  register long r1 __asm__("r1") = b;
+  register long r2 __asm__("r2") = c;
+  register long r3 __asm__("r3") = d;
+  register long r4 __asm__("r4") = e;
+  register long r5 __asm__("r5") = f;
+  __asm_syscall("r"(r6), "0"(r0), "r"(r1), "r"(r2), "r"(r3), "r"(r4), "r"(r5));
+}
+
+#define SYSCALL_FADVISE_6_ARG
diff --git a/configure b/configure
index 0b966ede..a381aef6 100755
--- a/configure
+++ b/configure
@@ -323,6 +323,7 @@ case "$target" in
 # Catch these early to simplify matching for 32-bit archs
 arm*) ARCH=arm ;;
 aarch64*) ARCH=aarch64 ;;
+hexagon*) ARCH=hexagon ;;
 i?86-nt32*) ARCH=nt32 ;;
 i?86*) ARCH=i386 ;;
 x86_64-x32*|x32*|x86_64*x32) ARCH=x32 ;;
diff --git a/include/elf.h b/include/elf.h
index 23f2c4bc..5b2551c3 100644
--- a/include/elf.h
+++ b/include/elf.h
@@ -3293,6 +3293,107 @@ enum
 #define R_RISCV_SET32           56
 #define R_RISCV_32_PCREL        57
 
+#define R_HEX_NONE               0
+#define R_HEX_B22_PCREL          1
+#define R_HEX_B15_PCREL          2
+#define R_HEX_B7_PCREL           3
+#define R_HEX_LO16               4
+#define R_HEX_HI16               5
+#define R_HEX_32                 6
+#define R_HEX_16                 7
+#define R_HEX_8                  8
+#define R_HEX_GPREL16_0          9
+#define R_HEX_GPREL16_1         10
+#define R_HEX_GPREL16_2         11
+#define R_HEX_GPREL16_3         12
+#define R_HEX_HL16              13
+#define R_HEX_B13_PCREL         14
+#define R_HEX_B9_PCREL          15
+#define R_HEX_B32_PCREL_X       16
+#define R_HEX_32_6_X            17
+#define R_HEX_B22_PCREL_X       18
+#define R_HEX_B15_PCREL_X       19
+#define R_HEX_B13_PCREL_X       20
+#define R_HEX_B9_PCREL_X        21
+#define R_HEX_B7_PCREL_X        22
+#define R_HEX_16_X              23
+#define R_HEX_12_X              24
+#define R_HEX_11_X              25
+#define R_HEX_10_X              26
+#define R_HEX_9_X               27
+#define R_HEX_8_X               28
+#define R_HEX_7_X               29
+#define R_HEX_6_X               30
+#define R_HEX_32_PCREL          31
+#define R_HEX_COPY              32
+#define R_HEX_GLOB_DAT          33
+#define R_HEX_JMP_SLOT          34
+#define R_HEX_RELATIVE          35
+#define R_HEX_PLT_B22_PCREL     36
+#define R_HEX_GOTOFF_LO16       37
+#define R_HEX_GOTOFF_HI16       38
+#define R_HEX_GOTOFF_32         39
+#define R_HEX_GOT_LO16          40
+#define R_HEX_GOT_HI16          41
+#define R_HEX_GOT_32            42
+#define R_HEX_GOT_16            43
+#define R_HEX_DTPMOD_32         44
+#define R_HEX_DTPREL_LO16       45
+#define R_HEX_DTPREL_HI16       46
+#define R_HEX_DTPREL_32         47
+#define R_HEX_DTPREL_16         48
+#define R_HEX_GD_PLT_B22_PCREL  49
+#define R_HEX_GD_GOT_LO16       50
+#define R_HEX_GD_GOT_HI16       51
+#define R_HEX_GD_GOT_32         52
+#define R_HEX_GD_GOT_16         53
+#define R_HEX_IE_LO16           54
+#define R_HEX_IE_HI16           55
+#define R_HEX_IE_32             56
+#define R_HEX_IE_GOT_LO16       57
+#define R_HEX_IE_GOT_HI16       58
+#define R_HEX_IE_GOT_32         59
+#define R_HEX_IE_GOT_16         60
+#define R_HEX_TPREL_LO16        61
+#define R_HEX_TPREL_HI16        62
+#define R_HEX_TPREL_32          63
+#define R_HEX_TPREL_16          64
+#define R_HEX_6_PCREL_X         65
+#define R_HEX_GOTREL_32_6_X     66
+#define R_HEX_GOTREL_16_X       67
+#define R_HEX_GOTREL_11_X       68
+#define R_HEX_GOT_32_6_X        69
+#define R_HEX_GOT_16_X          70
+#define R_HEX_GOT_11_X          71
+#define R_HEX_DTPREL_32_6_X     72
+#define R_HEX_DTPREL_16_X       73
+#define R_HEX_DTPREL_11_X       74
+#define R_HEX_GD_GOT_32_6_X     75
+#define R_HEX_GD_GOT_16_X       76
+#define R_HEX_GD_GOT_11_X       77
+#define R_HEX_IE_32_6_X         78
+#define R_HEX_IE_16_X           79
+#define R_HEX_IE_GOT_32_6_X     80
+#define R_HEX_IE_GOT_16_X       81
+#define R_HEX_IE_GOT_11_X       82
+#define R_HEX_TPREL_32_6_X      83
+#define R_HEX_TPREL_16_X        84
+#define R_HEX_TPREL_11_X        85
+#define R_HEX_LD_PLT_B22_PCREL  86
+#define R_HEX_LD_GOT_LO16       87
+#define R_HEX_LD_GOT_HI16       88
+#define R_HEX_LD_GOT_32         89
+#define R_HEX_LD_GOT_16         90
+#define R_HEX_LD_GOT_32_6_X     91
+#define R_HEX_LD_GOT_16_X       92
+#define R_HEX_LD_GOT_11_X       93
+#define R_HEX_23_REG            94
+#define R_HEX_GD_PLT_B22_PCREL_X 95
+#define R_HEX_GD_PLT_B32_PCREL_X 96
+#define R_HEX_LD_PLT_B22_PCREL_X 97
+#define R_HEX_LD_PLT_B32_PCREL_X 98
+
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/setjmp/hexagon/longjmp.s b/src/setjmp/hexagon/longjmp.s
new file mode 100644
index 00000000..691b67dd
--- /dev/null
+++ b/src/setjmp/hexagon/longjmp.s
@@ -0,0 +1,25 @@
+.text
+.global _longjmp
+.global longjmp
+.type _longjmp,%function
+.type longjmp,%function
+_longjmp:
+longjmp:
+    { r17:16=memd(r0+#0)
+      r19:18=memd(r0+#8) }
+    { r21:20=memd(r0+#16)
+      r23:22=memd(r0+#24) }
+    { r25:24=memd(r0+#32)
+      r27:26=memd(r0+#40) }
+    { r29:28=memd(r0+#48)
+      r31:30=memd(r0+#56) }
+
+    r0 = r1
+    r1 = #0
+    p0 = cmp.eq(r0,r1)
+    if (!p0) jumpr r31
+    r0 = #1
+
+    jumpr r31
+.size _longjmp, .-_longjmp
+.size longjmp, .-longjmp
diff --git a/src/setjmp/hexagon/setjmp.s b/src/setjmp/hexagon/setjmp.s
new file mode 100644
index 00000000..d29f036e
--- /dev/null
+++ b/src/setjmp/hexagon/setjmp.s
@@ -0,0 +1,24 @@
+.text
+.global __setjmp
+.global _setjmp
+.global setjmp
+.type __setjmp,@function
+.type _setjmp,@function
+.type setjmp,@function
+__setjmp:
+_setjmp:
+setjmp:
+    { memd(r0+#0)=r17:16
+      memd(r0+#8)=r19:18 }
+    { memd(r0+#16)=r21:20
+      memd(r0+#24)=r23:22 }
+    { memd(r0+#32)=r25:24
+      memd(r0+#40)=r27:26 }
+    { memd(r0+#48)=r29:28
+      memd(r0+#56)=r31:30 }
+
+    r0 = #0
+    jumpr r31
+.size __setjmp, .-__setjmp
+.size _setjmp, .-_setjmp
+.size setjmp, .-setjmp
diff --git a/src/signal/hexagon/restore.s b/src/signal/hexagon/restore.s
new file mode 100644
index 00000000..f43f5e02
--- /dev/null
+++ b/src/signal/hexagon/restore.s
@@ -0,0 +1,11 @@
+// TODO - Test this if sa_restorer is ever supported in our kernel
+.global __restore
+.type __restore,%function
+.global __restore_rt
+.type __restore_rt,%function
+__restore:
+__restore_rt:
+	r6 = #139				// SYS_rt_sigreturn
+	trap0(#0)
+.size __restore, .-__restore
+.size __restore_rt, .-__restore_rt
diff --git a/src/signal/hexagon/sigsetjmp.s b/src/signal/hexagon/sigsetjmp.s
new file mode 100644
index 00000000..f1aaf165
--- /dev/null
+++ b/src/signal/hexagon/sigsetjmp.s
@@ -0,0 +1,28 @@
+.global sigsetjmp
+.global __sigsetjmp
+.type sigsetjmp,@function
+.type __sigsetjmp,@function
+.balign 4
+sigsetjmp:
+__sigsetjmp:
+	// if savemask is 0 sigsetjmp behaves like setjmp
+	{
+		p0 = cmp.eq(r1, #0)
+		if (p0.new) jump:t ##setjmp
+	}
+	{
+		memw(r0+#64+4+8) = r16  // save r16 in __ss[2]
+		memw(r0+#64)   = r31  // save linkregister in __fl
+		r16 = r0
+	}
+		call ##setjmp
+	{
+		r1 = r0;
+		r0  = r16             // restore r0
+		r31 = memw(r16+#64)   // restore linkregister
+		r16 = memw(r16+#64+4+8) // restore r16 from __ss[2]
+	}
+.hidden __sigsetjmp_tail
+	jump ##__sigsetjmp_tail
+
+.size	sigsetjmp, .-sigsetjmp
diff --git a/src/thread/hexagon/__set_thread_area.s b/src/thread/hexagon/__set_thread_area.s
new file mode 100644
index 00000000..87a991b7
--- /dev/null
+++ b/src/thread/hexagon/__set_thread_area.s
@@ -0,0 +1,7 @@
+.global __set_thread_area
+.type   __set_thread_area,@function
+__set_thread_area:
+	{ ugp = r0
+	  r0 = #0
+	  jumpr r31 }
+.size __set_thread_area, .-__set_thread_area
diff --git a/src/thread/hexagon/__unmapself.s b/src/thread/hexagon/__unmapself.s
new file mode 100644
index 00000000..c47dce21
--- /dev/null
+++ b/src/thread/hexagon/__unmapself.s
@@ -0,0 +1,11 @@
+#include <syscall.h>
+
+.global __unmapself
+.type   __unmapself,%function
+__unmapself:
+	r6 = #215			// SYS_munmap
+	trap0(#1)
+	r6 = #93			// SYS_exit
+	trap0(#1)
+	jumpr r31
+.size __unmapself, .-__unmapself
diff --git a/src/thread/hexagon/clone.s b/src/thread/hexagon/clone.s
new file mode 100644
index 00000000..42aab67a
--- /dev/null
+++ b/src/thread/hexagon/clone.s
@@ -0,0 +1,37 @@
+// __clone(func, stack, flags, arg, ptid, tls, ctid)
+//         r0,   r1,    r2,    r3,  r4,   r5,  stack
+
+// tid = syscall(SYS_clone, flags, stack, ptid, ctid, tls)
+//               r6,        r0,    r1,    r2,   r3,   r4
+// if (tid != 0) return
+// func(arg)
+// syscall(SYS_exit)
+
+.text
+.global __clone
+.type   __clone,%function
+__clone:
+	allocframe(#8)
+	// Save pointers for later
+	{ r11 = r0
+	  r10 = r3 }
+
+	// Set up syscall args - The stack must be 8 byte aligned.
+	{ r0 = r2
+	  r1 = and(r1, ##0xfffffff8)
+	  r2 = r4 }
+	{
+	  r3 = memw(r30+#8)
+	  r4 = r5 }
+	r6 = #220			// SYS_clone
+	trap0(#1)
+
+	p0 = cmp.eq(r0, #0)
+	if (!p0) dealloc_return
+
+	{ r0 = r10
+	  callr r11 }
+
+	r6 = #93			// SYS_exit
+	trap0(#1)
+.size __clone, .-__clone
diff --git a/src/thread/hexagon/syscall_cp.s b/src/thread/hexagon/syscall_cp.s
new file mode 100644
index 00000000..50383cad
--- /dev/null
+++ b/src/thread/hexagon/syscall_cp.s
@@ -0,0 +1,35 @@
+// __syscall_cp_asm(&self->cancel, nr,  u, v, w, x, y,    z)
+//                  r0             r1  r2 r3 r4 r5  stack stack
+
+// syscall(nr,  u, v, w, x, y, z)
+//         r6  r0 r1 r2 r3 r4 r5
+
+.text
+.global __cp_begin
+.hidden __cp_begin
+.global __cp_end
+.hidden __cp_end
+.global __cp_cancel
+.hidden __cp_cancel
+.hidden __cancel
+.global __syscall_cp_asm
+.hidden __syscall_cp_asm
+.type __syscall_cp_asm,%function
+__syscall_cp_asm:
+__cp_begin:
+	r0 = memw(r0+#0)
+	{
+	  p0 = cmp.eq(r0, #0); if (!p0.new) jump:nt __cancel
+	}
+	{ r6 = r1
+	  r1:0 = combine(r3, r2)
+	  r3:2 = combine(r5, r4) }
+	{ r4 = memw(r29+#0)
+	  r5 = memw(r29+#4) }
+	trap0(#1)
+__cp_end:
+	jumpr r31
+.size __syscall_cp_asm, .-__syscall_cp_asm
+__cp_cancel:
+        jump __cancel
+.size __cp_cancel, .-__cp_cancel
-- 
2.37.2


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [musl] [RFC PATCH 2/5] hexagon: add fenv header and implementation
  2023-08-30 12:22 [musl] [RFC PATCH 0/5] Add support to Hexagon DSP Matheus Tavares Bernardino
  2023-08-30 12:22 ` [musl] [RFC PATCH 1/5] Add support to Hexagon arch Matheus Tavares Bernardino
@ 2023-08-30 12:22 ` Matheus Tavares Bernardino
  2023-08-30 12:22 ` [musl] [RFC PATCH 3/5] hexagon: add fma/fmaxf/fminf routines Matheus Tavares Bernardino
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 15+ messages in thread
From: Matheus Tavares Bernardino @ 2023-08-30 12:22 UTC (permalink / raw)
  To: musl; +Cc: Brian Cain, Sid Manning, Rich Felker, Fangrui Song, Szabolcs Nagy

From: Brian Cain <bcain@quicinc.com>

---
 arch/hexagon/bits/fenv.h |  20 ++++++
 src/fenv/hexagon/fenv.S  | 144 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 164 insertions(+)
 create mode 100644 arch/hexagon/bits/fenv.h
 create mode 100644 src/fenv/hexagon/fenv.S

diff --git a/arch/hexagon/bits/fenv.h b/arch/hexagon/bits/fenv.h
new file mode 100644
index 00000000..d3349306
--- /dev/null
+++ b/arch/hexagon/bits/fenv.h
@@ -0,0 +1,20 @@
+#define FE_INVALID    (1 << 1)
+#define FE_DIVBYZERO  (1 << 2)
+#define FE_OVERFLOW   (1 << 3)
+#define FE_UNDERFLOW  (1 << 4)
+#define FE_INEXACT    (1 << 5)
+#define FE_ALL_EXCEPT (FE_DIVBYZERO | FE_INEXACT | FE_INVALID | \
+                       FE_OVERFLOW | FE_UNDERFLOW)
+
+#define FE_TONEAREST  0x00
+#define FE_TOWARDZERO 0x01
+#define FE_DOWNWARD   0x02
+#define FE_UPWARD     0x03
+
+typedef unsigned long fexcept_t;
+
+typedef struct {
+	unsigned long __cw;
+} fenv_t;
+
+#define FE_DFL_ENV      ((const fenv_t *) -1)
diff --git a/src/fenv/hexagon/fenv.S b/src/fenv/hexagon/fenv.S
new file mode 100644
index 00000000..f5080a22
--- /dev/null
+++ b/src/fenv/hexagon/fenv.S
@@ -0,0 +1,144 @@
+/*
+ * The Hexagon user status register includes five status fields which work
+ * as sticky flags for the five IEEE-defined exception conditions:
+ * inexact, overflow, underflow, divide by zero, and invalid.
+ * A sticky flag is set when the corresponding exception occurs,
+ * and remains set until explicitly cleared.
+ *
+ *  usr:23:22 - Rounding Mode
+ *  00: Round toward nearest
+ *  01: Round toward zero
+ *  10: Downward Round toward negative infinity
+ *  11: Upward Round toward positive infinity
+ *
+ *  usr:5 - Floating-point IEEE Inexact Sticky Flag.
+ *  usr:4 - Floating-point IEEE Underflow Sticky Flag.
+ *  usr:3 - Floating-point IEEE Overflow Sticky Flag.
+ *  usr:2 - Floating-point IEEE Divide-By-Zero Sticky Flag.
+ *  usr:1 - Floating-point IEEE Invalid Sticky Flag.
+ *  usr:0 - Sticky Saturation Overflow, when 1 saturation occurred.
+ */
+
+#define FE_ALL_EXCEPT 0x3f
+
+#define USR_FE_MASK 0x3fc0003f
+#define RND_MASK    (0x3 << 22)
+#define RND_NEAR    (0x0 << 22)
+#define RND_ZERO    (0x1 << 22)
+#define RND_DOWN    (0x2 << 22)
+#define RND_UP      (0x3 << 22)
+
+/*
+ * int feclearexcept(int mask)
+ */
+.global feclearexcept
+.type feclearexcept,@function
+feclearexcept:
+  {
+    r0 = and(r0, #FE_ALL_EXCEPT) // Only touch the IEEE flag bits.
+    r1 = usr
+  }
+  r1 = and(r1, ~r0)
+  {
+    usr = r1
+    r0 = #0
+    jumpr r31
+  }
+
+/*
+ * int feraiseexcept(int mask)
+ */
+.global feraiseexcept
+.type feraiseexcept,@function
+feraiseexcept:
+  {
+    r0 = and(r0, #FE_ALL_EXCEPT) // Only touch the IEEE flag bits.
+    r1 = usr
+  }
+  r1 = or(r1, r0)
+  {
+    usr = r1
+    r0 = #0
+    jumpr r31
+  }
+
+
+/*
+ * int fetestexcept(int mask)
+ */
+.global fetestexcept
+.type fetestexcept,@function
+fetestexcept:
+  {
+    r0 = and(r0, #FE_ALL_EXCEPT) // Only touch the IEEE flag bits.
+    r1 = usr
+  }
+  {
+    r0 = and(r1, r0)
+    jumpr r31
+  }
+
+/*
+ *int fegetround(void)
+ */
+.global fegetround
+.type fegetround,@function
+fegetround:
+  r0 = usr
+  r0 = and(r0, ##RND_MASK)
+  r0 = lsr(r0, #22);
+  jumpr r31
+
+/*
+ * int __fesetround(int r)
+ */
+.global __fesetround
+.type __fesetround,@function
+__fesetround:
+  {
+    r0 = and(r0, #0x3) // Can only be 0,1,2, or 3
+    r1 = usr
+    r2 = ##RND_MASK
+  }
+  {
+    r1 = and (r1, ~r2)  // Clear the current rounding bits.
+    r0 = asl (r0, #22)
+  }
+  r1 = or(r1, r0)
+  usr = r1
+  {
+    r0 = #0; jumpr r31
+  }
+
+/*
+ * int fegetenv(fenv_t *envp)
+ */
+.global fegetenv
+.type fegetenv,@function
+fegetenv:
+  r1 = usr
+  memw(r0) = r1
+  {
+    r0 = #0
+    jumpr r31
+  }
+
+/*
+ * int fesetenv(const fenv_t *envp)
+ */
+.global fesetenv
+.type fesetenv,@function
+fesetenv:
+  { p0 = cmp.eq(r0, #-1); if (p0.new) r1 = #0 }  /* The default mode */
+  if (!p0) r1 = memw(r0)                         /* stored in fenv_t */
+
+  r2 = ##USR_FE_MASK // USR:FE bit mask
+  r1 = and(r1, r2)   // MASK the input bits with the FE bits
+  r3 = usr
+  r3 = and(r3, ~r2)  // Clear any currently set FE bits
+  r3 = or(r3, r1)    // Set the newbits
+  usr = r3
+  {
+    r0 = #0
+    jumpr r31
+  }
-- 
2.37.2


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [musl] [RFC PATCH 3/5] hexagon: add fma/fmaxf/fminf routines
  2023-08-30 12:22 [musl] [RFC PATCH 0/5] Add support to Hexagon DSP Matheus Tavares Bernardino
  2023-08-30 12:22 ` [musl] [RFC PATCH 1/5] Add support to Hexagon arch Matheus Tavares Bernardino
  2023-08-30 12:22 ` [musl] [RFC PATCH 2/5] hexagon: add fenv header and implementation Matheus Tavares Bernardino
@ 2023-08-30 12:22 ` Matheus Tavares Bernardino
  2023-08-30 12:22 ` [musl] [RFC PATCH 4/5] hexagon: add bits/user.h Matheus Tavares Bernardino
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 15+ messages in thread
From: Matheus Tavares Bernardino @ 2023-08-30 12:22 UTC (permalink / raw)
  To: musl; +Cc: Brian Cain, Sid Manning, Rich Felker, Fangrui Song, Szabolcs Nagy

From: Sid Manning <sidneym@quicinc.com>

---
 src/math/hexagon/fmaf.c  | 8 ++++++++
 src/math/hexagon/fmaxf.c | 8 ++++++++
 src/math/hexagon/fminf.c | 8 ++++++++
 3 files changed, 24 insertions(+)
 create mode 100644 src/math/hexagon/fmaf.c
 create mode 100644 src/math/hexagon/fmaxf.c
 create mode 100644 src/math/hexagon/fminf.c

diff --git a/src/math/hexagon/fmaf.c b/src/math/hexagon/fmaf.c
new file mode 100644
index 00000000..7ce1996c
--- /dev/null
+++ b/src/math/hexagon/fmaf.c
@@ -0,0 +1,8 @@
+#include <math.h>
+
+float fmaf(float x, float y, float z)
+{
+	__asm__ ("%[z]+=sfmpy(%[x], %[y])"
+                 : [z]"+r"(z) : [x]"r"(x), [y]"r"(y));
+	return z;
+}
diff --git a/src/math/hexagon/fmaxf.c b/src/math/hexagon/fmaxf.c
new file mode 100644
index 00000000..0dc52b25
--- /dev/null
+++ b/src/math/hexagon/fmaxf.c
@@ -0,0 +1,8 @@
+#include <math.h>
+
+float fmaxf(float x, float y)
+{
+	__asm__ ("%[x]=sfmax(%[x], %[y])"
+                : [x]"+r"(x) : [y]"r"(y));
+	return x;
+}
diff --git a/src/math/hexagon/fminf.c b/src/math/hexagon/fminf.c
new file mode 100644
index 00000000..aeb20ae0
--- /dev/null
+++ b/src/math/hexagon/fminf.c
@@ -0,0 +1,8 @@
+#include <math.h>
+
+float fminf(float x, float y)
+{
+	__asm__ ("%[x]=sfmin(%[x], %[y])"
+                : [x]"+r"(x) : [y]"r"(y));
+	return x;
+}
-- 
2.37.2


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [musl] [RFC PATCH 4/5] hexagon: add bits/user.h
  2023-08-30 12:22 [musl] [RFC PATCH 0/5] Add support to Hexagon DSP Matheus Tavares Bernardino
                   ` (2 preceding siblings ...)
  2023-08-30 12:22 ` [musl] [RFC PATCH 3/5] hexagon: add fma/fmaxf/fminf routines Matheus Tavares Bernardino
@ 2023-08-30 12:22 ` Matheus Tavares Bernardino
  2023-08-30 12:22 ` [musl] [RFC PATCH 5/5] INSTALL: add 'Hexagon' to list of supported targets Matheus Tavares Bernardino
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 15+ messages in thread
From: Matheus Tavares Bernardino @ 2023-08-30 12:22 UTC (permalink / raw)
  To: musl; +Cc: Brian Cain, Sid Manning, Rich Felker, Fangrui Song, Szabolcs Nagy

From: Brian Cain <bcain@quicinc.com>

---
 arch/hexagon/bits/user.h | 60 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 60 insertions(+)
 create mode 100644 arch/hexagon/bits/user.h

diff --git a/arch/hexagon/bits/user.h b/arch/hexagon/bits/user.h
new file mode 100644
index 00000000..4396385d
--- /dev/null
+++ b/arch/hexagon/bits/user.h
@@ -0,0 +1,60 @@
+#ifndef HEXAGON_ASM_USER_H
+#define HEXAGON_ASM_USER_H
+
+struct user_regs_struct {
+  unsigned long r0;
+  unsigned long r1;
+  unsigned long r2;
+  unsigned long r3;
+  unsigned long r4;
+  unsigned long r5;
+  unsigned long r6;
+  unsigned long r7;
+  unsigned long r8;
+  unsigned long r9;
+  unsigned long r10;
+  unsigned long r11;
+  unsigned long r12;
+  unsigned long r13;
+  unsigned long r14;
+  unsigned long r15;
+  unsigned long r16;
+  unsigned long r17;
+  unsigned long r18;
+  unsigned long r19;
+  unsigned long r20;
+  unsigned long r21;
+  unsigned long r22;
+  unsigned long r23;
+  unsigned long r24;
+  unsigned long r25;
+  unsigned long r26;
+  unsigned long r27;
+  unsigned long r28;
+  unsigned long r29;
+  unsigned long r30;
+  unsigned long r31;
+  unsigned long sa0;
+  unsigned long lc0;
+  unsigned long sa1;
+  unsigned long lc1;
+  unsigned long m0;
+  unsigned long m1;
+  unsigned long usr;
+  unsigned long p3_0;
+  unsigned long gp;
+  unsigned long ugp;
+  unsigned long pc;
+  unsigned long cause;
+  unsigned long badva;
+  unsigned long cs0;
+  unsigned long cs1;
+  unsigned long pad1;
+};
+
+#define ELF_NGREG 48
+typedef unsigned long elf_greg_t, elf_gregset_t[ELF_NGREG];
+
+typedef unsigned long elf_fpregset_t;
+
+#endif
-- 
2.37.2


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [musl] [RFC PATCH 5/5] INSTALL: add 'Hexagon' to list of supported targets
  2023-08-30 12:22 [musl] [RFC PATCH 0/5] Add support to Hexagon DSP Matheus Tavares Bernardino
                   ` (3 preceding siblings ...)
  2023-08-30 12:22 ` [musl] [RFC PATCH 4/5] hexagon: add bits/user.h Matheus Tavares Bernardino
@ 2023-08-30 12:22 ` Matheus Tavares Bernardino
  2023-09-08 11:18 ` [musl] [RFC PATCH 0/5] Add support to Hexagon DSP Matheus Tavares Bernardino
  2023-09-26 16:43 ` Rob Landley
  6 siblings, 0 replies; 15+ messages in thread
From: Matheus Tavares Bernardino @ 2023-08-30 12:22 UTC (permalink / raw)
  To: musl; +Cc: Brian Cain, Sid Manning, Rich Felker, Fangrui Song, Szabolcs Nagy

---
 INSTALL | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/INSTALL b/INSTALL
index c583691d..309f5017 100644
--- a/INSTALL
+++ b/INSTALL
@@ -54,6 +54,8 @@ and ABI combinations:
 * AArch64
     * Little-endian default; big-endian variants also supported
 
+* Hexagon
+
 * MIPS
     * ABI is o32, fp32/fpxx (except on r6 which is fp64)
     * Big-endian default; little-endian variants also supported
-- 
2.37.2


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [musl] [RFC PATCH 0/5] Add support to Hexagon DSP
  2023-08-30 12:22 [musl] [RFC PATCH 0/5] Add support to Hexagon DSP Matheus Tavares Bernardino
                   ` (4 preceding siblings ...)
  2023-08-30 12:22 ` [musl] [RFC PATCH 5/5] INSTALL: add 'Hexagon' to list of supported targets Matheus Tavares Bernardino
@ 2023-09-08 11:18 ` Matheus Tavares Bernardino
  2023-09-26 16:43 ` Rob Landley
  6 siblings, 0 replies; 15+ messages in thread
From: Matheus Tavares Bernardino @ 2023-09-08 11:18 UTC (permalink / raw)
  To: musl; +Cc: bcain, sidneym, i, nsz, dalias

> Matheus Tavares Bernardino <quic_mathbern@quicinc.com> wrote:
>
> I'd like to restart the conversations from
> https://marc.info/?l=musl&w=2&r=1&s=Hexagon+DSP+support&q=b about
> adding Hexagon support to musl.
> 
> I've read the comments from the two previous iterations and it looks
> like Sid has addressed them all already (please let me know if there is
> something missing, though). So I've only rebased/reorganized the patches
> with minor cleanup changes.
> 
> These patches are also available at my git tree:
> https://github.com/quic/musl/tree/mathbern/to-upstream
> You will noticed that this tree contains an extra downstream-only commit
> at the tip, which is intended as a convenience for running libc-test
> with musl + Hexagon (note that we use a small patch for libc-test).
> 
> Speaking of which, here is the latest src/REPORT from running the test
> suite with these patches applied:
> https://gist.github.com/quic-mathbern/e063344dd92e24f97c5a235e389495a3
> 
> Any help and/or feedback will be highly appreciated!

Gentle ping :)

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [musl] [RFC PATCH 0/5] Add support to Hexagon DSP
  2023-08-30 12:22 [musl] [RFC PATCH 0/5] Add support to Hexagon DSP Matheus Tavares Bernardino
                   ` (5 preceding siblings ...)
  2023-09-08 11:18 ` [musl] [RFC PATCH 0/5] Add support to Hexagon DSP Matheus Tavares Bernardino
@ 2023-09-26 16:43 ` Rob Landley
  2023-09-26 16:48   ` Brian Cain
  6 siblings, 1 reply; 15+ messages in thread
From: Rob Landley @ 2023-09-26 16:43 UTC (permalink / raw)
  To: musl, Matheus Tavares Bernardino
  Cc: Brian Cain, Sid Manning, Rich Felker, Fangrui Song, Szabolcs Nagy

On 8/30/23 07:22, Matheus Tavares Bernardino wrote:
> Hi,
> 
> I'd like to restart the conversations from
> https://marc.info/?l=musl&w=2&r=1&s=Hexagon+DSP+support&q=b about
> adding Hexagon support to musl.
> 
> I've read the comments from the two previous iterations and it looks
> like Sid has addressed them all already (please let me know if there is
> something missing, though). So I've only rebased/reorganized the patches
> with minor cleanup changes.
> 
> These patches are also available at my git tree:
> https://github.com/quic/musl/tree/mathbern/to-upstream

Is there a current toolchain build script for hexagon? I harvested an
llvm+hexagon+musl build out of qemu's test suite a year or two back
(https://www.openwall.com/lists/musl/2021/07/25/2), but when I pulled updated
llvm git versions a few months later the build faceplanted hard in a way that
wasn't obvious to me how to fix.

(I'm under the impression hexagon is still llvm-only, gcc support having been
dropped in favor of llvm some years ago...)

Rob

^ permalink raw reply	[flat|nested] 15+ messages in thread

* RE: [musl] [RFC PATCH 0/5] Add support to Hexagon DSP
  2023-09-26 16:43 ` Rob Landley
@ 2023-09-26 16:48   ` Brian Cain
  2023-09-26 17:55     ` Rob Landley
  0 siblings, 1 reply; 15+ messages in thread
From: Brian Cain @ 2023-09-26 16:48 UTC (permalink / raw)
  To: Rob Landley, musl, Matheus Bernardino (QUIC)
  Cc: Sid Manning, Rich Felker, Fangrui Song, Szabolcs Nagy

> -----Original Message-----
> From: Rob Landley <rob@landley.net>
...
> On 8/30/23 07:22, Matheus Tavares Bernardino wrote:
> > Hi,
> >
> > I'd like to restart the conversations from
> > https://marc.info/?l=musl&w=2&r=1&s=Hexagon+DSP+support&q=b about
> > adding Hexagon support to musl.
> >
> > I've read the comments from the two previous iterations and it looks
> > like Sid has addressed them all already (please let me know if there is
> > something missing, though). So I've only rebased/reorganized the patches
> > with minor cleanup changes.
> >
> > These patches are also available at my git tree:
> > https://github.com/quic/musl/tree/mathbern/to-upstream
> 
> Is there a current toolchain build script for hexagon? I harvested an

The recipe for the toolchain build is maintained here https://github.com/quic/toolchain_for_hexagon/ - along with binary releases of the toolchain itself for those who don't care to build their own.

> llvm+hexagon+musl build out of qemu's test suite a year or two back
> (https://www.openwall.com/lists/musl/2021/07/25/2), but when I pulled
> updated

The recipe included in the QEMU project was derived from the one in the repo above.  That QEMU container now uses binaries from the repo above.

> llvm git versions a few months later the build faceplanted hard in a way that
> wasn't obvious to me how to fix.
> 
> (I'm under the impression hexagon is still llvm-only, gcc support having been
> dropped in favor of llvm some years ago...)

It is indeed.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [musl] [RFC PATCH 0/5] Add support to Hexagon DSP
  2023-09-26 16:48   ` Brian Cain
@ 2023-09-26 17:55     ` Rob Landley
  2023-09-26 18:13       ` Brian Cain
  0 siblings, 1 reply; 15+ messages in thread
From: Rob Landley @ 2023-09-26 17:55 UTC (permalink / raw)
  To: Brian Cain, musl, Matheus Bernardino (QUIC)
  Cc: Sid Manning, Rich Felker, Fangrui Song, Szabolcs Nagy

On 9/26/23 11:48, Brian Cain wrote:
>> -----Original Message-----
>> From: Rob Landley <rob@landley.net>
> ...
>> On 8/30/23 07:22, Matheus Tavares Bernardino wrote:
>> > Hi,
>> >
>> > I'd like to restart the conversations from
>> > https://marc.info/?l=musl&w=2&r=1&s=Hexagon+DSP+support&q=b about
>> > adding Hexagon support to musl.
>> >
>> > I've read the comments from the two previous iterations and it looks
>> > like Sid has addressed them all already (please let me know if there is
>> > something missing, though). So I've only rebased/reorganized the patches
>> > with minor cleanup changes.
>> >
>> > These patches are also available at my git tree:
>> > https://github.com/quic/musl/tree/mathbern/to-upstream
>> 
>> Is there a current toolchain build script for hexagon? I harvested an
> 
> The recipe for the toolchain build is maintained here https://github.com/quic/toolchain_for_hexagon/ - along with binary releases of the toolchain itself for those who don't care to build their own.

Cloned. Let's see... The README.maryland has no usage instructions. Let's try...

$ ./build-toolchain.sh
++ date +%Y_%b_%d
+ STAMP=2023_Sep_26
+ set -euo pipefail
+ set -x
+ set +x
./build-toolchain.sh: line 250: TOOLCHAIN_INSTALL: unbound variable
$ TOOLCHAIN_INSTALL="$PWD"/walrus ./build-toolchain.sh
++ date +%Y_%b_%d
+ STAMP=2023_Sep_26
+ set -euo pipefail
+ set -x
+ set +x
./build-toolchain.sh: line 256: ROOT_INSTALL: unbound variable

The ./build-rootfs.sh has functions to compile busybox and dropbear, don't want
to go there right now...

Let's see, build-toolchain.sh starts with multiple large function definitions,
let's jump to the end... tarring stuff up, and before that it iterates "for t in
${CROSS_TRIPLES}" which is:

CROSS_TRIPLES="aarch64-windows-gnu x86_64-windows-gnu aarch64-linux-gnu
aarch64-macos"
CROSS_TRIPLES=""

It blanks it right after setting it. Great. And none of those look interesting.
(No x86-64 linux...)

Ok, before spelunking farther I'll ask: what is the expected invocation here?

Rob

^ permalink raw reply	[flat|nested] 15+ messages in thread

* RE: [musl] [RFC PATCH 0/5] Add support to Hexagon DSP
  2023-09-26 17:55     ` Rob Landley
@ 2023-09-26 18:13       ` Brian Cain
  2023-09-27  0:05         ` Brian Cain
  2023-09-27  1:49         ` Rob Landley
  0 siblings, 2 replies; 15+ messages in thread
From: Brian Cain @ 2023-09-26 18:13 UTC (permalink / raw)
  To: Rob Landley, musl, Matheus Bernardino (QUIC)
  Cc: Sid Manning, Rich Felker, Fangrui Song, Szabolcs Nagy

> -----Original Message-----
> From: Rob Landley <rob@landley.net>
> Sent: Tuesday, September 26, 2023 12:56 PM
> To: Brian Cain <bcain@quicinc.com>; musl@lists.openwall.com; Matheus
> Bernardino (QUIC) <quic_mathbern@quicinc.com>
> Cc: Sid Manning <sidneym@quicinc.com>; Rich Felker <dalias@libc.org>;
> Fangrui Song <i@maskray.me>; Szabolcs Nagy <nsz@port70.net>
> Subject: Re: [musl] [RFC PATCH 0/5] Add support to Hexagon DSP
> 
> WARNING: This email originated from outside of Qualcomm. Please be wary of
> any links or attachments, and do not enable macros.
> 
> On 9/26/23 11:48, Brian Cain wrote:
> >> -----Original Message-----
> >> From: Rob Landley <rob@landley.net>
> > ...
> >> On 8/30/23 07:22, Matheus Tavares Bernardino wrote:
> >> > Hi,
> >> >
> >> > I'd like to restart the conversations from
> >> > https://marc.info/?l=musl&w=2&r=1&s=Hexagon+DSP+support&q=b
> about
> >> > adding Hexagon support to musl.
> >> >
> >> > I've read the comments from the two previous iterations and it looks
> >> > like Sid has addressed them all already (please let me know if there is
> >> > something missing, though). So I've only rebased/reorganized the patches
> >> > with minor cleanup changes.
> >> >
> >> > These patches are also available at my git tree:
> >> > https://github.com/quic/musl/tree/mathbern/to-upstream
> >>
> >> Is there a current toolchain build script for hexagon? I harvested an
> >
> > The recipe for the toolchain build is maintained here
> https://github.com/quic/toolchain_for_hexagon/ - along with binary releases of
> the toolchain itself for those who don't care to build their own.
> 
> Cloned. Let's see... The README.maryland has no usage instructions. Let's try...
> 
> $ ./build-toolchain.sh
> ++ date +%Y_%b_%d
> + STAMP=2023_Sep_26
> + set -euo pipefail
> + set -x
> + set +x
> ./build-toolchain.sh: line 250: TOOLCHAIN_INSTALL: unbound variable
> $ TOOLCHAIN_INSTALL="$PWD"/walrus ./build-toolchain.sh
> ++ date +%Y_%b_%d
> + STAMP=2023_Sep_26
> + set -euo pipefail
> + set -x
> + set +x
> ./build-toolchain.sh: line 256: ROOT_INSTALL: unbound variable
> 

Ok - sure, let me take a minute to describe the usage of these scripts.  Standby.

-Brian

^ permalink raw reply	[flat|nested] 15+ messages in thread

* RE: [musl] [RFC PATCH 0/5] Add support to Hexagon DSP
  2023-09-26 18:13       ` Brian Cain
@ 2023-09-27  0:05         ` Brian Cain
  2023-09-27  1:49         ` Rob Landley
  1 sibling, 0 replies; 15+ messages in thread
From: Brian Cain @ 2023-09-27  0:05 UTC (permalink / raw)
  To: Rob Landley, musl, Matheus Bernardino (QUIC)
  Cc: Sid Manning, Rich Felker, Fangrui Song, Szabolcs Nagy



> -----Original Message-----
> From: Brian Cain <bcain@quicinc.com>
> Sent: Tuesday, September 26, 2023 1:13 PM
> To: Rob Landley <rob@landley.net>; musl@lists.openwall.com; Matheus
> Bernardino (QUIC) <quic_mathbern@quicinc.com>
> Cc: Sid Manning <sidneym@quicinc.com>; Rich Felker <dalias@libc.org>;
> Fangrui Song <i@maskray.me>; Szabolcs Nagy <nsz@port70.net>
> Subject: RE: [musl] [RFC PATCH 0/5] Add support to Hexagon DSP
> 
> > -----Original Message-----
> > From: Rob Landley <rob@landley.net>
> > Sent: Tuesday, September 26, 2023 12:56 PM
> > To: Brian Cain <bcain@quicinc.com>; musl@lists.openwall.com; Matheus
> > Bernardino (QUIC) <quic_mathbern@quicinc.com>
> > Cc: Sid Manning <sidneym@quicinc.com>; Rich Felker <dalias@libc.org>;
> > Fangrui Song <i@maskray.me>; Szabolcs Nagy <nsz@port70.net>
> > Subject: Re: [musl] [RFC PATCH 0/5] Add support to Hexagon DSP
> >
> > WARNING: This email originated from outside of Qualcomm. Please be wary
> of
> > any links or attachments, and do not enable macros.
> >
> > On 9/26/23 11:48, Brian Cain wrote:
> > >> -----Original Message-----
> > >> From: Rob Landley <rob@landley.net>
> > > ...
> > >> On 8/30/23 07:22, Matheus Tavares Bernardino wrote:
> > >> > Hi,
> > >> >
> > >> > I'd like to restart the conversations from
> > >> > https://marc.info/?l=musl&w=2&r=1&s=Hexagon+DSP+support&q=b
> > about
> > >> > adding Hexagon support to musl.
> > >> >
> > >> > I've read the comments from the two previous iterations and it looks
> > >> > like Sid has addressed them all already (please let me know if there is
> > >> > something missing, though). So I've only rebased/reorganized the
> patches
> > >> > with minor cleanup changes.
> > >> >
> > >> > These patches are also available at my git tree:
> > >> > https://github.com/quic/musl/tree/mathbern/to-upstream
> > >>
> > >> Is there a current toolchain build script for hexagon? I harvested an
> > >
> > > The recipe for the toolchain build is maintained here
> > https://github.com/quic/toolchain_for_hexagon/ - along with binary releases
> of
> > the toolchain itself for those who don't care to build their own.
> >
> > Cloned. Let's see... The README.maryland has no usage instructions. Let's
> try...
> >
> > $ ./build-toolchain.sh
> > ++ date +%Y_%b_%d
> > + STAMP=2023_Sep_26
> > + set -euo pipefail
> > + set -x
> > + set +x
> > ./build-toolchain.sh: line 250: TOOLCHAIN_INSTALL: unbound variable
> > $ TOOLCHAIN_INSTALL="$PWD"/walrus ./build-toolchain.sh
> > ++ date +%Y_%b_%d
> > + STAMP=2023_Sep_26
> > + set -euo pipefail
> > + set -x
> > + set +x
> > ./build-toolchain.sh: line 256: ROOT_INSTALL: unbound variable
> >
> 
> Ok - sure, let me take a minute to describe the usage of these scripts.  Standby.

Rob -- I updated that README - hopefully it's clearer how to use now.  If you have any questions, let me know.

-Brian

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [musl] [RFC PATCH 0/5] Add support to Hexagon DSP
  2023-09-26 18:13       ` Brian Cain
  2023-09-27  0:05         ` Brian Cain
@ 2023-09-27  1:49         ` Rob Landley
  2023-09-27  2:10           ` Brian Cain
  1 sibling, 1 reply; 15+ messages in thread
From: Rob Landley @ 2023-09-27  1:49 UTC (permalink / raw)
  To: Brian Cain, musl, Matheus Bernardino (QUIC)
  Cc: Sid Manning, Rich Felker, Fangrui Song, Szabolcs Nagy

On 9/26/23 13:13, Brian Cain wrote:
>> ./build-toolchain.sh: line 250: TOOLCHAIN_INSTALL: unbound variable
>> $ TOOLCHAIN_INSTALL="$PWD"/walrus ./build-toolchain.sh
>> ++ date +%Y_%b_%d
>> + STAMP=2023_Sep_26
>> + set -euo pipefail
>> + set -x
>> + set +x
>> ./build-toolchain.sh: line 256: ROOT_INSTALL: unbound variable
>> 
> 
> Ok - sure, let me take a minute to describe the usage of these scripts.  Standby.

Sigh. It's better, but it's not exactly "./configure; make; make install"
either. You're not making it easy for me to wrap your thing in an automated
invocation script without installing Docker.

+## Usage
+
+Checkout the required source repos like `llvm-project`, `musl`, etc. Invoke

Does not say what they are, still does not provide sample invocation script that
would work from a git clone without manual steps to be determined by the user.

+`get-src-tarballs.sh` with the corresponding `*_SRC_URL` links to the specific
+releases to use (see `Dockerfile` for reference / last-known-good versions).

Corresponding. Hmmm...

$ grep SRC_URL Dockerfile
ENV LLVM_SRC_URL https://github.com/llvm/llvm-project/archive/llvmorg-${VER}.tar.gz
ARG QEMU_SRC_URL=https://download.qemu.org/qemu-8.1.0.tar.xz
ENV MUSL_SRC_URL
https://github.com/quic/musl/archive/7243e0d3a9d7e0f08d21fc194a05749e0bb26725.tar.gz
ENV LINUX_SRC_URL https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.4.13.tar.xz
#ENV PYTHON_SRC_URL https://www.python.org/ftp/python/3.9.5/Python-3.9.5.tar.xz
ENV BUSYBOX_SRC_URL https://busybox.net/downloads/busybox-1.33.1.tar.bz2

One of those has an = and all the others have a space. The LLVM url has $VER in
it where the others are explicit version numbers in the URL.

I was hoping for something like "env $(sed -n 's/.* \([^ ]*_SRC_URL\)[=
]\(.*\)/\1=\2/p' Dockerfile) ./get-src-tarballs.sh" without having to special
case specific variables, but no. (And of course the one with the = is not the
one with the $VER.)

$ grep -o '{.*SRC_URL}' get-src-tarballs.sh | sort -u
{LINUX_SRC_URL}
{LLVM_SRC_URL}
{MUSL_SRC_URL}
{QEMU_SRC_URL}

The get-src-tarballs.sh script isn't just downloading and extracting package
source, it's also creating package.txt files in $MANIFEST_DIR, which is the
first of 2 expected arguments. The script does not check if those arguments are
provided, nor does it have help/usage info beyond "read the full source to the end".

Are these manifest files important, what does get-src-repos.sh... it calls wait
8 times, when "help wait" says "If ID is not given, waits for all currently
active child processes, and the return status is zero" so 7 of those calls
should be NOPs? Anyway, dump_checkout_info() is doing "git remote -v" to the
same manifest text file names, so maybe that file is consumed by the later
script. Although given that "remote -v info" output isn't obviously machine
parseable, it looks like the consumer would  be catting it into a readme or
something at best, so I could just echo "hello" to each of them if I just wanted
to make it work quickly...

Sigh, any attempt to make a ./build.sh wrapper for this thing is going to be as
brittle as my last build script, isn't it? I'll have to re-read all this stuff
every git pull to see if it broke my wrapper...

+Or instead you can check out the trunk of those projects' repos using
+`git` - try invoking `get_src_repos.sh`.

Which is nice to know, but "build random git snapshot du jour of everything in a
previously never tried by any human combination and hope for the best" is seldom
my first choice Let's see...

$ bash -c "$(sed -En 's/.* (VER|[^ ]*_SRC_URL)[= ](.*)/\1=\2/p' Dockerfile |
xargs) ./get-src-tarballs.sh $PWD/src $PWD/manifest"
+ get_src_tarballs
+ cd /home/landley/toybox/toolchain_for_hexagon/src
./get-src-tarballs.sh: line 9: cd:
/home/landley/toybox/toolchain_for_hexagon/src: No such file or directory

Really? It doesn't make the directories? Sigh...

bash -c "mkdir -p src manifest && $(sed -En 's/.* (VER|[^ ]*_SRC_URL)[=
](.*)/\1=\2/p' Dockerfile | xargs) ./get-src-tarballs.sh $PWD/src $PWD/manifest"

Your wget has --quiet on it. You _suppressed_ the progress indicator.

> * `ARTIFACT_TAG` - the tag from the llvm-project repo with which this release
> should be labeled.

Does this have to be a tag in the repo, or is it just an arbitrary string? It
looks like it's just used to set RESULTS_DIR_ which has a trailing underscore
for reasons I do not understand...

RESULTS_DIR_=${ARTIFACT_BASE}/${ARTIFACT_TAG}
mkdir -p ${RESULTS_DIR_}
RESULTS_DIR=$(readlink -f ${RESULTS_DIR_})

Because you didn't want to RESULTS_DIR=$(readlink -f $RESULTS_DIR)

You've never tested any of these scripts on paths with spaces in them, have you?

> * `TOOLCHAIN_INSTALL` - the path to install the toolchain to.
> * `ROOT_INSTALL` - the path to install the rootfs to.  Initially this will
> only contain the target includes + libraries.
> * `ARTIFACT_BASE` - the path to put the tarballs + manifests.
> * optional `MAKE_TARBALLS` - if `MAKE_TARBALLS` is set to `1`, it will create
> tarballs of the release and purge the intermediate build artifacts.
> 
> Sample usage:
> 
>     export ARTIFACT_TAG=17.0.0
>     export TOOLCHAIN_INSTALL=$PWD/clang+llvm-${ARTIFACT_TAG}-cross-hexagon-unknown-linux-musl
>     export ROOT_INSTALL=$PWD/install_rootfs
>     export ARTIFACT_BASE=$PWD/artifacts
> 
>     mkdir -p ${ARTIFACT_BASE}
> 
>     ./build-toolchain.sh 2>&1 | tee build_${ARTIFACT_TAG}.log

Yay sample usage. Once again the script expects the directory to exist. I
personally find prefix assignment useful in these sort of things (lifetime rules
are kind of a big deal to me: where does data come from, how long does it last,
when is it updated and by who, do the provider and consumer have an obvious
relationship), but once again the script expects the directory to exist which
makes prefix assignment more awkward here...

Hmmm, ROOT_INSTALL is used to set ROOTFS and ROOT_INSTALL_REL, neither of which
are used again by the script and not exported either, so I THINK that's just
debris in build-toolchain.sh?

./build-toolchain.sh: line 256: ROOT_INSTALL: unbound variable

Except, of course, it fails if the unused variable is not set. Let's feed it
ROOT_INSTALL=no and...

./build-toolchain.sh: line 276: ccache: command not found

$ grep ccache build-toolchain.sh
ccache --show-stats
ccache --show-stats
$ sed -i /ccache/d build-toolchain.sh
$ ARTIFACT_TAG=17.0.0
TOOLCHAIN_INSTALL=$PWD/clang+llvm-${ARTIFACT_TAG}-cross-hexagon-unknown-linux-musl
ARTIFACT_BASE=$PWD/artifacts ROOT_INSTALL=no ./build-toolchain.sh 2>&1 | tee out.txt
++ date +%Y_%b_%d
+ STAMP=2023_Sep_26
+ set -euo pipefail
+ set -x
+ set +x
$

And stick some "echo" in there... It silently exited after running "which
clang", which is not installed on the host. The interesting part is this one
DIDN'T complain about command not found, just silently died. I wonder why?

*shrug* I'm making progress, but I think I need to debootstrap a newer root
filesystem version than the one I'm using before going much further, since you
then call "python3.8" as a command name and this has 3.7.3 and can't apt-get
anything newer without a major version update. (I'm still on devuan B and D just
dropped, I've skipped the C release entirely. Busy with other things. Sigh, I
should bite the bullet...)

Still no qemu-system-hexagon I see. When did I last poke Taylor Simpson about
that... 2021 it looks like:

https://lists.gnu.org/archive/html/qemu-devel/2021-11/msg05062.html

Thanks for the help. I'll let you know if I get it working...

> -Brian

Rob

^ permalink raw reply	[flat|nested] 15+ messages in thread

* RE: [musl] [RFC PATCH 0/5] Add support to Hexagon DSP
  2023-09-27  1:49         ` Rob Landley
@ 2023-09-27  2:10           ` Brian Cain
  2023-09-27 13:19             ` Rob Landley
  0 siblings, 1 reply; 15+ messages in thread
From: Brian Cain @ 2023-09-27  2:10 UTC (permalink / raw)
  To: Rob Landley, musl, Matheus Bernardino (QUIC)
  Cc: Sid Manning, Rich Felker, Fangrui Song, Szabolcs Nagy



> -----Original Message-----
> From: Rob Landley <rob@landley.net>
> Sent: Tuesday, September 26, 2023 8:49 PM
> To: Brian Cain <bcain@quicinc.com>; musl@lists.openwall.com; Matheus
> Bernardino (QUIC) <quic_mathbern@quicinc.com>
> Cc: Sid Manning <sidneym@quicinc.com>; Rich Felker <dalias@libc.org>;
> Fangrui Song <i@maskray.me>; Szabolcs Nagy <nsz@port70.net>
> Subject: Re: [musl] [RFC PATCH 0/5] Add support to Hexagon DSP
> 
> WARNING: This email originated from outside of Qualcomm. Please be wary of
> any links or attachments, and do not enable macros.
> 
> On 9/26/23 13:13, Brian Cain wrote:
> >> ./build-toolchain.sh: line 250: TOOLCHAIN_INSTALL: unbound variable
> >> $ TOOLCHAIN_INSTALL="$PWD"/walrus ./build-toolchain.sh
> >> ++ date +%Y_%b_%d
> >> + STAMP=2023_Sep_26
> >> + set -euo pipefail
> >> + set -x
> >> + set +x
> >> ./build-toolchain.sh: line 256: ROOT_INSTALL: unbound variable
> >>
> >
> > Ok - sure, let me take a minute to describe the usage of these scripts.
> Standby.
> 
> Sigh. It's better, but it's not exactly "./configure; make; make install"
> either. You're not making it easy for me to wrap your thing in an automated
> invocation script without installing Docker.
> 
> +## Usage
> +
> +Checkout the required source repos like `llvm-project`, `musl`, etc. Invoke
> 
> Does not say what they are, still does not provide sample invocation script that
> would work from a git clone without manual steps to be determined by the
> user.
> 
> +`get-src-tarballs.sh` with the corresponding `*_SRC_URL` links to the specific
> +releases to use (see `Dockerfile` for reference / last-known-good versions).
> 
> Corresponding. Hmmm...
> 
> $ grep SRC_URL Dockerfile
> ENV LLVM_SRC_URL https://github.com/llvm/llvm-project/archive/llvmorg-
> ${VER}.tar.gz
> ARG QEMU_SRC_URL=https://download.qemu.org/qemu-8.1.0.tar.xz
> ENV MUSL_SRC_URL
> https://github.com/quic/musl/archive/7243e0d3a9d7e0f08d21fc194a05749e0
> bb26725.tar.gz
> ENV LINUX_SRC_URL https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-
> 6.4.13.tar.xz
> #ENV PYTHON_SRC_URL https://www.python.org/ftp/python/3.9.5/Python-
> 3.9.5.tar.xz
> ENV BUSYBOX_SRC_URL https://busybox.net/downloads/busybox-
> 1.33.1.tar.bz2
> 
> One of those has an = and all the others have a space. The LLVM url has $VER in
> it where the others are explicit version numbers in the URL.
> 
> I was hoping for something like "env $(sed -n 's/.* \([^ ]*_SRC_URL\)[=
> ]\(.*\)/\1=\2/p' Dockerfile) ./get-src-tarballs.sh" without having to special
> case specific variables, but no. (And of course the one with the = is not the
> one with the $VER.)
> 
> $ grep -o '{.*SRC_URL}' get-src-tarballs.sh | sort -u
> {LINUX_SRC_URL}
> {LLVM_SRC_URL}
> {MUSL_SRC_URL}
> {QEMU_SRC_URL}
> 
> The get-src-tarballs.sh script isn't just downloading and extracting package
> source, it's also creating package.txt files in $MANIFEST_DIR, which is the
> first of 2 expected arguments. The script does not check if those arguments are
> provided, nor does it have help/usage info beyond "read the full source to the
> end".
> 
> Are these manifest files important, what does get-src-repos.sh... it calls wait
> 8 times, when "help wait" says "If ID is not given, waits for all currently
> active child processes, and the return status is zero" so 7 of those calls
> should be NOPs? Anyway, dump_checkout_info() is doing "git remote -v" to the
> same manifest text file names, so maybe that file is consumed by the later
> script. Although given that "remote -v info" output isn't obviously machine
> parseable, it looks like the consumer would  be catting it into a readme or
> something at best, so I could just echo "hello" to each of them if I just wanted
> to make it work quickly...
> 
> Sigh, any attempt to make a ./build.sh wrapper for this thing is going to be as
> brittle as my last build script, isn't it? I'll have to re-read all this stuff
> every git pull to see if it broke my wrapper...
> 
> +Or instead you can check out the trunk of those projects' repos using
> +`git` - try invoking `get_src_repos.sh`.
> 
> Which is nice to know, but "build random git snapshot du jour of everything in
> a
> previously never tried by any human combination and hope for the best" is
> seldom
> my first choice Let's see...
> 
> $ bash -c "$(sed -En 's/.* (VER|[^ ]*_SRC_URL)[= ](.*)/\1=\2/p' Dockerfile |
> xargs) ./get-src-tarballs.sh $PWD/src $PWD/manifest"
> + get_src_tarballs
> + cd /home/landley/toybox/toolchain_for_hexagon/src
> ./get-src-tarballs.sh: line 9: cd:
> /home/landley/toybox/toolchain_for_hexagon/src: No such file or directory
> 
> Really? It doesn't make the directories? Sigh...
> 
> bash -c "mkdir -p src manifest && $(sed -En 's/.* (VER|[^ ]*_SRC_URL)[=
> ](.*)/\1=\2/p' Dockerfile | xargs) ./get-src-tarballs.sh $PWD/src
> $PWD/manifest"
> 
> Your wget has --quiet on it. You _suppressed_ the progress indicator.
> 
> > * `ARTIFACT_TAG` - the tag from the llvm-project repo with which this release
> > should be labeled.
> 
> Does this have to be a tag in the repo, or is it just an arbitrary string? It
> looks like it's just used to set RESULTS_DIR_ which has a trailing underscore
> for reasons I do not understand...
> 
> RESULTS_DIR_=${ARTIFACT_BASE}/${ARTIFACT_TAG}
> mkdir -p ${RESULTS_DIR_}
> RESULTS_DIR=$(readlink -f ${RESULTS_DIR_})
> 
> Because you didn't want to RESULTS_DIR=$(readlink -f $RESULTS_DIR)
> 
> You've never tested any of these scripts on paths with spaces in them, have
> you?
> 
> > * `TOOLCHAIN_INSTALL` - the path to install the toolchain to.
> > * `ROOT_INSTALL` - the path to install the rootfs to.  Initially this will
> > only contain the target includes + libraries.
> > * `ARTIFACT_BASE` - the path to put the tarballs + manifests.
> > * optional `MAKE_TARBALLS` - if `MAKE_TARBALLS` is set to `1`, it will create
> > tarballs of the release and purge the intermediate build artifacts.
> >
> > Sample usage:
> >
> >     export ARTIFACT_TAG=17.0.0
> >     export TOOLCHAIN_INSTALL=$PWD/clang+llvm-${ARTIFACT_TAG}-cross-
> hexagon-unknown-linux-musl
> >     export ROOT_INSTALL=$PWD/install_rootfs
> >     export ARTIFACT_BASE=$PWD/artifacts
> >
> >     mkdir -p ${ARTIFACT_BASE}
> >
> >     ./build-toolchain.sh 2>&1 | tee build_${ARTIFACT_TAG}.log
> 
> Yay sample usage. Once again the script expects the directory to exist. I
> personally find prefix assignment useful in these sort of things (lifetime rules
> are kind of a big deal to me: where does data come from, how long does it last,
> when is it updated and by who, do the provider and consumer have an obvious
> relationship), but once again the script expects the directory to exist which
> makes prefix assignment more awkward here...
> 
> Hmmm, ROOT_INSTALL is used to set ROOTFS and ROOT_INSTALL_REL, neither
> of which
> are used again by the script and not exported either, so I THINK that's just
> debris in build-toolchain.sh?
> 
> ./build-toolchain.sh: line 256: ROOT_INSTALL: unbound variable
> 
> Except, of course, it fails if the unused variable is not set. Let's feed it
> ROOT_INSTALL=no and...
> 
> ./build-toolchain.sh: line 276: ccache: command not found
> 
> $ grep ccache build-toolchain.sh
> ccache --show-stats
> ccache --show-stats
> $ sed -i /ccache/d build-toolchain.sh
> $ ARTIFACT_TAG=17.0.0
> TOOLCHAIN_INSTALL=$PWD/clang+llvm-${ARTIFACT_TAG}-cross-hexagon-
> unknown-linux-musl
> ARTIFACT_BASE=$PWD/artifacts ROOT_INSTALL=no ./build-toolchain.sh 2>&1 |
> tee out.txt
> ++ date +%Y_%b_%d
> + STAMP=2023_Sep_26
> + set -euo pipefail
> + set -x
> + set +x
> $
> 
> And stick some "echo" in there... It silently exited after running "which
> clang", which is not installed on the host. The interesting part is this one
> DIDN'T complain about command not found, just silently died. I wonder why?
> 
> *shrug* I'm making progress, but I think I need to debootstrap a newer root
> filesystem version than the one I'm using before going much further, since you
> then call "python3.8" as a command name and this has 3.7.3 and can't apt-get
> anything newer without a major version update. (I'm still on devuan B and D
> just
> dropped, I've skipped the C release entirely. Busy with other things. Sigh, I
> should bite the bullet...)

Tsk...sorry, clearly there's lots of room for improvement in the build script.

> Still no qemu-system-hexagon I see. When did I last poke Taylor Simpson about
> that... 2021 it looks like:
> 
> https://lists.gnu.org/archive/html/qemu-devel/2021-11/msg05062.html

Yeah, it's sadly not there yet.  We're making (glacial?) progress towards that goal.

> Thanks for the help. I'll let you know if I get it working...

I had hoped that binary builds of the toolchain might satisfy most of the interested parties.  But I suppose we've all read "Reflections on Trusting Trust" and understand the importance of being able to build it yourself.  So we'll take your feedback into account and try to make improvements.

-Brian

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [musl] [RFC PATCH 0/5] Add support to Hexagon DSP
  2023-09-27  2:10           ` Brian Cain
@ 2023-09-27 13:19             ` Rob Landley
  0 siblings, 0 replies; 15+ messages in thread
From: Rob Landley @ 2023-09-27 13:19 UTC (permalink / raw)
  To: Brian Cain, musl, Matheus Bernardino (QUIC)
  Cc: Sid Manning, Rich Felker, Fangrui Song, Szabolcs Nagy

On 9/26/23 21:10, Brian Cain wrote:
>> *shrug* I'm making progress, but I think I need to debootstrap a newer root
>> filesystem version than the one I'm using before going much further, since you
>> then call "python3.8" as a command name and this has 3.7.3 and can't apt-get
>> anything newer without a major version update. (I'm still on devuan B and D
>> just
>> dropped, I've skipped the C release entirely. Busy with other things. Sigh, I
>> should bite the bullet...)
> 
> Tsk...sorry, clearly there's lots of room for improvement in the build script.

I'd love to get a "build all llvm targets with musl" script working, but last
time I tried it compiler-rt was an unholy abomination constructed out of spite
and special cases. (The other packages were almost reasonable.)

And then there was version skew with new package versions next time I got around
to it.

Hexagon is the one I _need_ an llvm toolchain for, but I'd LIKE an llvm
toolchain for everything. I've got a musl gcc toolchain build for the other
targets. (Layered on top of musl-cross-make, ala
https://github.com/landley/toybox/blob/master/scripts/mcm-buildall.sh because my
old https://github.com/landley/aboriginal/blob/master/cross-compiler.sh and
https://github.com/landley/aboriginal/blob/master/native-compiler.sh scripts
stayed with the last GPLv2 releases of packages until I abandoned them.)

>> Still no qemu-system-hexagon I see. When did I last poke Taylor Simpson about
>> that... 2021 it looks like:
>> 
>> https://lists.gnu.org/archive/html/qemu-devel/2021-11/msg05062.html
> 
> Yeah, it's sadly not there yet.  We're making (glacial?) progress towards that goal.
> 
>> Thanks for the help. I'll let you know if I get it working...
> 
> I had hoped that binary builds of the toolchain might satisfy most of the
> interested parties.

I'm weird.

I'm using the Android NDK as a prebuilt binary because that thing's build is...
challenging. (Bionic hasn't _got_ a conventional standalone build I've been able
to find, and I haven't tried to reverse engineer the AOSP build to peel one out
yet.)

I may wind up using the hexagon binary toolchain, but in the context of a musl
source merge, building it from source is kind of a thing...

> But I suppose we've all read "Reflections on Trusting Trust" and understand
> the importance of being able to build it yourself.

A little more than that in my case:

  http://lists.landley.net/pipermail/toybox-landley.net/2020-July/011898.html

I have my own project which has an agenda:

  https://landley.net/toybox/about.html

Which is a successor to an older project:

  https://landley.net/aboriginal/about.html

Which I managed to replace with a 300 line bash script that builds bootable
Linux systems for a dozen architectures:

  https://github.com/landley/toybox/blob/master/mkroot/mkroot.sh

Which you'll notice has hexagon support (lines 201-203), but the toolchain I
used to regression test that was the one I built in 2021, which was a bit of a
struggle:

  https://landley.net/notes-2021.html#28-07-2021

I did an outline of what proper documentation for that tiny system builder would
look like (it was going to be a conference talk):

  https://landley.net/talks/mkroot-2023.txt

But the best I've got so far are a couple FAQ entries:

  https://landley.net/toybox/faq.html#mkroot

  https://landley.net/toybox/faq.html#cross

  https://landley.net/toybox/faq.html#targets

So don't feel bad about not having enough documentation or newbie-proofing, I
can't exactly throw stones from my glass house either.

The hard part of documentation writing is SUMMARIZING years of work into the
"three small sticks and 4cc of mouse blood" version. If you succeed, the problem
space becomes "oh that's trivial, everyone understands that" and it looks like
you didn't do anything.

Same old same old. Still chewing on this one...

Rob

P.S. Why doesn't "cc $(find . -name '*.c') -o thingy" parallelize? You'd think
the compiler could work that out for itself somehow...

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2023-09-27 13:16 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-08-30 12:22 [musl] [RFC PATCH 0/5] Add support to Hexagon DSP Matheus Tavares Bernardino
2023-08-30 12:22 ` [musl] [RFC PATCH 1/5] Add support to Hexagon arch Matheus Tavares Bernardino
2023-08-30 12:22 ` [musl] [RFC PATCH 2/5] hexagon: add fenv header and implementation Matheus Tavares Bernardino
2023-08-30 12:22 ` [musl] [RFC PATCH 3/5] hexagon: add fma/fmaxf/fminf routines Matheus Tavares Bernardino
2023-08-30 12:22 ` [musl] [RFC PATCH 4/5] hexagon: add bits/user.h Matheus Tavares Bernardino
2023-08-30 12:22 ` [musl] [RFC PATCH 5/5] INSTALL: add 'Hexagon' to list of supported targets Matheus Tavares Bernardino
2023-09-08 11:18 ` [musl] [RFC PATCH 0/5] Add support to Hexagon DSP Matheus Tavares Bernardino
2023-09-26 16:43 ` Rob Landley
2023-09-26 16:48   ` Brian Cain
2023-09-26 17:55     ` Rob Landley
2023-09-26 18:13       ` Brian Cain
2023-09-27  0:05         ` Brian Cain
2023-09-27  1:49         ` Rob Landley
2023-09-27  2:10           ` Brian Cain
2023-09-27 13:19             ` Rob Landley

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/musl/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).