Commit d8ecc0b9131a229ff6e8fbe5d3a0b284b1620452
1 parent
19c80e50
Make cpu_signal_handler work on Mac OS X/Darwin x86
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2400 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
15 additions
and
3 deletions
cpu-exec.c
... | ... | @@ -1176,6 +1176,18 @@ static inline int handle_cpu_signal(unsigned long pc, unsigned long address, |
1176 | 1176 | |
1177 | 1177 | #if defined(__i386__) |
1178 | 1178 | |
1179 | +#if defined(__APPLE__) | |
1180 | +# include <sys/ucontext.h> | |
1181 | + | |
1182 | +# define EIP_sig(context) (*((unsigned long*)&(context)->uc_mcontext->ss.eip)) | |
1183 | +# define TRAP_sig(context) ((context)->uc_mcontext->es.trapno) | |
1184 | +# define ERROR_sig(context) ((context)->uc_mcontext->es.err) | |
1185 | +#else | |
1186 | +# define EIP_sig(context) ((context)->uc_mcontext.gregs[REG_EIP]) | |
1187 | +# define TRAP_sig(context) ((context)->uc_mcontext.gregs[REG_TRAPNO]) | |
1188 | +# define ERROR_sig(context) ((context)->uc_mcontext.gregs[REG_ERR]) | |
1189 | +#endif | |
1190 | + | |
1179 | 1191 | #if defined(USE_CODE_COPY) |
1180 | 1192 | static void cpu_send_trap(unsigned long pc, int trap, |
1181 | 1193 | struct ucontext *uc) |
... | ... | @@ -1210,8 +1222,8 @@ int cpu_signal_handler(int host_signum, void *pinfo, |
1210 | 1222 | #define REG_ERR ERR |
1211 | 1223 | #define REG_TRAPNO TRAPNO |
1212 | 1224 | #endif |
1213 | - pc = uc->uc_mcontext.gregs[REG_EIP]; | |
1214 | - trapno = uc->uc_mcontext.gregs[REG_TRAPNO]; | |
1225 | + pc = EIP_sig(uc); | |
1226 | + trapno = TRAP_sig(uc); | |
1215 | 1227 | #if defined(TARGET_I386) && defined(USE_CODE_COPY) |
1216 | 1228 | if (trapno == 0x00 || trapno == 0x05) { |
1217 | 1229 | /* send division by zero or bound exception */ |
... | ... | @@ -1221,7 +1233,7 @@ int cpu_signal_handler(int host_signum, void *pinfo, |
1221 | 1233 | #endif |
1222 | 1234 | return handle_cpu_signal(pc, (unsigned long)info->si_addr, |
1223 | 1235 | trapno == 0xe ? |
1224 | - (uc->uc_mcontext.gregs[REG_ERR] >> 1) & 1 : 0, | |
1236 | + (ERROR_sig(uc) >> 1) & 1 : 0, | |
1225 | 1237 | &uc->uc_sigmask, puc); |
1226 | 1238 | } |
1227 | 1239 | ... | ... |