⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sigsetjmp.s

📁 操作系统SunOS 4.1.3版本的源码
💻 S
字号:
	.data/*	.asciz	"@(#)sigsetjmp.s 1.1 92/07/30 SMI"	*/	.text#include "DEFS.h"#include "PIC.h"#include "fpcrtdefs.h"#include "Wdefs.h"#include <syscall.h>|setjmp, longjmp||	longjmp(a, v)|causes a "return(v)" from the|last call to||	setjmp(v)|by restoring d2-d7,a2-a7 (all the register variables) and|adjusting the stack.  The signal mask is restored as well.||jmp_buf is set up as:||	_________________|0	|   onsigstack	||	-----------------|4	|    sigmask	||	-----------------|8	|       sp	||	-----------------|12	|       pc	||	-----------------|16	|       ps	||	-----------------|20	|	d2	||	-----------------|	|	...	||	-----------------|40	|	d7	||	-----------------|44	|	a2	||	-----------------|	|	...	||	-----------------|60	|	a6	||	-----------------|64	|	fp2a	||	-----------------|	|	fp2b	||	-----------------|	|	fp2c	||	-----------------|	|	...	||	-----------------|	|	fp7a	||	-----------------|	|	fp7b	||	-----------------|	|	fp7c	||	-----------------|136	|	fpa4a	||	-----------------|	|	fpa4b	||	-----------------|	|	...	||	-----------------|	|	fpa15a	||	-----------------|	|	fpa15b	||	-----------------|232||sigsetjmp, siglongjmp||	siglongjmp(a, v)|causes a "return(v)" from the|last call to||	sigsetjmp(v, savemask)|by restoring d2-d7,a2-a7 (all the register variables) and|adjusting the stack.  If "savemask" was set in that call, the signal mask|saved in that call is restored as well.||sigjmp_buf is the same as jmp_buf, but with an extra longword at the|beginning; the value of "savemask" is stored there.	.text#ifndef S5EMULENTRY(setjmp)#endif	movl	PARAM,a0	/* pointer to jmp_buf */	jra	setjmpsav	/* always save signal mask */ENTRY(sigsetjmp)	movl	PARAM,a0	/* pointer to sigjmp_buf */	movl	PARAM2,a0@+	/* store "savemask" */	beq	setjmpnosav	/* if "savemask" 0, don't save signal mask */setjmpsav:	pea	0	pea	0		/* fake PC making system call interface happy */	pea	SYS_sigblock	/* get signal mask */	trap	#0	addql	#8,sp	movl	d0,a0@(4)	/* save signal mask of caller */setjmpnosav:	subql	#8,sp		/* space for current struct sigstack */	pea	sp@		/* get current values */	pea	0		/* no new values */	pea	0		/* fake PC making system call interface happy */	pea	SYS_sigstack	/* get onsigstack status of caller */	trap	#0	lea	sp@(16),sp	/* pop args plus signal stack value */	movl	sp@+,a0@	/* save onsigstack status of caller */	movl	PARAM0,a0@(12)	/* save pc of caller */#ifdef PROF	unlk	a6		/* restore value of A6 and SP on entry */#endif PROF	lea	sp@(4),a1	/* sp before we were called */	movl	a1,a0@(8)	/* save sp of caller */	moveml	d2-d7/a2-a6,a0@(20) /* rest of the registers */#ifdef PIC	PIC_SETUP(a1)	movel 	a1@(_fp_switch:w),a1	movel	a1@,d0#else	movel   _fp_switch,d0#endif        cmpw    #FP_MC68881,d0        jne     3f	fmovemx	fp2-fp7,a0@(64)	jra	1f3:		cmpw	#FP_SUNFPA,d0	jne	1f	fmovemx	fp2-fp7,a0@(64)	lea	a0@(136),a0        movel   #(FPABASEADDRESS+0xc00+32),a1        movel   a1@+,a0@+               | fpa4        movel   a1@+,a0@+                     movel   a1@+,a0@+               | fpa5        movel   a1@+,a0@+                     movel   a1@+,a0@+               | fpa6        movel   a1@+,a0@+                     movel   a1@+,a0@+               | fpa7        movel   a1@+,a0@+                     movel   a1@+,a0@+               | fpa8        movel   a1@+,a0@+                     movel   a1@+,a0@+               | fpa9        movel   a1@+,a0@+                     movel   a1@+,a0@+               | fpa10        movel   a1@+,a0@+                     movel   a1@+,a0@+               | fpa11        movel   a1@+,a0@+                     movel   a1@+,a0@+               | fpa12        movel   a1@+,a0@+                     movel   a1@+,a0@+               | fpa13        movel   a1@+,a0@+                     movel   a1@+,a0@+               | fpa14        movel   a1@+,a0@+                     movel   a1@+,a0@+               | fpa15        movel   a1@+,a0@+             1: 	clrl	d0		/* return 0 */	rts#ifndef S5EMULENTRY(longjmp)#endif	movl	PARAM,a0	/* pointer to jmp_buf */	moveq	#1,d1		/* always restore signal mask */	jra	longjmpcmnENTRY(siglongjmp)	movl	PARAM,a0	/* pointer to sigjmp_buf */	movl	a0@+,d1		/* "savemask" flag */longjmpcmn:#ifdef PIC	PIC_SETUP(a1)	movel	a1@(_fp_switch:w),a1	movel	a1@,d0#else	movel   _fp_switch,d0#endif        cmpw    #FP_MC68881,d0        jne     3f	fmovemx	a0@(64),fp2-fp7	jra	1f3:		cmpw	#FP_SUNFPA,d0	jne	1f	fmovemx	a0@(64),fp2-fp7	lea	a0@(136),a1        movel   #(FPABASEADDRESS+0xc00+32),a0        movel   a1@+,a0@+               | fpa4        movel   a1@+,a0@+                     movel   a1@+,a0@+               | fpa5        movel   a1@+,a0@+                     movel   a1@+,a0@+               | fpa6        movel   a1@+,a0@+                     movel   a1@+,a0@+               | fpa7        movel   a1@+,a0@+                     movel   a1@+,a0@+               | fpa8        movel   a1@+,a0@+                     movel   a1@+,a0@+               | fpa9        movel   a1@+,a0@+                     movel   a1@+,a0@+               | fpa10        movel   a1@+,a0@+                     movel   a1@+,a0@+               | fpa11        movel   a1@+,a0@+                     movel   a1@+,a0@+               | fpa12        movel   a1@+,a0@+                     movel   a1@+,a0@+               | fpa13        movel   a1@+,a0@+                     movel   a1@+,a0@+               | fpa14        movel   a1@+,a0@+                     movel   a1@+,a0@+               | fpa15        movel   a1@+,a0@+             	lea	a1@(-232),a01: 	movl	PARAM2,d0	/* value returned */	bne	1$	moveq	#1,d01$:	moveml	a0@(20),d2-d7/a2-a6	/* restore most of the registers */	tstl	d1		/* restore signal mask? */	bne	1f		/* yes */	movl	a0@(8),sp	/* restore sp */	movl	a0@(12),sp@-	/* restore pc of call to setjmp to stack */	rts			/* and jump without restoring signal mask */1:	movl	a0,sp@-		/* address of jmp_buf is address of sigcontext */	pea	139		/* sigcleanup call */	trap	#0		/* restore rest - including pc, so no return */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -