Added _sigvec and _syscall
This commit is contained in:
		
							parent
							
								
									e91e983728
								
							
						
					
					
						commit
						7fbfa4360c
					
				
					 4 changed files with 54 additions and 2 deletions
				
			
		|  | @ -142,6 +142,7 @@ _sigsetmask.s | |||
| sigstack.s | ||||
| sigtramp.s | ||||
| sigvec.c | ||||
| _sigvec.c | ||||
| socket.s | ||||
| socketpair.s | ||||
| sstk.s | ||||
|  | @ -151,6 +152,7 @@ swapon.s | |||
| symlink.s | ||||
| sync.s | ||||
| syscall.s | ||||
| _syscall.s | ||||
| time.c | ||||
| times.c | ||||
| _times.c | ||||
|  |  | |||
							
								
								
									
										36
									
								
								mach/sun3/libsys/_sigvec.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								mach/sun3/libsys/_sigvec.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,36 @@ | |||
| #include "syscall.h" | ||||
| #include <errno.h> | ||||
| struct sigvec { int (*handler)(); int mask,flags; }; | ||||
| int (*(_sigfunc[32]))(); | ||||
| extern int _sigtramp(); | ||||
| extern int errno; | ||||
| 
 | ||||
| _sigvec(sig,vec,ovec) | ||||
| 	register struct sigvec *vec; | ||||
| 	struct sigvec *ovec; | ||||
| { | ||||
| 	struct sigvec tmp; | ||||
| 	int (*old)(); | ||||
| 
 | ||||
| 	if ((unsigned) sig >= 32) { | ||||
| 		errno = EINVAL; | ||||
| 		return -1; | ||||
| 	} | ||||
| 	old = _sigfunc[sig]; | ||||
| 	if (vec) { | ||||
| 		tmp = *vec; | ||||
| 		vec = &tmp; | ||||
| 		if (vec->handler && vec->handler != (int (*)()) 1) { | ||||
| 			_sigfunc[sig] = vec->handler; | ||||
| 			vec->handler = _sigtramp; | ||||
| 		} | ||||
| 	} | ||||
| 	if (_syscall(SYS_sigvec,sig,vec,ovec) < 0) { | ||||
| 		_sigfunc[sig] = old; | ||||
| 		return -1; | ||||
| 	} | ||||
| 	if (ovec && ovec->handler == _sigtramp) { | ||||
| 		ovec->handler = old; | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
							
								
								
									
										14
									
								
								mach/sun3/libsys/_syscall.s
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								mach/sun3/libsys/_syscall.s
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,14 @@ | |||
| .sect .text | ||||
| .define __syscall
 | ||||
| __syscall: | ||||
| 	move.l	(4,sp),d0 | ||||
| 	move.l	(sp),(4,sp) | ||||
| 	move.l	d0,(sp) | ||||
| 	trap	#0 | ||||
| 	bcs	1f | ||||
| 	move.l	(sp),a0 | ||||
| 	jmp	(a0) | ||||
| 1: | ||||
| 	move.l	(sp),a0 | ||||
| 	move.l	a0,-(sp) | ||||
| 	jmp	(cerror) | ||||
|  | @ -13,13 +13,13 @@ signal(sig,handler))() | |||
| 	v.sv_handler = handler; | ||||
| 	v.sv_mask = masks[sig]; | ||||
| 	v.sv_flags = flags[sig]; | ||||
| 	if (sigvec(sig,&v, &ov) < 0) return (int (*)()) -1; | ||||
| 	if (_sigvec(sig,&v, &ov) < 0) return (int (*)()) -1; | ||||
| 	if (v.sv_mask != ov.sv_mask || v.sv_flags != ov.sv_flags) { | ||||
| 		v.sv_mask = ov.sv_mask; | ||||
| 		masks[sig] = ov.sv_mask; | ||||
| 		v.sv_flags = ov.sv_flags; | ||||
| 		flags[sig] = ov.sv_flags; | ||||
| 		if (sigvec(sig,&v,(char *) 0) < 0) return (int (*)()) -1; | ||||
| 		if (_sigvec(sig,&v,(char *) 0) < 0) return (int (*)()) -1; | ||||
| 	} | ||||
| 	return ov.sv_handler; | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue