Revision a05c6409 linux-user/signal.c
b/linux-user/signal.c | ||
---|---|---|
202 | 202 |
static inline void host_to_target_siginfo_noswap(target_siginfo_t *tinfo, |
203 | 203 |
const siginfo_t *info) |
204 | 204 |
{ |
205 |
int sig; |
|
206 |
sig = host_to_target_signal(info->si_signo); |
|
205 |
int sig = host_to_target_signal(info->si_signo); |
|
207 | 206 |
tinfo->si_signo = sig; |
208 | 207 |
tinfo->si_errno = 0; |
209 | 208 |
tinfo->si_code = info->si_code; |
210 |
if (sig == SIGILL || sig == SIGFPE || sig == SIGSEGV || |
|
211 |
sig == SIGBUS || sig == SIGTRAP) { |
|
212 |
/* should never come here, but who knows. The information for |
|
213 |
the target is irrelevant */ |
|
209 |
|
|
210 |
if (sig == TARGET_SIGILL || sig == TARGET_SIGFPE || sig == TARGET_SIGSEGV |
|
211 |
|| sig == TARGET_SIGBUS || sig == TARGET_SIGTRAP) { |
|
212 |
/* Should never come here, but who knows. The information for |
|
213 |
the target is irrelevant. */ |
|
214 | 214 |
tinfo->_sifields._sigfault._addr = 0; |
215 |
} else if (sig == SIGIO) { |
|
215 |
} else if (sig == TARGET_SIGIO) { |
|
216 |
tinfo->_sifields._sigpoll._band = info->si_band; |
|
216 | 217 |
tinfo->_sifields._sigpoll._fd = info->si_fd; |
218 |
} else if (sig == TARGET_SIGCHLD) { |
|
219 |
tinfo->_sifields._sigchld._pid = info->si_pid; |
|
220 |
tinfo->_sifields._sigchld._uid = info->si_uid; |
|
221 |
tinfo->_sifields._sigchld._status |
|
222 |
= host_to_target_waitstatus(info->si_status); |
|
223 |
tinfo->_sifields._sigchld._utime = info->si_utime; |
|
224 |
tinfo->_sifields._sigchld._stime = info->si_stime; |
|
217 | 225 |
} else if (sig >= TARGET_SIGRTMIN) { |
218 | 226 |
tinfo->_sifields._rt._pid = info->si_pid; |
219 | 227 |
tinfo->_sifields._rt._uid = info->si_uid; |
220 | 228 |
/* XXX: potential problem if 64 bit */ |
221 |
tinfo->_sifields._rt._sigval.sival_ptr =
|
|
222 |
(abi_ulong)(unsigned long)info->si_value.sival_ptr; |
|
229 |
tinfo->_sifields._rt._sigval.sival_ptr |
|
230 |
= (abi_ulong)(unsigned long)info->si_value.sival_ptr;
|
|
223 | 231 |
} |
224 | 232 |
} |
225 | 233 |
|
226 | 234 |
static void tswap_siginfo(target_siginfo_t *tinfo, |
227 | 235 |
const target_siginfo_t *info) |
228 | 236 |
{ |
229 |
int sig; |
|
230 |
sig = info->si_signo; |
|
237 |
int sig = info->si_signo; |
|
231 | 238 |
tinfo->si_signo = tswap32(sig); |
232 | 239 |
tinfo->si_errno = tswap32(info->si_errno); |
233 | 240 |
tinfo->si_code = tswap32(info->si_code); |
234 |
if (sig == SIGILL || sig == SIGFPE || sig == SIGSEGV || |
|
235 |
sig == SIGBUS || sig == SIGTRAP) { |
|
236 |
tinfo->_sifields._sigfault._addr = |
|
237 |
tswapal(info->_sifields._sigfault._addr); |
|
238 |
} else if (sig == SIGIO) { |
|
239 |
tinfo->_sifields._sigpoll._fd = tswap32(info->_sifields._sigpoll._fd); |
|
241 |
|
|
242 |
if (sig == TARGET_SIGILL || sig == TARGET_SIGFPE || sig == TARGET_SIGSEGV |
|
243 |
|| sig == TARGET_SIGBUS || sig == TARGET_SIGTRAP) { |
|
244 |
tinfo->_sifields._sigfault._addr |
|
245 |
= tswapal(info->_sifields._sigfault._addr); |
|
246 |
} else if (sig == TARGET_SIGIO) { |
|
247 |
tinfo->_sifields._sigpoll._band |
|
248 |
= tswap32(info->_sifields._sigpoll._band); |
|
249 |
tinfo->_sifields._sigpoll._fd = tswap32(info->_sifields._sigpoll._fd); |
|
250 |
} else if (sig == TARGET_SIGCHLD) { |
|
251 |
tinfo->_sifields._sigchld._pid |
|
252 |
= tswap32(info->_sifields._sigchld._pid); |
|
253 |
tinfo->_sifields._sigchld._uid |
|
254 |
= tswap32(info->_sifields._sigchld._uid); |
|
255 |
tinfo->_sifields._sigchld._status |
|
256 |
= tswap32(info->_sifields._sigchld._status); |
|
257 |
tinfo->_sifields._sigchld._utime |
|
258 |
= tswapal(info->_sifields._sigchld._utime); |
|
259 |
tinfo->_sifields._sigchld._stime |
|
260 |
= tswapal(info->_sifields._sigchld._stime); |
|
240 | 261 |
} else if (sig >= TARGET_SIGRTMIN) { |
241 | 262 |
tinfo->_sifields._rt._pid = tswap32(info->_sifields._rt._pid); |
242 | 263 |
tinfo->_sifields._rt._uid = tswap32(info->_sifields._rt._uid); |
243 |
tinfo->_sifields._rt._sigval.sival_ptr =
|
|
244 |
tswapal(info->_sifields._rt._sigval.sival_ptr); |
|
264 |
tinfo->_sifields._rt._sigval.sival_ptr |
|
265 |
= tswapal(info->_sifields._rt._sigval.sival_ptr);
|
|
245 | 266 |
} |
246 | 267 |
} |
247 | 268 |
|
Also available in: Unified diff