NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: port-sh3/49597: swapcontext(3) stack pointer problem on NetBSD/sh3

The following reply was made to PR port-sh3/49597; it has been noted by GNATS.

From: Valery Ushakov <>
Subject: Re: port-sh3/49597: swapcontext(3) stack pointer problem on NetBSD/sh3
Date: Sun, 25 Jan 2015 06:39:09 +0300

 Thanks, I have applied the patch.  But it's got me thinking... We are
 tweaking oucp to resume "returning" from swapcontext, but we have
 already clobbered r12 and pr before/by calling getcontext, so oucp
 will get resumed with wrong r12 and pr values.  It probably goes
 undetected since the caller saves and restores pr itself (since it
 calls swapcontext at least) and since r12 is not used because the test
 is not in a DSO.
 So what about something like:
 	sts.l	pr, @-sp
 	mov.l	.L__getcontext, r0
 	mov.l	r5, @-sp
 1:	CALL	r0			! _getcontext(oucp)
 	 mov.l	r4, @-sp
 	!! getcontext captures oucp resuming here with r12 (when PIC),
 	!! pr, r5 and r4 pushed onto the stack
 	tst	r0, r0
 	bf.s	3f			! return error from getcontext
 	 mov.l	@sp, r1			! saved oucp
 	!! adjust oucp to resume after setcontext below
 	mova	3f, r0
 	mov.l	r0, @(36 + 1 * 4, r1)	! _UC_MACHINE_SET_PC(oucp, pr)
 	mov.l	.L_setcontext, r2
 2:	CALL	r2			! setcontext(ucp)
 	 mov.l	@(4, sp), r4		! saved ucp
 	.align	2
 3:	!! we get here on errors and when resuming oucp
 	add	#8, sp			! skip r4 and r5
 	lds.l	@sp+, pr
 though I haven't tested error legs.

Home | Main Index | Thread Index | Old Index