Subject: Re: assertion failure with pthreads
To: None <>
From: Christian Groessler <>
List: port-sh3
Date: 06/21/2003 16:02:19


> > .

> Hi, I unpacked this archive to /usr/src/lib and tried to cross compile 
> everything using The result was undefined references to 
> debout, dumpregs, and pthread__switch_return_point. Is there a simple 
> way to make this compile? Vesa

Sorry, I forgot to include some things for compilation with DEBUG

Add the following to lib/libpthread/pthread_alarms.c:

#ifdef __sh__
#include <stdio.h>
void dumpiter(void)
	struct pt_alarm_t *iterator;
        for ((iterator) = ((&pthread_alarmqueue)->ptqh_first);
	     (iterator) = ((iterator)->pta_next.ptqe_next)) {

		printf("dumpiter: (iterator = %p, iterator->pta_time = %p\n\tnext = %p)\n",
		       iterator, iterator ? iterator->pta_time: NULL,
		       ); fflush(stdout);

void dumpregs(const ucontext_t *ctx);
void dumpregs(const ucontext_t *ctx)
	printf("dumpregs %p\n", ctx);
	printf("\tr0\t= %8x\n", ctx->uc_mcontext.__gregs[_REG_R0]);
	printf("\tr1\t= %8x\n", ctx->uc_mcontext.__gregs[_REG_R1]);
	printf("\tr2\t= %8x\n", ctx->uc_mcontext.__gregs[_REG_R2]);
	printf("\tr3\t= %8x\n", ctx->uc_mcontext.__gregs[_REG_R3]);
	printf("\tr4\t= %8x\n", ctx->uc_mcontext.__gregs[_REG_R4]);
	printf("\tr5\t= %8x\n", ctx->uc_mcontext.__gregs[_REG_R5]);
	printf("\tr6\t= %8x\n", ctx->uc_mcontext.__gregs[_REG_R6]);
	printf("\tr7\t= %8x\n", ctx->uc_mcontext.__gregs[_REG_R7]);
	printf("\tr8\t= %8x\n", ctx->uc_mcontext.__gregs[_REG_R8]);
	printf("\tr9\t= %8x\n", ctx->uc_mcontext.__gregs[_REG_R9]);
	printf("\tr10\t= %8x\n", ctx->uc_mcontext.__gregs[_REG_R10]);
	printf("\tr11\t= %8x\n", ctx->uc_mcontext.__gregs[_REG_R11]);
	printf("\tr12\t= %8x\n", ctx->uc_mcontext.__gregs[_REG_R12]);
	printf("\tr13\t= %8x\n", ctx->uc_mcontext.__gregs[_REG_R13]);
	printf("\tr14\t= %8x\n", ctx->uc_mcontext.__gregs[_REG_R14]);
	printf("\tr15\t= %8x\n", ctx->uc_mcontext.__gregs[_REG_R15]);
	printf("\tpr\t= %8x\n", ctx->uc_mcontext.__gregs[_REG_PR]);
	printf("\tsr\t= %8x\n", ctx->uc_mcontext.__gregs[_REG_SR]);
	printf("\tpc\t= %8x\n", ctx->uc_mcontext.__gregs[_REG_PC]);
	printf("\tmach\t= %8x\n", ctx->uc_mcontext.__gregs[_REG_MACH]);
	printf("\tmacl\t= %8x\n", ctx->uc_mcontext.__gregs[_REG_MACL]);
	/*asm(".word 0xfffd");*/

debout is provided in the following file:

Content-Disposition: attachment; filename=debout.s
Content-Description: debout.s

! $Id$
! debug text output (NetBSD)
! (c) 2003 Copyright Christian Groessler,

SYS_write	=	4
OUTFD		=	1		! stdout

	.align	1

	.global	debout
	mov.l	r0,@-r15
	mov.l	r1,@-r15
	mov.l	r2,@-r15
	mov.l	r3,@-r15
	mov.l	r4,@-r15
	mov.l	r5,@-r15
	mov.l	r6,@-r15
	mov.l	r7,@-r15
	mov.l	r8,@-r15
	mov.l	r9,@-r15
	mov.l	r10,@-r15
	mov.l	r11,@-r15
	mov.l	r12,@-r15
	mov.l	r13,@-r15
	mov.l	r14,@-r15

	sts	pr,r1			! return address is start of output string
	mov	r1,r5			! r5 - buffer address for syscall
	sub	r2,r2
	mov	#0,r2			! length
loop:	mov.b	@r1+,r0
	and	#255,r0
	tst	r0,r0
	bt	end
	add	#1,r2			! adjust length
	bf	loop

end:	mov	r2,r6			! r6 - length parameter for syscall
	mov.l	r1,@-r15		! save address of end of string
	mov	#OUTFD,r4		! r4 - fd parameter for syscall
	mov	#SYS_write,r0		! do the syscall
	!.word	0xfffd

	trapa	#0x80

	mov.l	@r15+,r0		! get address of end of string again
	add	#1,r0
	mov	#-2,r1
	and	r1,r0			! word align it

	lds	r0,pr			! set return address

	mov.l	@r15+,r14
	mov.l	@r15+,r13
	mov.l	@r15+,r12
	mov.l	@r15+,r11
	mov.l	@r15+,r10
	mov.l	@r15+,r9
	mov.l	@r15+,r8
	mov.l	@r15+,r7
	mov.l	@r15+,r6
	mov.l	@r15+,r5
	mov.l	@r15+,r4
	mov.l	@r15+,r3
	mov.l	@r15+,r2
	mov.l	@r15+,r1
	mov.l	@r15+,r0



pthread__switch_return_point comes from a recent change in
pthread_sa.c, which isn't integrated into the sh3 files yet.