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