V10/sys/ml/setjmp.s

Compare this file to the similar file:
Show the results in this format:


/*
 * non-local goto's
 */

/*
 * the microvax constantly updates the ksp in the pcb block so
 * we can't trust a ldpctx to get the right sp for longjmps
 */
	.text

	.set	PCLOC,16	# location of pc in calls frame
	.set	APLOC,8		# location of ap,fp in calls frame

	.globl	_Longjmp
_Longjmp:
	movl	(r0)+,newfp	# must save parameters in memory as all
	movl	(r0),newpc	# registers may be clobbered.
1:
	cmpl	fp,newfp	# are we there yet?
	bgequ	2f		# yes
	moval	1b,PCLOC(fp)	# redirect return pc to us!
	ret			# pop next frame
2:
	beql	3f		# did we miss our frame?
	pushab	4f		# yep ?!?
	calls	$1,_panic
3:
	movl	newpc,r0	# all done, just return to the `setjmp'
	jmp	(r0)		# ``rsb''

	.data
newpc:	.space	4
newfp:	.space	4
4:	.asciz	"longjmp"
	.text
/*
 * setjmp that saves all registers as the call frame may not
 * be available to recover them in the usual mannor by longjmp.
 * Called before swapping out the u. area, restored by resume()
 * below.
 */

	.globl	_savectx
	.align	1
_savectx:
	.word	0
	movl	4(ap),r0
	movq	r6,(r0)+
	movq	r8,(r0)+
	movq	r10,(r0)+
	movq	APLOC(fp),(r0)+	# save ap, fp
	addl3	$8,ap,(r0)+	# save sp
	movl	PCLOC(fp),(r0)	# save pc
	clrl	r0
	ret