|  | /* | 
|  | * 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: | 
|  | */ |