Hi,
The subtle of previous changes is to align thread local data to 16 bytes.
At first jemalloc aligned "tsd_s" to 16 bytes and then for static executables TCB & TLS have been changed to 16 byte alignment.
On MIPS platform, pointer to TLS is stored in UserLocal registers (since 2016?) and offset is calculated on kernel side. TCB size is 16 bytes for mips64 and 8 bytes for mips32. As result, commits r324938 & r325364 results in shift between userland & kernel TLS pointers (fixed by r325364 for other 32-bit platforms like arm & i386).
Also following ddb command from sys/mips helped to identify root cause:
#ifdef DDB #include <ddb/ddb.h> #include <machine/proc.h> DB_SHOW_COMMAND(tls, db_show_tls) { struct thread *td; td = curthread; db_printf("TLS: %p %x\n", td->td_md.md_tls, td->td_md.md_tls_tcb_offset); return; } #endif /* DDB */
I doubt that it's right way to fix it, but at least it unbreak mips32 platform. IMHO md_tls_tcb_offset is to be populated by process, not by kernel, am I right?