53 строки
1.1 KiB
C
53 строки
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
|
|
|