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,6 +1176,18 @@ static inline int handle_cpu_signal(unsigned long pc, unsigned long address, | ||
| 1176 | 1176 | ||
| 1177 | #if defined(__i386__) | 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 | #if defined(USE_CODE_COPY) | 1191 | #if defined(USE_CODE_COPY) |
| 1180 | static void cpu_send_trap(unsigned long pc, int trap, | 1192 | static void cpu_send_trap(unsigned long pc, int trap, |
| 1181 | struct ucontext *uc) | 1193 | struct ucontext *uc) |
| @@ -1210,8 +1222,8 @@ int cpu_signal_handler(int host_signum, void *pinfo, | @@ -1210,8 +1222,8 @@ int cpu_signal_handler(int host_signum, void *pinfo, | ||
| 1210 | #define REG_ERR ERR | 1222 | #define REG_ERR ERR |
| 1211 | #define REG_TRAPNO TRAPNO | 1223 | #define REG_TRAPNO TRAPNO |
| 1212 | #endif | 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 | #if defined(TARGET_I386) && defined(USE_CODE_COPY) | 1227 | #if defined(TARGET_I386) && defined(USE_CODE_COPY) |
| 1216 | if (trapno == 0x00 || trapno == 0x05) { | 1228 | if (trapno == 0x00 || trapno == 0x05) { |
| 1217 | /* send division by zero or bound exception */ | 1229 | /* send division by zero or bound exception */ |
| @@ -1221,7 +1233,7 @@ int cpu_signal_handler(int host_signum, void *pinfo, | @@ -1221,7 +1233,7 @@ int cpu_signal_handler(int host_signum, void *pinfo, | ||
| 1221 | #endif | 1233 | #endif |
| 1222 | return handle_cpu_signal(pc, (unsigned long)info->si_addr, | 1234 | return handle_cpu_signal(pc, (unsigned long)info->si_addr, |
| 1223 | trapno == 0xe ? | 1235 | trapno == 0xe ? |
| 1224 | - (uc->uc_mcontext.gregs[REG_ERR] >> 1) & 1 : 0, | 1236 | + (ERROR_sig(uc) >> 1) & 1 : 0, |
| 1225 | &uc->uc_sigmask, puc); | 1237 | &uc->uc_sigmask, puc); |
| 1226 | } | 1238 | } |
| 1227 | 1239 |