diff options
Diffstat (limited to 'arch/um/include/shared/sysdep-ppc/sigcontext.h')
| -rw-r--r-- | arch/um/include/shared/sysdep-ppc/sigcontext.h | 62 | 
1 files changed, 62 insertions, 0 deletions
| diff --git a/arch/um/include/shared/sysdep-ppc/sigcontext.h b/arch/um/include/shared/sysdep-ppc/sigcontext.h new file mode 100644 index 000000000000..f20d965de9c7 --- /dev/null +++ b/arch/um/include/shared/sysdep-ppc/sigcontext.h @@ -0,0 +1,62 @@ +/*  + * 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: + */ | 
