53 lines
		
	
	
	
		
			1.1 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			53 lines
		
	
	
	
		
			1.1 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /* 
 | ||
|  |  * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) | ||
|  |  * Licensed under the GPL | ||
|  |  */ | ||
|  | 
 | ||
|  | #ifndef __SYS_SIGCONTEXT_PPC_H
 | ||
|  | #define __SYS_SIGCONTEXT_PPC_H
 | ||
|  | 
 | ||
|  | #define DSISR_WRITE 0x02000000
 | ||
|  | 
 | ||
|  | #define SC_FAULT_ADDR(sc) ({ \
 | ||
|  | 		struct sigcontext *_sc = (sc); \ | ||
|  | 		long retval = -1; \ | ||
|  | 		switch (_sc->regs->trap) { \ | ||
|  | 		case 0x300: \ | ||
|  | 			/* data exception */ \ | ||
|  | 			retval = _sc->regs->dar; \ | ||
|  | 			break; \ | ||
|  | 		case 0x400: \ | ||
|  | 			/* instruction exception */ \ | ||
|  | 			retval = _sc->regs->nip; \ | ||
|  | 			break; \ | ||
|  | 		default: \ | ||
|  | 			panic("SC_FAULT_ADDR: unhandled trap type\n"); \ | ||
|  | 		} \ | ||
|  | 		retval; \ | ||
|  | 	}) | ||
|  | 
 | ||
|  | #define SC_FAULT_WRITE(sc) ({ \
 | ||
|  | 		struct sigcontext *_sc = (sc); \ | ||
|  | 		long retval = -1; \ | ||
|  | 		switch (_sc->regs->trap) { \ | ||
|  | 		case 0x300: \ | ||
|  | 			/* data exception */ \ | ||
|  | 			retval = !!(_sc->regs->dsisr & DSISR_WRITE); \ | ||
|  | 			break; \ | ||
|  | 		case 0x400: \ | ||
|  | 			/* instruction exception: not a write */ \ | ||
|  | 			retval = 0; \ | ||
|  | 			break; \ | ||
|  | 		default: \ | ||
|  | 			panic("SC_FAULT_ADDR: unhandled trap type\n"); \ | ||
|  | 		} \ | ||
|  | 		retval; \ | ||
|  | 	}) | ||
|  | 
 | ||
|  | #define SC_IP(sc) ((sc)->regs->nip)
 | ||
|  | #define SC_SP(sc) ((sc)->regs->gpr[1])
 | ||
|  | #define SEGV_IS_FIXABLE(sc) (1)
 | ||
|  | 
 | ||
|  | #endif
 | ||
|  | 
 |