diff --git a/lib/libthr/arch/aarch64/include/pthread_md.h b/lib/libthr/arch/aarch64/include/pthread_md.h --- a/lib/libthr/arch/aarch64/include/pthread_md.h +++ b/lib/libthr/arch/aarch64/include/pthread_md.h @@ -51,4 +51,6 @@ return (_tcb_get()->tcb_thread); } +#define _cfi_undefine_ra() __asm __volatile(".cfi_undefined x30") + #endif /* _PTHREAD_MD_H_ */ diff --git a/lib/libthr/arch/amd64/include/pthread_md.h b/lib/libthr/arch/amd64/include/pthread_md.h --- a/lib/libthr/arch/amd64/include/pthread_md.h +++ b/lib/libthr/arch/amd64/include/pthread_md.h @@ -56,4 +56,6 @@ #define HAS__UMTX_OP_ERR 1 +#define _cfi_undefine_ra() __asm __volatile(".cfi_undefined %rip") + #endif diff --git a/lib/libthr/arch/arm/include/pthread_md.h b/lib/libthr/arch/arm/include/pthread_md.h --- a/lib/libthr/arch/arm/include/pthread_md.h +++ b/lib/libthr/arch/arm/include/pthread_md.h @@ -50,4 +50,6 @@ return (NULL); } +#define _cfi_undefine_ra() + #endif /* _PTHREAD_MD_H_ */ diff --git a/lib/libthr/arch/i386/include/pthread_md.h b/lib/libthr/arch/i386/include/pthread_md.h --- a/lib/libthr/arch/i386/include/pthread_md.h +++ b/lib/libthr/arch/i386/include/pthread_md.h @@ -56,4 +56,6 @@ #define HAS__UMTX_OP_ERR 1 +#define _cfi_undefine_ra() __asm __volatile(".cfi_undefined %eip") + #endif diff --git a/lib/libthr/arch/powerpc/include/pthread_md.h b/lib/libthr/arch/powerpc/include/pthread_md.h --- a/lib/libthr/arch/powerpc/include/pthread_md.h +++ b/lib/libthr/arch/powerpc/include/pthread_md.h @@ -53,4 +53,6 @@ #define HAS__UMTX_OP_ERR 1 +#define _cfi_undefine_ra() + #endif /* _PTHREAD_MD_H_ */ diff --git a/lib/libthr/arch/riscv/include/pthread_md.h b/lib/libthr/arch/riscv/include/pthread_md.h --- a/lib/libthr/arch/riscv/include/pthread_md.h +++ b/lib/libthr/arch/riscv/include/pthread_md.h @@ -58,4 +58,6 @@ return (NULL); } +#define _cfi_undefine_ra() __asm __volatile(".cfi_undefined ra") + #endif /* _PTHREAD_MD_H_ */ diff --git a/lib/libthr/thread/thr_create.c b/lib/libthr/thread/thr_create.c --- a/lib/libthr/thread/thr_create.c +++ b/lib/libthr/thread/thr_create.c @@ -255,6 +255,8 @@ { sigset_t set; + _cfi_undefine_ra(); + if (curthread->attr.suspend == THR_CREATE_SUSPENDED) set = curthread->sigmask; _thr_signal_block_setup(curthread);