Hi Rich, The patch fixes a link time error when compiled for microMIPS. The pthread_self() function has been modified to use rdhwr instruction instead of .word directive. The change has been done for both clang and gcc. Functions containing .word are not compiled for microMIPS. Please refer to https://github.com/JaydeepIMG/musl-1/tree/fix_rdhwr_for_umips for details. From 09e4e395d9f1538edb548ffaa02db74e8e11701e Mon Sep 17 00:00:00 2001 From: Jaydeep Patil Date: Mon, 21 Mar 2016 09:53:37 +0000 Subject: [PATCH] Use rdhwr insn instead of .word for microMIPS --- arch/mips/pthread_arch.h | 10 ++-------- arch/mips64/pthread_arch.h | 9 ++------- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/arch/mips/pthread_arch.h b/arch/mips/pthread_arch.h index 8a49965..30e2394 100644 --- a/arch/mips/pthread_arch.h +++ b/arch/mips/pthread_arch.h @@ -1,13 +1,7 @@ static inline struct pthread *__pthread_self() { -#ifdef __clang__ - char *tp; - __asm__ __volatile__ (".word 0x7c03e83b ; move %0, $3" : "=r" (tp) : : "$3" ); -#else - register char *tp __asm__("$3"); - /* rdhwr $3,$29 */ - __asm__ __volatile__ (".word 0x7c03e83b" : "=r" (tp) ); -#endif + register char *tp; + __asm__ __volatile__ ("rdhwr %0,$29" : "=r" (tp)); return (pthread_t)(tp - 0x7000 - sizeof(struct pthread)); } diff --git a/arch/mips64/pthread_arch.h b/arch/mips64/pthread_arch.h index b42edbe..30e2394 100644 --- a/arch/mips64/pthread_arch.h +++ b/arch/mips64/pthread_arch.h @@ -1,12 +1,7 @@ static inline struct pthread *__pthread_self() { -#ifdef __clang__ - char *tp; - __asm__ __volatile__ (".word 0x7c03e83b ; move %0, $3" : "=r" (tp) : : "$3" ); -#else - register char *tp __asm__("$3"); - __asm__ __volatile__ (".word 0x7c03e83b" : "=r" (tp) ); -#endif + register char *tp; + __asm__ __volatile__ ("rdhwr %0,$29" : "=r" (tp)); return (pthread_t)(tp - 0x7000 - sizeof(struct pthread)); } -- 2.1.4 Thanks, Jaydeep