| /*  | 
 |  * 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 | 
 |  | 
 | /* | 
 |  * Overrides for Emacs so that we follow Linus's tabbing style. | 
 |  * Emacs will notice this stuff at the end of the file and automatically | 
 |  * adjust the settings for this buffer only.  This must remain at the end | 
 |  * of the file. | 
 |  * --------------------------------------------------------------------------- | 
 |  * Local variables: | 
 |  * c-file-style: "linux" | 
 |  * End: | 
 |  */ |