Revision d397abbd
b/cpu-exec.c | ||
---|---|---|
1207 | 1207 |
#elif defined(__x86_64__) |
1208 | 1208 |
|
1209 | 1209 |
#ifdef __NetBSD__ |
1210 |
#define REG_ERR _REG_ERR |
|
1211 |
#define REG_TRAPNO _REG_TRAPNO |
|
1212 |
|
|
1213 |
#define QEMU_UC_MCONTEXT_GREGS(uc, reg) (uc)->uc_mcontext.__gregs[(reg)] |
|
1214 |
#define QEMU_UC_MACHINE_PC(uc) _UC_MACHINE_PC(uc) |
|
1210 |
#define PC_sig(context) _UC_MACHINE_PC(context) |
|
1211 |
#define TRAP_sig(context) ((context)->uc_mcontext.__gregs[_REG_TRAPNO]) |
|
1212 |
#define ERROR_sig(context) ((context)->uc_mcontext.__gregs[_REG_ERR]) |
|
1213 |
#define MASK_sig(context) ((context)->uc_sigmask) |
|
1214 |
#elif defined(__OpenBSD__) |
|
1215 |
#define PC_sig(context) ((context)->sc_rip) |
|
1216 |
#define TRAP_sig(context) ((context)->sc_trapno) |
|
1217 |
#define ERROR_sig(context) ((context)->sc_err) |
|
1218 |
#define MASK_sig(context) ((context)->sc_mask) |
|
1215 | 1219 |
#else |
1216 |
#define QEMU_UC_MCONTEXT_GREGS(uc, reg) (uc)->uc_mcontext.gregs[(reg)] |
|
1217 |
#define QEMU_UC_MACHINE_PC(uc) QEMU_UC_MCONTEXT_GREGS(uc, REG_RIP) |
|
1220 |
#define PC_sig(context) ((context)->uc_mcontext.gregs[REG_RIP]) |
|
1221 |
#define TRAP_sig(context) ((context)->uc_mcontext.gregs[REG_TRAPNO]) |
|
1222 |
#define ERROR_sig(context) ((context)->uc_mcontext.gregs[REG_ERR]) |
|
1223 |
#define MASK_sig(context) ((context)->uc_sigmask) |
|
1218 | 1224 |
#endif |
1219 | 1225 |
|
1220 | 1226 |
int cpu_signal_handler(int host_signum, void *pinfo, |
... | ... | |
1224 | 1230 |
unsigned long pc; |
1225 | 1231 |
#ifdef __NetBSD__ |
1226 | 1232 |
ucontext_t *uc = puc; |
1233 |
#elif defined(__OpenBSD__) |
|
1234 |
struct sigcontext *uc = puc; |
|
1227 | 1235 |
#else |
1228 | 1236 |
struct ucontext *uc = puc; |
1229 | 1237 |
#endif |
1230 | 1238 |
|
1231 |
pc = QEMU_UC_MACHINE_PC(uc);
|
|
1239 |
pc = PC_sig(uc);
|
|
1232 | 1240 |
return handle_cpu_signal(pc, (unsigned long)info->si_addr, |
1233 |
QEMU_UC_MCONTEXT_GREGS(uc, REG_TRAPNO) == 0xe ?
|
|
1234 |
(QEMU_UC_MCONTEXT_GREGS(uc, REG_ERR) >> 1) & 1 : 0,
|
|
1235 |
&uc->uc_sigmask, puc);
|
|
1241 |
TRAP_sig(uc) == 0xe ?
|
|
1242 |
(ERROR_sig(uc) >> 1) & 1 : 0,
|
|
1243 |
&MASK_sig(uc), puc);
|
|
1236 | 1244 |
} |
1237 | 1245 |
|
1238 | 1246 |
#elif defined(_ARCH_PPC) |
Also available in: Unified diff