2 * Emulation of Linux signals
4 * Copyright (c) 2003 Fabrice Bellard
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, see <http://www.gnu.org/licenses/>.
19 #include "qemu/osdep.h"
20 #include "qemu/bitops.h"
21 #include <sys/ucontext.h>
22 #include <sys/resource.h>
25 #include "qemu-common.h"
26 #include "target_signal.h"
29 static struct target_sigaltstack target_sigaltstack_used
= {
32 .ss_flags
= TARGET_SS_DISABLE
,
35 static struct target_sigaction sigact_table
[TARGET_NSIG
];
37 static void host_signal_handler(int host_signum
, siginfo_t
*info
,
40 static uint8_t host_to_target_signal_table
[_NSIG
] = {
41 [SIGHUP
] = TARGET_SIGHUP
,
42 [SIGINT
] = TARGET_SIGINT
,
43 [SIGQUIT
] = TARGET_SIGQUIT
,
44 [SIGILL
] = TARGET_SIGILL
,
45 [SIGTRAP
] = TARGET_SIGTRAP
,
46 [SIGABRT
] = TARGET_SIGABRT
,
47 /* [SIGIOT] = TARGET_SIGIOT,*/
48 [SIGBUS
] = TARGET_SIGBUS
,
49 [SIGFPE
] = TARGET_SIGFPE
,
50 [SIGKILL
] = TARGET_SIGKILL
,
51 [SIGUSR1
] = TARGET_SIGUSR1
,
52 [SIGSEGV
] = TARGET_SIGSEGV
,
53 [SIGUSR2
] = TARGET_SIGUSR2
,
54 [SIGPIPE
] = TARGET_SIGPIPE
,
55 [SIGALRM
] = TARGET_SIGALRM
,
56 [SIGTERM
] = TARGET_SIGTERM
,
58 [SIGSTKFLT
] = TARGET_SIGSTKFLT
,
60 [SIGCHLD
] = TARGET_SIGCHLD
,
61 [SIGCONT
] = TARGET_SIGCONT
,
62 [SIGSTOP
] = TARGET_SIGSTOP
,
63 [SIGTSTP
] = TARGET_SIGTSTP
,
64 [SIGTTIN
] = TARGET_SIGTTIN
,
65 [SIGTTOU
] = TARGET_SIGTTOU
,
66 [SIGURG
] = TARGET_SIGURG
,
67 [SIGXCPU
] = TARGET_SIGXCPU
,
68 [SIGXFSZ
] = TARGET_SIGXFSZ
,
69 [SIGVTALRM
] = TARGET_SIGVTALRM
,
70 [SIGPROF
] = TARGET_SIGPROF
,
71 [SIGWINCH
] = TARGET_SIGWINCH
,
72 [SIGIO
] = TARGET_SIGIO
,
73 [SIGPWR
] = TARGET_SIGPWR
,
74 [SIGSYS
] = TARGET_SIGSYS
,
75 /* next signals stay the same */
76 /* Nasty hack: Reverse SIGRTMIN and SIGRTMAX to avoid overlap with
77 host libpthread signals. This assumes no one actually uses SIGRTMAX :-/
78 To fix this properly we need to do manual signal delivery multiplexed
79 over a single host signal. */
80 [__SIGRTMIN
] = __SIGRTMAX
,
81 [__SIGRTMAX
] = __SIGRTMIN
,
83 static uint8_t target_to_host_signal_table
[_NSIG
];
85 static inline int on_sig_stack(unsigned long sp
)
87 return (sp
- target_sigaltstack_used
.ss_sp
88 < target_sigaltstack_used
.ss_size
);
91 static inline int sas_ss_flags(unsigned long sp
)
93 return (target_sigaltstack_used
.ss_size
== 0 ? SS_DISABLE
94 : on_sig_stack(sp
) ? SS_ONSTACK
: 0);
97 int host_to_target_signal(int sig
)
99 if (sig
< 0 || sig
>= _NSIG
)
101 return host_to_target_signal_table
[sig
];
104 int target_to_host_signal(int sig
)
106 if (sig
< 0 || sig
>= _NSIG
)
108 return target_to_host_signal_table
[sig
];
111 static inline void target_sigemptyset(target_sigset_t
*set
)
113 memset(set
, 0, sizeof(*set
));
116 static inline void target_sigaddset(target_sigset_t
*set
, int signum
)
119 abi_ulong mask
= (abi_ulong
)1 << (signum
% TARGET_NSIG_BPW
);
120 set
->sig
[signum
/ TARGET_NSIG_BPW
] |= mask
;
123 static inline int target_sigismember(const target_sigset_t
*set
, int signum
)
126 abi_ulong mask
= (abi_ulong
)1 << (signum
% TARGET_NSIG_BPW
);
127 return ((set
->sig
[signum
/ TARGET_NSIG_BPW
] & mask
) != 0);
130 static void host_to_target_sigset_internal(target_sigset_t
*d
,
134 target_sigemptyset(d
);
135 for (i
= 1; i
<= TARGET_NSIG
; i
++) {
136 if (sigismember(s
, i
)) {
137 target_sigaddset(d
, host_to_target_signal(i
));
142 void host_to_target_sigset(target_sigset_t
*d
, const sigset_t
*s
)
147 host_to_target_sigset_internal(&d1
, s
);
148 for(i
= 0;i
< TARGET_NSIG_WORDS
; i
++)
149 d
->sig
[i
] = tswapal(d1
.sig
[i
]);
152 static void target_to_host_sigset_internal(sigset_t
*d
,
153 const target_sigset_t
*s
)
157 for (i
= 1; i
<= TARGET_NSIG
; i
++) {
158 if (target_sigismember(s
, i
)) {
159 sigaddset(d
, target_to_host_signal(i
));
164 void target_to_host_sigset(sigset_t
*d
, const target_sigset_t
*s
)
169 for(i
= 0;i
< TARGET_NSIG_WORDS
; i
++)
170 s1
.sig
[i
] = tswapal(s
->sig
[i
]);
171 target_to_host_sigset_internal(d
, &s1
);
174 void host_to_target_old_sigset(abi_ulong
*old_sigset
,
175 const sigset_t
*sigset
)
178 host_to_target_sigset(&d
, sigset
);
179 *old_sigset
= d
.sig
[0];
182 void target_to_host_old_sigset(sigset_t
*sigset
,
183 const abi_ulong
*old_sigset
)
188 d
.sig
[0] = *old_sigset
;
189 for(i
= 1;i
< TARGET_NSIG_WORDS
; i
++)
191 target_to_host_sigset(sigset
, &d
);
194 int block_signals(void)
196 TaskState
*ts
= (TaskState
*)thread_cpu
->opaque
;
200 /* It's OK to block everything including SIGSEGV, because we won't
201 * run any further guest code before unblocking signals in
202 * process_pending_signals().
205 sigprocmask(SIG_SETMASK
, &set
, 0);
207 pending
= atomic_xchg(&ts
->signal_pending
, 1);
212 /* Wrapper for sigprocmask function
213 * Emulates a sigprocmask in a safe way for the guest. Note that set and oldset
214 * are host signal set, not guest ones. Returns -TARGET_ERESTARTSYS if
215 * a signal was already pending and the syscall must be restarted, or
217 * If set is NULL, this is guaranteed not to fail.
219 int do_sigprocmask(int how
, const sigset_t
*set
, sigset_t
*oldset
)
221 TaskState
*ts
= (TaskState
*)thread_cpu
->opaque
;
224 *oldset
= ts
->signal_mask
;
230 if (block_signals()) {
231 return -TARGET_ERESTARTSYS
;
236 sigorset(&ts
->signal_mask
, &ts
->signal_mask
, set
);
239 for (i
= 1; i
<= NSIG
; ++i
) {
240 if (sigismember(set
, i
)) {
241 sigdelset(&ts
->signal_mask
, i
);
246 ts
->signal_mask
= *set
;
249 g_assert_not_reached();
252 /* Silently ignore attempts to change blocking status of KILL or STOP */
253 sigdelset(&ts
->signal_mask
, SIGKILL
);
254 sigdelset(&ts
->signal_mask
, SIGSTOP
);
259 #if !defined(TARGET_OPENRISC) && !defined(TARGET_UNICORE32) && \
260 !defined(TARGET_X86_64)
261 /* Just set the guest's signal mask to the specified value; the
262 * caller is assumed to have called block_signals() already.
264 static void set_sigmask(const sigset_t
*set
)
266 TaskState
*ts
= (TaskState
*)thread_cpu
->opaque
;
268 ts
->signal_mask
= *set
;
272 /* siginfo conversion */
274 static inline void host_to_target_siginfo_noswap(target_siginfo_t
*tinfo
,
275 const siginfo_t
*info
)
277 int sig
= host_to_target_signal(info
->si_signo
);
278 int si_code
= info
->si_code
;
280 tinfo
->si_signo
= sig
;
282 tinfo
->si_code
= info
->si_code
;
284 /* This is awkward, because we have to use a combination of
285 * the si_code and si_signo to figure out which of the union's
286 * members are valid. (Within the host kernel it is always possible
287 * to tell, but the kernel carefully avoids giving userspace the
288 * high 16 bits of si_code, so we don't have the information to
289 * do this the easy way...) We therefore make our best guess,
290 * bearing in mind that a guest can spoof most of the si_codes
291 * via rt_sigqueueinfo() if it likes.
293 * Once we have made our guess, we record it in the top 16 bits of
294 * the si_code, so that tswap_siginfo() later can use it.
295 * tswap_siginfo() will strip these top bits out before writing
296 * si_code to the guest (sign-extending the lower bits).
303 /* Sent via kill(), tkill() or tgkill(), or direct from the kernel.
304 * These are the only unspoofable si_code values.
306 tinfo
->_sifields
._kill
._pid
= info
->si_pid
;
307 tinfo
->_sifields
._kill
._uid
= info
->si_uid
;
308 si_type
= QEMU_SI_KILL
;
311 /* Everything else is spoofable. Make best guess based on signal */
314 tinfo
->_sifields
._sigchld
._pid
= info
->si_pid
;
315 tinfo
->_sifields
._sigchld
._uid
= info
->si_uid
;
316 tinfo
->_sifields
._sigchld
._status
317 = host_to_target_waitstatus(info
->si_status
);
318 tinfo
->_sifields
._sigchld
._utime
= info
->si_utime
;
319 tinfo
->_sifields
._sigchld
._stime
= info
->si_stime
;
320 si_type
= QEMU_SI_CHLD
;
323 tinfo
->_sifields
._sigpoll
._band
= info
->si_band
;
324 tinfo
->_sifields
._sigpoll
._fd
= info
->si_fd
;
325 si_type
= QEMU_SI_POLL
;
328 /* Assume a sigqueue()/mq_notify()/rt_sigqueueinfo() source. */
329 tinfo
->_sifields
._rt
._pid
= info
->si_pid
;
330 tinfo
->_sifields
._rt
._uid
= info
->si_uid
;
331 /* XXX: potential problem if 64 bit */
332 tinfo
->_sifields
._rt
._sigval
.sival_ptr
333 = (abi_ulong
)(unsigned long)info
->si_value
.sival_ptr
;
334 si_type
= QEMU_SI_RT
;
340 tinfo
->si_code
= deposit32(si_code
, 16, 16, si_type
);
343 static void tswap_siginfo(target_siginfo_t
*tinfo
,
344 const target_siginfo_t
*info
)
346 int si_type
= extract32(info
->si_code
, 16, 16);
347 int si_code
= sextract32(info
->si_code
, 0, 16);
349 __put_user(info
->si_signo
, &tinfo
->si_signo
);
350 __put_user(info
->si_errno
, &tinfo
->si_errno
);
351 __put_user(si_code
, &tinfo
->si_code
);
353 /* We can use our internal marker of which fields in the structure
354 * are valid, rather than duplicating the guesswork of
355 * host_to_target_siginfo_noswap() here.
359 __put_user(info
->_sifields
._kill
._pid
, &tinfo
->_sifields
._kill
._pid
);
360 __put_user(info
->_sifields
._kill
._uid
, &tinfo
->_sifields
._kill
._uid
);
363 __put_user(info
->_sifields
._timer
._timer1
,
364 &tinfo
->_sifields
._timer
._timer1
);
365 __put_user(info
->_sifields
._timer
._timer2
,
366 &tinfo
->_sifields
._timer
._timer2
);
369 __put_user(info
->_sifields
._sigpoll
._band
,
370 &tinfo
->_sifields
._sigpoll
._band
);
371 __put_user(info
->_sifields
._sigpoll
._fd
,
372 &tinfo
->_sifields
._sigpoll
._fd
);
375 __put_user(info
->_sifields
._sigfault
._addr
,
376 &tinfo
->_sifields
._sigfault
._addr
);
379 __put_user(info
->_sifields
._sigchld
._pid
,
380 &tinfo
->_sifields
._sigchld
._pid
);
381 __put_user(info
->_sifields
._sigchld
._uid
,
382 &tinfo
->_sifields
._sigchld
._uid
);
383 __put_user(info
->_sifields
._sigchld
._status
,
384 &tinfo
->_sifields
._sigchld
._status
);
385 __put_user(info
->_sifields
._sigchld
._utime
,
386 &tinfo
->_sifields
._sigchld
._utime
);
387 __put_user(info
->_sifields
._sigchld
._stime
,
388 &tinfo
->_sifields
._sigchld
._stime
);
391 __put_user(info
->_sifields
._rt
._pid
, &tinfo
->_sifields
._rt
._pid
);
392 __put_user(info
->_sifields
._rt
._uid
, &tinfo
->_sifields
._rt
._uid
);
393 __put_user(info
->_sifields
._rt
._sigval
.sival_ptr
,
394 &tinfo
->_sifields
._rt
._sigval
.sival_ptr
);
397 g_assert_not_reached();
401 void host_to_target_siginfo(target_siginfo_t
*tinfo
, const siginfo_t
*info
)
403 host_to_target_siginfo_noswap(tinfo
, info
);
404 tswap_siginfo(tinfo
, tinfo
);
407 /* XXX: we support only POSIX RT signals are used. */
408 /* XXX: find a solution for 64 bit (additional malloced data is needed) */
409 void target_to_host_siginfo(siginfo_t
*info
, const target_siginfo_t
*tinfo
)
411 info
->si_signo
= tswap32(tinfo
->si_signo
);
412 info
->si_errno
= tswap32(tinfo
->si_errno
);
413 info
->si_code
= tswap32(tinfo
->si_code
);
414 info
->si_pid
= tswap32(tinfo
->_sifields
._rt
._pid
);
415 info
->si_uid
= tswap32(tinfo
->_sifields
._rt
._uid
);
416 info
->si_value
.sival_ptr
=
417 (void *)(long)tswapal(tinfo
->_sifields
._rt
._sigval
.sival_ptr
);
420 static int fatal_signal (int sig
)
425 case TARGET_SIGWINCH
:
426 /* Ignored by default. */
433 /* Job control signals. */
440 /* returns 1 if given signal should dump core if not handled */
441 static int core_dump_signal(int sig
)
457 void signal_init(void)
459 TaskState
*ts
= (TaskState
*)thread_cpu
->opaque
;
460 struct sigaction act
;
461 struct sigaction oact
;
465 /* generate signal conversion tables */
466 for(i
= 1; i
< _NSIG
; i
++) {
467 if (host_to_target_signal_table
[i
] == 0)
468 host_to_target_signal_table
[i
] = i
;
470 for(i
= 1; i
< _NSIG
; i
++) {
471 j
= host_to_target_signal_table
[i
];
472 target_to_host_signal_table
[j
] = i
;
475 /* Set the signal mask from the host mask. */
476 sigprocmask(0, 0, &ts
->signal_mask
);
478 /* set all host signal handlers. ALL signals are blocked during
479 the handlers to serialize them. */
480 memset(sigact_table
, 0, sizeof(sigact_table
));
482 sigfillset(&act
.sa_mask
);
483 act
.sa_flags
= SA_SIGINFO
;
484 act
.sa_sigaction
= host_signal_handler
;
485 for(i
= 1; i
<= TARGET_NSIG
; i
++) {
486 host_sig
= target_to_host_signal(i
);
487 sigaction(host_sig
, NULL
, &oact
);
488 if (oact
.sa_sigaction
== (void *)SIG_IGN
) {
489 sigact_table
[i
- 1]._sa_handler
= TARGET_SIG_IGN
;
490 } else if (oact
.sa_sigaction
== (void *)SIG_DFL
) {
491 sigact_table
[i
- 1]._sa_handler
= TARGET_SIG_DFL
;
493 /* If there's already a handler installed then something has
494 gone horribly wrong, so don't even try to handle that case. */
495 /* Install some handlers for our own use. We need at least
496 SIGSEGV and SIGBUS, to detect exceptions. We can not just
497 trap all signals because it affects syscall interrupt
498 behavior. But do trap all default-fatal signals. */
499 if (fatal_signal (i
))
500 sigaction(host_sig
, &act
, NULL
);
505 /* abort execution with signal */
506 static void QEMU_NORETURN
force_sig(int target_sig
)
508 CPUState
*cpu
= thread_cpu
;
509 CPUArchState
*env
= cpu
->env_ptr
;
510 TaskState
*ts
= (TaskState
*)cpu
->opaque
;
511 int host_sig
, core_dumped
= 0;
512 struct sigaction act
;
514 host_sig
= target_to_host_signal(target_sig
);
515 trace_user_force_sig(env
, target_sig
, host_sig
);
516 gdb_signalled(env
, target_sig
);
518 /* dump core if supported by target binary format */
519 if (core_dump_signal(target_sig
) && (ts
->bprm
->core_dump
!= NULL
)) {
522 ((*ts
->bprm
->core_dump
)(target_sig
, env
) == 0);
525 /* we already dumped the core of target process, we don't want
526 * a coredump of qemu itself */
527 struct rlimit nodump
;
528 getrlimit(RLIMIT_CORE
, &nodump
);
530 setrlimit(RLIMIT_CORE
, &nodump
);
531 (void) fprintf(stderr
, "qemu: uncaught target signal %d (%s) - %s\n",
532 target_sig
, strsignal(host_sig
), "core dumped" );
535 /* The proper exit code for dying from an uncaught signal is
536 * -<signal>. The kernel doesn't allow exit() or _exit() to pass
537 * a negative value. To get the proper exit code we need to
538 * actually die from an uncaught signal. Here the default signal
539 * handler is installed, we send ourself a signal and we wait for
541 sigfillset(&act
.sa_mask
);
542 act
.sa_handler
= SIG_DFL
;
544 sigaction(host_sig
, &act
, NULL
);
546 /* For some reason raise(host_sig) doesn't send the signal when
547 * statically linked on x86-64. */
548 kill(getpid(), host_sig
);
550 /* Make sure the signal isn't masked (just reuse the mask inside
552 sigdelset(&act
.sa_mask
, host_sig
);
553 sigsuspend(&act
.sa_mask
);
559 /* queue a signal so that it will be send to the virtual CPU as soon
561 int queue_signal(CPUArchState
*env
, int sig
, target_siginfo_t
*info
)
563 CPUState
*cpu
= ENV_GET_CPU(env
);
564 TaskState
*ts
= cpu
->opaque
;
566 trace_user_queue_signal(env
, sig
);
568 /* Currently all callers define siginfo structures which
569 * use the _sifields._sigfault union member, so we can
570 * set the type here. If that changes we should push this
571 * out so the si_type is passed in by callers.
573 info
->si_code
= deposit32(info
->si_code
, 16, 16, QEMU_SI_FAULT
);
575 ts
->sync_signal
.info
= *info
;
576 ts
->sync_signal
.pending
= sig
;
577 /* signal that a new signal is pending */
578 atomic_set(&ts
->signal_pending
, 1);
579 return 1; /* indicates that the signal was queued */
582 #ifndef HAVE_SAFE_SYSCALL
583 static inline void rewind_if_in_safe_syscall(void *puc
)
585 /* Default version: never rewind */
589 static void host_signal_handler(int host_signum
, siginfo_t
*info
,
592 CPUArchState
*env
= thread_cpu
->env_ptr
;
593 CPUState
*cpu
= ENV_GET_CPU(env
);
594 TaskState
*ts
= cpu
->opaque
;
597 target_siginfo_t tinfo
;
598 ucontext_t
*uc
= puc
;
599 struct emulated_sigtable
*k
;
601 /* the CPU emulator uses some host signals to detect exceptions,
602 we forward to it some signals */
603 if ((host_signum
== SIGSEGV
|| host_signum
== SIGBUS
)
604 && info
->si_code
> 0) {
605 if (cpu_signal_handler(host_signum
, info
, puc
))
609 /* get target signal number */
610 sig
= host_to_target_signal(host_signum
);
611 if (sig
< 1 || sig
> TARGET_NSIG
)
613 trace_user_host_signal(env
, host_signum
, sig
);
615 rewind_if_in_safe_syscall(puc
);
617 host_to_target_siginfo_noswap(&tinfo
, info
);
618 k
= &ts
->sigtab
[sig
- 1];
621 ts
->signal_pending
= 1;
623 /* Block host signals until target signal handler entered. We
624 * can't block SIGSEGV or SIGBUS while we're executing guest
625 * code in case the guest code provokes one in the window between
626 * now and it getting out to the main loop. Signals will be
627 * unblocked again in process_pending_signals().
629 sigfillset(&uc
->uc_sigmask
);
630 sigdelset(&uc
->uc_sigmask
, SIGSEGV
);
631 sigdelset(&uc
->uc_sigmask
, SIGBUS
);
633 /* interrupt the virtual CPU as soon as possible */
634 cpu_exit(thread_cpu
);
637 /* do_sigaltstack() returns target values and errnos. */
638 /* compare linux/kernel/signal.c:do_sigaltstack() */
639 abi_long
do_sigaltstack(abi_ulong uss_addr
, abi_ulong uoss_addr
, abi_ulong sp
)
642 struct target_sigaltstack oss
;
644 /* XXX: test errors */
647 __put_user(target_sigaltstack_used
.ss_sp
, &oss
.ss_sp
);
648 __put_user(target_sigaltstack_used
.ss_size
, &oss
.ss_size
);
649 __put_user(sas_ss_flags(sp
), &oss
.ss_flags
);
654 struct target_sigaltstack
*uss
;
655 struct target_sigaltstack ss
;
656 size_t minstacksize
= TARGET_MINSIGSTKSZ
;
658 #if defined(TARGET_PPC64)
659 /* ELF V2 for PPC64 has a 4K minimum stack size for signal handlers */
660 struct image_info
*image
= ((TaskState
*)thread_cpu
->opaque
)->info
;
661 if (get_ppc64_abi(image
) > 1) {
666 ret
= -TARGET_EFAULT
;
667 if (!lock_user_struct(VERIFY_READ
, uss
, uss_addr
, 1)) {
670 __get_user(ss
.ss_sp
, &uss
->ss_sp
);
671 __get_user(ss
.ss_size
, &uss
->ss_size
);
672 __get_user(ss
.ss_flags
, &uss
->ss_flags
);
673 unlock_user_struct(uss
, uss_addr
, 0);
676 if (on_sig_stack(sp
))
679 ret
= -TARGET_EINVAL
;
680 if (ss
.ss_flags
!= TARGET_SS_DISABLE
681 && ss
.ss_flags
!= TARGET_SS_ONSTACK
685 if (ss
.ss_flags
== TARGET_SS_DISABLE
) {
689 ret
= -TARGET_ENOMEM
;
690 if (ss
.ss_size
< minstacksize
) {
695 target_sigaltstack_used
.ss_sp
= ss
.ss_sp
;
696 target_sigaltstack_used
.ss_size
= ss
.ss_size
;
700 ret
= -TARGET_EFAULT
;
701 if (copy_to_user(uoss_addr
, &oss
, sizeof(oss
)))
710 /* do_sigaction() return target values and host errnos */
711 int do_sigaction(int sig
, const struct target_sigaction
*act
,
712 struct target_sigaction
*oact
)
714 struct target_sigaction
*k
;
715 struct sigaction act1
;
719 if (sig
< 1 || sig
> TARGET_NSIG
|| sig
== TARGET_SIGKILL
|| sig
== TARGET_SIGSTOP
) {
720 return -TARGET_EINVAL
;
723 if (block_signals()) {
724 return -TARGET_ERESTARTSYS
;
727 k
= &sigact_table
[sig
- 1];
729 __put_user(k
->_sa_handler
, &oact
->_sa_handler
);
730 __put_user(k
->sa_flags
, &oact
->sa_flags
);
731 #if !defined(TARGET_MIPS)
732 __put_user(k
->sa_restorer
, &oact
->sa_restorer
);
735 oact
->sa_mask
= k
->sa_mask
;
738 /* FIXME: This is not threadsafe. */
739 __get_user(k
->_sa_handler
, &act
->_sa_handler
);
740 __get_user(k
->sa_flags
, &act
->sa_flags
);
741 #if !defined(TARGET_MIPS)
742 __get_user(k
->sa_restorer
, &act
->sa_restorer
);
744 /* To be swapped in target_to_host_sigset. */
745 k
->sa_mask
= act
->sa_mask
;
747 /* we update the host linux signal state */
748 host_sig
= target_to_host_signal(sig
);
749 if (host_sig
!= SIGSEGV
&& host_sig
!= SIGBUS
) {
750 sigfillset(&act1
.sa_mask
);
751 act1
.sa_flags
= SA_SIGINFO
;
752 if (k
->sa_flags
& TARGET_SA_RESTART
)
753 act1
.sa_flags
|= SA_RESTART
;
754 /* NOTE: it is important to update the host kernel signal
755 ignore state to avoid getting unexpected interrupted
757 if (k
->_sa_handler
== TARGET_SIG_IGN
) {
758 act1
.sa_sigaction
= (void *)SIG_IGN
;
759 } else if (k
->_sa_handler
== TARGET_SIG_DFL
) {
760 if (fatal_signal (sig
))
761 act1
.sa_sigaction
= host_signal_handler
;
763 act1
.sa_sigaction
= (void *)SIG_DFL
;
765 act1
.sa_sigaction
= host_signal_handler
;
767 ret
= sigaction(host_sig
, &act1
, NULL
);
773 #if defined(TARGET_I386) && TARGET_ABI_BITS == 32
775 /* from the Linux kernel */
777 struct target_fpreg
{
778 uint16_t significand
[4];
782 struct target_fpxreg
{
783 uint16_t significand
[4];
788 struct target_xmmreg
{
789 abi_ulong element
[4];
792 struct target_fpstate
{
793 /* Regular FPU environment */
801 struct target_fpreg _st
[8];
803 uint16_t magic
; /* 0xffff = regular FPU data only */
805 /* FXSR FPU environment */
806 abi_ulong _fxsr_env
[6]; /* FXSR FPU env is ignored */
809 struct target_fpxreg _fxsr_st
[8]; /* FXSR FPU reg data is ignored */
810 struct target_xmmreg _xmm
[8];
811 abi_ulong padding
[56];
814 #define X86_FXSR_MAGIC 0x0000
816 struct target_sigcontext
{
834 abi_ulong esp_at_signal
;
836 abi_ulong fpstate
; /* pointer */
841 struct target_ucontext
{
844 target_stack_t tuc_stack
;
845 struct target_sigcontext tuc_mcontext
;
846 target_sigset_t tuc_sigmask
; /* mask last for extensibility */
853 struct target_sigcontext sc
;
854 struct target_fpstate fpstate
;
855 abi_ulong extramask
[TARGET_NSIG_WORDS
-1];
865 struct target_siginfo info
;
866 struct target_ucontext uc
;
867 struct target_fpstate fpstate
;
872 * Set up a signal frame.
875 /* XXX: save x87 state */
876 static void setup_sigcontext(struct target_sigcontext
*sc
,
877 struct target_fpstate
*fpstate
, CPUX86State
*env
, abi_ulong mask
,
878 abi_ulong fpstate_addr
)
880 CPUState
*cs
= CPU(x86_env_get_cpu(env
));
883 /* already locked in setup_frame() */
884 __put_user(env
->segs
[R_GS
].selector
, (unsigned int *)&sc
->gs
);
885 __put_user(env
->segs
[R_FS
].selector
, (unsigned int *)&sc
->fs
);
886 __put_user(env
->segs
[R_ES
].selector
, (unsigned int *)&sc
->es
);
887 __put_user(env
->segs
[R_DS
].selector
, (unsigned int *)&sc
->ds
);
888 __put_user(env
->regs
[R_EDI
], &sc
->edi
);
889 __put_user(env
->regs
[R_ESI
], &sc
->esi
);
890 __put_user(env
->regs
[R_EBP
], &sc
->ebp
);
891 __put_user(env
->regs
[R_ESP
], &sc
->esp
);
892 __put_user(env
->regs
[R_EBX
], &sc
->ebx
);
893 __put_user(env
->regs
[R_EDX
], &sc
->edx
);
894 __put_user(env
->regs
[R_ECX
], &sc
->ecx
);
895 __put_user(env
->regs
[R_EAX
], &sc
->eax
);
896 __put_user(cs
->exception_index
, &sc
->trapno
);
897 __put_user(env
->error_code
, &sc
->err
);
898 __put_user(env
->eip
, &sc
->eip
);
899 __put_user(env
->segs
[R_CS
].selector
, (unsigned int *)&sc
->cs
);
900 __put_user(env
->eflags
, &sc
->eflags
);
901 __put_user(env
->regs
[R_ESP
], &sc
->esp_at_signal
);
902 __put_user(env
->segs
[R_SS
].selector
, (unsigned int *)&sc
->ss
);
904 cpu_x86_fsave(env
, fpstate_addr
, 1);
905 fpstate
->status
= fpstate
->sw
;
907 __put_user(magic
, &fpstate
->magic
);
908 __put_user(fpstate_addr
, &sc
->fpstate
);
910 /* non-iBCS2 extensions.. */
911 __put_user(mask
, &sc
->oldmask
);
912 __put_user(env
->cr
[2], &sc
->cr2
);
916 * Determine which stack to use..
919 static inline abi_ulong
920 get_sigframe(struct target_sigaction
*ka
, CPUX86State
*env
, size_t frame_size
)
924 /* Default to using normal stack */
925 esp
= env
->regs
[R_ESP
];
926 /* This is the X/Open sanctioned signal stack switching. */
927 if (ka
->sa_flags
& TARGET_SA_ONSTACK
) {
928 if (sas_ss_flags(esp
) == 0) {
929 esp
= target_sigaltstack_used
.ss_sp
+ target_sigaltstack_used
.ss_size
;
933 /* This is the legacy signal stack switching. */
934 if ((env
->segs
[R_SS
].selector
& 0xffff) != __USER_DS
&&
935 !(ka
->sa_flags
& TARGET_SA_RESTORER
) &&
937 esp
= (unsigned long) ka
->sa_restorer
;
940 return (esp
- frame_size
) & -8ul;
943 /* compare linux/arch/i386/kernel/signal.c:setup_frame() */
944 static void setup_frame(int sig
, struct target_sigaction
*ka
,
945 target_sigset_t
*set
, CPUX86State
*env
)
947 abi_ulong frame_addr
;
948 struct sigframe
*frame
;
951 frame_addr
= get_sigframe(ka
, env
, sizeof(*frame
));
952 trace_user_setup_frame(env
, frame_addr
);
954 if (!lock_user_struct(VERIFY_WRITE
, frame
, frame_addr
, 0))
957 __put_user(sig
, &frame
->sig
);
959 setup_sigcontext(&frame
->sc
, &frame
->fpstate
, env
, set
->sig
[0],
960 frame_addr
+ offsetof(struct sigframe
, fpstate
));
962 for(i
= 1; i
< TARGET_NSIG_WORDS
; i
++) {
963 __put_user(set
->sig
[i
], &frame
->extramask
[i
- 1]);
966 /* Set up to return from userspace. If provided, use a stub
967 already in userspace. */
968 if (ka
->sa_flags
& TARGET_SA_RESTORER
) {
969 __put_user(ka
->sa_restorer
, &frame
->pretcode
);
972 abi_ulong retcode_addr
;
973 retcode_addr
= frame_addr
+ offsetof(struct sigframe
, retcode
);
974 __put_user(retcode_addr
, &frame
->pretcode
);
975 /* This is popl %eax ; movl $,%eax ; int $0x80 */
977 __put_user(val16
, (uint16_t *)(frame
->retcode
+0));
978 __put_user(TARGET_NR_sigreturn
, (int *)(frame
->retcode
+2));
980 __put_user(val16
, (uint16_t *)(frame
->retcode
+6));
984 /* Set up registers for signal handler */
985 env
->regs
[R_ESP
] = frame_addr
;
986 env
->eip
= ka
->_sa_handler
;
988 cpu_x86_load_seg(env
, R_DS
, __USER_DS
);
989 cpu_x86_load_seg(env
, R_ES
, __USER_DS
);
990 cpu_x86_load_seg(env
, R_SS
, __USER_DS
);
991 cpu_x86_load_seg(env
, R_CS
, __USER_CS
);
992 env
->eflags
&= ~TF_MASK
;
994 unlock_user_struct(frame
, frame_addr
, 1);
999 if (sig
== TARGET_SIGSEGV
) {
1000 ka
->_sa_handler
= TARGET_SIG_DFL
;
1002 force_sig(TARGET_SIGSEGV
/* , current */);
1005 /* compare linux/arch/i386/kernel/signal.c:setup_rt_frame() */
1006 static void setup_rt_frame(int sig
, struct target_sigaction
*ka
,
1007 target_siginfo_t
*info
,
1008 target_sigset_t
*set
, CPUX86State
*env
)
1010 abi_ulong frame_addr
, addr
;
1011 struct rt_sigframe
*frame
;
1014 frame_addr
= get_sigframe(ka
, env
, sizeof(*frame
));
1015 trace_user_setup_rt_frame(env
, frame_addr
);
1017 if (!lock_user_struct(VERIFY_WRITE
, frame
, frame_addr
, 0))
1020 __put_user(sig
, &frame
->sig
);
1021 addr
= frame_addr
+ offsetof(struct rt_sigframe
, info
);
1022 __put_user(addr
, &frame
->pinfo
);
1023 addr
= frame_addr
+ offsetof(struct rt_sigframe
, uc
);
1024 __put_user(addr
, &frame
->puc
);
1025 tswap_siginfo(&frame
->info
, info
);
1027 /* Create the ucontext. */
1028 __put_user(0, &frame
->uc
.tuc_flags
);
1029 __put_user(0, &frame
->uc
.tuc_link
);
1030 __put_user(target_sigaltstack_used
.ss_sp
, &frame
->uc
.tuc_stack
.ss_sp
);
1031 __put_user(sas_ss_flags(get_sp_from_cpustate(env
)),
1032 &frame
->uc
.tuc_stack
.ss_flags
);
1033 __put_user(target_sigaltstack_used
.ss_size
,
1034 &frame
->uc
.tuc_stack
.ss_size
);
1035 setup_sigcontext(&frame
->uc
.tuc_mcontext
, &frame
->fpstate
, env
,
1036 set
->sig
[0], frame_addr
+ offsetof(struct rt_sigframe
, fpstate
));
1038 for(i
= 0; i
< TARGET_NSIG_WORDS
; i
++) {
1039 __put_user(set
->sig
[i
], &frame
->uc
.tuc_sigmask
.sig
[i
]);
1042 /* Set up to return from userspace. If provided, use a stub
1043 already in userspace. */
1044 if (ka
->sa_flags
& TARGET_SA_RESTORER
) {
1045 __put_user(ka
->sa_restorer
, &frame
->pretcode
);
1048 addr
= frame_addr
+ offsetof(struct rt_sigframe
, retcode
);
1049 __put_user(addr
, &frame
->pretcode
);
1050 /* This is movl $,%eax ; int $0x80 */
1051 __put_user(0xb8, (char *)(frame
->retcode
+0));
1052 __put_user(TARGET_NR_rt_sigreturn
, (int *)(frame
->retcode
+1));
1054 __put_user(val16
, (uint16_t *)(frame
->retcode
+5));
1057 /* Set up registers for signal handler */
1058 env
->regs
[R_ESP
] = frame_addr
;
1059 env
->eip
= ka
->_sa_handler
;
1061 cpu_x86_load_seg(env
, R_DS
, __USER_DS
);
1062 cpu_x86_load_seg(env
, R_ES
, __USER_DS
);
1063 cpu_x86_load_seg(env
, R_SS
, __USER_DS
);
1064 cpu_x86_load_seg(env
, R_CS
, __USER_CS
);
1065 env
->eflags
&= ~TF_MASK
;
1067 unlock_user_struct(frame
, frame_addr
, 1);
1072 if (sig
== TARGET_SIGSEGV
) {
1073 ka
->_sa_handler
= TARGET_SIG_DFL
;
1075 force_sig(TARGET_SIGSEGV
/* , current */);
1079 restore_sigcontext(CPUX86State
*env
, struct target_sigcontext
*sc
)
1081 unsigned int err
= 0;
1082 abi_ulong fpstate_addr
;
1083 unsigned int tmpflags
;
1085 cpu_x86_load_seg(env
, R_GS
, tswap16(sc
->gs
));
1086 cpu_x86_load_seg(env
, R_FS
, tswap16(sc
->fs
));
1087 cpu_x86_load_seg(env
, R_ES
, tswap16(sc
->es
));
1088 cpu_x86_load_seg(env
, R_DS
, tswap16(sc
->ds
));
1090 env
->regs
[R_EDI
] = tswapl(sc
->edi
);
1091 env
->regs
[R_ESI
] = tswapl(sc
->esi
);
1092 env
->regs
[R_EBP
] = tswapl(sc
->ebp
);
1093 env
->regs
[R_ESP
] = tswapl(sc
->esp
);
1094 env
->regs
[R_EBX
] = tswapl(sc
->ebx
);
1095 env
->regs
[R_EDX
] = tswapl(sc
->edx
);
1096 env
->regs
[R_ECX
] = tswapl(sc
->ecx
);
1097 env
->regs
[R_EAX
] = tswapl(sc
->eax
);
1098 env
->eip
= tswapl(sc
->eip
);
1100 cpu_x86_load_seg(env
, R_CS
, lduw_p(&sc
->cs
) | 3);
1101 cpu_x86_load_seg(env
, R_SS
, lduw_p(&sc
->ss
) | 3);
1103 tmpflags
= tswapl(sc
->eflags
);
1104 env
->eflags
= (env
->eflags
& ~0x40DD5) | (tmpflags
& 0x40DD5);
1105 // regs->orig_eax = -1; /* disable syscall checks */
1107 fpstate_addr
= tswapl(sc
->fpstate
);
1108 if (fpstate_addr
!= 0) {
1109 if (!access_ok(VERIFY_READ
, fpstate_addr
,
1110 sizeof(struct target_fpstate
)))
1112 cpu_x86_frstor(env
, fpstate_addr
, 1);
1120 long do_sigreturn(CPUX86State
*env
)
1122 struct sigframe
*frame
;
1123 abi_ulong frame_addr
= env
->regs
[R_ESP
] - 8;
1124 target_sigset_t target_set
;
1128 trace_user_do_sigreturn(env
, frame_addr
);
1129 if (!lock_user_struct(VERIFY_READ
, frame
, frame_addr
, 1))
1131 /* set blocked signals */
1132 __get_user(target_set
.sig
[0], &frame
->sc
.oldmask
);
1133 for(i
= 1; i
< TARGET_NSIG_WORDS
; i
++) {
1134 __get_user(target_set
.sig
[i
], &frame
->extramask
[i
- 1]);
1137 target_to_host_sigset_internal(&set
, &target_set
);
1140 /* restore registers */
1141 if (restore_sigcontext(env
, &frame
->sc
))
1143 unlock_user_struct(frame
, frame_addr
, 0);
1144 return -TARGET_QEMU_ESIGRETURN
;
1147 unlock_user_struct(frame
, frame_addr
, 0);
1148 force_sig(TARGET_SIGSEGV
);
1152 long do_rt_sigreturn(CPUX86State
*env
)
1154 abi_ulong frame_addr
;
1155 struct rt_sigframe
*frame
;
1158 frame_addr
= env
->regs
[R_ESP
] - 4;
1159 trace_user_do_rt_sigreturn(env
, frame_addr
);
1160 if (!lock_user_struct(VERIFY_READ
, frame
, frame_addr
, 1))
1162 target_to_host_sigset(&set
, &frame
->uc
.tuc_sigmask
);
1165 if (restore_sigcontext(env
, &frame
->uc
.tuc_mcontext
)) {
1169 if (do_sigaltstack(frame_addr
+ offsetof(struct rt_sigframe
, uc
.tuc_stack
), 0,
1170 get_sp_from_cpustate(env
)) == -EFAULT
) {
1174 unlock_user_struct(frame
, frame_addr
, 0);
1175 return -TARGET_QEMU_ESIGRETURN
;
1178 unlock_user_struct(frame
, frame_addr
, 0);
1179 force_sig(TARGET_SIGSEGV
);
1183 #elif defined(TARGET_AARCH64)
1185 struct target_sigcontext
{
1186 uint64_t fault_address
;
1187 /* AArch64 registers */
1192 /* 4K reserved for FP/SIMD state and future expansion */
1193 char __reserved
[4096] __attribute__((__aligned__(16)));
1196 struct target_ucontext
{
1197 abi_ulong tuc_flags
;
1199 target_stack_t tuc_stack
;
1200 target_sigset_t tuc_sigmask
;
1201 /* glibc uses a 1024-bit sigset_t */
1202 char __unused
[1024 / 8 - sizeof(target_sigset_t
)];
1203 /* last for future expansion */
1204 struct target_sigcontext tuc_mcontext
;
1208 * Header to be used at the beginning of structures extending the user
1209 * context. Such structures must be placed after the rt_sigframe on the stack
1210 * and be 16-byte aligned. The last structure must be a dummy one with the
1211 * magic and size set to 0.
1213 struct target_aarch64_ctx
{
1218 #define TARGET_FPSIMD_MAGIC 0x46508001
1220 struct target_fpsimd_context
{
1221 struct target_aarch64_ctx head
;
1224 uint64_t vregs
[32 * 2]; /* really uint128_t vregs[32] */
1228 * Auxiliary context saved in the sigcontext.__reserved array. Not exported to
1229 * user space as it will change with the addition of new context. User space
1230 * should check the magic/size information.
1232 struct target_aux_context
{
1233 struct target_fpsimd_context fpsimd
;
1234 /* additional context to be added before "end" */
1235 struct target_aarch64_ctx end
;
1238 struct target_rt_sigframe
{
1239 struct target_siginfo info
;
1240 struct target_ucontext uc
;
1246 static int target_setup_sigframe(struct target_rt_sigframe
*sf
,
1247 CPUARMState
*env
, target_sigset_t
*set
)
1250 struct target_aux_context
*aux
=
1251 (struct target_aux_context
*)sf
->uc
.tuc_mcontext
.__reserved
;
1253 /* set up the stack frame for unwinding */
1254 __put_user(env
->xregs
[29], &sf
->fp
);
1255 __put_user(env
->xregs
[30], &sf
->lr
);
1257 for (i
= 0; i
< 31; i
++) {
1258 __put_user(env
->xregs
[i
], &sf
->uc
.tuc_mcontext
.regs
[i
]);
1260 __put_user(env
->xregs
[31], &sf
->uc
.tuc_mcontext
.sp
);
1261 __put_user(env
->pc
, &sf
->uc
.tuc_mcontext
.pc
);
1262 __put_user(pstate_read(env
), &sf
->uc
.tuc_mcontext
.pstate
);
1264 __put_user(env
->exception
.vaddress
, &sf
->uc
.tuc_mcontext
.fault_address
);
1266 for (i
= 0; i
< TARGET_NSIG_WORDS
; i
++) {
1267 __put_user(set
->sig
[i
], &sf
->uc
.tuc_sigmask
.sig
[i
]);
1270 for (i
= 0; i
< 32; i
++) {
1271 #ifdef TARGET_WORDS_BIGENDIAN
1272 __put_user(env
->vfp
.regs
[i
* 2], &aux
->fpsimd
.vregs
[i
* 2 + 1]);
1273 __put_user(env
->vfp
.regs
[i
* 2 + 1], &aux
->fpsimd
.vregs
[i
* 2]);
1275 __put_user(env
->vfp
.regs
[i
* 2], &aux
->fpsimd
.vregs
[i
* 2]);
1276 __put_user(env
->vfp
.regs
[i
* 2 + 1], &aux
->fpsimd
.vregs
[i
* 2 + 1]);
1279 __put_user(vfp_get_fpsr(env
), &aux
->fpsimd
.fpsr
);
1280 __put_user(vfp_get_fpcr(env
), &aux
->fpsimd
.fpcr
);
1281 __put_user(TARGET_FPSIMD_MAGIC
, &aux
->fpsimd
.head
.magic
);
1282 __put_user(sizeof(struct target_fpsimd_context
),
1283 &aux
->fpsimd
.head
.size
);
1285 /* set the "end" magic */
1286 __put_user(0, &aux
->end
.magic
);
1287 __put_user(0, &aux
->end
.size
);
1292 static int target_restore_sigframe(CPUARMState
*env
,
1293 struct target_rt_sigframe
*sf
)
1297 struct target_aux_context
*aux
=
1298 (struct target_aux_context
*)sf
->uc
.tuc_mcontext
.__reserved
;
1299 uint32_t magic
, size
, fpsr
, fpcr
;
1302 target_to_host_sigset(&set
, &sf
->uc
.tuc_sigmask
);
1305 for (i
= 0; i
< 31; i
++) {
1306 __get_user(env
->xregs
[i
], &sf
->uc
.tuc_mcontext
.regs
[i
]);
1309 __get_user(env
->xregs
[31], &sf
->uc
.tuc_mcontext
.sp
);
1310 __get_user(env
->pc
, &sf
->uc
.tuc_mcontext
.pc
);
1311 __get_user(pstate
, &sf
->uc
.tuc_mcontext
.pstate
);
1312 pstate_write(env
, pstate
);
1314 __get_user(magic
, &aux
->fpsimd
.head
.magic
);
1315 __get_user(size
, &aux
->fpsimd
.head
.size
);
1317 if (magic
!= TARGET_FPSIMD_MAGIC
1318 || size
!= sizeof(struct target_fpsimd_context
)) {
1322 for (i
= 0; i
< 32; i
++) {
1323 #ifdef TARGET_WORDS_BIGENDIAN
1324 __get_user(env
->vfp
.regs
[i
* 2], &aux
->fpsimd
.vregs
[i
* 2 + 1]);
1325 __get_user(env
->vfp
.regs
[i
* 2 + 1], &aux
->fpsimd
.vregs
[i
* 2]);
1327 __get_user(env
->vfp
.regs
[i
* 2], &aux
->fpsimd
.vregs
[i
* 2]);
1328 __get_user(env
->vfp
.regs
[i
* 2 + 1], &aux
->fpsimd
.vregs
[i
* 2 + 1]);
1331 __get_user(fpsr
, &aux
->fpsimd
.fpsr
);
1332 vfp_set_fpsr(env
, fpsr
);
1333 __get_user(fpcr
, &aux
->fpsimd
.fpcr
);
1334 vfp_set_fpcr(env
, fpcr
);
1339 static abi_ulong
get_sigframe(struct target_sigaction
*ka
, CPUARMState
*env
)
1343 sp
= env
->xregs
[31];
1346 * This is the X/Open sanctioned signal stack switching.
1348 if ((ka
->sa_flags
& TARGET_SA_ONSTACK
) && !sas_ss_flags(sp
)) {
1349 sp
= target_sigaltstack_used
.ss_sp
+ target_sigaltstack_used
.ss_size
;
1352 sp
= (sp
- sizeof(struct target_rt_sigframe
)) & ~15;
1357 static void target_setup_frame(int usig
, struct target_sigaction
*ka
,
1358 target_siginfo_t
*info
, target_sigset_t
*set
,
1361 struct target_rt_sigframe
*frame
;
1362 abi_ulong frame_addr
, return_addr
;
1364 frame_addr
= get_sigframe(ka
, env
);
1365 trace_user_setup_frame(env
, frame_addr
);
1366 if (!lock_user_struct(VERIFY_WRITE
, frame
, frame_addr
, 0)) {
1370 __put_user(0, &frame
->uc
.tuc_flags
);
1371 __put_user(0, &frame
->uc
.tuc_link
);
1373 __put_user(target_sigaltstack_used
.ss_sp
,
1374 &frame
->uc
.tuc_stack
.ss_sp
);
1375 __put_user(sas_ss_flags(env
->xregs
[31]),
1376 &frame
->uc
.tuc_stack
.ss_flags
);
1377 __put_user(target_sigaltstack_used
.ss_size
,
1378 &frame
->uc
.tuc_stack
.ss_size
);
1379 target_setup_sigframe(frame
, env
, set
);
1380 if (ka
->sa_flags
& TARGET_SA_RESTORER
) {
1381 return_addr
= ka
->sa_restorer
;
1383 /* mov x8,#__NR_rt_sigreturn; svc #0 */
1384 __put_user(0xd2801168, &frame
->tramp
[0]);
1385 __put_user(0xd4000001, &frame
->tramp
[1]);
1386 return_addr
= frame_addr
+ offsetof(struct target_rt_sigframe
, tramp
);
1388 env
->xregs
[0] = usig
;
1389 env
->xregs
[31] = frame_addr
;
1390 env
->xregs
[29] = env
->xregs
[31] + offsetof(struct target_rt_sigframe
, fp
);
1391 env
->pc
= ka
->_sa_handler
;
1392 env
->xregs
[30] = return_addr
;
1394 tswap_siginfo(&frame
->info
, info
);
1395 env
->xregs
[1] = frame_addr
+ offsetof(struct target_rt_sigframe
, info
);
1396 env
->xregs
[2] = frame_addr
+ offsetof(struct target_rt_sigframe
, uc
);
1399 unlock_user_struct(frame
, frame_addr
, 1);
1403 unlock_user_struct(frame
, frame_addr
, 1);
1404 force_sig(TARGET_SIGSEGV
);
1407 static void setup_rt_frame(int sig
, struct target_sigaction
*ka
,
1408 target_siginfo_t
*info
, target_sigset_t
*set
,
1411 target_setup_frame(sig
, ka
, info
, set
, env
);
1414 static void setup_frame(int sig
, struct target_sigaction
*ka
,
1415 target_sigset_t
*set
, CPUARMState
*env
)
1417 target_setup_frame(sig
, ka
, 0, set
, env
);
1420 long do_rt_sigreturn(CPUARMState
*env
)
1422 struct target_rt_sigframe
*frame
= NULL
;
1423 abi_ulong frame_addr
= env
->xregs
[31];
1425 trace_user_do_rt_sigreturn(env
, frame_addr
);
1426 if (frame_addr
& 15) {
1430 if (!lock_user_struct(VERIFY_READ
, frame
, frame_addr
, 1)) {
1434 if (target_restore_sigframe(env
, frame
)) {
1438 if (do_sigaltstack(frame_addr
+
1439 offsetof(struct target_rt_sigframe
, uc
.tuc_stack
),
1440 0, get_sp_from_cpustate(env
)) == -EFAULT
) {
1444 unlock_user_struct(frame
, frame_addr
, 0);
1445 return -TARGET_QEMU_ESIGRETURN
;
1448 unlock_user_struct(frame
, frame_addr
, 0);
1449 force_sig(TARGET_SIGSEGV
);
1453 long do_sigreturn(CPUARMState
*env
)
1455 return do_rt_sigreturn(env
);
1458 #elif defined(TARGET_ARM)
1460 struct target_sigcontext
{
1462 abi_ulong error_code
;
1481 abi_ulong fault_address
;
1484 struct target_ucontext_v1
{
1485 abi_ulong tuc_flags
;
1487 target_stack_t tuc_stack
;
1488 struct target_sigcontext tuc_mcontext
;
1489 target_sigset_t tuc_sigmask
; /* mask last for extensibility */
1492 struct target_ucontext_v2
{
1493 abi_ulong tuc_flags
;
1495 target_stack_t tuc_stack
;
1496 struct target_sigcontext tuc_mcontext
;
1497 target_sigset_t tuc_sigmask
; /* mask last for extensibility */
1498 char __unused
[128 - sizeof(target_sigset_t
)];
1499 abi_ulong tuc_regspace
[128] __attribute__((__aligned__(8)));
1502 struct target_user_vfp
{
1503 uint64_t fpregs
[32];
1507 struct target_user_vfp_exc
{
1513 struct target_vfp_sigframe
{
1516 struct target_user_vfp ufp
;
1517 struct target_user_vfp_exc ufp_exc
;
1518 } __attribute__((__aligned__(8)));
1520 struct target_iwmmxt_sigframe
{
1524 /* Note that not all the coprocessor control registers are stored here */
1531 } __attribute__((__aligned__(8)));
1533 #define TARGET_VFP_MAGIC 0x56465001
1534 #define TARGET_IWMMXT_MAGIC 0x12ef842a
1538 struct target_sigcontext sc
;
1539 abi_ulong extramask
[TARGET_NSIG_WORDS
-1];
1545 struct target_ucontext_v2 uc
;
1549 struct rt_sigframe_v1
1553 struct target_siginfo info
;
1554 struct target_ucontext_v1 uc
;
1558 struct rt_sigframe_v2
1560 struct target_siginfo info
;
1561 struct target_ucontext_v2 uc
;
1565 #define TARGET_CONFIG_CPU_32 1
1568 * For ARM syscalls, we encode the syscall number into the instruction.
1570 #define SWI_SYS_SIGRETURN (0xef000000|(TARGET_NR_sigreturn + ARM_SYSCALL_BASE))
1571 #define SWI_SYS_RT_SIGRETURN (0xef000000|(TARGET_NR_rt_sigreturn + ARM_SYSCALL_BASE))
1574 * For Thumb syscalls, we pass the syscall number via r7. We therefore
1575 * need two 16-bit instructions.
1577 #define SWI_THUMB_SIGRETURN (0xdf00 << 16 | 0x2700 | (TARGET_NR_sigreturn))
1578 #define SWI_THUMB_RT_SIGRETURN (0xdf00 << 16 | 0x2700 | (TARGET_NR_rt_sigreturn))
1580 static const abi_ulong retcodes
[4] = {
1581 SWI_SYS_SIGRETURN
, SWI_THUMB_SIGRETURN
,
1582 SWI_SYS_RT_SIGRETURN
, SWI_THUMB_RT_SIGRETURN
1586 static inline int valid_user_regs(CPUARMState
*regs
)
1592 setup_sigcontext(struct target_sigcontext
*sc
, /*struct _fpstate *fpstate,*/
1593 CPUARMState
*env
, abi_ulong mask
)
1595 __put_user(env
->regs
[0], &sc
->arm_r0
);
1596 __put_user(env
->regs
[1], &sc
->arm_r1
);
1597 __put_user(env
->regs
[2], &sc
->arm_r2
);
1598 __put_user(env
->regs
[3], &sc
->arm_r3
);
1599 __put_user(env
->regs
[4], &sc
->arm_r4
);
1600 __put_user(env
->regs
[5], &sc
->arm_r5
);
1601 __put_user(env
->regs
[6], &sc
->arm_r6
);
1602 __put_user(env
->regs
[7], &sc
->arm_r7
);
1603 __put_user(env
->regs
[8], &sc
->arm_r8
);
1604 __put_user(env
->regs
[9], &sc
->arm_r9
);
1605 __put_user(env
->regs
[10], &sc
->arm_r10
);
1606 __put_user(env
->regs
[11], &sc
->arm_fp
);
1607 __put_user(env
->regs
[12], &sc
->arm_ip
);
1608 __put_user(env
->regs
[13], &sc
->arm_sp
);
1609 __put_user(env
->regs
[14], &sc
->arm_lr
);
1610 __put_user(env
->regs
[15], &sc
->arm_pc
);
1611 #ifdef TARGET_CONFIG_CPU_32
1612 __put_user(cpsr_read(env
), &sc
->arm_cpsr
);
1615 __put_user(/* current->thread.trap_no */ 0, &sc
->trap_no
);
1616 __put_user(/* current->thread.error_code */ 0, &sc
->error_code
);
1617 __put_user(/* current->thread.address */ 0, &sc
->fault_address
);
1618 __put_user(mask
, &sc
->oldmask
);
1621 static inline abi_ulong
1622 get_sigframe(struct target_sigaction
*ka
, CPUARMState
*regs
, int framesize
)
1624 unsigned long sp
= regs
->regs
[13];
1627 * This is the X/Open sanctioned signal stack switching.
1629 if ((ka
->sa_flags
& TARGET_SA_ONSTACK
) && !sas_ss_flags(sp
)) {
1630 sp
= target_sigaltstack_used
.ss_sp
+ target_sigaltstack_used
.ss_size
;
1633 * ATPCS B01 mandates 8-byte alignment
1635 return (sp
- framesize
) & ~7;
1639 setup_return(CPUARMState
*env
, struct target_sigaction
*ka
,
1640 abi_ulong
*rc
, abi_ulong frame_addr
, int usig
, abi_ulong rc_addr
)
1642 abi_ulong handler
= ka
->_sa_handler
;
1644 int thumb
= handler
& 1;
1645 uint32_t cpsr
= cpsr_read(env
);
1654 if (ka
->sa_flags
& TARGET_SA_RESTORER
) {
1655 retcode
= ka
->sa_restorer
;
1657 unsigned int idx
= thumb
;
1659 if (ka
->sa_flags
& TARGET_SA_SIGINFO
) {
1663 __put_user(retcodes
[idx
], rc
);
1665 retcode
= rc_addr
+ thumb
;
1668 env
->regs
[0] = usig
;
1669 env
->regs
[13] = frame_addr
;
1670 env
->regs
[14] = retcode
;
1671 env
->regs
[15] = handler
& (thumb
? ~1 : ~3);
1672 cpsr_write(env
, cpsr
, CPSR_IT
| CPSR_T
, CPSRWriteByInstr
);
1675 static abi_ulong
*setup_sigframe_v2_vfp(abi_ulong
*regspace
, CPUARMState
*env
)
1678 struct target_vfp_sigframe
*vfpframe
;
1679 vfpframe
= (struct target_vfp_sigframe
*)regspace
;
1680 __put_user(TARGET_VFP_MAGIC
, &vfpframe
->magic
);
1681 __put_user(sizeof(*vfpframe
), &vfpframe
->size
);
1682 for (i
= 0; i
< 32; i
++) {
1683 __put_user(float64_val(env
->vfp
.regs
[i
]), &vfpframe
->ufp
.fpregs
[i
]);
1685 __put_user(vfp_get_fpscr(env
), &vfpframe
->ufp
.fpscr
);
1686 __put_user(env
->vfp
.xregs
[ARM_VFP_FPEXC
], &vfpframe
->ufp_exc
.fpexc
);
1687 __put_user(env
->vfp
.xregs
[ARM_VFP_FPINST
], &vfpframe
->ufp_exc
.fpinst
);
1688 __put_user(env
->vfp
.xregs
[ARM_VFP_FPINST2
], &vfpframe
->ufp_exc
.fpinst2
);
1689 return (abi_ulong
*)(vfpframe
+1);
1692 static abi_ulong
*setup_sigframe_v2_iwmmxt(abi_ulong
*regspace
,
1696 struct target_iwmmxt_sigframe
*iwmmxtframe
;
1697 iwmmxtframe
= (struct target_iwmmxt_sigframe
*)regspace
;
1698 __put_user(TARGET_IWMMXT_MAGIC
, &iwmmxtframe
->magic
);
1699 __put_user(sizeof(*iwmmxtframe
), &iwmmxtframe
->size
);
1700 for (i
= 0; i
< 16; i
++) {
1701 __put_user(env
->iwmmxt
.regs
[i
], &iwmmxtframe
->regs
[i
]);
1703 __put_user(env
->vfp
.xregs
[ARM_IWMMXT_wCSSF
], &iwmmxtframe
->wcssf
);
1704 __put_user(env
->vfp
.xregs
[ARM_IWMMXT_wCASF
], &iwmmxtframe
->wcssf
);
1705 __put_user(env
->vfp
.xregs
[ARM_IWMMXT_wCGR0
], &iwmmxtframe
->wcgr0
);
1706 __put_user(env
->vfp
.xregs
[ARM_IWMMXT_wCGR1
], &iwmmxtframe
->wcgr1
);
1707 __put_user(env
->vfp
.xregs
[ARM_IWMMXT_wCGR2
], &iwmmxtframe
->wcgr2
);
1708 __put_user(env
->vfp
.xregs
[ARM_IWMMXT_wCGR3
], &iwmmxtframe
->wcgr3
);
1709 return (abi_ulong
*)(iwmmxtframe
+1);
1712 static void setup_sigframe_v2(struct target_ucontext_v2
*uc
,
1713 target_sigset_t
*set
, CPUARMState
*env
)
1715 struct target_sigaltstack stack
;
1717 abi_ulong
*regspace
;
1719 /* Clear all the bits of the ucontext we don't use. */
1720 memset(uc
, 0, offsetof(struct target_ucontext_v2
, tuc_mcontext
));
1722 memset(&stack
, 0, sizeof(stack
));
1723 __put_user(target_sigaltstack_used
.ss_sp
, &stack
.ss_sp
);
1724 __put_user(target_sigaltstack_used
.ss_size
, &stack
.ss_size
);
1725 __put_user(sas_ss_flags(get_sp_from_cpustate(env
)), &stack
.ss_flags
);
1726 memcpy(&uc
->tuc_stack
, &stack
, sizeof(stack
));
1728 setup_sigcontext(&uc
->tuc_mcontext
, env
, set
->sig
[0]);
1729 /* Save coprocessor signal frame. */
1730 regspace
= uc
->tuc_regspace
;
1731 if (arm_feature(env
, ARM_FEATURE_VFP
)) {
1732 regspace
= setup_sigframe_v2_vfp(regspace
, env
);
1734 if (arm_feature(env
, ARM_FEATURE_IWMMXT
)) {
1735 regspace
= setup_sigframe_v2_iwmmxt(regspace
, env
);
1738 /* Write terminating magic word */
1739 __put_user(0, regspace
);
1741 for(i
= 0; i
< TARGET_NSIG_WORDS
; i
++) {
1742 __put_user(set
->sig
[i
], &uc
->tuc_sigmask
.sig
[i
]);
1746 /* compare linux/arch/arm/kernel/signal.c:setup_frame() */
1747 static void setup_frame_v1(int usig
, struct target_sigaction
*ka
,
1748 target_sigset_t
*set
, CPUARMState
*regs
)
1750 struct sigframe_v1
*frame
;
1751 abi_ulong frame_addr
= get_sigframe(ka
, regs
, sizeof(*frame
));
1754 trace_user_setup_frame(regs
, frame_addr
);
1755 if (!lock_user_struct(VERIFY_WRITE
, frame
, frame_addr
, 0)) {
1759 setup_sigcontext(&frame
->sc
, regs
, set
->sig
[0]);
1761 for(i
= 1; i
< TARGET_NSIG_WORDS
; i
++) {
1762 __put_user(set
->sig
[i
], &frame
->extramask
[i
- 1]);
1765 setup_return(regs
, ka
, &frame
->retcode
, frame_addr
, usig
,
1766 frame_addr
+ offsetof(struct sigframe_v1
, retcode
));
1768 unlock_user_struct(frame
, frame_addr
, 1);
1771 static void setup_frame_v2(int usig
, struct target_sigaction
*ka
,
1772 target_sigset_t
*set
, CPUARMState
*regs
)
1774 struct sigframe_v2
*frame
;
1775 abi_ulong frame_addr
= get_sigframe(ka
, regs
, sizeof(*frame
));
1777 trace_user_setup_frame(regs
, frame_addr
);
1778 if (!lock_user_struct(VERIFY_WRITE
, frame
, frame_addr
, 0)) {
1782 setup_sigframe_v2(&frame
->uc
, set
, regs
);
1784 setup_return(regs
, ka
, &frame
->retcode
, frame_addr
, usig
,
1785 frame_addr
+ offsetof(struct sigframe_v2
, retcode
));
1787 unlock_user_struct(frame
, frame_addr
, 1);
1790 static void setup_frame(int usig
, struct target_sigaction
*ka
,
1791 target_sigset_t
*set
, CPUARMState
*regs
)
1793 if (get_osversion() >= 0x020612) {
1794 setup_frame_v2(usig
, ka
, set
, regs
);
1796 setup_frame_v1(usig
, ka
, set
, regs
);
1800 /* compare linux/arch/arm/kernel/signal.c:setup_rt_frame() */
1801 static void setup_rt_frame_v1(int usig
, struct target_sigaction
*ka
,
1802 target_siginfo_t
*info
,
1803 target_sigset_t
*set
, CPUARMState
*env
)
1805 struct rt_sigframe_v1
*frame
;
1806 abi_ulong frame_addr
= get_sigframe(ka
, env
, sizeof(*frame
));
1807 struct target_sigaltstack stack
;
1809 abi_ulong info_addr
, uc_addr
;
1811 trace_user_setup_rt_frame(env
, frame_addr
);
1812 if (!lock_user_struct(VERIFY_WRITE
, frame
, frame_addr
, 0)) {
1816 info_addr
= frame_addr
+ offsetof(struct rt_sigframe_v1
, info
);
1817 __put_user(info_addr
, &frame
->pinfo
);
1818 uc_addr
= frame_addr
+ offsetof(struct rt_sigframe_v1
, uc
);
1819 __put_user(uc_addr
, &frame
->puc
);
1820 tswap_siginfo(&frame
->info
, info
);
1822 /* Clear all the bits of the ucontext we don't use. */
1823 memset(&frame
->uc
, 0, offsetof(struct target_ucontext_v1
, tuc_mcontext
));
1825 memset(&stack
, 0, sizeof(stack
));
1826 __put_user(target_sigaltstack_used
.ss_sp
, &stack
.ss_sp
);
1827 __put_user(target_sigaltstack_used
.ss_size
, &stack
.ss_size
);
1828 __put_user(sas_ss_flags(get_sp_from_cpustate(env
)), &stack
.ss_flags
);
1829 memcpy(&frame
->uc
.tuc_stack
, &stack
, sizeof(stack
));
1831 setup_sigcontext(&frame
->uc
.tuc_mcontext
, env
, set
->sig
[0]);
1832 for(i
= 0; i
< TARGET_NSIG_WORDS
; i
++) {
1833 __put_user(set
->sig
[i
], &frame
->uc
.tuc_sigmask
.sig
[i
]);
1836 setup_return(env
, ka
, &frame
->retcode
, frame_addr
, usig
,
1837 frame_addr
+ offsetof(struct rt_sigframe_v1
, retcode
));
1839 env
->regs
[1] = info_addr
;
1840 env
->regs
[2] = uc_addr
;
1842 unlock_user_struct(frame
, frame_addr
, 1);
1845 static void setup_rt_frame_v2(int usig
, struct target_sigaction
*ka
,
1846 target_siginfo_t
*info
,
1847 target_sigset_t
*set
, CPUARMState
*env
)
1849 struct rt_sigframe_v2
*frame
;
1850 abi_ulong frame_addr
= get_sigframe(ka
, env
, sizeof(*frame
));
1851 abi_ulong info_addr
, uc_addr
;
1853 trace_user_setup_rt_frame(env
, frame_addr
);
1854 if (!lock_user_struct(VERIFY_WRITE
, frame
, frame_addr
, 0)) {
1858 info_addr
= frame_addr
+ offsetof(struct rt_sigframe_v2
, info
);
1859 uc_addr
= frame_addr
+ offsetof(struct rt_sigframe_v2
, uc
);
1860 tswap_siginfo(&frame
->info
, info
);
1862 setup_sigframe_v2(&frame
->uc
, set
, env
);
1864 setup_return(env
, ka
, &frame
->retcode
, frame_addr
, usig
,
1865 frame_addr
+ offsetof(struct rt_sigframe_v2
, retcode
));
1867 env
->regs
[1] = info_addr
;
1868 env
->regs
[2] = uc_addr
;
1870 unlock_user_struct(frame
, frame_addr
, 1);
1873 static void setup_rt_frame(int usig
, struct target_sigaction
*ka
,
1874 target_siginfo_t
*info
,
1875 target_sigset_t
*set
, CPUARMState
*env
)
1877 if (get_osversion() >= 0x020612) {
1878 setup_rt_frame_v2(usig
, ka
, info
, set
, env
);
1880 setup_rt_frame_v1(usig
, ka
, info
, set
, env
);
1885 restore_sigcontext(CPUARMState
*env
, struct target_sigcontext
*sc
)
1890 __get_user(env
->regs
[0], &sc
->arm_r0
);
1891 __get_user(env
->regs
[1], &sc
->arm_r1
);
1892 __get_user(env
->regs
[2], &sc
->arm_r2
);
1893 __get_user(env
->regs
[3], &sc
->arm_r3
);
1894 __get_user(env
->regs
[4], &sc
->arm_r4
);
1895 __get_user(env
->regs
[5], &sc
->arm_r5
);
1896 __get_user(env
->regs
[6], &sc
->arm_r6
);
1897 __get_user(env
->regs
[7], &sc
->arm_r7
);
1898 __get_user(env
->regs
[8], &sc
->arm_r8
);
1899 __get_user(env
->regs
[9], &sc
->arm_r9
);
1900 __get_user(env
->regs
[10], &sc
->arm_r10
);
1901 __get_user(env
->regs
[11], &sc
->arm_fp
);
1902 __get_user(env
->regs
[12], &sc
->arm_ip
);
1903 __get_user(env
->regs
[13], &sc
->arm_sp
);
1904 __get_user(env
->regs
[14], &sc
->arm_lr
);
1905 __get_user(env
->regs
[15], &sc
->arm_pc
);
1906 #ifdef TARGET_CONFIG_CPU_32
1907 __get_user(cpsr
, &sc
->arm_cpsr
);
1908 cpsr_write(env
, cpsr
, CPSR_USER
| CPSR_EXEC
, CPSRWriteByInstr
);
1911 err
|= !valid_user_regs(env
);
1916 static long do_sigreturn_v1(CPUARMState
*env
)
1918 abi_ulong frame_addr
;
1919 struct sigframe_v1
*frame
= NULL
;
1920 target_sigset_t set
;
1925 * Since we stacked the signal on a 64-bit boundary,
1926 * then 'sp' should be word aligned here. If it's
1927 * not, then the user is trying to mess with us.
1929 frame_addr
= env
->regs
[13];
1930 trace_user_do_sigreturn(env
, frame_addr
);
1931 if (frame_addr
& 7) {
1935 if (!lock_user_struct(VERIFY_READ
, frame
, frame_addr
, 1)) {
1939 __get_user(set
.sig
[0], &frame
->sc
.oldmask
);
1940 for(i
= 1; i
< TARGET_NSIG_WORDS
; i
++) {
1941 __get_user(set
.sig
[i
], &frame
->extramask
[i
- 1]);
1944 target_to_host_sigset_internal(&host_set
, &set
);
1945 set_sigmask(&host_set
);
1947 if (restore_sigcontext(env
, &frame
->sc
)) {
1952 /* Send SIGTRAP if we're single-stepping */
1953 if (ptrace_cancel_bpt(current
))
1954 send_sig(SIGTRAP
, current
, 1);
1956 unlock_user_struct(frame
, frame_addr
, 0);
1957 return -TARGET_QEMU_ESIGRETURN
;
1960 force_sig(TARGET_SIGSEGV
/* , current */);
1964 static abi_ulong
*restore_sigframe_v2_vfp(CPUARMState
*env
, abi_ulong
*regspace
)
1967 abi_ulong magic
, sz
;
1968 uint32_t fpscr
, fpexc
;
1969 struct target_vfp_sigframe
*vfpframe
;
1970 vfpframe
= (struct target_vfp_sigframe
*)regspace
;
1972 __get_user(magic
, &vfpframe
->magic
);
1973 __get_user(sz
, &vfpframe
->size
);
1974 if (magic
!= TARGET_VFP_MAGIC
|| sz
!= sizeof(*vfpframe
)) {
1977 for (i
= 0; i
< 32; i
++) {
1978 __get_user(float64_val(env
->vfp
.regs
[i
]), &vfpframe
->ufp
.fpregs
[i
]);
1980 __get_user(fpscr
, &vfpframe
->ufp
.fpscr
);
1981 vfp_set_fpscr(env
, fpscr
);
1982 __get_user(fpexc
, &vfpframe
->ufp_exc
.fpexc
);
1983 /* Sanitise FPEXC: ensure VFP is enabled, FPINST2 is invalid
1984 * and the exception flag is cleared
1987 fpexc
&= ~((1 << 31) | (1 << 28));
1988 env
->vfp
.xregs
[ARM_VFP_FPEXC
] = fpexc
;
1989 __get_user(env
->vfp
.xregs
[ARM_VFP_FPINST
], &vfpframe
->ufp_exc
.fpinst
);
1990 __get_user(env
->vfp
.xregs
[ARM_VFP_FPINST2
], &vfpframe
->ufp_exc
.fpinst2
);
1991 return (abi_ulong
*)(vfpframe
+ 1);
1994 static abi_ulong
*restore_sigframe_v2_iwmmxt(CPUARMState
*env
,
1995 abi_ulong
*regspace
)
1998 abi_ulong magic
, sz
;
1999 struct target_iwmmxt_sigframe
*iwmmxtframe
;
2000 iwmmxtframe
= (struct target_iwmmxt_sigframe
*)regspace
;
2002 __get_user(magic
, &iwmmxtframe
->magic
);
2003 __get_user(sz
, &iwmmxtframe
->size
);
2004 if (magic
!= TARGET_IWMMXT_MAGIC
|| sz
!= sizeof(*iwmmxtframe
)) {
2007 for (i
= 0; i
< 16; i
++) {
2008 __get_user(env
->iwmmxt
.regs
[i
], &iwmmxtframe
->regs
[i
]);
2010 __get_user(env
->vfp
.xregs
[ARM_IWMMXT_wCSSF
], &iwmmxtframe
->wcssf
);
2011 __get_user(env
->vfp
.xregs
[ARM_IWMMXT_wCASF
], &iwmmxtframe
->wcssf
);
2012 __get_user(env
->vfp
.xregs
[ARM_IWMMXT_wCGR0
], &iwmmxtframe
->wcgr0
);
2013 __get_user(env
->vfp
.xregs
[ARM_IWMMXT_wCGR1
], &iwmmxtframe
->wcgr1
);
2014 __get_user(env
->vfp
.xregs
[ARM_IWMMXT_wCGR2
], &iwmmxtframe
->wcgr2
);
2015 __get_user(env
->vfp
.xregs
[ARM_IWMMXT_wCGR3
], &iwmmxtframe
->wcgr3
);
2016 return (abi_ulong
*)(iwmmxtframe
+ 1);
2019 static int do_sigframe_return_v2(CPUARMState
*env
, target_ulong frame_addr
,
2020 struct target_ucontext_v2
*uc
)
2023 abi_ulong
*regspace
;
2025 target_to_host_sigset(&host_set
, &uc
->tuc_sigmask
);
2026 set_sigmask(&host_set
);
2028 if (restore_sigcontext(env
, &uc
->tuc_mcontext
))
2031 /* Restore coprocessor signal frame */
2032 regspace
= uc
->tuc_regspace
;
2033 if (arm_feature(env
, ARM_FEATURE_VFP
)) {
2034 regspace
= restore_sigframe_v2_vfp(env
, regspace
);
2039 if (arm_feature(env
, ARM_FEATURE_IWMMXT
)) {
2040 regspace
= restore_sigframe_v2_iwmmxt(env
, regspace
);
2046 if (do_sigaltstack(frame_addr
+ offsetof(struct target_ucontext_v2
, tuc_stack
), 0, get_sp_from_cpustate(env
)) == -EFAULT
)
2050 /* Send SIGTRAP if we're single-stepping */
2051 if (ptrace_cancel_bpt(current
))
2052 send_sig(SIGTRAP
, current
, 1);
2058 static long do_sigreturn_v2(CPUARMState
*env
)
2060 abi_ulong frame_addr
;
2061 struct sigframe_v2
*frame
= NULL
;
2064 * Since we stacked the signal on a 64-bit boundary,
2065 * then 'sp' should be word aligned here. If it's
2066 * not, then the user is trying to mess with us.
2068 frame_addr
= env
->regs
[13];
2069 trace_user_do_sigreturn(env
, frame_addr
);
2070 if (frame_addr
& 7) {
2074 if (!lock_user_struct(VERIFY_READ
, frame
, frame_addr
, 1)) {
2078 if (do_sigframe_return_v2(env
, frame_addr
, &frame
->uc
)) {
2082 unlock_user_struct(frame
, frame_addr
, 0);
2083 return -TARGET_QEMU_ESIGRETURN
;
2086 unlock_user_struct(frame
, frame_addr
, 0);
2087 force_sig(TARGET_SIGSEGV
/* , current */);
2091 long do_sigreturn(CPUARMState
*env
)
2093 if (get_osversion() >= 0x020612) {
2094 return do_sigreturn_v2(env
);
2096 return do_sigreturn_v1(env
);
2100 static long do_rt_sigreturn_v1(CPUARMState
*env
)
2102 abi_ulong frame_addr
;
2103 struct rt_sigframe_v1
*frame
= NULL
;
2107 * Since we stacked the signal on a 64-bit boundary,
2108 * then 'sp' should be word aligned here. If it's
2109 * not, then the user is trying to mess with us.
2111 frame_addr
= env
->regs
[13];
2112 trace_user_do_rt_sigreturn(env
, frame_addr
);
2113 if (frame_addr
& 7) {
2117 if (!lock_user_struct(VERIFY_READ
, frame
, frame_addr
, 1)) {
2121 target_to_host_sigset(&host_set
, &frame
->uc
.tuc_sigmask
);
2122 set_sigmask(&host_set
);
2124 if (restore_sigcontext(env
, &frame
->uc
.tuc_mcontext
)) {
2128 if (do_sigaltstack(frame_addr
+ offsetof(struct rt_sigframe_v1
, uc
.tuc_stack
), 0, get_sp_from_cpustate(env
)) == -EFAULT
)
2132 /* Send SIGTRAP if we're single-stepping */
2133 if (ptrace_cancel_bpt(current
))
2134 send_sig(SIGTRAP
, current
, 1);
2136 unlock_user_struct(frame
, frame_addr
, 0);
2137 return -TARGET_QEMU_ESIGRETURN
;
2140 unlock_user_struct(frame
, frame_addr
, 0);
2141 force_sig(TARGET_SIGSEGV
/* , current */);
2145 static long do_rt_sigreturn_v2(CPUARMState
*env
)
2147 abi_ulong frame_addr
;
2148 struct rt_sigframe_v2
*frame
= NULL
;
2151 * Since we stacked the signal on a 64-bit boundary,
2152 * then 'sp' should be word aligned here. If it's
2153 * not, then the user is trying to mess with us.
2155 frame_addr
= env
->regs
[13];
2156 trace_user_do_rt_sigreturn(env
, frame_addr
);
2157 if (frame_addr
& 7) {
2161 if (!lock_user_struct(VERIFY_READ
, frame
, frame_addr
, 1)) {
2165 if (do_sigframe_return_v2(env
, frame_addr
, &frame
->uc
)) {
2169 unlock_user_struct(frame
, frame_addr
, 0);
2170 return -TARGET_QEMU_ESIGRETURN
;
2173 unlock_user_struct(frame
, frame_addr
, 0);
2174 force_sig(TARGET_SIGSEGV
/* , current */);
2178 long do_rt_sigreturn(CPUARMState
*env
)
2180 if (get_osversion() >= 0x020612) {
2181 return do_rt_sigreturn_v2(env
);
2183 return do_rt_sigreturn_v1(env
);
2187 #elif defined(TARGET_SPARC)
2189 #define __SUNOS_MAXWIN 31
2191 /* This is what SunOS does, so shall I. */
2192 struct target_sigcontext
{
2193 abi_ulong sigc_onstack
; /* state to restore */
2195 abi_ulong sigc_mask
; /* sigmask to restore */
2196 abi_ulong sigc_sp
; /* stack pointer */
2197 abi_ulong sigc_pc
; /* program counter */
2198 abi_ulong sigc_npc
; /* next program counter */
2199 abi_ulong sigc_psr
; /* for condition codes etc */
2200 abi_ulong sigc_g1
; /* User uses these two registers */
2201 abi_ulong sigc_o0
; /* within the trampoline code. */
2203 /* Now comes information regarding the users window set
2204 * at the time of the signal.
2206 abi_ulong sigc_oswins
; /* outstanding windows */
2208 /* stack ptrs for each regwin buf */
2209 char *sigc_spbuf
[__SUNOS_MAXWIN
];
2211 /* Windows to restore after signal */
2213 abi_ulong locals
[8];
2215 } sigc_wbuf
[__SUNOS_MAXWIN
];
2217 /* A Sparc stack frame */
2218 struct sparc_stackf
{
2219 abi_ulong locals
[8];
2221 /* It's simpler to treat fp and callers_pc as elements of ins[]
2222 * since we never need to access them ourselves.
2226 abi_ulong xxargs
[1];
2235 abi_ulong u_regs
[16]; /* globals and ins */
2241 abi_ulong si_float_regs
[32];
2242 unsigned long si_fsr
;
2243 unsigned long si_fpqdepth
;
2245 unsigned long *insn_addr
;
2248 } qemu_siginfo_fpu_t
;
2251 struct target_signal_frame
{
2252 struct sparc_stackf ss
;
2255 abi_ulong insns
[2] __attribute__ ((aligned (8)));
2256 abi_ulong extramask
[TARGET_NSIG_WORDS
- 1];
2257 abi_ulong extra_size
; /* Should be 0 */
2258 qemu_siginfo_fpu_t fpu_state
;
2260 struct target_rt_signal_frame
{
2261 struct sparc_stackf ss
;
2266 unsigned int insns
[2];
2268 unsigned int extra_size
; /* Should be 0 */
2269 qemu_siginfo_fpu_t fpu_state
;
2283 #define UREG_FP UREG_I6
2284 #define UREG_SP UREG_O6
2286 static inline abi_ulong
get_sigframe(struct target_sigaction
*sa
,
2288 unsigned long framesize
)
2292 sp
= env
->regwptr
[UREG_FP
];
2294 /* This is the X/Open sanctioned signal stack switching. */
2295 if (sa
->sa_flags
& TARGET_SA_ONSTACK
) {
2296 if (!on_sig_stack(sp
)
2297 && !((target_sigaltstack_used
.ss_sp
+ target_sigaltstack_used
.ss_size
) & 7)) {
2298 sp
= target_sigaltstack_used
.ss_sp
+ target_sigaltstack_used
.ss_size
;
2301 return sp
- framesize
;
2305 setup___siginfo(__siginfo_t
*si
, CPUSPARCState
*env
, abi_ulong mask
)
2309 __put_user(env
->psr
, &si
->si_regs
.psr
);
2310 __put_user(env
->pc
, &si
->si_regs
.pc
);
2311 __put_user(env
->npc
, &si
->si_regs
.npc
);
2312 __put_user(env
->y
, &si
->si_regs
.y
);
2313 for (i
=0; i
< 8; i
++) {
2314 __put_user(env
->gregs
[i
], &si
->si_regs
.u_regs
[i
]);
2316 for (i
=0; i
< 8; i
++) {
2317 __put_user(env
->regwptr
[UREG_I0
+ i
], &si
->si_regs
.u_regs
[i
+8]);
2319 __put_user(mask
, &si
->si_mask
);
2325 setup_sigcontext(struct target_sigcontext
*sc
, /*struct _fpstate *fpstate,*/
2326 CPUSPARCState
*env
, unsigned long mask
)
2330 __put_user(mask
, &sc
->sigc_mask
);
2331 __put_user(env
->regwptr
[UREG_SP
], &sc
->sigc_sp
);
2332 __put_user(env
->pc
, &sc
->sigc_pc
);
2333 __put_user(env
->npc
, &sc
->sigc_npc
);
2334 __put_user(env
->psr
, &sc
->sigc_psr
);
2335 __put_user(env
->gregs
[1], &sc
->sigc_g1
);
2336 __put_user(env
->regwptr
[UREG_O0
], &sc
->sigc_o0
);
2341 #define NF_ALIGNEDSZ (((sizeof(struct target_signal_frame) + 7) & (~7)))
2343 static void setup_frame(int sig
, struct target_sigaction
*ka
,
2344 target_sigset_t
*set
, CPUSPARCState
*env
)
2347 struct target_signal_frame
*sf
;
2348 int sigframe_size
, err
, i
;
2350 /* 1. Make sure everything is clean */
2351 //synchronize_user_stack();
2353 sigframe_size
= NF_ALIGNEDSZ
;
2354 sf_addr
= get_sigframe(ka
, env
, sigframe_size
);
2355 trace_user_setup_frame(env
, sf_addr
);
2357 sf
= lock_user(VERIFY_WRITE
, sf_addr
,
2358 sizeof(struct target_signal_frame
), 0);
2363 if (invalid_frame_pointer(sf
, sigframe_size
))
2364 goto sigill_and_return
;
2366 /* 2. Save the current process state */
2367 err
= setup___siginfo(&sf
->info
, env
, set
->sig
[0]);
2368 __put_user(0, &sf
->extra_size
);
2370 //save_fpu_state(regs, &sf->fpu_state);
2371 //__put_user(&sf->fpu_state, &sf->fpu_save);
2373 __put_user(set
->sig
[0], &sf
->info
.si_mask
);
2374 for (i
= 0; i
< TARGET_NSIG_WORDS
- 1; i
++) {
2375 __put_user(set
->sig
[i
+ 1], &sf
->extramask
[i
]);
2378 for (i
= 0; i
< 8; i
++) {
2379 __put_user(env
->regwptr
[i
+ UREG_L0
], &sf
->ss
.locals
[i
]);
2381 for (i
= 0; i
< 8; i
++) {
2382 __put_user(env
->regwptr
[i
+ UREG_I0
], &sf
->ss
.ins
[i
]);
2387 /* 3. signal handler back-trampoline and parameters */
2388 env
->regwptr
[UREG_FP
] = sf_addr
;
2389 env
->regwptr
[UREG_I0
] = sig
;
2390 env
->regwptr
[UREG_I1
] = sf_addr
+
2391 offsetof(struct target_signal_frame
, info
);
2392 env
->regwptr
[UREG_I2
] = sf_addr
+
2393 offsetof(struct target_signal_frame
, info
);
2395 /* 4. signal handler */
2396 env
->pc
= ka
->_sa_handler
;
2397 env
->npc
= (env
->pc
+ 4);
2398 /* 5. return to kernel instructions */
2399 if (ka
->sa_restorer
) {
2400 env
->regwptr
[UREG_I7
] = ka
->sa_restorer
;
2404 env
->regwptr
[UREG_I7
] = sf_addr
+
2405 offsetof(struct target_signal_frame
, insns
) - 2 * 4;
2407 /* mov __NR_sigreturn, %g1 */
2409 __put_user(val32
, &sf
->insns
[0]);
2413 __put_user(val32
, &sf
->insns
[1]);
2417 /* Flush instruction space. */
2418 // flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0]));
2421 unlock_user(sf
, sf_addr
, sizeof(struct target_signal_frame
));
2425 force_sig(TARGET_SIGILL
);
2428 unlock_user(sf
, sf_addr
, sizeof(struct target_signal_frame
));
2429 force_sig(TARGET_SIGSEGV
);
2432 static void setup_rt_frame(int sig
, struct target_sigaction
*ka
,
2433 target_siginfo_t
*info
,
2434 target_sigset_t
*set
, CPUSPARCState
*env
)
2436 fprintf(stderr
, "setup_rt_frame: not implemented\n");
2439 long do_sigreturn(CPUSPARCState
*env
)
2442 struct target_signal_frame
*sf
;
2443 uint32_t up_psr
, pc
, npc
;
2444 target_sigset_t set
;
2448 sf_addr
= env
->regwptr
[UREG_FP
];
2449 trace_user_do_sigreturn(env
, sf_addr
);
2450 if (!lock_user_struct(VERIFY_READ
, sf
, sf_addr
, 1)) {
2454 /* 1. Make sure we are not getting garbage from the user */
2459 __get_user(pc
, &sf
->info
.si_regs
.pc
);
2460 __get_user(npc
, &sf
->info
.si_regs
.npc
);
2462 if ((pc
| npc
) & 3) {
2466 /* 2. Restore the state */
2467 __get_user(up_psr
, &sf
->info
.si_regs
.psr
);
2469 /* User can only change condition codes and FPU enabling in %psr. */
2470 env
->psr
= (up_psr
& (PSR_ICC
/* | PSR_EF */))
2471 | (env
->psr
& ~(PSR_ICC
/* | PSR_EF */));
2475 __get_user(env
->y
, &sf
->info
.si_regs
.y
);
2476 for (i
=0; i
< 8; i
++) {
2477 __get_user(env
->gregs
[i
], &sf
->info
.si_regs
.u_regs
[i
]);
2479 for (i
=0; i
< 8; i
++) {
2480 __get_user(env
->regwptr
[i
+ UREG_I0
], &sf
->info
.si_regs
.u_regs
[i
+8]);
2483 /* FIXME: implement FPU save/restore:
2484 * __get_user(fpu_save, &sf->fpu_save);
2486 * err |= restore_fpu_state(env, fpu_save);
2489 /* This is pretty much atomic, no amount locking would prevent
2490 * the races which exist anyways.
2492 __get_user(set
.sig
[0], &sf
->info
.si_mask
);
2493 for(i
= 1; i
< TARGET_NSIG_WORDS
; i
++) {
2494 __get_user(set
.sig
[i
], &sf
->extramask
[i
- 1]);
2497 target_to_host_sigset_internal(&host_set
, &set
);
2498 set_sigmask(&host_set
);
2503 unlock_user_struct(sf
, sf_addr
, 0);
2504 return -TARGET_QEMU_ESIGRETURN
;
2507 unlock_user_struct(sf
, sf_addr
, 0);
2508 force_sig(TARGET_SIGSEGV
);
2511 long do_rt_sigreturn(CPUSPARCState
*env
)
2513 trace_user_do_rt_sigreturn(env
, 0);
2514 fprintf(stderr
, "do_rt_sigreturn: not implemented\n");
2515 return -TARGET_ENOSYS
;
2518 #if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
2540 typedef abi_ulong target_mc_greg_t
;
2541 typedef target_mc_greg_t target_mc_gregset_t
[MC_NGREG
];
2543 struct target_mc_fq
{
2544 abi_ulong
*mcfq_addr
;
2548 struct target_mc_fpu
{
2552 //uint128_t qregs[16];
2554 abi_ulong mcfpu_fsr
;
2555 abi_ulong mcfpu_fprs
;
2556 abi_ulong mcfpu_gsr
;
2557 struct target_mc_fq
*mcfpu_fq
;
2558 unsigned char mcfpu_qcnt
;
2559 unsigned char mcfpu_qentsz
;
2560 unsigned char mcfpu_enab
;
2562 typedef struct target_mc_fpu target_mc_fpu_t
;
2565 target_mc_gregset_t mc_gregs
;
2566 target_mc_greg_t mc_fp
;
2567 target_mc_greg_t mc_i7
;
2568 target_mc_fpu_t mc_fpregs
;
2569 } target_mcontext_t
;
2571 struct target_ucontext
{
2572 struct target_ucontext
*tuc_link
;
2573 abi_ulong tuc_flags
;
2574 target_sigset_t tuc_sigmask
;
2575 target_mcontext_t tuc_mcontext
;
2578 /* A V9 register window */
2579 struct target_reg_window
{
2580 abi_ulong locals
[8];
2584 #define TARGET_STACK_BIAS 2047
2586 /* {set, get}context() needed for 64-bit SparcLinux userland. */
2587 void sparc64_set_context(CPUSPARCState
*env
)
2590 struct target_ucontext
*ucp
;
2591 target_mc_gregset_t
*grp
;
2592 abi_ulong pc
, npc
, tstate
;
2593 abi_ulong fp
, i7
, w_addr
;
2596 ucp_addr
= env
->regwptr
[UREG_I0
];
2597 if (!lock_user_struct(VERIFY_READ
, ucp
, ucp_addr
, 1)) {
2600 grp
= &ucp
->tuc_mcontext
.mc_gregs
;
2601 __get_user(pc
, &((*grp
)[MC_PC
]));
2602 __get_user(npc
, &((*grp
)[MC_NPC
]));
2603 if ((pc
| npc
) & 3) {
2606 if (env
->regwptr
[UREG_I1
]) {
2607 target_sigset_t target_set
;
2610 if (TARGET_NSIG_WORDS
== 1) {
2611 __get_user(target_set
.sig
[0], &ucp
->tuc_sigmask
.sig
[0]);
2613 abi_ulong
*src
, *dst
;
2614 src
= ucp
->tuc_sigmask
.sig
;
2615 dst
= target_set
.sig
;
2616 for (i
= 0; i
< TARGET_NSIG_WORDS
; i
++, dst
++, src
++) {
2617 __get_user(*dst
, src
);
2620 target_to_host_sigset_internal(&set
, &target_set
);
2625 __get_user(env
->y
, &((*grp
)[MC_Y
]));
2626 __get_user(tstate
, &((*grp
)[MC_TSTATE
]));
2627 env
->asi
= (tstate
>> 24) & 0xff;
2628 cpu_put_ccr(env
, tstate
>> 32);
2629 cpu_put_cwp64(env
, tstate
& 0x1f);
2630 __get_user(env
->gregs
[1], (&(*grp
)[MC_G1
]));
2631 __get_user(env
->gregs
[2], (&(*grp
)[MC_G2
]));
2632 __get_user(env
->gregs
[3], (&(*grp
)[MC_G3
]));
2633 __get_user(env
->gregs
[4], (&(*grp
)[MC_G4
]));
2634 __get_user(env
->gregs
[5], (&(*grp
)[MC_G5
]));
2635 __get_user(env
->gregs
[6], (&(*grp
)[MC_G6
]));
2636 __get_user(env
->gregs
[7], (&(*grp
)[MC_G7
]));
2637 __get_user(env
->regwptr
[UREG_I0
], (&(*grp
)[MC_O0
]));
2638 __get_user(env
->regwptr
[UREG_I1
], (&(*grp
)[MC_O1
]));
2639 __get_user(env
->regwptr
[UREG_I2
], (&(*grp
)[MC_O2
]));
2640 __get_user(env
->regwptr
[UREG_I3
], (&(*grp
)[MC_O3
]));
2641 __get_user(env
->regwptr
[UREG_I4
], (&(*grp
)[MC_O4
]));
2642 __get_user(env
->regwptr
[UREG_I5
], (&(*grp
)[MC_O5
]));
2643 __get_user(env
->regwptr
[UREG_I6
], (&(*grp
)[MC_O6
]));
2644 __get_user(env
->regwptr
[UREG_I7
], (&(*grp
)[MC_O7
]));
2646 __get_user(fp
, &(ucp
->tuc_mcontext
.mc_fp
));
2647 __get_user(i7
, &(ucp
->tuc_mcontext
.mc_i7
));
2649 w_addr
= TARGET_STACK_BIAS
+env
->regwptr
[UREG_I6
];
2650 if (put_user(fp
, w_addr
+ offsetof(struct target_reg_window
, ins
[6]),
2654 if (put_user(i7
, w_addr
+ offsetof(struct target_reg_window
, ins
[7]),
2658 /* FIXME this does not match how the kernel handles the FPU in
2659 * its sparc64_set_context implementation. In particular the FPU
2660 * is only restored if fenab is non-zero in:
2661 * __get_user(fenab, &(ucp->tuc_mcontext.mc_fpregs.mcfpu_enab));
2663 __get_user(env
->fprs
, &(ucp
->tuc_mcontext
.mc_fpregs
.mcfpu_fprs
));
2665 uint32_t *src
= ucp
->tuc_mcontext
.mc_fpregs
.mcfpu_fregs
.sregs
;
2666 for (i
= 0; i
< 64; i
++, src
++) {
2668 __get_user(env
->fpr
[i
/2].l
.lower
, src
);
2670 __get_user(env
->fpr
[i
/2].l
.upper
, src
);
2674 __get_user(env
->fsr
,
2675 &(ucp
->tuc_mcontext
.mc_fpregs
.mcfpu_fsr
));
2676 __get_user(env
->gsr
,
2677 &(ucp
->tuc_mcontext
.mc_fpregs
.mcfpu_gsr
));
2678 unlock_user_struct(ucp
, ucp_addr
, 0);
2681 unlock_user_struct(ucp
, ucp_addr
, 0);
2682 force_sig(TARGET_SIGSEGV
);
2685 void sparc64_get_context(CPUSPARCState
*env
)
2688 struct target_ucontext
*ucp
;
2689 target_mc_gregset_t
*grp
;
2690 target_mcontext_t
*mcp
;
2691 abi_ulong fp
, i7
, w_addr
;
2694 target_sigset_t target_set
;
2697 ucp_addr
= env
->regwptr
[UREG_I0
];
2698 if (!lock_user_struct(VERIFY_WRITE
, ucp
, ucp_addr
, 0)) {
2702 mcp
= &ucp
->tuc_mcontext
;
2703 grp
= &mcp
->mc_gregs
;
2705 /* Skip over the trap instruction, first. */
2709 /* If we're only reading the signal mask then do_sigprocmask()
2710 * is guaranteed not to fail, which is important because we don't
2711 * have any way to signal a failure or restart this operation since
2712 * this is not a normal syscall.
2714 err
= do_sigprocmask(0, NULL
, &set
);
2716 host_to_target_sigset_internal(&target_set
, &set
);
2717 if (TARGET_NSIG_WORDS
== 1) {
2718 __put_user(target_set
.sig
[0],
2719 (abi_ulong
*)&ucp
->tuc_sigmask
);
2721 abi_ulong
*src
, *dst
;
2722 src
= target_set
.sig
;
2723 dst
= ucp
->tuc_sigmask
.sig
;
2724 for (i
= 0; i
< TARGET_NSIG_WORDS
; i
++, dst
++, src
++) {
2725 __put_user(*src
, dst
);
2731 /* XXX: tstate must be saved properly */
2732 // __put_user(env->tstate, &((*grp)[MC_TSTATE]));
2733 __put_user(env
->pc
, &((*grp
)[MC_PC
]));
2734 __put_user(env
->npc
, &((*grp
)[MC_NPC
]));
2735 __put_user(env
->y
, &((*grp
)[MC_Y
]));
2736 __put_user(env
->gregs
[1], &((*grp
)[MC_G1
]));
2737 __put_user(env
->gregs
[2], &((*grp
)[MC_G2
]));
2738 __put_user(env
->gregs
[3], &((*grp
)[MC_G3
]));
2739 __put_user(env
->gregs
[4], &((*grp
)[MC_G4
]));
2740 __put_user(env
->gregs
[5], &((*grp
)[MC_G5
]));
2741 __put_user(env
->gregs
[6], &((*grp
)[MC_G6
]));
2742 __put_user(env
->gregs
[7], &((*grp
)[MC_G7
]));
2743 __put_user(env
->regwptr
[UREG_I0
], &((*grp
)[MC_O0
]));
2744 __put_user(env
->regwptr
[UREG_I1
], &((*grp
)[MC_O1
]));
2745 __put_user(env
->regwptr
[UREG_I2
], &((*grp
)[MC_O2
]));
2746 __put_user(env
->regwptr
[UREG_I3
], &((*grp
)[MC_O3
]));
2747 __put_user(env
->regwptr
[UREG_I4
], &((*grp
)[MC_O4
]));
2748 __put_user(env
->regwptr
[UREG_I5
], &((*grp
)[MC_O5
]));
2749 __put_user(env
->regwptr
[UREG_I6
], &((*grp
)[MC_O6
]));
2750 __put_user(env
->regwptr
[UREG_I7
], &((*grp
)[MC_O7
]));
2752 w_addr
= TARGET_STACK_BIAS
+env
->regwptr
[UREG_I6
];
2754 if (get_user(fp
, w_addr
+ offsetof(struct target_reg_window
, ins
[6]),
2758 if (get_user(i7
, w_addr
+ offsetof(struct target_reg_window
, ins
[7]),
2762 __put_user(fp
, &(mcp
->mc_fp
));
2763 __put_user(i7
, &(mcp
->mc_i7
));
2766 uint32_t *dst
= ucp
->tuc_mcontext
.mc_fpregs
.mcfpu_fregs
.sregs
;
2767 for (i
= 0; i
< 64; i
++, dst
++) {
2769 __put_user(env
->fpr
[i
/2].l
.lower
, dst
);
2771 __put_user(env
->fpr
[i
/2].l
.upper
, dst
);
2775 __put_user(env
->fsr
, &(mcp
->mc_fpregs
.mcfpu_fsr
));
2776 __put_user(env
->gsr
, &(mcp
->mc_fpregs
.mcfpu_gsr
));
2777 __put_user(env
->fprs
, &(mcp
->mc_fpregs
.mcfpu_fprs
));
2781 unlock_user_struct(ucp
, ucp_addr
, 1);
2784 unlock_user_struct(ucp
, ucp_addr
, 1);
2785 force_sig(TARGET_SIGSEGV
);
2788 #elif defined(TARGET_MIPS) || defined(TARGET_MIPS64)
2790 # if defined(TARGET_ABI_MIPSO32)
2791 struct target_sigcontext
{
2792 uint32_t sc_regmask
; /* Unused */
2795 uint64_t sc_regs
[32];
2796 uint64_t sc_fpregs
[32];
2797 uint32_t sc_ownedfp
; /* Unused */
2798 uint32_t sc_fpc_csr
;
2799 uint32_t sc_fpc_eir
; /* Unused */
2800 uint32_t sc_used_math
;
2801 uint32_t sc_dsp
; /* dsp status, was sc_ssflags */
2805 target_ulong sc_hi1
; /* Was sc_cause */
2806 target_ulong sc_lo1
; /* Was sc_badvaddr */
2807 target_ulong sc_hi2
; /* Was sc_sigset[4] */
2808 target_ulong sc_lo2
;
2809 target_ulong sc_hi3
;
2810 target_ulong sc_lo3
;
2812 # else /* N32 || N64 */
2813 struct target_sigcontext
{
2814 uint64_t sc_regs
[32];
2815 uint64_t sc_fpregs
[32];
2825 uint32_t sc_fpc_csr
;
2826 uint32_t sc_used_math
;
2828 uint32_t sc_reserved
;
2833 uint32_t sf_ass
[4]; /* argument save space for o32 */
2834 uint32_t sf_code
[2]; /* signal trampoline */
2835 struct target_sigcontext sf_sc
;
2836 target_sigset_t sf_mask
;
2839 struct target_ucontext
{
2840 target_ulong tuc_flags
;
2841 target_ulong tuc_link
;
2842 target_stack_t tuc_stack
;
2844 struct target_sigcontext tuc_mcontext
;
2845 target_sigset_t tuc_sigmask
;
2848 struct target_rt_sigframe
{
2849 uint32_t rs_ass
[4]; /* argument save space for o32 */
2850 uint32_t rs_code
[2]; /* signal trampoline */
2851 struct target_siginfo rs_info
;
2852 struct target_ucontext rs_uc
;
2855 /* Install trampoline to jump back from signal handler */
2856 static inline int install_sigtramp(unsigned int *tramp
, unsigned int syscall
)
2861 * Set up the return code ...
2863 * li v0, __NR__foo_sigreturn
2867 __put_user(0x24020000 + syscall
, tramp
+ 0);
2868 __put_user(0x0000000c , tramp
+ 1);
2872 static inline void setup_sigcontext(CPUMIPSState
*regs
,
2873 struct target_sigcontext
*sc
)
2877 __put_user(exception_resume_pc(regs
), &sc
->sc_pc
);
2878 regs
->hflags
&= ~MIPS_HFLAG_BMASK
;
2880 __put_user(0, &sc
->sc_regs
[0]);
2881 for (i
= 1; i
< 32; ++i
) {
2882 __put_user(regs
->active_tc
.gpr
[i
], &sc
->sc_regs
[i
]);
2885 __put_user(regs
->active_tc
.HI
[0], &sc
->sc_mdhi
);
2886 __put_user(regs
->active_tc
.LO
[0], &sc
->sc_mdlo
);
2888 /* Rather than checking for dsp existence, always copy. The storage
2889 would just be garbage otherwise. */
2890 __put_user(regs
->active_tc
.HI
[1], &sc
->sc_hi1
);
2891 __put_user(regs
->active_tc
.HI
[2], &sc
->sc_hi2
);
2892 __put_user(regs
->active_tc
.HI
[3], &sc
->sc_hi3
);
2893 __put_user(regs
->active_tc
.LO
[1], &sc
->sc_lo1
);
2894 __put_user(regs
->active_tc
.LO
[2], &sc
->sc_lo2
);
2895 __put_user(regs
->active_tc
.LO
[3], &sc
->sc_lo3
);
2897 uint32_t dsp
= cpu_rddsp(0x3ff, regs
);
2898 __put_user(dsp
, &sc
->sc_dsp
);
2901 __put_user(1, &sc
->sc_used_math
);
2903 for (i
= 0; i
< 32; ++i
) {
2904 __put_user(regs
->active_fpu
.fpr
[i
].d
, &sc
->sc_fpregs
[i
]);
2909 restore_sigcontext(CPUMIPSState
*regs
, struct target_sigcontext
*sc
)
2913 __get_user(regs
->CP0_EPC
, &sc
->sc_pc
);
2915 __get_user(regs
->active_tc
.HI
[0], &sc
->sc_mdhi
);
2916 __get_user(regs
->active_tc
.LO
[0], &sc
->sc_mdlo
);
2918 for (i
= 1; i
< 32; ++i
) {
2919 __get_user(regs
->active_tc
.gpr
[i
], &sc
->sc_regs
[i
]);
2922 __get_user(regs
->active_tc
.HI
[1], &sc
->sc_hi1
);
2923 __get_user(regs
->active_tc
.HI
[2], &sc
->sc_hi2
);
2924 __get_user(regs
->active_tc
.HI
[3], &sc
->sc_hi3
);
2925 __get_user(regs
->active_tc
.LO
[1], &sc
->sc_lo1
);
2926 __get_user(regs
->active_tc
.LO
[2], &sc
->sc_lo2
);
2927 __get_user(regs
->active_tc
.LO
[3], &sc
->sc_lo3
);
2930 __get_user(dsp
, &sc
->sc_dsp
);
2931 cpu_wrdsp(dsp
, 0x3ff, regs
);
2934 for (i
= 0; i
< 32; ++i
) {
2935 __get_user(regs
->active_fpu
.fpr
[i
].d
, &sc
->sc_fpregs
[i
]);
2940 * Determine which stack to use..
2942 static inline abi_ulong
2943 get_sigframe(struct target_sigaction
*ka
, CPUMIPSState
*regs
, size_t frame_size
)
2947 /* Default to using normal stack */
2948 sp
= regs
->active_tc
.gpr
[29];
2951 * FPU emulator may have its own trampoline active just
2952 * above the user stack, 16-bytes before the next lowest
2953 * 16 byte boundary. Try to avoid trashing it.
2957 /* This is the X/Open sanctioned signal stack switching. */
2958 if ((ka
->sa_flags
& TARGET_SA_ONSTACK
) && (sas_ss_flags (sp
) == 0)) {
2959 sp
= target_sigaltstack_used
.ss_sp
+ target_sigaltstack_used
.ss_size
;
2962 return (sp
- frame_size
) & ~7;
2965 static void mips_set_hflags_isa_mode_from_pc(CPUMIPSState
*env
)
2967 if (env
->insn_flags
& (ASE_MIPS16
| ASE_MICROMIPS
)) {
2968 env
->hflags
&= ~MIPS_HFLAG_M16
;
2969 env
->hflags
|= (env
->active_tc
.PC
& 1) << MIPS_HFLAG_M16_SHIFT
;
2970 env
->active_tc
.PC
&= ~(target_ulong
) 1;
2974 # if defined(TARGET_ABI_MIPSO32)
2975 /* compare linux/arch/mips/kernel/signal.c:setup_frame() */
2976 static void setup_frame(int sig
, struct target_sigaction
* ka
,
2977 target_sigset_t
*set
, CPUMIPSState
*regs
)
2979 struct sigframe
*frame
;
2980 abi_ulong frame_addr
;
2983 frame_addr
= get_sigframe(ka
, regs
, sizeof(*frame
));
2984 trace_user_setup_frame(regs
, frame_addr
);
2985 if (!lock_user_struct(VERIFY_WRITE
, frame
, frame_addr
, 0)) {
2989 install_sigtramp(frame
->sf_code
, TARGET_NR_sigreturn
);
2991 setup_sigcontext(regs
, &frame
->sf_sc
);
2993 for(i
= 0; i
< TARGET_NSIG_WORDS
; i
++) {
2994 __put_user(set
->sig
[i
], &frame
->sf_mask
.sig
[i
]);
2998 * Arguments to signal handler:
3000 * a0 = signal number
3001 * a1 = 0 (should be cause)
3002 * a2 = pointer to struct sigcontext
3004 * $25 and PC point to the signal handler, $29 points to the
3007 regs
->active_tc
.gpr
[ 4] = sig
;
3008 regs
->active_tc
.gpr
[ 5] = 0;
3009 regs
->active_tc
.gpr
[ 6] = frame_addr
+ offsetof(struct sigframe
, sf_sc
);
3010 regs
->active_tc
.gpr
[29] = frame_addr
;
3011 regs
->active_tc
.gpr
[31] = frame_addr
+ offsetof(struct sigframe
, sf_code
);
3012 /* The original kernel code sets CP0_EPC to the handler
3013 * since it returns to userland using eret
3014 * we cannot do this here, and we must set PC directly */
3015 regs
->active_tc
.PC
= regs
->active_tc
.gpr
[25] = ka
->_sa_handler
;
3016 mips_set_hflags_isa_mode_from_pc(regs
);
3017 unlock_user_struct(frame
, frame_addr
, 1);
3021 force_sig(TARGET_SIGSEGV
/*, current*/);
3024 long do_sigreturn(CPUMIPSState
*regs
)
3026 struct sigframe
*frame
;
3027 abi_ulong frame_addr
;
3029 target_sigset_t target_set
;
3032 frame_addr
= regs
->active_tc
.gpr
[29];
3033 trace_user_do_sigreturn(regs
, frame_addr
);
3034 if (!lock_user_struct(VERIFY_READ
, frame
, frame_addr
, 1))
3037 for(i
= 0; i
< TARGET_NSIG_WORDS
; i
++) {
3038 __get_user(target_set
.sig
[i
], &frame
->sf_mask
.sig
[i
]);
3041 target_to_host_sigset_internal(&blocked
, &target_set
);
3042 set_sigmask(&blocked
);
3044 restore_sigcontext(regs
, &frame
->sf_sc
);
3048 * Don't let your children do this ...
3050 __asm__
__volatile__(
3058 regs
->active_tc
.PC
= regs
->CP0_EPC
;
3059 mips_set_hflags_isa_mode_from_pc(regs
);
3060 /* I am not sure this is right, but it seems to work
3061 * maybe a problem with nested signals ? */
3063 return -TARGET_QEMU_ESIGRETURN
;
3066 force_sig(TARGET_SIGSEGV
/*, current*/);
3071 static void setup_rt_frame(int sig
, struct target_sigaction
*ka
,
3072 target_siginfo_t
*info
,
3073 target_sigset_t
*set
, CPUMIPSState
*env
)
3075 struct target_rt_sigframe
*frame
;
3076 abi_ulong frame_addr
;
3079 frame_addr
= get_sigframe(ka
, env
, sizeof(*frame
));
3080 trace_user_setup_rt_frame(env
, frame_addr
);
3081 if (!lock_user_struct(VERIFY_WRITE
, frame
, frame_addr
, 0)) {
3085 install_sigtramp(frame
->rs_code
, TARGET_NR_rt_sigreturn
);
3087 tswap_siginfo(&frame
->rs_info
, info
);
3089 __put_user(0, &frame
->rs_uc
.tuc_flags
);
3090 __put_user(0, &frame
->rs_uc
.tuc_link
);
3091 __put_user(target_sigaltstack_used
.ss_sp
, &frame
->rs_uc
.tuc_stack
.ss_sp
);
3092 __put_user(target_sigaltstack_used
.ss_size
, &frame
->rs_uc
.tuc_stack
.ss_size
);
3093 __put_user(sas_ss_flags(get_sp_from_cpustate(env
)),
3094 &frame
->rs_uc
.tuc_stack
.ss_flags
);
3096 setup_sigcontext(env
, &frame
->rs_uc
.tuc_mcontext
);
3098 for(i
= 0; i
< TARGET_NSIG_WORDS
; i
++) {
3099 __put_user(set
->sig
[i
], &frame
->rs_uc
.tuc_sigmask
.sig
[i
]);
3103 * Arguments to signal handler:
3105 * a0 = signal number
3106 * a1 = pointer to siginfo_t
3107 * a2 = pointer to struct ucontext
3109 * $25 and PC point to the signal handler, $29 points to the
3112 env
->active_tc
.gpr
[ 4] = sig
;
3113 env
->active_tc
.gpr
[ 5] = frame_addr
3114 + offsetof(struct target_rt_sigframe
, rs_info
);
3115 env
->active_tc
.gpr
[ 6] = frame_addr
3116 + offsetof(struct target_rt_sigframe
, rs_uc
);
3117 env
->active_tc
.gpr
[29] = frame_addr
;
3118 env
->active_tc
.gpr
[31] = frame_addr
3119 + offsetof(struct target_rt_sigframe
, rs_code
);
3120 /* The original kernel code sets CP0_EPC to the handler
3121 * since it returns to userland using eret
3122 * we cannot do this here, and we must set PC directly */
3123 env
->active_tc
.PC
= env
->active_tc
.gpr
[25] = ka
->_sa_handler
;
3124 mips_set_hflags_isa_mode_from_pc(env
);
3125 unlock_user_struct(frame
, frame_addr
, 1);
3129 unlock_user_struct(frame
, frame_addr
, 1);
3130 force_sig(TARGET_SIGSEGV
/*, current*/);
3133 long do_rt_sigreturn(CPUMIPSState
*env
)
3135 struct target_rt_sigframe
*frame
;
3136 abi_ulong frame_addr
;
3139 frame_addr
= env
->active_tc
.gpr
[29];
3140 trace_user_do_rt_sigreturn(env
, frame_addr
);
3141 if (!lock_user_struct(VERIFY_READ
, frame
, frame_addr
, 1)) {
3145 target_to_host_sigset(&blocked
, &frame
->rs_uc
.tuc_sigmask
);
3146 set_sigmask(&blocked
);
3148 restore_sigcontext(env
, &frame
->rs_uc
.tuc_mcontext
);
3150 if (do_sigaltstack(frame_addr
+
3151 offsetof(struct target_rt_sigframe
, rs_uc
.tuc_stack
),
3152 0, get_sp_from_cpustate(env
)) == -EFAULT
)
3155 env
->active_tc
.PC
= env
->CP0_EPC
;
3156 mips_set_hflags_isa_mode_from_pc(env
);
3157 /* I am not sure this is right, but it seems to work
3158 * maybe a problem with nested signals ? */
3160 return -TARGET_QEMU_ESIGRETURN
;
3163 force_sig(TARGET_SIGSEGV
/*, current*/);
3167 #elif defined(TARGET_SH4)
3170 * code and data structures from linux kernel:
3171 * include/asm-sh/sigcontext.h
3172 * arch/sh/kernel/signal.c
3175 struct target_sigcontext
{
3176 target_ulong oldmask
;
3179 target_ulong sc_gregs
[16];
3183 target_ulong sc_gbr
;
3184 target_ulong sc_mach
;
3185 target_ulong sc_macl
;
3188 target_ulong sc_fpregs
[16];
3189 target_ulong sc_xfpregs
[16];
3190 unsigned int sc_fpscr
;
3191 unsigned int sc_fpul
;
3192 unsigned int sc_ownedfp
;
3195 struct target_sigframe
3197 struct target_sigcontext sc
;
3198 target_ulong extramask
[TARGET_NSIG_WORDS
-1];
3199 uint16_t retcode
[3];
3203 struct target_ucontext
{
3204 target_ulong tuc_flags
;
3205 struct target_ucontext
*tuc_link
;
3206 target_stack_t tuc_stack
;
3207 struct target_sigcontext tuc_mcontext
;
3208 target_sigset_t tuc_sigmask
; /* mask last for extensibility */
3211 struct target_rt_sigframe
3213 struct target_siginfo info
;
3214 struct target_ucontext uc
;
3215 uint16_t retcode
[3];
3219 #define MOVW(n) (0x9300|((n)-2)) /* Move mem word at PC+n to R3 */
3220 #define TRAP_NOARG 0xc310 /* Syscall w/no args (NR in R3) SH3/4 */
3222 static abi_ulong
get_sigframe(struct target_sigaction
*ka
,
3223 unsigned long sp
, size_t frame_size
)
3225 if ((ka
->sa_flags
& TARGET_SA_ONSTACK
) && (sas_ss_flags(sp
) == 0)) {
3226 sp
= target_sigaltstack_used
.ss_sp
+ target_sigaltstack_used
.ss_size
;
3229 return (sp
- frame_size
) & -8ul;
3232 static void setup_sigcontext(struct target_sigcontext
*sc
,
3233 CPUSH4State
*regs
, unsigned long mask
)
3237 #define COPY(x) __put_user(regs->x, &sc->sc_##x)
3238 COPY(gregs
[0]); COPY(gregs
[1]);
3239 COPY(gregs
[2]); COPY(gregs
[3]);
3240 COPY(gregs
[4]); COPY(gregs
[5]);
3241 COPY(gregs
[6]); COPY(gregs
[7]);
3242 COPY(gregs
[8]); COPY(gregs
[9]);
3243 COPY(gregs
[10]); COPY(gregs
[11]);
3244 COPY(gregs
[12]); COPY(gregs
[13]);
3245 COPY(gregs
[14]); COPY(gregs
[15]);
3246 COPY(gbr
); COPY(mach
);
3247 COPY(macl
); COPY(pr
);
3251 for (i
=0; i
<16; i
++) {
3252 __put_user(regs
->fregs
[i
], &sc
->sc_fpregs
[i
]);
3254 __put_user(regs
->fpscr
, &sc
->sc_fpscr
);
3255 __put_user(regs
->fpul
, &sc
->sc_fpul
);
3257 /* non-iBCS2 extensions.. */
3258 __put_user(mask
, &sc
->oldmask
);
3261 static void restore_sigcontext(CPUSH4State
*regs
, struct target_sigcontext
*sc
)
3265 #define COPY(x) __get_user(regs->x, &sc->sc_##x)
3266 COPY(gregs
[0]); COPY(gregs
[1]);
3267 COPY(gregs
[2]); COPY(gregs
[3]);
3268 COPY(gregs
[4]); COPY(gregs
[5]);
3269 COPY(gregs
[6]); COPY(gregs
[7]);
3270 COPY(gregs
[8]); COPY(gregs
[9]);
3271 COPY(gregs
[10]); COPY(gregs
[11]);
3272 COPY(gregs
[12]); COPY(gregs
[13]);
3273 COPY(gregs
[14]); COPY(gregs
[15]);
3274 COPY(gbr
); COPY(mach
);
3275 COPY(macl
); COPY(pr
);
3279 for (i
=0; i
<16; i
++) {
3280 __get_user(regs
->fregs
[i
], &sc
->sc_fpregs
[i
]);
3282 __get_user(regs
->fpscr
, &sc
->sc_fpscr
);
3283 __get_user(regs
->fpul
, &sc
->sc_fpul
);
3285 regs
->tra
= -1; /* disable syscall checks */
3288 static void setup_frame(int sig
, struct target_sigaction
*ka
,
3289 target_sigset_t
*set
, CPUSH4State
*regs
)
3291 struct target_sigframe
*frame
;
3292 abi_ulong frame_addr
;
3295 frame_addr
= get_sigframe(ka
, regs
->gregs
[15], sizeof(*frame
));
3296 trace_user_setup_frame(regs
, frame_addr
);
3297 if (!lock_user_struct(VERIFY_WRITE
, frame
, frame_addr
, 0)) {
3301 setup_sigcontext(&frame
->sc
, regs
, set
->sig
[0]);
3303 for (i
= 0; i
< TARGET_NSIG_WORDS
- 1; i
++) {
3304 __put_user(set
->sig
[i
+ 1], &frame
->extramask
[i
]);
3307 /* Set up to return from userspace. If provided, use a stub
3308 already in userspace. */
3309 if (ka
->sa_flags
& TARGET_SA_RESTORER
) {
3310 regs
->pr
= (unsigned long) ka
->sa_restorer
;
3312 /* Generate return code (system call to sigreturn) */
3313 abi_ulong retcode_addr
= frame_addr
+
3314 offsetof(struct target_sigframe
, retcode
);
3315 __put_user(MOVW(2), &frame
->retcode
[0]);
3316 __put_user(TRAP_NOARG
, &frame
->retcode
[1]);
3317 __put_user((TARGET_NR_sigreturn
), &frame
->retcode
[2]);
3318 regs
->pr
= (unsigned long) retcode_addr
;
3321 /* Set up registers for signal handler */
3322 regs
->gregs
[15] = frame_addr
;
3323 regs
->gregs
[4] = sig
; /* Arg for signal handler */
3325 regs
->gregs
[6] = frame_addr
+= offsetof(typeof(*frame
), sc
);
3326 regs
->pc
= (unsigned long) ka
->_sa_handler
;
3328 unlock_user_struct(frame
, frame_addr
, 1);
3332 unlock_user_struct(frame
, frame_addr
, 1);
3333 force_sig(TARGET_SIGSEGV
);
3336 static void setup_rt_frame(int sig
, struct target_sigaction
*ka
,
3337 target_siginfo_t
*info
,
3338 target_sigset_t
*set
, CPUSH4State
*regs
)
3340 struct target_rt_sigframe
*frame
;
3341 abi_ulong frame_addr
;
3344 frame_addr
= get_sigframe(ka
, regs
->gregs
[15], sizeof(*frame
));
3345 trace_user_setup_rt_frame(regs
, frame_addr
);
3346 if (!lock_user_struct(VERIFY_WRITE
, frame
, frame_addr
, 0)) {
3350 tswap_siginfo(&frame
->info
, info
);
3352 /* Create the ucontext. */
3353 __put_user(0, &frame
->uc
.tuc_flags
);
3354 __put_user(0, (unsigned long *)&frame
->uc
.tuc_link
);
3355 __put_user((unsigned long)target_sigaltstack_used
.ss_sp
,
3356 &frame
->uc
.tuc_stack
.ss_sp
);
3357 __put_user(sas_ss_flags(regs
->gregs
[15]),
3358 &frame
->uc
.tuc_stack
.ss_flags
);
3359 __put_user(target_sigaltstack_used
.ss_size
,
3360 &frame
->uc
.tuc_stack
.ss_size
);
3361 setup_sigcontext(&frame
->uc
.tuc_mcontext
,
3363 for(i
= 0; i
< TARGET_NSIG_WORDS
; i
++) {
3364 __put_user(set
->sig
[i
], &frame
->uc
.tuc_sigmask
.sig
[i
]);
3367 /* Set up to return from userspace. If provided, use a stub
3368 already in userspace. */
3369 if (ka
->sa_flags
& TARGET_SA_RESTORER
) {
3370 regs
->pr
= (unsigned long) ka
->sa_restorer
;
3372 /* Generate return code (system call to sigreturn) */
3373 abi_ulong retcode_addr
= frame_addr
+
3374 offsetof(struct target_rt_sigframe
, retcode
);
3375 __put_user(MOVW(2), &frame
->retcode
[0]);
3376 __put_user(TRAP_NOARG
, &frame
->retcode
[1]);
3377 __put_user((TARGET_NR_rt_sigreturn
), &frame
->retcode
[2]);
3378 regs
->pr
= (unsigned long) retcode_addr
;
3381 /* Set up registers for signal handler */
3382 regs
->gregs
[15] = frame_addr
;
3383 regs
->gregs
[4] = sig
; /* Arg for signal handler */
3384 regs
->gregs
[5] = frame_addr
+ offsetof(typeof(*frame
), info
);
3385 regs
->gregs
[6] = frame_addr
+ offsetof(typeof(*frame
), uc
);
3386 regs
->pc
= (unsigned long) ka
->_sa_handler
;
3388 unlock_user_struct(frame
, frame_addr
, 1);
3392 unlock_user_struct(frame
, frame_addr
, 1);
3393 force_sig(TARGET_SIGSEGV
);
3396 long do_sigreturn(CPUSH4State
*regs
)
3398 struct target_sigframe
*frame
;
3399 abi_ulong frame_addr
;
3401 target_sigset_t target_set
;
3405 frame_addr
= regs
->gregs
[15];
3406 trace_user_do_sigreturn(regs
, frame_addr
);
3407 if (!lock_user_struct(VERIFY_READ
, frame
, frame_addr
, 1)) {
3411 __get_user(target_set
.sig
[0], &frame
->sc
.oldmask
);
3412 for(i
= 1; i
< TARGET_NSIG_WORDS
; i
++) {
3413 __get_user(target_set
.sig
[i
], &frame
->extramask
[i
- 1]);
3419 target_to_host_sigset_internal(&blocked
, &target_set
);
3420 set_sigmask(&blocked
);
3422 restore_sigcontext(regs
, &frame
->sc
);
3424 unlock_user_struct(frame
, frame_addr
, 0);
3425 return -TARGET_QEMU_ESIGRETURN
;
3428 unlock_user_struct(frame
, frame_addr
, 0);
3429 force_sig(TARGET_SIGSEGV
);
3433 long do_rt_sigreturn(CPUSH4State
*regs
)
3435 struct target_rt_sigframe
*frame
;
3436 abi_ulong frame_addr
;
3439 frame_addr
= regs
->gregs
[15];
3440 trace_user_do_rt_sigreturn(regs
, frame_addr
);
3441 if (!lock_user_struct(VERIFY_READ
, frame
, frame_addr
, 1)) {
3445 target_to_host_sigset(&blocked
, &frame
->uc
.tuc_sigmask
);
3446 set_sigmask(&blocked
);
3448 restore_sigcontext(regs
, &frame
->uc
.tuc_mcontext
);
3450 if (do_sigaltstack(frame_addr
+
3451 offsetof(struct target_rt_sigframe
, uc
.tuc_stack
),
3452 0, get_sp_from_cpustate(regs
)) == -EFAULT
) {
3456 unlock_user_struct(frame
, frame_addr
, 0);
3457 return -TARGET_QEMU_ESIGRETURN
;
3460 unlock_user_struct(frame
, frame_addr
, 0);
3461 force_sig(TARGET_SIGSEGV
);
3464 #elif defined(TARGET_MICROBLAZE)
3466 struct target_sigcontext
{
3467 struct target_pt_regs regs
; /* needs to be first */
3471 struct target_stack_t
{
3474 unsigned int ss_size
;
3477 struct target_ucontext
{
3478 abi_ulong tuc_flags
;
3480 struct target_stack_t tuc_stack
;
3481 struct target_sigcontext tuc_mcontext
;
3482 uint32_t tuc_extramask
[TARGET_NSIG_WORDS
- 1];
3485 /* Signal frames. */
3486 struct target_signal_frame
{
3487 struct target_ucontext uc
;
3488 uint32_t extramask
[TARGET_NSIG_WORDS
- 1];
3492 struct rt_signal_frame
{
3498 static void setup_sigcontext(struct target_sigcontext
*sc
, CPUMBState
*env
)
3500 __put_user(env
->regs
[0], &sc
->regs
.r0
);
3501 __put_user(env
->regs
[1], &sc
->regs
.r1
);
3502 __put_user(env
->regs
[2], &sc
->regs
.r2
);
3503 __put_user(env
->regs
[3], &sc
->regs
.r3
);
3504 __put_user(env
->regs
[4], &sc
->regs
.r4
);
3505 __put_user(env
->regs
[5], &sc
->regs
.r5
);
3506 __put_user(env
->regs
[6], &sc
->regs
.r6
);
3507 __put_user(env
->regs
[7], &sc
->regs
.r7
);
3508 __put_user(env
->regs
[8], &sc
->regs
.r8
);
3509 __put_user(env
->regs
[9], &sc
->regs
.r9
);
3510 __put_user(env
->regs
[10], &sc
->regs
.r10
);
3511 __put_user(env
->regs
[11], &sc
->regs
.r11
);
3512 __put_user(env
->regs
[12], &sc
->regs
.r12
);
3513 __put_user(env
->regs
[13], &sc
->regs
.r13
);
3514 __put_user(env
->regs
[14], &sc
->regs
.r14
);
3515 __put_user(env
->regs
[15], &sc
->regs
.r15
);
3516 __put_user(env
->regs
[16], &sc
->regs
.r16
);
3517 __put_user(env
->regs
[17], &sc
->regs
.r17
);
3518 __put_user(env
->regs
[18], &sc
->regs
.r18
);
3519 __put_user(env
->regs
[19], &sc
->regs
.r19
);
3520 __put_user(env
->regs
[20], &sc
->regs
.r20
);
3521 __put_user(env
->regs
[21], &sc
->regs
.r21
);
3522 __put_user(env
->regs
[22], &sc
->regs
.r22
);
3523 __put_user(env
->regs
[23], &sc
->regs
.r23
);
3524 __put_user(env
->regs
[24], &sc
->regs
.r24
);
3525 __put_user(env
->regs
[25], &sc
->regs
.r25
);
3526 __put_user(env
->regs
[26], &sc
->regs
.r26
);
3527 __put_user(env
->regs
[27], &sc
->regs
.r27
);
3528 __put_user(env
->regs
[28], &sc
->regs
.r28
);
3529 __put_user(env
->regs
[29], &sc
->regs
.r29
);
3530 __put_user(env
->regs
[30], &sc
->regs
.r30
);
3531 __put_user(env
->regs
[31], &sc
->regs
.r31
);
3532 __put_user(env
->sregs
[SR_PC
], &sc
->regs
.pc
);
3535 static void restore_sigcontext(struct target_sigcontext
*sc
, CPUMBState
*env
)
3537 __get_user(env
->regs
[0], &sc
->regs
.r0
);
3538 __get_user(env
->regs
[1], &sc
->regs
.r1
);
3539 __get_user(env
->regs
[2], &sc
->regs
.r2
);
3540 __get_user(env
->regs
[3], &sc
->regs
.r3
);
3541 __get_user(env
->regs
[4], &sc
->regs
.r4
);
3542 __get_user(env
->regs
[5], &sc
->regs
.r5
);
3543 __get_user(env
->regs
[6], &sc
->regs
.r6
);
3544 __get_user(env
->regs
[7], &sc
->regs
.r7
);
3545 __get_user(env
->regs
[8], &sc
->regs
.r8
);
3546 __get_user(env
->regs
[9], &sc
->regs
.r9
);
3547 __get_user(env
->regs
[10], &sc
->regs
.r10
);
3548 __get_user(env
->regs
[11], &sc
->regs
.r11
);
3549 __get_user(env
->regs
[12], &sc
->regs
.r12
);
3550 __get_user(env
->regs
[13], &sc
->regs
.r13
);
3551 __get_user(env
->regs
[14], &sc
->regs
.r14
);
3552 __get_user(env
->regs
[15], &sc
->regs
.r15
);
3553 __get_user(env
->regs
[16], &sc
->regs
.r16
);
3554 __get_user(env
->regs
[17], &sc
->regs
.r17
);
3555 __get_user(env
->regs
[18], &sc
->regs
.r18
);
3556 __get_user(env
->regs
[19], &sc
->regs
.r19
);
3557 __get_user(env
->regs
[20], &sc
->regs
.r20
);
3558 __get_user(env
->regs
[21], &sc
->regs
.r21
);
3559 __get_user(env
->regs
[22], &sc
->regs
.r22
);
3560 __get_user(env
->regs
[23], &sc
->regs
.r23
);
3561 __get_user(env
->regs
[24], &sc
->regs
.r24
);
3562 __get_user(env
->regs
[25], &sc
->regs
.r25
);
3563 __get_user(env
->regs
[26], &sc
->regs
.r26
);
3564 __get_user(env
->regs
[27], &sc
->regs
.r27
);
3565 __get_user(env
->regs
[28], &sc
->regs
.r28
);
3566 __get_user(env
->regs
[29], &sc
->regs
.r29
);
3567 __get_user(env
->regs
[30], &sc
->regs
.r30
);
3568 __get_user(env
->regs
[31], &sc
->regs
.r31
);
3569 __get_user(env
->sregs
[SR_PC
], &sc
->regs
.pc
);
3572 static abi_ulong
get_sigframe(struct target_sigaction
*ka
,
3573 CPUMBState
*env
, int frame_size
)
3575 abi_ulong sp
= env
->regs
[1];
3577 if ((ka
->sa_flags
& TARGET_SA_ONSTACK
) != 0 && !on_sig_stack(sp
)) {
3578 sp
= target_sigaltstack_used
.ss_sp
+ target_sigaltstack_used
.ss_size
;
3581 return ((sp
- frame_size
) & -8UL);
3584 static void setup_frame(int sig
, struct target_sigaction
*ka
,
3585 target_sigset_t
*set
, CPUMBState
*env
)
3587 struct target_signal_frame
*frame
;
3588 abi_ulong frame_addr
;
3591 frame_addr
= get_sigframe(ka
, env
, sizeof *frame
);
3592 trace_user_setup_frame(env
, frame_addr
);
3593 if (!lock_user_struct(VERIFY_WRITE
, frame
, frame_addr
, 0))
3596 /* Save the mask. */
3597 __put_user(set
->sig
[0], &frame
->uc
.tuc_mcontext
.oldmask
);
3599 for(i
= 1; i
< TARGET_NSIG_WORDS
; i
++) {
3600 __put_user(set
->sig
[i
], &frame
->extramask
[i
- 1]);
3603 setup_sigcontext(&frame
->uc
.tuc_mcontext
, env
);
3605 /* Set up to return from userspace. If provided, use a stub
3606 already in userspace. */
3607 /* minus 8 is offset to cater for "rtsd r15,8" offset */
3608 if (ka
->sa_flags
& TARGET_SA_RESTORER
) {
3609 env
->regs
[15] = ((unsigned long)ka
->sa_restorer
)-8;
3612 /* Note, these encodings are _big endian_! */
3613 /* addi r12, r0, __NR_sigreturn */
3614 t
= 0x31800000UL
| TARGET_NR_sigreturn
;
3615 __put_user(t
, frame
->tramp
+ 0);
3618 __put_user(t
, frame
->tramp
+ 1);
3620 /* Return from sighandler will jump to the tramp.
3621 Negative 8 offset because return is rtsd r15, 8 */
3622 env
->regs
[15] = frame_addr
+ offsetof(struct target_signal_frame
, tramp
)
3626 /* Set up registers for signal handler */
3627 env
->regs
[1] = frame_addr
;
3628 /* Signal handler args: */
3629 env
->regs
[5] = sig
; /* Arg 0: signum */
3631 /* arg 1: sigcontext */
3632 env
->regs
[7] = frame_addr
+= offsetof(typeof(*frame
), uc
);
3634 /* Offset of 4 to handle microblaze rtid r14, 0 */
3635 env
->sregs
[SR_PC
] = (unsigned long)ka
->_sa_handler
;
3637 unlock_user_struct(frame
, frame_addr
, 1);
3640 force_sig(TARGET_SIGSEGV
);
3643 static void setup_rt_frame(int sig
, struct target_sigaction
*ka
,
3644 target_siginfo_t
*info
,
3645 target_sigset_t
*set
, CPUMBState
*env
)
3647 fprintf(stderr
, "Microblaze setup_rt_frame: not implemented\n");
3650 long do_sigreturn(CPUMBState
*env
)
3652 struct target_signal_frame
*frame
;
3653 abi_ulong frame_addr
;
3654 target_sigset_t target_set
;
3658 frame_addr
= env
->regs
[R_SP
];
3659 trace_user_do_sigreturn(env
, frame_addr
);
3660 /* Make sure the guest isn't playing games. */
3661 if (!lock_user_struct(VERIFY_WRITE
, frame
, frame_addr
, 1))
3664 /* Restore blocked signals */
3665 __get_user(target_set
.sig
[0], &frame
->uc
.tuc_mcontext
.oldmask
);
3666 for(i
= 1; i
< TARGET_NSIG_WORDS
; i
++) {
3667 __get_user(target_set
.sig
[i
], &frame
->extramask
[i
- 1]);
3669 target_to_host_sigset_internal(&set
, &target_set
);
3672 restore_sigcontext(&frame
->uc
.tuc_mcontext
, env
);
3673 /* We got here through a sigreturn syscall, our path back is via an
3674 rtb insn so setup r14 for that. */
3675 env
->regs
[14] = env
->sregs
[SR_PC
];
3677 unlock_user_struct(frame
, frame_addr
, 0);
3678 return -TARGET_QEMU_ESIGRETURN
;
3680 force_sig(TARGET_SIGSEGV
);
3683 long do_rt_sigreturn(CPUMBState
*env
)
3685 trace_user_do_rt_sigreturn(env
, 0);
3686 fprintf(stderr
, "Microblaze do_rt_sigreturn: not implemented\n");
3687 return -TARGET_ENOSYS
;
3690 #elif defined(TARGET_CRIS)
3692 struct target_sigcontext
{
3693 struct target_pt_regs regs
; /* needs to be first */
3695 uint32_t usp
; /* usp before stacking this gunk on it */
3698 /* Signal frames. */
3699 struct target_signal_frame
{
3700 struct target_sigcontext sc
;
3701 uint32_t extramask
[TARGET_NSIG_WORDS
- 1];
3702 uint16_t retcode
[4]; /* Trampoline code. */
3705 struct rt_signal_frame
{
3710 uint16_t retcode
[4]; /* Trampoline code. */
3713 static void setup_sigcontext(struct target_sigcontext
*sc
, CPUCRISState
*env
)
3715 __put_user(env
->regs
[0], &sc
->regs
.r0
);
3716 __put_user(env
->regs
[1], &sc
->regs
.r1
);
3717 __put_user(env
->regs
[2], &sc
->regs
.r2
);
3718 __put_user(env
->regs
[3], &sc
->regs
.r3
);
3719 __put_user(env
->regs
[4], &sc
->regs
.r4
);
3720 __put_user(env
->regs
[5], &sc
->regs
.r5
);
3721 __put_user(env
->regs
[6], &sc
->regs
.r6
);
3722 __put_user(env
->regs
[7], &sc
->regs
.r7
);
3723 __put_user(env
->regs
[8], &sc
->regs
.r8
);
3724 __put_user(env
->regs
[9], &sc
->regs
.r9
);
3725 __put_user(env
->regs
[10], &sc
->regs
.r10
);
3726 __put_user(env
->regs
[11], &sc
->regs
.r11
);
3727 __put_user(env
->regs
[12], &sc
->regs
.r12
);
3728 __put_user(env
->regs
[13], &sc
->regs
.r13
);
3729 __put_user(env
->regs
[14], &sc
->usp
);
3730 __put_user(env
->regs
[15], &sc
->regs
.acr
);
3731 __put_user(env
->pregs
[PR_MOF
], &sc
->regs
.mof
);
3732 __put_user(env
->pregs
[PR_SRP
], &sc
->regs
.srp
);
3733 __put_user(env
->pc
, &sc
->regs
.erp
);
3736 static void restore_sigcontext(struct target_sigcontext
*sc
, CPUCRISState
*env
)
3738 __get_user(env
->regs
[0], &sc
->regs
.r0
);
3739 __get_user(env
->regs
[1], &sc
->regs
.r1
);
3740 __get_user(env
->regs
[2], &sc
->regs
.r2
);
3741 __get_user(env
->regs
[3], &sc
->regs
.r3
);
3742 __get_user(env
->regs
[4], &sc
->regs
.r4
);
3743 __get_user(env
->regs
[5], &sc
->regs
.r5
);
3744 __get_user(env
->regs
[6], &sc
->regs
.r6
);
3745 __get_user(env
->regs
[7], &sc
->regs
.r7
);
3746 __get_user(env
->regs
[8], &sc
->regs
.r8
);
3747 __get_user(env
->regs
[9], &sc
->regs
.r9
);
3748 __get_user(env
->regs
[10], &sc
->regs
.r10
);
3749 __get_user(env
->regs
[11], &sc
->regs
.r11
);
3750 __get_user(env
->regs
[12], &sc
->regs
.r12
);
3751 __get_user(env
->regs
[13], &sc
->regs
.r13
);
3752 __get_user(env
->regs
[14], &sc
->usp
);
3753 __get_user(env
->regs
[15], &sc
->regs
.acr
);
3754 __get_user(env
->pregs
[PR_MOF
], &sc
->regs
.mof
);
3755 __get_user(env
->pregs
[PR_SRP
], &sc
->regs
.srp
);
3756 __get_user(env
->pc
, &sc
->regs
.erp
);
3759 static abi_ulong
get_sigframe(CPUCRISState
*env
, int framesize
)
3762 /* Align the stack downwards to 4. */
3763 sp
= (env
->regs
[R_SP
] & ~3);
3764 return sp
- framesize
;
3767 static void setup_frame(int sig
, struct target_sigaction
*ka
,
3768 target_sigset_t
*set
, CPUCRISState
*env
)
3770 struct target_signal_frame
*frame
;
3771 abi_ulong frame_addr
;
3774 frame_addr
= get_sigframe(env
, sizeof *frame
);
3775 trace_user_setup_frame(env
, frame_addr
);
3776 if (!lock_user_struct(VERIFY_WRITE
, frame
, frame_addr
, 0))
3780 * The CRIS signal return trampoline. A real linux/CRIS kernel doesn't
3781 * use this trampoline anymore but it sets it up for GDB.
3782 * In QEMU, using the trampoline simplifies things a bit so we use it.
3784 * This is movu.w __NR_sigreturn, r9; break 13;
3786 __put_user(0x9c5f, frame
->retcode
+0);
3787 __put_user(TARGET_NR_sigreturn
,
3788 frame
->retcode
+ 1);
3789 __put_user(0xe93d, frame
->retcode
+ 2);
3791 /* Save the mask. */
3792 __put_user(set
->sig
[0], &frame
->sc
.oldmask
);
3794 for(i
= 1; i
< TARGET_NSIG_WORDS
; i
++) {
3795 __put_user(set
->sig
[i
], &frame
->extramask
[i
- 1]);
3798 setup_sigcontext(&frame
->sc
, env
);
3800 /* Move the stack and setup the arguments for the handler. */
3801 env
->regs
[R_SP
] = frame_addr
;
3802 env
->regs
[10] = sig
;
3803 env
->pc
= (unsigned long) ka
->_sa_handler
;
3804 /* Link SRP so the guest returns through the trampoline. */
3805 env
->pregs
[PR_SRP
] = frame_addr
+ offsetof(typeof(*frame
), retcode
);
3807 unlock_user_struct(frame
, frame_addr
, 1);
3810 force_sig(TARGET_SIGSEGV
);
3813 static void setup_rt_frame(int sig
, struct target_sigaction
*ka
,
3814 target_siginfo_t
*info
,
3815 target_sigset_t
*set
, CPUCRISState
*env
)
3817 fprintf(stderr
, "CRIS setup_rt_frame: not implemented\n");
3820 long do_sigreturn(CPUCRISState
*env
)
3822 struct target_signal_frame
*frame
;
3823 abi_ulong frame_addr
;
3824 target_sigset_t target_set
;
3828 frame_addr
= env
->regs
[R_SP
];
3829 trace_user_do_sigreturn(env
, frame_addr
);
3830 /* Make sure the guest isn't playing games. */
3831 if (!lock_user_struct(VERIFY_WRITE
, frame
, frame_addr
, 1)) {
3835 /* Restore blocked signals */
3836 __get_user(target_set
.sig
[0], &frame
->sc
.oldmask
);
3837 for(i
= 1; i
< TARGET_NSIG_WORDS
; i
++) {
3838 __get_user(target_set
.sig
[i
], &frame
->extramask
[i
- 1]);
3840 target_to_host_sigset_internal(&set
, &target_set
);
3843 restore_sigcontext(&frame
->sc
, env
);
3844 unlock_user_struct(frame
, frame_addr
, 0);
3845 return -TARGET_QEMU_ESIGRETURN
;
3847 force_sig(TARGET_SIGSEGV
);
3850 long do_rt_sigreturn(CPUCRISState
*env
)
3852 trace_user_do_rt_sigreturn(env
, 0);
3853 fprintf(stderr
, "CRIS do_rt_sigreturn: not implemented\n");
3854 return -TARGET_ENOSYS
;
3857 #elif defined(TARGET_OPENRISC)
3859 struct target_sigcontext
{
3860 struct target_pt_regs regs
;
3865 struct target_ucontext
{
3866 abi_ulong tuc_flags
;
3868 target_stack_t tuc_stack
;
3869 struct target_sigcontext tuc_mcontext
;
3870 target_sigset_t tuc_sigmask
; /* mask last for extensibility */
3873 struct target_rt_sigframe
{
3876 struct target_siginfo info
;
3877 struct target_sigcontext sc
;
3878 struct target_ucontext uc
;
3879 unsigned char retcode
[16]; /* trampoline code */
3882 /* This is the asm-generic/ucontext.h version */
3884 static int restore_sigcontext(CPUOpenRISCState
*regs
,
3885 struct target_sigcontext
*sc
)
3887 unsigned int err
= 0;
3888 unsigned long old_usp
;
3890 /* Alwys make any pending restarted system call return -EINTR */
3891 current_thread_info()->restart_block
.fn
= do_no_restart_syscall
;
3893 /* restore the regs from &sc->regs (same as sc, since regs is first)
3894 * (sc is already checked for VERIFY_READ since the sigframe was
3895 * checked in sys_sigreturn previously)
3898 if (copy_from_user(regs
, &sc
, sizeof(struct target_pt_regs
))) {
3902 /* make sure the U-flag is set so user-mode cannot fool us */
3906 /* restore the old USP as it was before we stacked the sc etc.
3907 * (we cannot just pop the sigcontext since we aligned the sp and
3908 * stuff after pushing it)
3911 __get_user(old_usp
, &sc
->usp
);
3912 phx_signal("old_usp 0x%lx", old_usp
);
3914 __PHX__ REALLY
/* ??? */
3916 regs
->gpr
[1] = old_usp
;
3918 /* TODO: the other ports use regs->orig_XX to disable syscall checks
3919 * after this completes, but we don't use that mechanism. maybe we can
3930 /* Set up a signal frame. */
3932 static void setup_sigcontext(struct target_sigcontext
*sc
,
3933 CPUOpenRISCState
*regs
,
3936 unsigned long usp
= regs
->gpr
[1];
3938 /* copy the regs. they are first in sc so we can use sc directly */
3940 /*copy_to_user(&sc, regs, sizeof(struct target_pt_regs));*/
3942 /* Set the frametype to CRIS_FRAME_NORMAL for the execution of
3943 the signal handler. The frametype will be restored to its previous
3944 value in restore_sigcontext. */
3945 /*regs->frametype = CRIS_FRAME_NORMAL;*/
3947 /* then some other stuff */
3948 __put_user(mask
, &sc
->oldmask
);
3949 __put_user(usp
, &sc
->usp
);
3952 static inline unsigned long align_sigframe(unsigned long sp
)
3959 static inline abi_ulong
get_sigframe(struct target_sigaction
*ka
,
3960 CPUOpenRISCState
*regs
,
3963 unsigned long sp
= regs
->gpr
[1];
3964 int onsigstack
= on_sig_stack(sp
);
3967 /* This is the X/Open sanctioned signal stack switching. */
3968 if ((ka
->sa_flags
& TARGET_SA_ONSTACK
) != 0 && !onsigstack
) {
3969 sp
= target_sigaltstack_used
.ss_sp
+ target_sigaltstack_used
.ss_size
;
3972 sp
= align_sigframe(sp
- frame_size
);
3975 * If we are on the alternate signal stack and would overflow it, don't.
3976 * Return an always-bogus address instead so we will die with SIGSEGV.
3979 if (onsigstack
&& !likely(on_sig_stack(sp
))) {
3986 static void setup_rt_frame(int sig
, struct target_sigaction
*ka
,
3987 target_siginfo_t
*info
,
3988 target_sigset_t
*set
, CPUOpenRISCState
*env
)
3991 abi_ulong frame_addr
;
3992 unsigned long return_ip
;
3993 struct target_rt_sigframe
*frame
;
3994 abi_ulong info_addr
, uc_addr
;
3996 frame_addr
= get_sigframe(ka
, env
, sizeof(*frame
));
3997 trace_user_setup_rt_frame(env
, frame_addr
);
3998 if (!lock_user_struct(VERIFY_WRITE
, frame
, frame_addr
, 0)) {
4002 info_addr
= frame_addr
+ offsetof(struct target_rt_sigframe
, info
);
4003 __put_user(info_addr
, &frame
->pinfo
);
4004 uc_addr
= frame_addr
+ offsetof(struct target_rt_sigframe
, uc
);
4005 __put_user(uc_addr
, &frame
->puc
);
4007 if (ka
->sa_flags
& SA_SIGINFO
) {
4008 tswap_siginfo(&frame
->info
, info
);
4011 /*err |= __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext));*/
4012 __put_user(0, &frame
->uc
.tuc_flags
);
4013 __put_user(0, &frame
->uc
.tuc_link
);
4014 __put_user(target_sigaltstack_used
.ss_sp
,
4015 &frame
->uc
.tuc_stack
.ss_sp
);
4016 __put_user(sas_ss_flags(env
->gpr
[1]), &frame
->uc
.tuc_stack
.ss_flags
);
4017 __put_user(target_sigaltstack_used
.ss_size
,
4018 &frame
->uc
.tuc_stack
.ss_size
);
4019 setup_sigcontext(&frame
->sc
, env
, set
->sig
[0]);
4021 /*err |= copy_to_user(frame->uc.tuc_sigmask, set, sizeof(*set));*/
4023 /* trampoline - the desired return ip is the retcode itself */
4024 return_ip
= (unsigned long)&frame
->retcode
;
4025 /* This is l.ori r11,r0,__NR_sigreturn, l.sys 1 */
4026 __put_user(0xa960, (short *)(frame
->retcode
+ 0));
4027 __put_user(TARGET_NR_rt_sigreturn
, (short *)(frame
->retcode
+ 2));
4028 __put_user(0x20000001, (unsigned long *)(frame
->retcode
+ 4));
4029 __put_user(0x15000000, (unsigned long *)(frame
->retcode
+ 8));
4035 /* TODO what is the current->exec_domain stuff and invmap ? */
4037 /* Set up registers for signal handler */
4038 env
->pc
= (unsigned long)ka
->_sa_handler
; /* what we enter NOW */
4039 env
->gpr
[9] = (unsigned long)return_ip
; /* what we enter LATER */
4040 env
->gpr
[3] = (unsigned long)sig
; /* arg 1: signo */
4041 env
->gpr
[4] = (unsigned long)&frame
->info
; /* arg 2: (siginfo_t*) */
4042 env
->gpr
[5] = (unsigned long)&frame
->uc
; /* arg 3: ucontext */
4044 /* actually move the usp to reflect the stacked frame */
4045 env
->gpr
[1] = (unsigned long)frame
;
4050 unlock_user_struct(frame
, frame_addr
, 1);
4051 if (sig
== TARGET_SIGSEGV
) {
4052 ka
->_sa_handler
= TARGET_SIG_DFL
;
4054 force_sig(TARGET_SIGSEGV
);
4057 long do_sigreturn(CPUOpenRISCState
*env
)
4059 trace_user_do_sigreturn(env
, 0);
4060 fprintf(stderr
, "do_sigreturn: not implemented\n");
4061 return -TARGET_ENOSYS
;
4064 long do_rt_sigreturn(CPUOpenRISCState
*env
)
4066 trace_user_do_rt_sigreturn(env
, 0);
4067 fprintf(stderr
, "do_rt_sigreturn: not implemented\n");
4068 return -TARGET_ENOSYS
;
4070 /* TARGET_OPENRISC */
4072 #elif defined(TARGET_S390X)
4074 #define __NUM_GPRS 16
4075 #define __NUM_FPRS 16
4076 #define __NUM_ACRS 16
4078 #define S390_SYSCALL_SIZE 2
4079 #define __SIGNAL_FRAMESIZE 160 /* FIXME: 31-bit mode -> 96 */
4081 #define _SIGCONTEXT_NSIG 64
4082 #define _SIGCONTEXT_NSIG_BPW 64 /* FIXME: 31-bit mode -> 32 */
4083 #define _SIGCONTEXT_NSIG_WORDS (_SIGCONTEXT_NSIG / _SIGCONTEXT_NSIG_BPW)
4084 #define _SIGMASK_COPY_SIZE (sizeof(unsigned long)*_SIGCONTEXT_NSIG_WORDS)
4085 #define PSW_ADDR_AMODE 0x0000000000000000UL /* 0x80000000UL for 31-bit */
4086 #define S390_SYSCALL_OPCODE ((uint16_t)0x0a00)
4090 target_ulong gprs
[__NUM_GPRS
];
4091 unsigned int acrs
[__NUM_ACRS
];
4092 } target_s390_regs_common
;
4096 double fprs
[__NUM_FPRS
];
4097 } target_s390_fp_regs
;
4100 target_s390_regs_common regs
;
4101 target_s390_fp_regs fpregs
;
4104 struct target_sigcontext
{
4105 target_ulong oldmask
[_SIGCONTEXT_NSIG_WORDS
];
4106 target_sigregs
*sregs
;
4110 uint8_t callee_used_stack
[__SIGNAL_FRAMESIZE
];
4111 struct target_sigcontext sc
;
4112 target_sigregs sregs
;
4114 uint8_t retcode
[S390_SYSCALL_SIZE
];
4117 struct target_ucontext
{
4118 target_ulong tuc_flags
;
4119 struct target_ucontext
*tuc_link
;
4120 target_stack_t tuc_stack
;
4121 target_sigregs tuc_mcontext
;
4122 target_sigset_t tuc_sigmask
; /* mask last for extensibility */
4126 uint8_t callee_used_stack
[__SIGNAL_FRAMESIZE
];
4127 uint8_t retcode
[S390_SYSCALL_SIZE
];
4128 struct target_siginfo info
;
4129 struct target_ucontext uc
;
4132 static inline abi_ulong
4133 get_sigframe(struct target_sigaction
*ka
, CPUS390XState
*env
, size_t frame_size
)
4137 /* Default to using normal stack */
4140 /* This is the X/Open sanctioned signal stack switching. */
4141 if (ka
->sa_flags
& TARGET_SA_ONSTACK
) {
4142 if (!sas_ss_flags(sp
)) {
4143 sp
= target_sigaltstack_used
.ss_sp
+
4144 target_sigaltstack_used
.ss_size
;
4148 /* This is the legacy signal stack switching. */
4149 else if (/* FIXME !user_mode(regs) */ 0 &&
4150 !(ka
->sa_flags
& TARGET_SA_RESTORER
) &&
4152 sp
= (abi_ulong
) ka
->sa_restorer
;
4155 return (sp
- frame_size
) & -8ul;
4158 static void save_sigregs(CPUS390XState
*env
, target_sigregs
*sregs
)
4161 //save_access_regs(current->thread.acrs); FIXME
4163 /* Copy a 'clean' PSW mask to the user to avoid leaking
4164 information about whether PER is currently on. */
4165 __put_user(env
->psw
.mask
, &sregs
->regs
.psw
.mask
);
4166 __put_user(env
->psw
.addr
, &sregs
->regs
.psw
.addr
);
4167 for (i
= 0; i
< 16; i
++) {
4168 __put_user(env
->regs
[i
], &sregs
->regs
.gprs
[i
]);
4170 for (i
= 0; i
< 16; i
++) {
4171 __put_user(env
->aregs
[i
], &sregs
->regs
.acrs
[i
]);
4174 * We have to store the fp registers to current->thread.fp_regs
4175 * to merge them with the emulated registers.
4177 //save_fp_regs(¤t->thread.fp_regs); FIXME
4178 for (i
= 0; i
< 16; i
++) {
4179 __put_user(get_freg(env
, i
)->ll
, &sregs
->fpregs
.fprs
[i
]);
4183 static void setup_frame(int sig
, struct target_sigaction
*ka
,
4184 target_sigset_t
*set
, CPUS390XState
*env
)
4187 abi_ulong frame_addr
;
4189 frame_addr
= get_sigframe(ka
, env
, sizeof(*frame
));
4190 trace_user_setup_frame(env
, frame_addr
);
4191 if (!lock_user_struct(VERIFY_WRITE
, frame
, frame_addr
, 0)) {
4195 __put_user(set
->sig
[0], &frame
->sc
.oldmask
[0]);
4197 save_sigregs(env
, &frame
->sregs
);
4199 __put_user((abi_ulong
)(unsigned long)&frame
->sregs
,
4200 (abi_ulong
*)&frame
->sc
.sregs
);
4202 /* Set up to return from userspace. If provided, use a stub
4203 already in userspace. */
4204 if (ka
->sa_flags
& TARGET_SA_RESTORER
) {
4205 env
->regs
[14] = (unsigned long)
4206 ka
->sa_restorer
| PSW_ADDR_AMODE
;
4208 env
->regs
[14] = (frame_addr
+ offsetof(sigframe
, retcode
))
4210 __put_user(S390_SYSCALL_OPCODE
| TARGET_NR_sigreturn
,
4211 (uint16_t *)(frame
->retcode
));
4214 /* Set up backchain. */
4215 __put_user(env
->regs
[15], (abi_ulong
*) frame
);
4217 /* Set up registers for signal handler */
4218 env
->regs
[15] = frame_addr
;
4219 env
->psw
.addr
= (target_ulong
) ka
->_sa_handler
| PSW_ADDR_AMODE
;
4221 env
->regs
[2] = sig
; //map_signal(sig);
4222 env
->regs
[3] = frame_addr
+= offsetof(typeof(*frame
), sc
);
4224 /* We forgot to include these in the sigcontext.
4225 To avoid breaking binary compatibility, they are passed as args. */
4226 env
->regs
[4] = 0; // FIXME: no clue... current->thread.trap_no;
4227 env
->regs
[5] = 0; // FIXME: no clue... current->thread.prot_addr;
4229 /* Place signal number on stack to allow backtrace from handler. */
4230 __put_user(env
->regs
[2], (int *) &frame
->signo
);
4231 unlock_user_struct(frame
, frame_addr
, 1);
4235 force_sig(TARGET_SIGSEGV
);
4238 static void setup_rt_frame(int sig
, struct target_sigaction
*ka
,
4239 target_siginfo_t
*info
,
4240 target_sigset_t
*set
, CPUS390XState
*env
)
4244 abi_ulong frame_addr
;
4246 frame_addr
= get_sigframe(ka
, env
, sizeof *frame
);
4247 trace_user_setup_rt_frame(env
, frame_addr
);
4248 if (!lock_user_struct(VERIFY_WRITE
, frame
, frame_addr
, 0)) {
4252 tswap_siginfo(&frame
->info
, info
);
4254 /* Create the ucontext. */
4255 __put_user(0, &frame
->uc
.tuc_flags
);
4256 __put_user((abi_ulong
)0, (abi_ulong
*)&frame
->uc
.tuc_link
);
4257 __put_user(target_sigaltstack_used
.ss_sp
, &frame
->uc
.tuc_stack
.ss_sp
);
4258 __put_user(sas_ss_flags(get_sp_from_cpustate(env
)),
4259 &frame
->uc
.tuc_stack
.ss_flags
);
4260 __put_user(target_sigaltstack_used
.ss_size
, &frame
->uc
.tuc_stack
.ss_size
);
4261 save_sigregs(env
, &frame
->uc
.tuc_mcontext
);
4262 for (i
= 0; i
< TARGET_NSIG_WORDS
; i
++) {
4263 __put_user((abi_ulong
)set
->sig
[i
],
4264 (abi_ulong
*)&frame
->uc
.tuc_sigmask
.sig
[i
]);
4267 /* Set up to return from userspace. If provided, use a stub
4268 already in userspace. */
4269 if (ka
->sa_flags
& TARGET_SA_RESTORER
) {
4270 env
->regs
[14] = (unsigned long) ka
->sa_restorer
| PSW_ADDR_AMODE
;
4272 env
->regs
[14] = (unsigned long) frame
->retcode
| PSW_ADDR_AMODE
;
4273 __put_user(S390_SYSCALL_OPCODE
| TARGET_NR_rt_sigreturn
,
4274 (uint16_t *)(frame
->retcode
));
4277 /* Set up backchain. */
4278 __put_user(env
->regs
[15], (abi_ulong
*) frame
);
4280 /* Set up registers for signal handler */
4281 env
->regs
[15] = frame_addr
;
4282 env
->psw
.addr
= (target_ulong
) ka
->_sa_handler
| PSW_ADDR_AMODE
;
4284 env
->regs
[2] = sig
; //map_signal(sig);
4285 env
->regs
[3] = frame_addr
+ offsetof(typeof(*frame
), info
);
4286 env
->regs
[4] = frame_addr
+ offsetof(typeof(*frame
), uc
);
4290 force_sig(TARGET_SIGSEGV
);
4294 restore_sigregs(CPUS390XState
*env
, target_sigregs
*sc
)
4299 for (i
= 0; i
< 16; i
++) {
4300 __get_user(env
->regs
[i
], &sc
->regs
.gprs
[i
]);
4303 __get_user(env
->psw
.mask
, &sc
->regs
.psw
.mask
);
4304 trace_user_s390x_restore_sigregs(env
, (unsigned long long)sc
->regs
.psw
.addr
,
4305 (unsigned long long)env
->psw
.addr
);
4306 __get_user(env
->psw
.addr
, &sc
->regs
.psw
.addr
);
4307 /* FIXME: 31-bit -> | PSW_ADDR_AMODE */
4309 for (i
= 0; i
< 16; i
++) {
4310 __get_user(env
->aregs
[i
], &sc
->regs
.acrs
[i
]);
4312 for (i
= 0; i
< 16; i
++) {
4313 __get_user(get_freg(env
, i
)->ll
, &sc
->fpregs
.fprs
[i
]);
4319 long do_sigreturn(CPUS390XState
*env
)
4322 abi_ulong frame_addr
= env
->regs
[15];
4323 target_sigset_t target_set
;
4326 trace_user_do_sigreturn(env
, frame_addr
);
4327 if (!lock_user_struct(VERIFY_READ
, frame
, frame_addr
, 1)) {
4330 __get_user(target_set
.sig
[0], &frame
->sc
.oldmask
[0]);
4332 target_to_host_sigset_internal(&set
, &target_set
);
4333 set_sigmask(&set
); /* ~_BLOCKABLE? */
4335 if (restore_sigregs(env
, &frame
->sregs
)) {
4339 unlock_user_struct(frame
, frame_addr
, 0);
4340 return -TARGET_QEMU_ESIGRETURN
;
4343 force_sig(TARGET_SIGSEGV
);
4347 long do_rt_sigreturn(CPUS390XState
*env
)
4350 abi_ulong frame_addr
= env
->regs
[15];
4353 trace_user_do_rt_sigreturn(env
, frame_addr
);
4354 if (!lock_user_struct(VERIFY_READ
, frame
, frame_addr
, 1)) {
4357 target_to_host_sigset(&set
, &frame
->uc
.tuc_sigmask
);
4359 set_sigmask(&set
); /* ~_BLOCKABLE? */
4361 if (restore_sigregs(env
, &frame
->uc
.tuc_mcontext
)) {
4365 if (do_sigaltstack(frame_addr
+ offsetof(rt_sigframe
, uc
.tuc_stack
), 0,
4366 get_sp_from_cpustate(env
)) == -EFAULT
) {
4369 unlock_user_struct(frame
, frame_addr
, 0);
4370 return -TARGET_QEMU_ESIGRETURN
;
4373 unlock_user_struct(frame
, frame_addr
, 0);
4374 force_sig(TARGET_SIGSEGV
);
4378 #elif defined(TARGET_PPC)
4380 /* Size of dummy stack frame allocated when calling signal handler.
4381 See arch/powerpc/include/asm/ptrace.h. */
4382 #if defined(TARGET_PPC64)
4383 #define SIGNAL_FRAMESIZE 128
4385 #define SIGNAL_FRAMESIZE 64
4388 /* See arch/powerpc/include/asm/ucontext.h. Only used for 32-bit PPC;
4389 on 64-bit PPC, sigcontext and mcontext are one and the same. */
4390 struct target_mcontext
{
4391 target_ulong mc_gregs
[48];
4392 /* Includes fpscr. */
4393 uint64_t mc_fregs
[33];
4394 target_ulong mc_pad
[2];
4395 /* We need to handle Altivec and SPE at the same time, which no
4396 kernel needs to do. Fortunately, the kernel defines this bit to
4397 be Altivec-register-large all the time, rather than trying to
4398 twiddle it based on the specific platform. */
4400 /* SPE vector registers. One extra for SPEFSCR. */
4402 /* Altivec vector registers. The packing of VSCR and VRSAVE
4403 varies depending on whether we're PPC64 or not: PPC64 splits
4404 them apart; PPC32 stuffs them together. */
4405 #if defined(TARGET_PPC64)
4406 #define QEMU_NVRREG 34
4408 #define QEMU_NVRREG 33
4410 ppc_avr_t altivec
[QEMU_NVRREG
];
4412 } mc_vregs
__attribute__((__aligned__(16)));
4415 /* See arch/powerpc/include/asm/sigcontext.h. */
4416 struct target_sigcontext
{
4417 target_ulong _unused
[4];
4419 #if defined(TARGET_PPC64)
4422 target_ulong handler
;
4423 target_ulong oldmask
;
4424 target_ulong regs
; /* struct pt_regs __user * */
4425 #if defined(TARGET_PPC64)
4426 struct target_mcontext mcontext
;
4430 /* Indices for target_mcontext.mc_gregs, below.
4431 See arch/powerpc/include/asm/ptrace.h for details. */
4467 TARGET_PT_ORIG_R3
= 34,
4472 /* Yes, there are two registers with #39. One is 64-bit only. */
4474 TARGET_PT_SOFTE
= 39,
4475 TARGET_PT_TRAP
= 40,
4477 TARGET_PT_DSISR
= 42,
4478 TARGET_PT_RESULT
= 43,
4479 TARGET_PT_REGS_COUNT
= 44
4483 struct target_ucontext
{
4484 target_ulong tuc_flags
;
4485 target_ulong tuc_link
; /* struct ucontext __user * */
4486 struct target_sigaltstack tuc_stack
;
4487 #if !defined(TARGET_PPC64)
4489 target_ulong tuc_regs
; /* struct mcontext __user *
4490 points to uc_mcontext field */
4492 target_sigset_t tuc_sigmask
;
4493 #if defined(TARGET_PPC64)
4494 target_sigset_t unused
[15]; /* Allow for uc_sigmask growth */
4495 struct target_sigcontext tuc_sigcontext
;
4497 int32_t tuc_maskext
[30];
4498 int32_t tuc_pad2
[3];
4499 struct target_mcontext tuc_mcontext
;
4503 /* See arch/powerpc/kernel/signal_32.c. */
4504 struct target_sigframe
{
4505 struct target_sigcontext sctx
;
4506 struct target_mcontext mctx
;
4510 #if defined(TARGET_PPC64)
4512 #define TARGET_TRAMP_SIZE 6
4514 struct target_rt_sigframe
{
4515 /* sys_rt_sigreturn requires the ucontext be the first field */
4516 struct target_ucontext uc
;
4517 target_ulong _unused
[2];
4518 uint32_t trampoline
[TARGET_TRAMP_SIZE
];
4519 target_ulong pinfo
; /* struct siginfo __user * */
4520 target_ulong puc
; /* void __user * */
4521 struct target_siginfo info
;
4522 /* 64 bit ABI allows for 288 bytes below sp before decrementing it. */
4524 } __attribute__((aligned(16)));
4528 struct target_rt_sigframe
{
4529 struct target_siginfo info
;
4530 struct target_ucontext uc
;
4536 #if defined(TARGET_PPC64)
4538 struct target_func_ptr
{
4545 /* We use the mc_pad field for the signal return trampoline. */
4546 #define tramp mc_pad
4548 /* See arch/powerpc/kernel/signal.c. */
4549 static target_ulong
get_sigframe(struct target_sigaction
*ka
,
4553 target_ulong oldsp
, newsp
;
4555 oldsp
= env
->gpr
[1];
4557 if ((ka
->sa_flags
& TARGET_SA_ONSTACK
) &&
4558 (sas_ss_flags(oldsp
) == 0)) {
4559 oldsp
= (target_sigaltstack_used
.ss_sp
4560 + target_sigaltstack_used
.ss_size
);
4563 newsp
= (oldsp
- frame_size
) & ~0xFUL
;
4568 static void save_user_regs(CPUPPCState
*env
, struct target_mcontext
*frame
)
4570 target_ulong msr
= env
->msr
;
4572 target_ulong ccr
= 0;
4574 /* In general, the kernel attempts to be intelligent about what it
4575 needs to save for Altivec/FP/SPE registers. We don't care that
4576 much, so we just go ahead and save everything. */
4578 /* Save general registers. */
4579 for (i
= 0; i
< ARRAY_SIZE(env
->gpr
); i
++) {
4580 __put_user(env
->gpr
[i
], &frame
->mc_gregs
[i
]);
4582 __put_user(env
->nip
, &frame
->mc_gregs
[TARGET_PT_NIP
]);
4583 __put_user(env
->ctr
, &frame
->mc_gregs
[TARGET_PT_CTR
]);
4584 __put_user(env
->lr
, &frame
->mc_gregs
[TARGET_PT_LNK
]);
4585 __put_user(env
->xer
, &frame
->mc_gregs
[TARGET_PT_XER
]);
4587 for (i
= 0; i
< ARRAY_SIZE(env
->crf
); i
++) {
4588 ccr
|= env
->crf
[i
] << (32 - ((i
+ 1) * 4));
4590 __put_user(ccr
, &frame
->mc_gregs
[TARGET_PT_CCR
]);
4592 /* Save Altivec registers if necessary. */
4593 if (env
->insns_flags
& PPC_ALTIVEC
) {
4594 for (i
= 0; i
< ARRAY_SIZE(env
->avr
); i
++) {
4595 ppc_avr_t
*avr
= &env
->avr
[i
];
4596 ppc_avr_t
*vreg
= &frame
->mc_vregs
.altivec
[i
];
4598 __put_user(avr
->u64
[0], &vreg
->u64
[0]);
4599 __put_user(avr
->u64
[1], &vreg
->u64
[1]);
4601 /* Set MSR_VR in the saved MSR value to indicate that
4602 frame->mc_vregs contains valid data. */
4604 __put_user((uint32_t)env
->spr
[SPR_VRSAVE
],
4605 &frame
->mc_vregs
.altivec
[32].u32
[3]);
4608 /* Save floating point registers. */
4609 if (env
->insns_flags
& PPC_FLOAT
) {
4610 for (i
= 0; i
< ARRAY_SIZE(env
->fpr
); i
++) {
4611 __put_user(env
->fpr
[i
], &frame
->mc_fregs
[i
]);
4613 __put_user((uint64_t) env
->fpscr
, &frame
->mc_fregs
[32]);
4616 /* Save SPE registers. The kernel only saves the high half. */
4617 if (env
->insns_flags
& PPC_SPE
) {
4618 #if defined(TARGET_PPC64)
4619 for (i
= 0; i
< ARRAY_SIZE(env
->gpr
); i
++) {
4620 __put_user(env
->gpr
[i
] >> 32, &frame
->mc_vregs
.spe
[i
]);
4623 for (i
= 0; i
< ARRAY_SIZE(env
->gprh
); i
++) {
4624 __put_user(env
->gprh
[i
], &frame
->mc_vregs
.spe
[i
]);
4627 /* Set MSR_SPE in the saved MSR value to indicate that
4628 frame->mc_vregs contains valid data. */
4630 __put_user(env
->spe_fscr
, &frame
->mc_vregs
.spe
[32]);
4634 __put_user(msr
, &frame
->mc_gregs
[TARGET_PT_MSR
]);
4637 static void encode_trampoline(int sigret
, uint32_t *tramp
)
4639 /* Set up the sigreturn trampoline: li r0,sigret; sc. */
4641 __put_user(0x38000000 | sigret
, &tramp
[0]);
4642 __put_user(0x44000002, &tramp
[1]);
4646 static void restore_user_regs(CPUPPCState
*env
,
4647 struct target_mcontext
*frame
, int sig
)
4649 target_ulong save_r2
= 0;
4656 save_r2
= env
->gpr
[2];
4659 /* Restore general registers. */
4660 for (i
= 0; i
< ARRAY_SIZE(env
->gpr
); i
++) {
4661 __get_user(env
->gpr
[i
], &frame
->mc_gregs
[i
]);
4663 __get_user(env
->nip
, &frame
->mc_gregs
[TARGET_PT_NIP
]);
4664 __get_user(env
->ctr
, &frame
->mc_gregs
[TARGET_PT_CTR
]);
4665 __get_user(env
->lr
, &frame
->mc_gregs
[TARGET_PT_LNK
]);
4666 __get_user(env
->xer
, &frame
->mc_gregs
[TARGET_PT_XER
]);
4667 __get_user(ccr
, &frame
->mc_gregs
[TARGET_PT_CCR
]);
4669 for (i
= 0; i
< ARRAY_SIZE(env
->crf
); i
++) {
4670 env
->crf
[i
] = (ccr
>> (32 - ((i
+ 1) * 4))) & 0xf;
4674 env
->gpr
[2] = save_r2
;
4677 __get_user(msr
, &frame
->mc_gregs
[TARGET_PT_MSR
]);
4679 /* If doing signal return, restore the previous little-endian mode. */
4681 env
->msr
= (env
->msr
& ~(1ull << MSR_LE
)) | (msr
& (1ull << MSR_LE
));
4683 /* Restore Altivec registers if necessary. */
4684 if (env
->insns_flags
& PPC_ALTIVEC
) {
4685 for (i
= 0; i
< ARRAY_SIZE(env
->avr
); i
++) {
4686 ppc_avr_t
*avr
= &env
->avr
[i
];
4687 ppc_avr_t
*vreg
= &frame
->mc_vregs
.altivec
[i
];
4689 __get_user(avr
->u64
[0], &vreg
->u64
[0]);
4690 __get_user(avr
->u64
[1], &vreg
->u64
[1]);
4692 /* Set MSR_VEC in the saved MSR value to indicate that
4693 frame->mc_vregs contains valid data. */
4694 __get_user(env
->spr
[SPR_VRSAVE
],
4695 (target_ulong
*)(&frame
->mc_vregs
.altivec
[32].u32
[3]));
4698 /* Restore floating point registers. */
4699 if (env
->insns_flags
& PPC_FLOAT
) {
4701 for (i
= 0; i
< ARRAY_SIZE(env
->fpr
); i
++) {
4702 __get_user(env
->fpr
[i
], &frame
->mc_fregs
[i
]);
4704 __get_user(fpscr
, &frame
->mc_fregs
[32]);
4705 env
->fpscr
= (uint32_t) fpscr
;
4708 /* Save SPE registers. The kernel only saves the high half. */
4709 if (env
->insns_flags
& PPC_SPE
) {
4710 #if defined(TARGET_PPC64)
4711 for (i
= 0; i
< ARRAY_SIZE(env
->gpr
); i
++) {
4714 __get_user(hi
, &frame
->mc_vregs
.spe
[i
]);
4715 env
->gpr
[i
] = ((uint64_t)hi
<< 32) | ((uint32_t) env
->gpr
[i
]);
4718 for (i
= 0; i
< ARRAY_SIZE(env
->gprh
); i
++) {
4719 __get_user(env
->gprh
[i
], &frame
->mc_vregs
.spe
[i
]);
4722 __get_user(env
->spe_fscr
, &frame
->mc_vregs
.spe
[32]);
4726 static void setup_frame(int sig
, struct target_sigaction
*ka
,
4727 target_sigset_t
*set
, CPUPPCState
*env
)
4729 struct target_sigframe
*frame
;
4730 struct target_sigcontext
*sc
;
4731 target_ulong frame_addr
, newsp
;
4733 #if defined(TARGET_PPC64)
4734 struct image_info
*image
= ((TaskState
*)thread_cpu
->opaque
)->info
;
4737 frame_addr
= get_sigframe(ka
, env
, sizeof(*frame
));
4738 trace_user_setup_frame(env
, frame_addr
);
4739 if (!lock_user_struct(VERIFY_WRITE
, frame
, frame_addr
, 1))
4743 __put_user(ka
->_sa_handler
, &sc
->handler
);
4744 __put_user(set
->sig
[0], &sc
->oldmask
);
4745 #if TARGET_ABI_BITS == 64
4746 __put_user(set
->sig
[0] >> 32, &sc
->_unused
[3]);
4748 __put_user(set
->sig
[1], &sc
->_unused
[3]);
4750 __put_user(h2g(&frame
->mctx
), &sc
->regs
);
4751 __put_user(sig
, &sc
->signal
);
4753 /* Save user regs. */
4754 save_user_regs(env
, &frame
->mctx
);
4756 /* Construct the trampoline code on the stack. */
4757 encode_trampoline(TARGET_NR_sigreturn
, (uint32_t *)&frame
->mctx
.tramp
);
4759 /* The kernel checks for the presence of a VDSO here. We don't
4760 emulate a vdso, so use a sigreturn system call. */
4761 env
->lr
= (target_ulong
) h2g(frame
->mctx
.tramp
);
4763 /* Turn off all fp exceptions. */
4766 /* Create a stack frame for the caller of the handler. */
4767 newsp
= frame_addr
- SIGNAL_FRAMESIZE
;
4768 err
|= put_user(env
->gpr
[1], newsp
, target_ulong
);
4773 /* Set up registers for signal handler. */
4774 env
->gpr
[1] = newsp
;
4776 env
->gpr
[4] = frame_addr
+ offsetof(struct target_sigframe
, sctx
);
4778 #if defined(TARGET_PPC64)
4779 if (get_ppc64_abi(image
) < 2) {
4780 /* ELFv1 PPC64 function pointers are pointers to OPD entries. */
4781 struct target_func_ptr
*handler
=
4782 (struct target_func_ptr
*)g2h(ka
->_sa_handler
);
4783 env
->nip
= tswapl(handler
->entry
);
4784 env
->gpr
[2] = tswapl(handler
->toc
);
4786 /* ELFv2 PPC64 function pointers are entry points, but R12
4787 * must also be set */
4788 env
->nip
= tswapl((target_ulong
) ka
->_sa_handler
);
4789 env
->gpr
[12] = env
->nip
;
4792 env
->nip
= (target_ulong
) ka
->_sa_handler
;
4795 /* Signal handlers are entered in big-endian mode. */
4796 env
->msr
&= ~(1ull << MSR_LE
);
4798 unlock_user_struct(frame
, frame_addr
, 1);
4802 unlock_user_struct(frame
, frame_addr
, 1);
4803 force_sig(TARGET_SIGSEGV
);
4806 static void setup_rt_frame(int sig
, struct target_sigaction
*ka
,
4807 target_siginfo_t
*info
,
4808 target_sigset_t
*set
, CPUPPCState
*env
)
4810 struct target_rt_sigframe
*rt_sf
;
4811 uint32_t *trampptr
= 0;
4812 struct target_mcontext
*mctx
= 0;
4813 target_ulong rt_sf_addr
, newsp
= 0;
4815 #if defined(TARGET_PPC64)
4816 struct image_info
*image
= ((TaskState
*)thread_cpu
->opaque
)->info
;
4819 rt_sf_addr
= get_sigframe(ka
, env
, sizeof(*rt_sf
));
4820 if (!lock_user_struct(VERIFY_WRITE
, rt_sf
, rt_sf_addr
, 1))
4823 tswap_siginfo(&rt_sf
->info
, info
);
4825 __put_user(0, &rt_sf
->uc
.tuc_flags
);
4826 __put_user(0, &rt_sf
->uc
.tuc_link
);
4827 __put_user((target_ulong
)target_sigaltstack_used
.ss_sp
,
4828 &rt_sf
->uc
.tuc_stack
.ss_sp
);
4829 __put_user(sas_ss_flags(env
->gpr
[1]),
4830 &rt_sf
->uc
.tuc_stack
.ss_flags
);
4831 __put_user(target_sigaltstack_used
.ss_size
,
4832 &rt_sf
->uc
.tuc_stack
.ss_size
);
4833 #if !defined(TARGET_PPC64)
4834 __put_user(h2g (&rt_sf
->uc
.tuc_mcontext
),
4835 &rt_sf
->uc
.tuc_regs
);
4837 for(i
= 0; i
< TARGET_NSIG_WORDS
; i
++) {
4838 __put_user(set
->sig
[i
], &rt_sf
->uc
.tuc_sigmask
.sig
[i
]);
4841 #if defined(TARGET_PPC64)
4842 mctx
= &rt_sf
->uc
.tuc_sigcontext
.mcontext
;
4843 trampptr
= &rt_sf
->trampoline
[0];
4845 mctx
= &rt_sf
->uc
.tuc_mcontext
;
4846 trampptr
= (uint32_t *)&rt_sf
->uc
.tuc_mcontext
.tramp
;
4849 save_user_regs(env
, mctx
);
4850 encode_trampoline(TARGET_NR_rt_sigreturn
, trampptr
);
4852 /* The kernel checks for the presence of a VDSO here. We don't
4853 emulate a vdso, so use a sigreturn system call. */
4854 env
->lr
= (target_ulong
) h2g(trampptr
);
4856 /* Turn off all fp exceptions. */
4859 /* Create a stack frame for the caller of the handler. */
4860 newsp
= rt_sf_addr
- (SIGNAL_FRAMESIZE
+ 16);
4861 err
|= put_user(env
->gpr
[1], newsp
, target_ulong
);
4866 /* Set up registers for signal handler. */
4867 env
->gpr
[1] = newsp
;
4868 env
->gpr
[3] = (target_ulong
) sig
;
4869 env
->gpr
[4] = (target_ulong
) h2g(&rt_sf
->info
);
4870 env
->gpr
[5] = (target_ulong
) h2g(&rt_sf
->uc
);
4871 env
->gpr
[6] = (target_ulong
) h2g(rt_sf
);
4873 #if defined(TARGET_PPC64)
4874 if (get_ppc64_abi(image
) < 2) {
4875 /* ELFv1 PPC64 function pointers are pointers to OPD entries. */
4876 struct target_func_ptr
*handler
=
4877 (struct target_func_ptr
*)g2h(ka
->_sa_handler
);
4878 env
->nip
= tswapl(handler
->entry
);
4879 env
->gpr
[2] = tswapl(handler
->toc
);
4881 /* ELFv2 PPC64 function pointers are entry points, but R12
4882 * must also be set */
4883 env
->nip
= tswapl((target_ulong
) ka
->_sa_handler
);
4884 env
->gpr
[12] = env
->nip
;
4887 env
->nip
= (target_ulong
) ka
->_sa_handler
;
4890 /* Signal handlers are entered in big-endian mode. */
4891 env
->msr
&= ~(1ull << MSR_LE
);
4893 unlock_user_struct(rt_sf
, rt_sf_addr
, 1);
4897 unlock_user_struct(rt_sf
, rt_sf_addr
, 1);
4898 force_sig(TARGET_SIGSEGV
);
4902 long do_sigreturn(CPUPPCState
*env
)
4904 struct target_sigcontext
*sc
= NULL
;
4905 struct target_mcontext
*sr
= NULL
;
4906 target_ulong sr_addr
= 0, sc_addr
;
4908 target_sigset_t set
;
4910 sc_addr
= env
->gpr
[1] + SIGNAL_FRAMESIZE
;
4911 if (!lock_user_struct(VERIFY_READ
, sc
, sc_addr
, 1))
4914 #if defined(TARGET_PPC64)
4915 set
.sig
[0] = sc
->oldmask
+ ((uint64_t)(sc
->_unused
[3]) << 32);
4917 __get_user(set
.sig
[0], &sc
->oldmask
);
4918 __get_user(set
.sig
[1], &sc
->_unused
[3]);
4920 target_to_host_sigset_internal(&blocked
, &set
);
4921 set_sigmask(&blocked
);
4923 __get_user(sr_addr
, &sc
->regs
);
4924 if (!lock_user_struct(VERIFY_READ
, sr
, sr_addr
, 1))
4926 restore_user_regs(env
, sr
, 1);
4928 unlock_user_struct(sr
, sr_addr
, 1);
4929 unlock_user_struct(sc
, sc_addr
, 1);
4930 return -TARGET_QEMU_ESIGRETURN
;
4933 unlock_user_struct(sr
, sr_addr
, 1);
4934 unlock_user_struct(sc
, sc_addr
, 1);
4935 force_sig(TARGET_SIGSEGV
);
4939 /* See arch/powerpc/kernel/signal_32.c. */
4940 static int do_setcontext(struct target_ucontext
*ucp
, CPUPPCState
*env
, int sig
)
4942 struct target_mcontext
*mcp
;
4943 target_ulong mcp_addr
;
4945 target_sigset_t set
;
4947 if (copy_from_user(&set
, h2g(ucp
) + offsetof(struct target_ucontext
, tuc_sigmask
),
4951 #if defined(TARGET_PPC64)
4952 mcp_addr
= h2g(ucp
) +
4953 offsetof(struct target_ucontext
, tuc_sigcontext
.mcontext
);
4955 __get_user(mcp_addr
, &ucp
->tuc_regs
);
4958 if (!lock_user_struct(VERIFY_READ
, mcp
, mcp_addr
, 1))
4961 target_to_host_sigset_internal(&blocked
, &set
);
4962 set_sigmask(&blocked
);
4963 restore_user_regs(env
, mcp
, sig
);
4965 unlock_user_struct(mcp
, mcp_addr
, 1);
4969 long do_rt_sigreturn(CPUPPCState
*env
)
4971 struct target_rt_sigframe
*rt_sf
= NULL
;
4972 target_ulong rt_sf_addr
;
4974 rt_sf_addr
= env
->gpr
[1] + SIGNAL_FRAMESIZE
+ 16;
4975 if (!lock_user_struct(VERIFY_READ
, rt_sf
, rt_sf_addr
, 1))
4978 if (do_setcontext(&rt_sf
->uc
, env
, 1))
4981 do_sigaltstack(rt_sf_addr
4982 + offsetof(struct target_rt_sigframe
, uc
.tuc_stack
),
4985 unlock_user_struct(rt_sf
, rt_sf_addr
, 1);
4986 return -TARGET_QEMU_ESIGRETURN
;
4989 unlock_user_struct(rt_sf
, rt_sf_addr
, 1);
4990 force_sig(TARGET_SIGSEGV
);
4994 #elif defined(TARGET_M68K)
4996 struct target_sigcontext
{
5003 unsigned short sc_sr
;
5007 struct target_sigframe
5014 abi_ulong extramask
[TARGET_NSIG_WORDS
-1];
5015 struct target_sigcontext sc
;
5018 typedef int target_greg_t
;
5019 #define TARGET_NGREG 18
5020 typedef target_greg_t target_gregset_t
[TARGET_NGREG
];
5022 typedef struct target_fpregset
{
5025 } target_fpregset_t
;
5027 struct target_mcontext
{
5029 target_gregset_t gregs
;
5030 target_fpregset_t fpregs
;
5033 #define TARGET_MCONTEXT_VERSION 2
5035 struct target_ucontext
{
5036 abi_ulong tuc_flags
;
5038 target_stack_t tuc_stack
;
5039 struct target_mcontext tuc_mcontext
;
5040 abi_long tuc_filler
[80];
5041 target_sigset_t tuc_sigmask
;
5044 struct target_rt_sigframe
5051 struct target_siginfo info
;
5052 struct target_ucontext uc
;
5055 static void setup_sigcontext(struct target_sigcontext
*sc
, CPUM68KState
*env
,
5058 __put_user(mask
, &sc
->sc_mask
);
5059 __put_user(env
->aregs
[7], &sc
->sc_usp
);
5060 __put_user(env
->dregs
[0], &sc
->sc_d0
);
5061 __put_user(env
->dregs
[1], &sc
->sc_d1
);
5062 __put_user(env
->aregs
[0], &sc
->sc_a0
);
5063 __put_user(env
->aregs
[1], &sc
->sc_a1
);
5064 __put_user(env
->sr
, &sc
->sc_sr
);
5065 __put_user(env
->pc
, &sc
->sc_pc
);
5069 restore_sigcontext(CPUM68KState
*env
, struct target_sigcontext
*sc
)
5073 __get_user(env
->aregs
[7], &sc
->sc_usp
);
5074 __get_user(env
->dregs
[0], &sc
->sc_d0
);
5075 __get_user(env
->dregs
[1], &sc
->sc_d1
);
5076 __get_user(env
->aregs
[0], &sc
->sc_a0
);
5077 __get_user(env
->aregs
[1], &sc
->sc_a1
);
5078 __get_user(env
->pc
, &sc
->sc_pc
);
5079 __get_user(temp
, &sc
->sc_sr
);
5080 env
->sr
= (env
->sr
& 0xff00) | (temp
& 0xff);
5084 * Determine which stack to use..
5086 static inline abi_ulong
5087 get_sigframe(struct target_sigaction
*ka
, CPUM68KState
*regs
,
5092 sp
= regs
->aregs
[7];
5094 /* This is the X/Open sanctioned signal stack switching. */
5095 if ((ka
->sa_flags
& TARGET_SA_ONSTACK
) && (sas_ss_flags (sp
) == 0)) {
5096 sp
= target_sigaltstack_used
.ss_sp
+ target_sigaltstack_used
.ss_size
;
5099 return ((sp
- frame_size
) & -8UL);
5102 static void setup_frame(int sig
, struct target_sigaction
*ka
,
5103 target_sigset_t
*set
, CPUM68KState
*env
)
5105 struct target_sigframe
*frame
;
5106 abi_ulong frame_addr
;
5107 abi_ulong retcode_addr
;
5111 frame_addr
= get_sigframe(ka
, env
, sizeof *frame
);
5112 trace_user_setup_frame(env
, frame_addr
);
5113 if (!lock_user_struct(VERIFY_WRITE
, frame
, frame_addr
, 0)) {
5117 __put_user(sig
, &frame
->sig
);
5119 sc_addr
= frame_addr
+ offsetof(struct target_sigframe
, sc
);
5120 __put_user(sc_addr
, &frame
->psc
);
5122 setup_sigcontext(&frame
->sc
, env
, set
->sig
[0]);
5124 for(i
= 1; i
< TARGET_NSIG_WORDS
; i
++) {
5125 __put_user(set
->sig
[i
], &frame
->extramask
[i
- 1]);
5128 /* Set up to return from userspace. */
5130 retcode_addr
= frame_addr
+ offsetof(struct target_sigframe
, retcode
);
5131 __put_user(retcode_addr
, &frame
->pretcode
);
5133 /* moveq #,d0; trap #0 */
5135 __put_user(0x70004e40 + (TARGET_NR_sigreturn
<< 16),
5136 (uint32_t *)(frame
->retcode
));
5138 /* Set up to return from userspace */
5140 env
->aregs
[7] = frame_addr
;
5141 env
->pc
= ka
->_sa_handler
;
5143 unlock_user_struct(frame
, frame_addr
, 1);
5147 force_sig(TARGET_SIGSEGV
);
5150 static inline int target_rt_setup_ucontext(struct target_ucontext
*uc
,
5153 target_greg_t
*gregs
= uc
->tuc_mcontext
.gregs
;
5155 __put_user(TARGET_MCONTEXT_VERSION
, &uc
->tuc_mcontext
.version
);
5156 __put_user(env
->dregs
[0], &gregs
[0]);
5157 __put_user(env
->dregs
[1], &gregs
[1]);
5158 __put_user(env
->dregs
[2], &gregs
[2]);
5159 __put_user(env
->dregs
[3], &gregs
[3]);
5160 __put_user(env
->dregs
[4], &gregs
[4]);
5161 __put_user(env
->dregs
[5], &gregs
[5]);
5162 __put_user(env
->dregs
[6], &gregs
[6]);
5163 __put_user(env
->dregs
[7], &gregs
[7]);
5164 __put_user(env
->aregs
[0], &gregs
[8]);
5165 __put_user(env
->aregs
[1], &gregs
[9]);
5166 __put_user(env
->aregs
[2], &gregs
[10]);
5167 __put_user(env
->aregs
[3], &gregs
[11]);
5168 __put_user(env
->aregs
[4], &gregs
[12]);
5169 __put_user(env
->aregs
[5], &gregs
[13]);
5170 __put_user(env
->aregs
[6], &gregs
[14]);
5171 __put_user(env
->aregs
[7], &gregs
[15]);
5172 __put_user(env
->pc
, &gregs
[16]);
5173 __put_user(env
->sr
, &gregs
[17]);
5178 static inline int target_rt_restore_ucontext(CPUM68KState
*env
,
5179 struct target_ucontext
*uc
)
5182 target_greg_t
*gregs
= uc
->tuc_mcontext
.gregs
;
5184 __get_user(temp
, &uc
->tuc_mcontext
.version
);
5185 if (temp
!= TARGET_MCONTEXT_VERSION
)
5188 /* restore passed registers */
5189 __get_user(env
->dregs
[0], &gregs
[0]);
5190 __get_user(env
->dregs
[1], &gregs
[1]);
5191 __get_user(env
->dregs
[2], &gregs
[2]);
5192 __get_user(env
->dregs
[3], &gregs
[3]);
5193 __get_user(env
->dregs
[4], &gregs
[4]);
5194 __get_user(env
->dregs
[5], &gregs
[5]);
5195 __get_user(env
->dregs
[6], &gregs
[6]);
5196 __get_user(env
->dregs
[7], &gregs
[7]);
5197 __get_user(env
->aregs
[0], &gregs
[8]);
5198 __get_user(env
->aregs
[1], &gregs
[9]);
5199 __get_user(env
->aregs
[2], &gregs
[10]);
5200 __get_user(env
->aregs
[3], &gregs
[11]);
5201 __get_user(env
->aregs
[4], &gregs
[12]);
5202 __get_user(env
->aregs
[5], &gregs
[13]);
5203 __get_user(env
->aregs
[6], &gregs
[14]);
5204 __get_user(env
->aregs
[7], &gregs
[15]);
5205 __get_user(env
->pc
, &gregs
[16]);
5206 __get_user(temp
, &gregs
[17]);
5207 env
->sr
= (env
->sr
& 0xff00) | (temp
& 0xff);
5215 static void setup_rt_frame(int sig
, struct target_sigaction
*ka
,
5216 target_siginfo_t
*info
,
5217 target_sigset_t
*set
, CPUM68KState
*env
)
5219 struct target_rt_sigframe
*frame
;
5220 abi_ulong frame_addr
;
5221 abi_ulong retcode_addr
;
5222 abi_ulong info_addr
;
5227 frame_addr
= get_sigframe(ka
, env
, sizeof *frame
);
5228 trace_user_setup_rt_frame(env
, frame_addr
);
5229 if (!lock_user_struct(VERIFY_WRITE
, frame
, frame_addr
, 0)) {
5233 __put_user(sig
, &frame
->sig
);
5235 info_addr
= frame_addr
+ offsetof(struct target_rt_sigframe
, info
);
5236 __put_user(info_addr
, &frame
->pinfo
);
5238 uc_addr
= frame_addr
+ offsetof(struct target_rt_sigframe
, uc
);
5239 __put_user(uc_addr
, &frame
->puc
);
5241 tswap_siginfo(&frame
->info
, info
);
5243 /* Create the ucontext */
5245 __put_user(0, &frame
->uc
.tuc_flags
);
5246 __put_user(0, &frame
->uc
.tuc_link
);
5247 __put_user(target_sigaltstack_used
.ss_sp
,
5248 &frame
->uc
.tuc_stack
.ss_sp
);
5249 __put_user(sas_ss_flags(env
->aregs
[7]),
5250 &frame
->uc
.tuc_stack
.ss_flags
);
5251 __put_user(target_sigaltstack_used
.ss_size
,
5252 &frame
->uc
.tuc_stack
.ss_size
);
5253 err
|= target_rt_setup_ucontext(&frame
->uc
, env
);
5258 for(i
= 0; i
< TARGET_NSIG_WORDS
; i
++) {
5259 __put_user(set
->sig
[i
], &frame
->uc
.tuc_sigmask
.sig
[i
]);
5262 /* Set up to return from userspace. */
5264 retcode_addr
= frame_addr
+ offsetof(struct target_sigframe
, retcode
);
5265 __put_user(retcode_addr
, &frame
->pretcode
);
5267 /* moveq #,d0; notb d0; trap #0 */
5269 __put_user(0x70004600 + ((TARGET_NR_rt_sigreturn
^ 0xff) << 16),
5270 (uint32_t *)(frame
->retcode
+ 0));
5271 __put_user(0x4e40, (uint16_t *)(frame
->retcode
+ 4));
5276 /* Set up to return from userspace */
5278 env
->aregs
[7] = frame_addr
;
5279 env
->pc
= ka
->_sa_handler
;
5281 unlock_user_struct(frame
, frame_addr
, 1);
5285 unlock_user_struct(frame
, frame_addr
, 1);
5286 force_sig(TARGET_SIGSEGV
);
5289 long do_sigreturn(CPUM68KState
*env
)
5291 struct target_sigframe
*frame
;
5292 abi_ulong frame_addr
= env
->aregs
[7] - 4;
5293 target_sigset_t target_set
;
5297 trace_user_do_sigreturn(env
, frame_addr
);
5298 if (!lock_user_struct(VERIFY_READ
, frame
, frame_addr
, 1))
5301 /* set blocked signals */
5303 __get_user(target_set
.sig
[0], &frame
->sc
.sc_mask
);
5305 for(i
= 1; i
< TARGET_NSIG_WORDS
; i
++) {
5306 __get_user(target_set
.sig
[i
], &frame
->extramask
[i
- 1]);
5309 target_to_host_sigset_internal(&set
, &target_set
);
5312 /* restore registers */
5314 restore_sigcontext(env
, &frame
->sc
);
5316 unlock_user_struct(frame
, frame_addr
, 0);
5317 return -TARGET_QEMU_ESIGRETURN
;
5320 force_sig(TARGET_SIGSEGV
);
5324 long do_rt_sigreturn(CPUM68KState
*env
)
5326 struct target_rt_sigframe
*frame
;
5327 abi_ulong frame_addr
= env
->aregs
[7] - 4;
5328 target_sigset_t target_set
;
5331 trace_user_do_rt_sigreturn(env
, frame_addr
);
5332 if (!lock_user_struct(VERIFY_READ
, frame
, frame_addr
, 1))
5335 target_to_host_sigset_internal(&set
, &target_set
);
5338 /* restore registers */
5340 if (target_rt_restore_ucontext(env
, &frame
->uc
))
5343 if (do_sigaltstack(frame_addr
+
5344 offsetof(struct target_rt_sigframe
, uc
.tuc_stack
),
5345 0, get_sp_from_cpustate(env
)) == -EFAULT
)
5348 unlock_user_struct(frame
, frame_addr
, 0);
5349 return -TARGET_QEMU_ESIGRETURN
;
5352 unlock_user_struct(frame
, frame_addr
, 0);
5353 force_sig(TARGET_SIGSEGV
);
5357 #elif defined(TARGET_ALPHA)
5359 struct target_sigcontext
{
5360 abi_long sc_onstack
;
5364 abi_long sc_regs
[32];
5365 abi_long sc_ownedfp
;
5366 abi_long sc_fpregs
[32];
5368 abi_ulong sc_fp_control
;
5369 abi_ulong sc_reserved1
;
5370 abi_ulong sc_reserved2
;
5373 abi_ulong sc_traparg_a0
;
5374 abi_ulong sc_traparg_a1
;
5375 abi_ulong sc_traparg_a2
;
5376 abi_ulong sc_fp_trap_pc
;
5377 abi_ulong sc_fp_trigger_sum
;
5378 abi_ulong sc_fp_trigger_inst
;
5381 struct target_ucontext
{
5382 abi_ulong tuc_flags
;
5384 abi_ulong tuc_osf_sigmask
;
5385 target_stack_t tuc_stack
;
5386 struct target_sigcontext tuc_mcontext
;
5387 target_sigset_t tuc_sigmask
;
5390 struct target_sigframe
{
5391 struct target_sigcontext sc
;
5392 unsigned int retcode
[3];
5395 struct target_rt_sigframe
{
5396 target_siginfo_t info
;
5397 struct target_ucontext uc
;
5398 unsigned int retcode
[3];
5401 #define INSN_MOV_R30_R16 0x47fe0410
5402 #define INSN_LDI_R0 0x201f0000
5403 #define INSN_CALLSYS 0x00000083
5405 static void setup_sigcontext(struct target_sigcontext
*sc
, CPUAlphaState
*env
,
5406 abi_ulong frame_addr
, target_sigset_t
*set
)
5410 __put_user(on_sig_stack(frame_addr
), &sc
->sc_onstack
);
5411 __put_user(set
->sig
[0], &sc
->sc_mask
);
5412 __put_user(env
->pc
, &sc
->sc_pc
);
5413 __put_user(8, &sc
->sc_ps
);
5415 for (i
= 0; i
< 31; ++i
) {
5416 __put_user(env
->ir
[i
], &sc
->sc_regs
[i
]);
5418 __put_user(0, &sc
->sc_regs
[31]);
5420 for (i
= 0; i
< 31; ++i
) {
5421 __put_user(env
->fir
[i
], &sc
->sc_fpregs
[i
]);
5423 __put_user(0, &sc
->sc_fpregs
[31]);
5424 __put_user(cpu_alpha_load_fpcr(env
), &sc
->sc_fpcr
);
5426 __put_user(0, &sc
->sc_traparg_a0
); /* FIXME */
5427 __put_user(0, &sc
->sc_traparg_a1
); /* FIXME */
5428 __put_user(0, &sc
->sc_traparg_a2
); /* FIXME */
5431 static void restore_sigcontext(CPUAlphaState
*env
,
5432 struct target_sigcontext
*sc
)
5437 __get_user(env
->pc
, &sc
->sc_pc
);
5439 for (i
= 0; i
< 31; ++i
) {
5440 __get_user(env
->ir
[i
], &sc
->sc_regs
[i
]);
5442 for (i
= 0; i
< 31; ++i
) {
5443 __get_user(env
->fir
[i
], &sc
->sc_fpregs
[i
]);
5446 __get_user(fpcr
, &sc
->sc_fpcr
);
5447 cpu_alpha_store_fpcr(env
, fpcr
);
5450 static inline abi_ulong
get_sigframe(struct target_sigaction
*sa
,
5452 unsigned long framesize
)
5454 abi_ulong sp
= env
->ir
[IR_SP
];
5456 /* This is the X/Open sanctioned signal stack switching. */
5457 if ((sa
->sa_flags
& TARGET_SA_ONSTACK
) != 0 && !sas_ss_flags(sp
)) {
5458 sp
= target_sigaltstack_used
.ss_sp
+ target_sigaltstack_used
.ss_size
;
5460 return (sp
- framesize
) & -32;
5463 static void setup_frame(int sig
, struct target_sigaction
*ka
,
5464 target_sigset_t
*set
, CPUAlphaState
*env
)
5466 abi_ulong frame_addr
, r26
;
5467 struct target_sigframe
*frame
;
5470 frame_addr
= get_sigframe(ka
, env
, sizeof(*frame
));
5471 trace_user_setup_frame(env
, frame_addr
);
5472 if (!lock_user_struct(VERIFY_WRITE
, frame
, frame_addr
, 0)) {
5476 setup_sigcontext(&frame
->sc
, env
, frame_addr
, set
);
5478 if (ka
->sa_restorer
) {
5479 r26
= ka
->sa_restorer
;
5481 __put_user(INSN_MOV_R30_R16
, &frame
->retcode
[0]);
5482 __put_user(INSN_LDI_R0
+ TARGET_NR_sigreturn
,
5483 &frame
->retcode
[1]);
5484 __put_user(INSN_CALLSYS
, &frame
->retcode
[2]);
5489 unlock_user_struct(frame
, frame_addr
, 1);
5493 if (sig
== TARGET_SIGSEGV
) {
5494 ka
->_sa_handler
= TARGET_SIG_DFL
;
5496 force_sig(TARGET_SIGSEGV
);
5499 env
->ir
[IR_RA
] = r26
;
5500 env
->ir
[IR_PV
] = env
->pc
= ka
->_sa_handler
;
5501 env
->ir
[IR_A0
] = sig
;
5503 env
->ir
[IR_A2
] = frame_addr
+ offsetof(struct target_sigframe
, sc
);
5504 env
->ir
[IR_SP
] = frame_addr
;
5507 static void setup_rt_frame(int sig
, struct target_sigaction
*ka
,
5508 target_siginfo_t
*info
,
5509 target_sigset_t
*set
, CPUAlphaState
*env
)
5511 abi_ulong frame_addr
, r26
;
5512 struct target_rt_sigframe
*frame
;
5515 frame_addr
= get_sigframe(ka
, env
, sizeof(*frame
));
5516 trace_user_setup_rt_frame(env
, frame_addr
);
5517 if (!lock_user_struct(VERIFY_WRITE
, frame
, frame_addr
, 0)) {
5521 tswap_siginfo(&frame
->info
, info
);
5523 __put_user(0, &frame
->uc
.tuc_flags
);
5524 __put_user(0, &frame
->uc
.tuc_link
);
5525 __put_user(set
->sig
[0], &frame
->uc
.tuc_osf_sigmask
);
5526 __put_user(target_sigaltstack_used
.ss_sp
,
5527 &frame
->uc
.tuc_stack
.ss_sp
);
5528 __put_user(sas_ss_flags(env
->ir
[IR_SP
]),
5529 &frame
->uc
.tuc_stack
.ss_flags
);
5530 __put_user(target_sigaltstack_used
.ss_size
,
5531 &frame
->uc
.tuc_stack
.ss_size
);
5532 setup_sigcontext(&frame
->uc
.tuc_mcontext
, env
, frame_addr
, set
);
5533 for (i
= 0; i
< TARGET_NSIG_WORDS
; ++i
) {
5534 __put_user(set
->sig
[i
], &frame
->uc
.tuc_sigmask
.sig
[i
]);
5537 if (ka
->sa_restorer
) {
5538 r26
= ka
->sa_restorer
;
5540 __put_user(INSN_MOV_R30_R16
, &frame
->retcode
[0]);
5541 __put_user(INSN_LDI_R0
+ TARGET_NR_rt_sigreturn
,
5542 &frame
->retcode
[1]);
5543 __put_user(INSN_CALLSYS
, &frame
->retcode
[2]);
5550 if (sig
== TARGET_SIGSEGV
) {
5551 ka
->_sa_handler
= TARGET_SIG_DFL
;
5553 force_sig(TARGET_SIGSEGV
);
5556 env
->ir
[IR_RA
] = r26
;
5557 env
->ir
[IR_PV
] = env
->pc
= ka
->_sa_handler
;
5558 env
->ir
[IR_A0
] = sig
;
5559 env
->ir
[IR_A1
] = frame_addr
+ offsetof(struct target_rt_sigframe
, info
);
5560 env
->ir
[IR_A2
] = frame_addr
+ offsetof(struct target_rt_sigframe
, uc
);
5561 env
->ir
[IR_SP
] = frame_addr
;
5564 long do_sigreturn(CPUAlphaState
*env
)
5566 struct target_sigcontext
*sc
;
5567 abi_ulong sc_addr
= env
->ir
[IR_A0
];
5568 target_sigset_t target_set
;
5571 if (!lock_user_struct(VERIFY_READ
, sc
, sc_addr
, 1)) {
5575 target_sigemptyset(&target_set
);
5576 __get_user(target_set
.sig
[0], &sc
->sc_mask
);
5578 target_to_host_sigset_internal(&set
, &target_set
);
5581 restore_sigcontext(env
, sc
);
5582 unlock_user_struct(sc
, sc_addr
, 0);
5583 return -TARGET_QEMU_ESIGRETURN
;
5586 force_sig(TARGET_SIGSEGV
);
5589 long do_rt_sigreturn(CPUAlphaState
*env
)
5591 abi_ulong frame_addr
= env
->ir
[IR_A0
];
5592 struct target_rt_sigframe
*frame
;
5595 trace_user_do_rt_sigreturn(env
, frame_addr
);
5596 if (!lock_user_struct(VERIFY_READ
, frame
, frame_addr
, 1)) {
5599 target_to_host_sigset(&set
, &frame
->uc
.tuc_sigmask
);
5602 restore_sigcontext(env
, &frame
->uc
.tuc_mcontext
);
5603 if (do_sigaltstack(frame_addr
+ offsetof(struct target_rt_sigframe
,
5605 0, env
->ir
[IR_SP
]) == -EFAULT
) {
5609 unlock_user_struct(frame
, frame_addr
, 0);
5610 return -TARGET_QEMU_ESIGRETURN
;
5614 unlock_user_struct(frame
, frame_addr
, 0);
5615 force_sig(TARGET_SIGSEGV
);
5618 #elif defined(TARGET_TILEGX)
5620 struct target_sigcontext
{
5622 /* General-purpose registers. */
5623 abi_ulong gregs
[56];
5625 abi_ulong __gregs
[53];
5626 abi_ulong tp
; /* Aliases gregs[TREG_TP]. */
5627 abi_ulong sp
; /* Aliases gregs[TREG_SP]. */
5628 abi_ulong lr
; /* Aliases gregs[TREG_LR]. */
5631 abi_ulong pc
; /* Program counter. */
5632 abi_ulong ics
; /* In Interrupt Critical Section? */
5633 abi_ulong faultnum
; /* Fault number. */
5637 struct target_ucontext
{
5638 abi_ulong tuc_flags
;
5640 target_stack_t tuc_stack
;
5641 struct target_sigcontext tuc_mcontext
;
5642 target_sigset_t tuc_sigmask
; /* mask last for extensibility */
5645 struct target_rt_sigframe
{
5646 unsigned char save_area
[16]; /* caller save area */
5647 struct target_siginfo info
;
5648 struct target_ucontext uc
;
5649 abi_ulong retcode
[2];
5652 #define INSN_MOVELI_R10_139 0x00045fe551483000ULL /* { moveli r10, 139 } */
5653 #define INSN_SWINT1 0x286b180051485000ULL /* { swint1 } */
5656 static void setup_sigcontext(struct target_sigcontext
*sc
,
5657 CPUArchState
*env
, int signo
)
5661 for (i
= 0; i
< TILEGX_R_COUNT
; ++i
) {
5662 __put_user(env
->regs
[i
], &sc
->gregs
[i
]);
5665 __put_user(env
->pc
, &sc
->pc
);
5666 __put_user(0, &sc
->ics
);
5667 __put_user(signo
, &sc
->faultnum
);
5670 static void restore_sigcontext(CPUTLGState
*env
, struct target_sigcontext
*sc
)
5674 for (i
= 0; i
< TILEGX_R_COUNT
; ++i
) {
5675 __get_user(env
->regs
[i
], &sc
->gregs
[i
]);
5678 __get_user(env
->pc
, &sc
->pc
);
5681 static abi_ulong
get_sigframe(struct target_sigaction
*ka
, CPUArchState
*env
,
5684 unsigned long sp
= env
->regs
[TILEGX_R_SP
];
5686 if (on_sig_stack(sp
) && !likely(on_sig_stack(sp
- frame_size
))) {
5690 if ((ka
->sa_flags
& SA_ONSTACK
) && !sas_ss_flags(sp
)) {
5691 sp
= target_sigaltstack_used
.ss_sp
+ target_sigaltstack_used
.ss_size
;
5699 static void setup_rt_frame(int sig
, struct target_sigaction
*ka
,
5700 target_siginfo_t
*info
,
5701 target_sigset_t
*set
, CPUArchState
*env
)
5703 abi_ulong frame_addr
;
5704 struct target_rt_sigframe
*frame
;
5705 unsigned long restorer
;
5707 frame_addr
= get_sigframe(ka
, env
, sizeof(*frame
));
5708 trace_user_setup_rt_frame(env
, frame_addr
);
5709 if (!lock_user_struct(VERIFY_WRITE
, frame
, frame_addr
, 0)) {
5713 /* Always write at least the signal number for the stack backtracer. */
5714 if (ka
->sa_flags
& TARGET_SA_SIGINFO
) {
5715 /* At sigreturn time, restore the callee-save registers too. */
5716 tswap_siginfo(&frame
->info
, info
);
5717 /* regs->flags |= PT_FLAGS_RESTORE_REGS; FIXME: we can skip it? */
5719 __put_user(info
->si_signo
, &frame
->info
.si_signo
);
5722 /* Create the ucontext. */
5723 __put_user(0, &frame
->uc
.tuc_flags
);
5724 __put_user(0, &frame
->uc
.tuc_link
);
5725 __put_user(target_sigaltstack_used
.ss_sp
, &frame
->uc
.tuc_stack
.ss_sp
);
5726 __put_user(sas_ss_flags(env
->regs
[TILEGX_R_SP
]),
5727 &frame
->uc
.tuc_stack
.ss_flags
);
5728 __put_user(target_sigaltstack_used
.ss_size
, &frame
->uc
.tuc_stack
.ss_size
);
5729 setup_sigcontext(&frame
->uc
.tuc_mcontext
, env
, info
->si_signo
);
5731 if (ka
->sa_flags
& TARGET_SA_RESTORER
) {
5732 restorer
= (unsigned long) ka
->sa_restorer
;
5734 __put_user(INSN_MOVELI_R10_139
, &frame
->retcode
[0]);
5735 __put_user(INSN_SWINT1
, &frame
->retcode
[1]);
5736 restorer
= frame_addr
+ offsetof(struct target_rt_sigframe
, retcode
);
5738 env
->pc
= (unsigned long) ka
->_sa_handler
;
5739 env
->regs
[TILEGX_R_SP
] = (unsigned long) frame
;
5740 env
->regs
[TILEGX_R_LR
] = restorer
;
5741 env
->regs
[0] = (unsigned long) sig
;
5742 env
->regs
[1] = (unsigned long) &frame
->info
;
5743 env
->regs
[2] = (unsigned long) &frame
->uc
;
5744 /* regs->flags |= PT_FLAGS_CALLER_SAVES; FIXME: we can skip it? */
5746 unlock_user_struct(frame
, frame_addr
, 1);
5750 if (sig
== TARGET_SIGSEGV
) {
5751 ka
->_sa_handler
= TARGET_SIG_DFL
;
5753 force_sig(TARGET_SIGSEGV
/* , current */);
5756 long do_rt_sigreturn(CPUTLGState
*env
)
5758 abi_ulong frame_addr
= env
->regs
[TILEGX_R_SP
];
5759 struct target_rt_sigframe
*frame
;
5762 trace_user_do_rt_sigreturn(env
, frame_addr
);
5763 if (!lock_user_struct(VERIFY_READ
, frame
, frame_addr
, 1)) {
5766 target_to_host_sigset(&set
, &frame
->uc
.tuc_sigmask
);
5769 restore_sigcontext(env
, &frame
->uc
.tuc_mcontext
);
5770 if (do_sigaltstack(frame_addr
+ offsetof(struct target_rt_sigframe
,
5772 0, env
->regs
[TILEGX_R_SP
]) == -EFAULT
) {
5776 unlock_user_struct(frame
, frame_addr
, 0);
5777 return -TARGET_QEMU_ESIGRETURN
;
5781 unlock_user_struct(frame
, frame_addr
, 0);
5782 force_sig(TARGET_SIGSEGV
);
5787 static void setup_frame(int sig
, struct target_sigaction
*ka
,
5788 target_sigset_t
*set
, CPUArchState
*env
)
5790 fprintf(stderr
, "setup_frame: not implemented\n");
5793 static void setup_rt_frame(int sig
, struct target_sigaction
*ka
,
5794 target_siginfo_t
*info
,
5795 target_sigset_t
*set
, CPUArchState
*env
)
5797 fprintf(stderr
, "setup_rt_frame: not implemented\n");
5800 long do_sigreturn(CPUArchState
*env
)
5802 fprintf(stderr
, "do_sigreturn: not implemented\n");
5803 return -TARGET_ENOSYS
;
5806 long do_rt_sigreturn(CPUArchState
*env
)
5808 fprintf(stderr
, "do_rt_sigreturn: not implemented\n");
5809 return -TARGET_ENOSYS
;
5814 static void handle_pending_signal(CPUArchState
*cpu_env
, int sig
)
5816 CPUState
*cpu
= ENV_GET_CPU(cpu_env
);
5819 target_sigset_t target_old_set
;
5820 struct target_sigaction
*sa
;
5821 TaskState
*ts
= cpu
->opaque
;
5822 struct emulated_sigtable
*k
= &ts
->sigtab
[sig
- 1];
5824 trace_user_handle_signal(cpu_env
, sig
);
5825 /* dequeue signal */
5828 sig
= gdb_handlesig(cpu
, sig
);
5831 handler
= TARGET_SIG_IGN
;
5833 sa
= &sigact_table
[sig
- 1];
5834 handler
= sa
->_sa_handler
;
5837 if (handler
== TARGET_SIG_DFL
) {
5838 /* default handler : ignore some signal. The other are job control or fatal */
5839 if (sig
== TARGET_SIGTSTP
|| sig
== TARGET_SIGTTIN
|| sig
== TARGET_SIGTTOU
) {
5840 kill(getpid(),SIGSTOP
);
5841 } else if (sig
!= TARGET_SIGCHLD
&&
5842 sig
!= TARGET_SIGURG
&&
5843 sig
!= TARGET_SIGWINCH
&&
5844 sig
!= TARGET_SIGCONT
) {
5847 } else if (handler
== TARGET_SIG_IGN
) {
5849 } else if (handler
== TARGET_SIG_ERR
) {
5852 /* compute the blocked signals during the handler execution */
5853 sigset_t
*blocked_set
;
5855 target_to_host_sigset(&set
, &sa
->sa_mask
);
5856 /* SA_NODEFER indicates that the current signal should not be
5857 blocked during the handler */
5858 if (!(sa
->sa_flags
& TARGET_SA_NODEFER
))
5859 sigaddset(&set
, target_to_host_signal(sig
));
5861 /* save the previous blocked signal state to restore it at the
5862 end of the signal execution (see do_sigreturn) */
5863 host_to_target_sigset_internal(&target_old_set
, &ts
->signal_mask
);
5865 /* block signals in the handler */
5866 blocked_set
= ts
->in_sigsuspend
?
5867 &ts
->sigsuspend_mask
: &ts
->signal_mask
;
5868 sigorset(&ts
->signal_mask
, blocked_set
, &set
);
5869 ts
->in_sigsuspend
= 0;
5871 /* if the CPU is in VM86 mode, we restore the 32 bit values */
5872 #if defined(TARGET_I386) && !defined(TARGET_X86_64)
5874 CPUX86State
*env
= cpu_env
;
5875 if (env
->eflags
& VM_MASK
)
5876 save_v86_state(env
);
5879 /* prepare the stack frame of the virtual CPU */
5880 #if defined(TARGET_ABI_MIPSN32) || defined(TARGET_ABI_MIPSN64) \
5881 || defined(TARGET_OPENRISC) || defined(TARGET_TILEGX)
5882 /* These targets do not have traditional signals. */
5883 setup_rt_frame(sig
, sa
, &k
->info
, &target_old_set
, cpu_env
);
5885 if (sa
->sa_flags
& TARGET_SA_SIGINFO
)
5886 setup_rt_frame(sig
, sa
, &k
->info
, &target_old_set
, cpu_env
);
5888 setup_frame(sig
, sa
, &target_old_set
, cpu_env
);
5890 if (sa
->sa_flags
& TARGET_SA_RESETHAND
) {
5891 sa
->_sa_handler
= TARGET_SIG_DFL
;
5896 void process_pending_signals(CPUArchState
*cpu_env
)
5898 CPUState
*cpu
= ENV_GET_CPU(cpu_env
);
5900 TaskState
*ts
= cpu
->opaque
;
5902 sigset_t
*blocked_set
;
5904 while (atomic_read(&ts
->signal_pending
)) {
5905 /* FIXME: This is not threadsafe. */
5907 sigprocmask(SIG_SETMASK
, &set
, 0);
5909 sig
= ts
->sync_signal
.pending
;
5911 /* Synchronous signals are forced,
5912 * see force_sig_info() and callers in Linux
5913 * Note that not all of our queue_signal() calls in QEMU correspond
5914 * to force_sig_info() calls in Linux (some are send_sig_info()).
5915 * However it seems like a kernel bug to me to allow the process
5916 * to block a synchronous signal since it could then just end up
5917 * looping round and round indefinitely.
5919 if (sigismember(&ts
->signal_mask
, target_to_host_signal_table
[sig
])
5920 || sigact_table
[sig
- 1]._sa_handler
== TARGET_SIG_IGN
) {
5921 sigdelset(&ts
->signal_mask
, target_to_host_signal_table
[sig
]);
5922 sigact_table
[sig
- 1]._sa_handler
= TARGET_SIG_DFL
;
5925 handle_pending_signal(cpu_env
, sig
);
5928 for (sig
= 1; sig
<= TARGET_NSIG
; sig
++) {
5929 blocked_set
= ts
->in_sigsuspend
?
5930 &ts
->sigsuspend_mask
: &ts
->signal_mask
;
5932 if (ts
->sigtab
[sig
- 1].pending
&&
5933 (!sigismember(blocked_set
,
5934 target_to_host_signal_table
[sig
]))) {
5935 handle_pending_signal(cpu_env
, sig
);
5936 /* Restart scan from the beginning */
5941 /* if no signal is pending, unblock signals and recheck (the act
5942 * of unblocking might cause us to take another host signal which
5943 * will set signal_pending again).
5945 atomic_set(&ts
->signal_pending
, 0);
5946 ts
->in_sigsuspend
= 0;
5947 set
= ts
->signal_mask
;
5948 sigdelset(&set
, SIGSEGV
);
5949 sigdelset(&set
, SIGBUS
);
5950 sigprocmask(SIG_SETMASK
, &set
, 0);
5952 ts
->in_sigsuspend
= 0;