xref: /qemu/linux-user/signal.c (revision 08218b3527301760393b0b4ec732fcdfb7ff6cda)
1 /*
2  *  Emulation of Linux signals
3  *
4  *  Copyright (c) 2003 Fabrice Bellard
5  *
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.
10  *
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.
15  *
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/>.
18  */
19 #include <stdlib.h>
20 #include <stdio.h>
21 #include <string.h>
22 #include <stdarg.h>
23 #include <unistd.h>
24 #include <signal.h>
25 #include <errno.h>
26 #include <assert.h>
27 #include <sys/ucontext.h>
28 #include <sys/resource.h>
29 
30 #include "qemu.h"
31 #include "qemu-common.h"
32 #include "target_signal.h"
33 
34 //#define DEBUG_SIGNAL
35 
36 static struct target_sigaltstack target_sigaltstack_used = {
37     .ss_sp = 0,
38     .ss_size = 0,
39     .ss_flags = TARGET_SS_DISABLE,
40 };
41 
42 static struct target_sigaction sigact_table[TARGET_NSIG];
43 
44 static void host_signal_handler(int host_signum, siginfo_t *info,
45                                 void *puc);
46 
47 static uint8_t host_to_target_signal_table[_NSIG] = {
48     [SIGHUP] = TARGET_SIGHUP,
49     [SIGINT] = TARGET_SIGINT,
50     [SIGQUIT] = TARGET_SIGQUIT,
51     [SIGILL] = TARGET_SIGILL,
52     [SIGTRAP] = TARGET_SIGTRAP,
53     [SIGABRT] = TARGET_SIGABRT,
54 /*    [SIGIOT] = TARGET_SIGIOT,*/
55     [SIGBUS] = TARGET_SIGBUS,
56     [SIGFPE] = TARGET_SIGFPE,
57     [SIGKILL] = TARGET_SIGKILL,
58     [SIGUSR1] = TARGET_SIGUSR1,
59     [SIGSEGV] = TARGET_SIGSEGV,
60     [SIGUSR2] = TARGET_SIGUSR2,
61     [SIGPIPE] = TARGET_SIGPIPE,
62     [SIGALRM] = TARGET_SIGALRM,
63     [SIGTERM] = TARGET_SIGTERM,
64 #ifdef SIGSTKFLT
65     [SIGSTKFLT] = TARGET_SIGSTKFLT,
66 #endif
67     [SIGCHLD] = TARGET_SIGCHLD,
68     [SIGCONT] = TARGET_SIGCONT,
69     [SIGSTOP] = TARGET_SIGSTOP,
70     [SIGTSTP] = TARGET_SIGTSTP,
71     [SIGTTIN] = TARGET_SIGTTIN,
72     [SIGTTOU] = TARGET_SIGTTOU,
73     [SIGURG] = TARGET_SIGURG,
74     [SIGXCPU] = TARGET_SIGXCPU,
75     [SIGXFSZ] = TARGET_SIGXFSZ,
76     [SIGVTALRM] = TARGET_SIGVTALRM,
77     [SIGPROF] = TARGET_SIGPROF,
78     [SIGWINCH] = TARGET_SIGWINCH,
79     [SIGIO] = TARGET_SIGIO,
80     [SIGPWR] = TARGET_SIGPWR,
81     [SIGSYS] = TARGET_SIGSYS,
82     /* next signals stay the same */
83     /* Nasty hack: Reverse SIGRTMIN and SIGRTMAX to avoid overlap with
84        host libpthread signals.  This assumes noone actually uses SIGRTMAX :-/
85        To fix this properly we need to do manual signal delivery multiplexed
86        over a single host signal.  */
87     [__SIGRTMIN] = __SIGRTMAX,
88     [__SIGRTMAX] = __SIGRTMIN,
89 };
90 static uint8_t target_to_host_signal_table[_NSIG];
91 
92 static inline int on_sig_stack(unsigned long sp)
93 {
94     return (sp - target_sigaltstack_used.ss_sp
95             < target_sigaltstack_used.ss_size);
96 }
97 
98 static inline int sas_ss_flags(unsigned long sp)
99 {
100     return (target_sigaltstack_used.ss_size == 0 ? SS_DISABLE
101             : on_sig_stack(sp) ? SS_ONSTACK : 0);
102 }
103 
104 int host_to_target_signal(int sig)
105 {
106     if (sig >= _NSIG)
107         return sig;
108     return host_to_target_signal_table[sig];
109 }
110 
111 int target_to_host_signal(int sig)
112 {
113     if (sig >= _NSIG)
114         return sig;
115     return target_to_host_signal_table[sig];
116 }
117 
118 static inline void target_sigemptyset(target_sigset_t *set)
119 {
120     memset(set, 0, sizeof(*set));
121 }
122 
123 static inline void target_sigaddset(target_sigset_t *set, int signum)
124 {
125     signum--;
126     abi_ulong mask = (abi_ulong)1 << (signum % TARGET_NSIG_BPW);
127     set->sig[signum / TARGET_NSIG_BPW] |= mask;
128 }
129 
130 static inline int target_sigismember(const target_sigset_t *set, int signum)
131 {
132     signum--;
133     abi_ulong mask = (abi_ulong)1 << (signum % TARGET_NSIG_BPW);
134     return ((set->sig[signum / TARGET_NSIG_BPW] & mask) != 0);
135 }
136 
137 static void host_to_target_sigset_internal(target_sigset_t *d,
138                                            const sigset_t *s)
139 {
140     int i;
141     target_sigemptyset(d);
142     for (i = 1; i <= TARGET_NSIG; i++) {
143         if (sigismember(s, i)) {
144             target_sigaddset(d, host_to_target_signal(i));
145         }
146     }
147 }
148 
149 void host_to_target_sigset(target_sigset_t *d, const sigset_t *s)
150 {
151     target_sigset_t d1;
152     int i;
153 
154     host_to_target_sigset_internal(&d1, s);
155     for(i = 0;i < TARGET_NSIG_WORDS; i++)
156         d->sig[i] = tswapl(d1.sig[i]);
157 }
158 
159 static void target_to_host_sigset_internal(sigset_t *d,
160                                            const target_sigset_t *s)
161 {
162     int i;
163     sigemptyset(d);
164     for (i = 1; i <= TARGET_NSIG; i++) {
165         if (target_sigismember(s, i)) {
166             sigaddset(d, target_to_host_signal(i));
167         }
168      }
169 }
170 
171 void target_to_host_sigset(sigset_t *d, const target_sigset_t *s)
172 {
173     target_sigset_t s1;
174     int i;
175 
176     for(i = 0;i < TARGET_NSIG_WORDS; i++)
177         s1.sig[i] = tswapl(s->sig[i]);
178     target_to_host_sigset_internal(d, &s1);
179 }
180 
181 void host_to_target_old_sigset(abi_ulong *old_sigset,
182                                const sigset_t *sigset)
183 {
184     target_sigset_t d;
185     host_to_target_sigset(&d, sigset);
186     *old_sigset = d.sig[0];
187 }
188 
189 void target_to_host_old_sigset(sigset_t *sigset,
190                                const abi_ulong *old_sigset)
191 {
192     target_sigset_t d;
193     int i;
194 
195     d.sig[0] = *old_sigset;
196     for(i = 1;i < TARGET_NSIG_WORDS; i++)
197         d.sig[i] = 0;
198     target_to_host_sigset(sigset, &d);
199 }
200 
201 /* siginfo conversion */
202 
203 static inline void host_to_target_siginfo_noswap(target_siginfo_t *tinfo,
204                                                  const siginfo_t *info)
205 {
206     int sig;
207     sig = host_to_target_signal(info->si_signo);
208     tinfo->si_signo = sig;
209     tinfo->si_errno = 0;
210     tinfo->si_code = info->si_code;
211     if (sig == SIGILL || sig == SIGFPE || sig == SIGSEGV ||
212         sig == SIGBUS || sig == SIGTRAP) {
213         /* should never come here, but who knows. The information for
214            the target is irrelevant */
215         tinfo->_sifields._sigfault._addr = 0;
216     } else if (sig == SIGIO) {
217 	tinfo->_sifields._sigpoll._fd = info->si_fd;
218     } else if (sig >= TARGET_SIGRTMIN) {
219         tinfo->_sifields._rt._pid = info->si_pid;
220         tinfo->_sifields._rt._uid = info->si_uid;
221         /* XXX: potential problem if 64 bit */
222         tinfo->_sifields._rt._sigval.sival_ptr =
223             (abi_ulong)(unsigned long)info->si_value.sival_ptr;
224     }
225 }
226 
227 static void tswap_siginfo(target_siginfo_t *tinfo,
228                           const target_siginfo_t *info)
229 {
230     int sig;
231     sig = info->si_signo;
232     tinfo->si_signo = tswap32(sig);
233     tinfo->si_errno = tswap32(info->si_errno);
234     tinfo->si_code = tswap32(info->si_code);
235     if (sig == SIGILL || sig == SIGFPE || sig == SIGSEGV ||
236         sig == SIGBUS || sig == SIGTRAP) {
237         tinfo->_sifields._sigfault._addr =
238             tswapl(info->_sifields._sigfault._addr);
239     } else if (sig == SIGIO) {
240 	tinfo->_sifields._sigpoll._fd = tswap32(info->_sifields._sigpoll._fd);
241     } else if (sig >= TARGET_SIGRTMIN) {
242         tinfo->_sifields._rt._pid = tswap32(info->_sifields._rt._pid);
243         tinfo->_sifields._rt._uid = tswap32(info->_sifields._rt._uid);
244         tinfo->_sifields._rt._sigval.sival_ptr =
245             tswapl(info->_sifields._rt._sigval.sival_ptr);
246     }
247 }
248 
249 
250 void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info)
251 {
252     host_to_target_siginfo_noswap(tinfo, info);
253     tswap_siginfo(tinfo, tinfo);
254 }
255 
256 /* XXX: we support only POSIX RT signals are used. */
257 /* XXX: find a solution for 64 bit (additional malloced data is needed) */
258 void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo)
259 {
260     info->si_signo = tswap32(tinfo->si_signo);
261     info->si_errno = tswap32(tinfo->si_errno);
262     info->si_code = tswap32(tinfo->si_code);
263     info->si_pid = tswap32(tinfo->_sifields._rt._pid);
264     info->si_uid = tswap32(tinfo->_sifields._rt._uid);
265     info->si_value.sival_ptr =
266             (void *)(long)tswapl(tinfo->_sifields._rt._sigval.sival_ptr);
267 }
268 
269 static int fatal_signal (int sig)
270 {
271     switch (sig) {
272     case TARGET_SIGCHLD:
273     case TARGET_SIGURG:
274     case TARGET_SIGWINCH:
275         /* Ignored by default.  */
276         return 0;
277     case TARGET_SIGCONT:
278     case TARGET_SIGSTOP:
279     case TARGET_SIGTSTP:
280     case TARGET_SIGTTIN:
281     case TARGET_SIGTTOU:
282         /* Job control signals.  */
283         return 0;
284     default:
285         return 1;
286     }
287 }
288 
289 /* returns 1 if given signal should dump core if not handled */
290 static int core_dump_signal(int sig)
291 {
292     switch (sig) {
293     case TARGET_SIGABRT:
294     case TARGET_SIGFPE:
295     case TARGET_SIGILL:
296     case TARGET_SIGQUIT:
297     case TARGET_SIGSEGV:
298     case TARGET_SIGTRAP:
299     case TARGET_SIGBUS:
300         return (1);
301     default:
302         return (0);
303     }
304 }
305 
306 void signal_init(void)
307 {
308     struct sigaction act;
309     struct sigaction oact;
310     int i, j;
311     int host_sig;
312 
313     /* generate signal conversion tables */
314     for(i = 1; i < _NSIG; i++) {
315         if (host_to_target_signal_table[i] == 0)
316             host_to_target_signal_table[i] = i;
317     }
318     for(i = 1; i < _NSIG; i++) {
319         j = host_to_target_signal_table[i];
320         target_to_host_signal_table[j] = i;
321     }
322 
323     /* set all host signal handlers. ALL signals are blocked during
324        the handlers to serialize them. */
325     memset(sigact_table, 0, sizeof(sigact_table));
326 
327     sigfillset(&act.sa_mask);
328     act.sa_flags = SA_SIGINFO;
329     act.sa_sigaction = host_signal_handler;
330     for(i = 1; i <= TARGET_NSIG; i++) {
331         host_sig = target_to_host_signal(i);
332         sigaction(host_sig, NULL, &oact);
333         if (oact.sa_sigaction == (void *)SIG_IGN) {
334             sigact_table[i - 1]._sa_handler = TARGET_SIG_IGN;
335         } else if (oact.sa_sigaction == (void *)SIG_DFL) {
336             sigact_table[i - 1]._sa_handler = TARGET_SIG_DFL;
337         }
338         /* If there's already a handler installed then something has
339            gone horribly wrong, so don't even try to handle that case.  */
340         /* Install some handlers for our own use.  We need at least
341            SIGSEGV and SIGBUS, to detect exceptions.  We can not just
342            trap all signals because it affects syscall interrupt
343            behavior.  But do trap all default-fatal signals.  */
344         if (fatal_signal (i))
345             sigaction(host_sig, &act, NULL);
346     }
347 }
348 
349 /* signal queue handling */
350 
351 static inline struct sigqueue *alloc_sigqueue(CPUState *env)
352 {
353     TaskState *ts = env->opaque;
354     struct sigqueue *q = ts->first_free;
355     if (!q)
356         return NULL;
357     ts->first_free = q->next;
358     return q;
359 }
360 
361 static inline void free_sigqueue(CPUState *env, struct sigqueue *q)
362 {
363     TaskState *ts = env->opaque;
364     q->next = ts->first_free;
365     ts->first_free = q;
366 }
367 
368 /* abort execution with signal */
369 static void QEMU_NORETURN force_sig(int target_sig)
370 {
371     TaskState *ts = (TaskState *)thread_env->opaque;
372     int host_sig, core_dumped = 0;
373     struct sigaction act;
374     host_sig = target_to_host_signal(target_sig);
375     gdb_signalled(thread_env, target_sig);
376 
377     /* dump core if supported by target binary format */
378     if (core_dump_signal(target_sig) && (ts->bprm->core_dump != NULL)) {
379         stop_all_tasks();
380         core_dumped =
381             ((*ts->bprm->core_dump)(target_sig, thread_env) == 0);
382     }
383     if (core_dumped) {
384         /* we already dumped the core of target process, we don't want
385          * a coredump of qemu itself */
386         struct rlimit nodump;
387         getrlimit(RLIMIT_CORE, &nodump);
388         nodump.rlim_cur=0;
389         setrlimit(RLIMIT_CORE, &nodump);
390         (void) fprintf(stderr, "qemu: uncaught target signal %d (%s) - %s\n",
391             target_sig, strsignal(host_sig), "core dumped" );
392     }
393 
394     /* The proper exit code for dieing from an uncaught signal is
395      * -<signal>.  The kernel doesn't allow exit() or _exit() to pass
396      * a negative value.  To get the proper exit code we need to
397      * actually die from an uncaught signal.  Here the default signal
398      * handler is installed, we send ourself a signal and we wait for
399      * it to arrive. */
400     sigfillset(&act.sa_mask);
401     act.sa_handler = SIG_DFL;
402     sigaction(host_sig, &act, NULL);
403 
404     /* For some reason raise(host_sig) doesn't send the signal when
405      * statically linked on x86-64. */
406     kill(getpid(), host_sig);
407 
408     /* Make sure the signal isn't masked (just reuse the mask inside
409     of act) */
410     sigdelset(&act.sa_mask, host_sig);
411     sigsuspend(&act.sa_mask);
412 
413     /* unreachable */
414     abort();
415 }
416 
417 /* queue a signal so that it will be send to the virtual CPU as soon
418    as possible */
419 int queue_signal(CPUState *env, int sig, target_siginfo_t *info)
420 {
421     TaskState *ts = env->opaque;
422     struct emulated_sigtable *k;
423     struct sigqueue *q, **pq;
424     abi_ulong handler;
425     int queue;
426 
427 #if defined(DEBUG_SIGNAL)
428     fprintf(stderr, "queue_signal: sig=%d\n",
429             sig);
430 #endif
431     k = &ts->sigtab[sig - 1];
432     queue = gdb_queuesig ();
433     handler = sigact_table[sig - 1]._sa_handler;
434     if (!queue && handler == TARGET_SIG_DFL) {
435         if (sig == TARGET_SIGTSTP || sig == TARGET_SIGTTIN || sig == TARGET_SIGTTOU) {
436             kill(getpid(),SIGSTOP);
437             return 0;
438         } else
439         /* default handler : ignore some signal. The other are fatal */
440         if (sig != TARGET_SIGCHLD &&
441             sig != TARGET_SIGURG &&
442             sig != TARGET_SIGWINCH &&
443             sig != TARGET_SIGCONT) {
444             force_sig(sig);
445         } else {
446             return 0; /* indicate ignored */
447         }
448     } else if (!queue && handler == TARGET_SIG_IGN) {
449         /* ignore signal */
450         return 0;
451     } else if (!queue && handler == TARGET_SIG_ERR) {
452         force_sig(sig);
453     } else {
454         pq = &k->first;
455         if (sig < TARGET_SIGRTMIN) {
456             /* if non real time signal, we queue exactly one signal */
457             if (!k->pending)
458                 q = &k->info;
459             else
460                 return 0;
461         } else {
462             if (!k->pending) {
463                 /* first signal */
464                 q = &k->info;
465             } else {
466                 q = alloc_sigqueue(env);
467                 if (!q)
468                     return -EAGAIN;
469                 while (*pq != NULL)
470                     pq = &(*pq)->next;
471             }
472         }
473         *pq = q;
474         q->info = *info;
475         q->next = NULL;
476         k->pending = 1;
477         /* signal that a new signal is pending */
478         ts->signal_pending = 1;
479         return 1; /* indicates that the signal was queued */
480     }
481 }
482 
483 static void host_signal_handler(int host_signum, siginfo_t *info,
484                                 void *puc)
485 {
486     int sig;
487     target_siginfo_t tinfo;
488 
489     /* the CPU emulator uses some host signals to detect exceptions,
490        we forward to it some signals */
491     if ((host_signum == SIGSEGV || host_signum == SIGBUS)
492         && info->si_code > 0) {
493         if (cpu_signal_handler(host_signum, info, puc))
494             return;
495     }
496 
497     /* get target signal number */
498     sig = host_to_target_signal(host_signum);
499     if (sig < 1 || sig > TARGET_NSIG)
500         return;
501 #if defined(DEBUG_SIGNAL)
502     fprintf(stderr, "qemu: got signal %d\n", sig);
503 #endif
504     host_to_target_siginfo_noswap(&tinfo, info);
505     if (queue_signal(thread_env, sig, &tinfo) == 1) {
506         /* interrupt the virtual CPU as soon as possible */
507         cpu_exit(thread_env);
508     }
509 }
510 
511 /* do_sigaltstack() returns target values and errnos. */
512 /* compare linux/kernel/signal.c:do_sigaltstack() */
513 abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong uoss_addr, abi_ulong sp)
514 {
515     int ret;
516     struct target_sigaltstack oss;
517 
518     /* XXX: test errors */
519     if(uoss_addr)
520     {
521         __put_user(target_sigaltstack_used.ss_sp, &oss.ss_sp);
522         __put_user(target_sigaltstack_used.ss_size, &oss.ss_size);
523         __put_user(sas_ss_flags(sp), &oss.ss_flags);
524     }
525 
526     if(uss_addr)
527     {
528         struct target_sigaltstack *uss;
529         struct target_sigaltstack ss;
530 
531 	ret = -TARGET_EFAULT;
532         if (!lock_user_struct(VERIFY_READ, uss, uss_addr, 1)
533 	    || __get_user(ss.ss_sp, &uss->ss_sp)
534 	    || __get_user(ss.ss_size, &uss->ss_size)
535 	    || __get_user(ss.ss_flags, &uss->ss_flags))
536             goto out;
537         unlock_user_struct(uss, uss_addr, 0);
538 
539 	ret = -TARGET_EPERM;
540 	if (on_sig_stack(sp))
541             goto out;
542 
543 	ret = -TARGET_EINVAL;
544 	if (ss.ss_flags != TARGET_SS_DISABLE
545             && ss.ss_flags != TARGET_SS_ONSTACK
546             && ss.ss_flags != 0)
547             goto out;
548 
549 	if (ss.ss_flags == TARGET_SS_DISABLE) {
550             ss.ss_size = 0;
551             ss.ss_sp = 0;
552 	} else {
553             ret = -TARGET_ENOMEM;
554             if (ss.ss_size < MINSIGSTKSZ)
555                 goto out;
556 	}
557 
558         target_sigaltstack_used.ss_sp = ss.ss_sp;
559         target_sigaltstack_used.ss_size = ss.ss_size;
560     }
561 
562     if (uoss_addr) {
563         ret = -TARGET_EFAULT;
564         if (copy_to_user(uoss_addr, &oss, sizeof(oss)))
565             goto out;
566     }
567 
568     ret = 0;
569 out:
570     return ret;
571 }
572 
573 /* do_sigaction() return host values and errnos */
574 int do_sigaction(int sig, const struct target_sigaction *act,
575                  struct target_sigaction *oact)
576 {
577     struct target_sigaction *k;
578     struct sigaction act1;
579     int host_sig;
580     int ret = 0;
581 
582     if (sig < 1 || sig > TARGET_NSIG || sig == TARGET_SIGKILL || sig == TARGET_SIGSTOP)
583         return -EINVAL;
584     k = &sigact_table[sig - 1];
585 #if defined(DEBUG_SIGNAL)
586     fprintf(stderr, "sigaction sig=%d act=0x%p, oact=0x%p\n",
587             sig, act, oact);
588 #endif
589     if (oact) {
590         oact->_sa_handler = tswapl(k->_sa_handler);
591         oact->sa_flags = tswapl(k->sa_flags);
592 #if !defined(TARGET_MIPS)
593         oact->sa_restorer = tswapl(k->sa_restorer);
594 #endif
595         oact->sa_mask = k->sa_mask;
596     }
597     if (act) {
598         /* FIXME: This is not threadsafe.  */
599         k->_sa_handler = tswapl(act->_sa_handler);
600         k->sa_flags = tswapl(act->sa_flags);
601 #if !defined(TARGET_MIPS)
602         k->sa_restorer = tswapl(act->sa_restorer);
603 #endif
604         k->sa_mask = act->sa_mask;
605 
606         /* we update the host linux signal state */
607         host_sig = target_to_host_signal(sig);
608         if (host_sig != SIGSEGV && host_sig != SIGBUS) {
609             sigfillset(&act1.sa_mask);
610             act1.sa_flags = SA_SIGINFO;
611             if (k->sa_flags & TARGET_SA_RESTART)
612                 act1.sa_flags |= SA_RESTART;
613             /* NOTE: it is important to update the host kernel signal
614                ignore state to avoid getting unexpected interrupted
615                syscalls */
616             if (k->_sa_handler == TARGET_SIG_IGN) {
617                 act1.sa_sigaction = (void *)SIG_IGN;
618             } else if (k->_sa_handler == TARGET_SIG_DFL) {
619                 if (fatal_signal (sig))
620                     act1.sa_sigaction = host_signal_handler;
621                 else
622                     act1.sa_sigaction = (void *)SIG_DFL;
623             } else {
624                 act1.sa_sigaction = host_signal_handler;
625             }
626             ret = sigaction(host_sig, &act1, NULL);
627         }
628     }
629     return ret;
630 }
631 
632 static inline int copy_siginfo_to_user(target_siginfo_t *tinfo,
633                                        const target_siginfo_t *info)
634 {
635     tswap_siginfo(tinfo, info);
636     return 0;
637 }
638 
639 static inline int current_exec_domain_sig(int sig)
640 {
641     return /* current->exec_domain && current->exec_domain->signal_invmap
642 	      && sig < 32 ? current->exec_domain->signal_invmap[sig] : */ sig;
643 }
644 
645 #if defined(TARGET_I386) && TARGET_ABI_BITS == 32
646 
647 /* from the Linux kernel */
648 
649 struct target_fpreg {
650 	uint16_t significand[4];
651 	uint16_t exponent;
652 };
653 
654 struct target_fpxreg {
655 	uint16_t significand[4];
656 	uint16_t exponent;
657 	uint16_t padding[3];
658 };
659 
660 struct target_xmmreg {
661 	abi_ulong element[4];
662 };
663 
664 struct target_fpstate {
665 	/* Regular FPU environment */
666         abi_ulong       cw;
667         abi_ulong       sw;
668         abi_ulong       tag;
669         abi_ulong       ipoff;
670         abi_ulong       cssel;
671         abi_ulong       dataoff;
672         abi_ulong       datasel;
673 	struct target_fpreg	_st[8];
674 	uint16_t	status;
675 	uint16_t	magic;		/* 0xffff = regular FPU data only */
676 
677 	/* FXSR FPU environment */
678         abi_ulong       _fxsr_env[6];   /* FXSR FPU env is ignored */
679         abi_ulong       mxcsr;
680         abi_ulong       reserved;
681 	struct target_fpxreg	_fxsr_st[8];	/* FXSR FPU reg data is ignored */
682 	struct target_xmmreg	_xmm[8];
683         abi_ulong       padding[56];
684 };
685 
686 #define X86_FXSR_MAGIC		0x0000
687 
688 struct target_sigcontext {
689 	uint16_t gs, __gsh;
690 	uint16_t fs, __fsh;
691 	uint16_t es, __esh;
692 	uint16_t ds, __dsh;
693         abi_ulong edi;
694         abi_ulong esi;
695         abi_ulong ebp;
696         abi_ulong esp;
697         abi_ulong ebx;
698         abi_ulong edx;
699         abi_ulong ecx;
700         abi_ulong eax;
701         abi_ulong trapno;
702         abi_ulong err;
703         abi_ulong eip;
704 	uint16_t cs, __csh;
705         abi_ulong eflags;
706         abi_ulong esp_at_signal;
707 	uint16_t ss, __ssh;
708         abi_ulong fpstate; /* pointer */
709         abi_ulong oldmask;
710         abi_ulong cr2;
711 };
712 
713 struct target_ucontext {
714         abi_ulong         tuc_flags;
715         abi_ulong         tuc_link;
716 	target_stack_t	  tuc_stack;
717 	struct target_sigcontext tuc_mcontext;
718 	target_sigset_t	  tuc_sigmask;	/* mask last for extensibility */
719 };
720 
721 struct sigframe
722 {
723     abi_ulong pretcode;
724     int sig;
725     struct target_sigcontext sc;
726     struct target_fpstate fpstate;
727     abi_ulong extramask[TARGET_NSIG_WORDS-1];
728     char retcode[8];
729 };
730 
731 struct rt_sigframe
732 {
733     abi_ulong pretcode;
734     int sig;
735     abi_ulong pinfo;
736     abi_ulong puc;
737     struct target_siginfo info;
738     struct target_ucontext uc;
739     struct target_fpstate fpstate;
740     char retcode[8];
741 };
742 
743 /*
744  * Set up a signal frame.
745  */
746 
747 /* XXX: save x87 state */
748 static int
749 setup_sigcontext(struct target_sigcontext *sc, struct target_fpstate *fpstate,
750 		 CPUX86State *env, abi_ulong mask, abi_ulong fpstate_addr)
751 {
752 	int err = 0;
753         uint16_t magic;
754 
755 	/* already locked in setup_frame() */
756 	err |= __put_user(env->segs[R_GS].selector, (unsigned int *)&sc->gs);
757 	err |= __put_user(env->segs[R_FS].selector, (unsigned int *)&sc->fs);
758 	err |= __put_user(env->segs[R_ES].selector, (unsigned int *)&sc->es);
759 	err |= __put_user(env->segs[R_DS].selector, (unsigned int *)&sc->ds);
760 	err |= __put_user(env->regs[R_EDI], &sc->edi);
761 	err |= __put_user(env->regs[R_ESI], &sc->esi);
762 	err |= __put_user(env->regs[R_EBP], &sc->ebp);
763 	err |= __put_user(env->regs[R_ESP], &sc->esp);
764 	err |= __put_user(env->regs[R_EBX], &sc->ebx);
765 	err |= __put_user(env->regs[R_EDX], &sc->edx);
766 	err |= __put_user(env->regs[R_ECX], &sc->ecx);
767 	err |= __put_user(env->regs[R_EAX], &sc->eax);
768 	err |= __put_user(env->exception_index, &sc->trapno);
769 	err |= __put_user(env->error_code, &sc->err);
770 	err |= __put_user(env->eip, &sc->eip);
771 	err |= __put_user(env->segs[R_CS].selector, (unsigned int *)&sc->cs);
772 	err |= __put_user(env->eflags, &sc->eflags);
773 	err |= __put_user(env->regs[R_ESP], &sc->esp_at_signal);
774 	err |= __put_user(env->segs[R_SS].selector, (unsigned int *)&sc->ss);
775 
776         cpu_x86_fsave(env, fpstate_addr, 1);
777         fpstate->status = fpstate->sw;
778         magic = 0xffff;
779         err |= __put_user(magic, &fpstate->magic);
780         err |= __put_user(fpstate_addr, &sc->fpstate);
781 
782 	/* non-iBCS2 extensions.. */
783 	err |= __put_user(mask, &sc->oldmask);
784 	err |= __put_user(env->cr[2], &sc->cr2);
785 	return err;
786 }
787 
788 /*
789  * Determine which stack to use..
790  */
791 
792 static inline abi_ulong
793 get_sigframe(struct target_sigaction *ka, CPUX86State *env, size_t frame_size)
794 {
795 	unsigned long esp;
796 
797 	/* Default to using normal stack */
798 	esp = env->regs[R_ESP];
799 	/* This is the X/Open sanctioned signal stack switching.  */
800         if (ka->sa_flags & TARGET_SA_ONSTACK) {
801             if (sas_ss_flags(esp) == 0)
802                 esp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
803         }
804 
805 	/* This is the legacy signal stack switching. */
806 	else
807         if ((env->segs[R_SS].selector & 0xffff) != __USER_DS &&
808             !(ka->sa_flags & TARGET_SA_RESTORER) &&
809             ka->sa_restorer) {
810             esp = (unsigned long) ka->sa_restorer;
811 	}
812         return (esp - frame_size) & -8ul;
813 }
814 
815 /* compare linux/arch/i386/kernel/signal.c:setup_frame() */
816 static void setup_frame(int sig, struct target_sigaction *ka,
817 			target_sigset_t *set, CPUX86State *env)
818 {
819 	abi_ulong frame_addr;
820 	struct sigframe *frame;
821 	int i, err = 0;
822 
823 	frame_addr = get_sigframe(ka, env, sizeof(*frame));
824 
825 	if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
826 		goto give_sigsegv;
827 
828 	err |= __put_user(current_exec_domain_sig(sig),
829 		          &frame->sig);
830 	if (err)
831 		goto give_sigsegv;
832 
833 	setup_sigcontext(&frame->sc, &frame->fpstate, env, set->sig[0],
834                          frame_addr + offsetof(struct sigframe, fpstate));
835 	if (err)
836 		goto give_sigsegv;
837 
838         for(i = 1; i < TARGET_NSIG_WORDS; i++) {
839             if (__put_user(set->sig[i], &frame->extramask[i - 1]))
840                 goto give_sigsegv;
841         }
842 
843 	/* Set up to return from userspace.  If provided, use a stub
844 	   already in userspace.  */
845 	if (ka->sa_flags & TARGET_SA_RESTORER) {
846 		err |= __put_user(ka->sa_restorer, &frame->pretcode);
847 	} else {
848                 uint16_t val16;
849                 abi_ulong retcode_addr;
850                 retcode_addr = frame_addr + offsetof(struct sigframe, retcode);
851 		err |= __put_user(retcode_addr, &frame->pretcode);
852 		/* This is popl %eax ; movl $,%eax ; int $0x80 */
853                 val16 = 0xb858;
854 		err |= __put_user(val16, (uint16_t *)(frame->retcode+0));
855 		err |= __put_user(TARGET_NR_sigreturn, (int *)(frame->retcode+2));
856                 val16 = 0x80cd;
857 		err |= __put_user(val16, (uint16_t *)(frame->retcode+6));
858 	}
859 
860 	if (err)
861 		goto give_sigsegv;
862 
863 	/* Set up registers for signal handler */
864 	env->regs[R_ESP] = frame_addr;
865 	env->eip = ka->_sa_handler;
866 
867         cpu_x86_load_seg(env, R_DS, __USER_DS);
868         cpu_x86_load_seg(env, R_ES, __USER_DS);
869         cpu_x86_load_seg(env, R_SS, __USER_DS);
870         cpu_x86_load_seg(env, R_CS, __USER_CS);
871 	env->eflags &= ~TF_MASK;
872 
873 	unlock_user_struct(frame, frame_addr, 1);
874 
875 	return;
876 
877 give_sigsegv:
878 	unlock_user_struct(frame, frame_addr, 1);
879 	if (sig == TARGET_SIGSEGV)
880 		ka->_sa_handler = TARGET_SIG_DFL;
881 	force_sig(TARGET_SIGSEGV /* , current */);
882 }
883 
884 /* compare linux/arch/i386/kernel/signal.c:setup_rt_frame() */
885 static void setup_rt_frame(int sig, struct target_sigaction *ka,
886                            target_siginfo_t *info,
887 			   target_sigset_t *set, CPUX86State *env)
888 {
889         abi_ulong frame_addr, addr;
890 	struct rt_sigframe *frame;
891 	int i, err = 0;
892 
893 	frame_addr = get_sigframe(ka, env, sizeof(*frame));
894 
895 	if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
896 		goto give_sigsegv;
897 
898 	err |= __put_user(current_exec_domain_sig(sig),
899 			  &frame->sig);
900         addr = frame_addr + offsetof(struct rt_sigframe, info);
901 	err |= __put_user(addr, &frame->pinfo);
902         addr = frame_addr + offsetof(struct rt_sigframe, uc);
903 	err |= __put_user(addr, &frame->puc);
904 	err |= copy_siginfo_to_user(&frame->info, info);
905 	if (err)
906 		goto give_sigsegv;
907 
908 	/* Create the ucontext.  */
909 	err |= __put_user(0, &frame->uc.tuc_flags);
910 	err |= __put_user(0, &frame->uc.tuc_link);
911 	err |= __put_user(target_sigaltstack_used.ss_sp,
912 			  &frame->uc.tuc_stack.ss_sp);
913 	err |= __put_user(sas_ss_flags(get_sp_from_cpustate(env)),
914 			  &frame->uc.tuc_stack.ss_flags);
915 	err |= __put_user(target_sigaltstack_used.ss_size,
916 			  &frame->uc.tuc_stack.ss_size);
917 	err |= setup_sigcontext(&frame->uc.tuc_mcontext, &frame->fpstate,
918 			        env, set->sig[0],
919                                 frame_addr + offsetof(struct rt_sigframe, fpstate));
920         for(i = 0; i < TARGET_NSIG_WORDS; i++) {
921             if (__put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]))
922                 goto give_sigsegv;
923         }
924 
925 	/* Set up to return from userspace.  If provided, use a stub
926 	   already in userspace.  */
927 	if (ka->sa_flags & TARGET_SA_RESTORER) {
928 		err |= __put_user(ka->sa_restorer, &frame->pretcode);
929 	} else {
930                 uint16_t val16;
931                 addr = frame_addr + offsetof(struct rt_sigframe, retcode);
932 		err |= __put_user(addr, &frame->pretcode);
933 		/* This is movl $,%eax ; int $0x80 */
934                 err |= __put_user(0xb8, (char *)(frame->retcode+0));
935 		err |= __put_user(TARGET_NR_rt_sigreturn, (int *)(frame->retcode+1));
936                 val16 = 0x80cd;
937                 err |= __put_user(val16, (uint16_t *)(frame->retcode+5));
938 	}
939 
940 	if (err)
941 		goto give_sigsegv;
942 
943 	/* Set up registers for signal handler */
944 	env->regs[R_ESP] = frame_addr;
945 	env->eip = ka->_sa_handler;
946 
947         cpu_x86_load_seg(env, R_DS, __USER_DS);
948         cpu_x86_load_seg(env, R_ES, __USER_DS);
949         cpu_x86_load_seg(env, R_SS, __USER_DS);
950         cpu_x86_load_seg(env, R_CS, __USER_CS);
951 	env->eflags &= ~TF_MASK;
952 
953 	unlock_user_struct(frame, frame_addr, 1);
954 
955 	return;
956 
957 give_sigsegv:
958 	unlock_user_struct(frame, frame_addr, 1);
959 	if (sig == TARGET_SIGSEGV)
960 		ka->_sa_handler = TARGET_SIG_DFL;
961 	force_sig(TARGET_SIGSEGV /* , current */);
962 }
963 
964 static int
965 restore_sigcontext(CPUX86State *env, struct target_sigcontext *sc, int *peax)
966 {
967 	unsigned int err = 0;
968         abi_ulong fpstate_addr;
969         unsigned int tmpflags;
970 
971         cpu_x86_load_seg(env, R_GS, tswap16(sc->gs));
972         cpu_x86_load_seg(env, R_FS, tswap16(sc->fs));
973         cpu_x86_load_seg(env, R_ES, tswap16(sc->es));
974         cpu_x86_load_seg(env, R_DS, tswap16(sc->ds));
975 
976         env->regs[R_EDI] = tswapl(sc->edi);
977         env->regs[R_ESI] = tswapl(sc->esi);
978         env->regs[R_EBP] = tswapl(sc->ebp);
979         env->regs[R_ESP] = tswapl(sc->esp);
980         env->regs[R_EBX] = tswapl(sc->ebx);
981         env->regs[R_EDX] = tswapl(sc->edx);
982         env->regs[R_ECX] = tswapl(sc->ecx);
983         env->eip = tswapl(sc->eip);
984 
985         cpu_x86_load_seg(env, R_CS, lduw(&sc->cs) | 3);
986         cpu_x86_load_seg(env, R_SS, lduw(&sc->ss) | 3);
987 
988         tmpflags = tswapl(sc->eflags);
989         env->eflags = (env->eflags & ~0x40DD5) | (tmpflags & 0x40DD5);
990         //		regs->orig_eax = -1;		/* disable syscall checks */
991 
992         fpstate_addr = tswapl(sc->fpstate);
993 	if (fpstate_addr != 0) {
994                 if (!access_ok(VERIFY_READ, fpstate_addr,
995                                sizeof(struct target_fpstate)))
996                         goto badframe;
997                 cpu_x86_frstor(env, fpstate_addr, 1);
998 	}
999 
1000         *peax = tswapl(sc->eax);
1001 	return err;
1002 badframe:
1003 	return 1;
1004 }
1005 
1006 long do_sigreturn(CPUX86State *env)
1007 {
1008     struct sigframe *frame;
1009     abi_ulong frame_addr = env->regs[R_ESP] - 8;
1010     target_sigset_t target_set;
1011     sigset_t set;
1012     int eax, i;
1013 
1014 #if defined(DEBUG_SIGNAL)
1015     fprintf(stderr, "do_sigreturn\n");
1016 #endif
1017     if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1018         goto badframe;
1019     /* set blocked signals */
1020     if (__get_user(target_set.sig[0], &frame->sc.oldmask))
1021         goto badframe;
1022     for(i = 1; i < TARGET_NSIG_WORDS; i++) {
1023         if (__get_user(target_set.sig[i], &frame->extramask[i - 1]))
1024             goto badframe;
1025     }
1026 
1027     target_to_host_sigset_internal(&set, &target_set);
1028     sigprocmask(SIG_SETMASK, &set, NULL);
1029 
1030     /* restore registers */
1031     if (restore_sigcontext(env, &frame->sc, &eax))
1032         goto badframe;
1033     unlock_user_struct(frame, frame_addr, 0);
1034     return eax;
1035 
1036 badframe:
1037     unlock_user_struct(frame, frame_addr, 0);
1038     force_sig(TARGET_SIGSEGV);
1039     return 0;
1040 }
1041 
1042 long do_rt_sigreturn(CPUX86State *env)
1043 {
1044         abi_ulong frame_addr;
1045 	struct rt_sigframe *frame;
1046         sigset_t set;
1047 	int eax;
1048 
1049         frame_addr = env->regs[R_ESP] - 4;
1050         if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1051                 goto badframe;
1052         target_to_host_sigset(&set, &frame->uc.tuc_sigmask);
1053         sigprocmask(SIG_SETMASK, &set, NULL);
1054 
1055 	if (restore_sigcontext(env, &frame->uc.tuc_mcontext, &eax))
1056 		goto badframe;
1057 
1058 	if (do_sigaltstack(frame_addr + offsetof(struct rt_sigframe, uc.tuc_stack), 0,
1059                            get_sp_from_cpustate(env)) == -EFAULT)
1060 		goto badframe;
1061 
1062         unlock_user_struct(frame, frame_addr, 0);
1063 	return eax;
1064 
1065 badframe:
1066         unlock_user_struct(frame, frame_addr, 0);
1067         force_sig(TARGET_SIGSEGV);
1068 	return 0;
1069 }
1070 
1071 #elif defined(TARGET_ARM)
1072 
1073 struct target_sigcontext {
1074 	abi_ulong trap_no;
1075 	abi_ulong error_code;
1076 	abi_ulong oldmask;
1077 	abi_ulong arm_r0;
1078 	abi_ulong arm_r1;
1079 	abi_ulong arm_r2;
1080 	abi_ulong arm_r3;
1081 	abi_ulong arm_r4;
1082 	abi_ulong arm_r5;
1083 	abi_ulong arm_r6;
1084 	abi_ulong arm_r7;
1085 	abi_ulong arm_r8;
1086 	abi_ulong arm_r9;
1087 	abi_ulong arm_r10;
1088 	abi_ulong arm_fp;
1089 	abi_ulong arm_ip;
1090 	abi_ulong arm_sp;
1091 	abi_ulong arm_lr;
1092 	abi_ulong arm_pc;
1093 	abi_ulong arm_cpsr;
1094 	abi_ulong fault_address;
1095 };
1096 
1097 struct target_ucontext_v1 {
1098     abi_ulong tuc_flags;
1099     abi_ulong tuc_link;
1100     target_stack_t tuc_stack;
1101     struct target_sigcontext tuc_mcontext;
1102     target_sigset_t  tuc_sigmask;	/* mask last for extensibility */
1103 };
1104 
1105 struct target_ucontext_v2 {
1106     abi_ulong tuc_flags;
1107     abi_ulong tuc_link;
1108     target_stack_t tuc_stack;
1109     struct target_sigcontext tuc_mcontext;
1110     target_sigset_t  tuc_sigmask;	/* mask last for extensibility */
1111     char __unused[128 - sizeof(sigset_t)];
1112     abi_ulong tuc_regspace[128] __attribute__((__aligned__(8)));
1113 };
1114 
1115 struct sigframe_v1
1116 {
1117     struct target_sigcontext sc;
1118     abi_ulong extramask[TARGET_NSIG_WORDS-1];
1119     abi_ulong retcode;
1120 };
1121 
1122 struct sigframe_v2
1123 {
1124     struct target_ucontext_v2 uc;
1125     abi_ulong retcode;
1126 };
1127 
1128 struct rt_sigframe_v1
1129 {
1130     abi_ulong pinfo;
1131     abi_ulong puc;
1132     struct target_siginfo info;
1133     struct target_ucontext_v1 uc;
1134     abi_ulong retcode;
1135 };
1136 
1137 struct rt_sigframe_v2
1138 {
1139     struct target_siginfo info;
1140     struct target_ucontext_v2 uc;
1141     abi_ulong retcode;
1142 };
1143 
1144 #define TARGET_CONFIG_CPU_32 1
1145 
1146 /*
1147  * For ARM syscalls, we encode the syscall number into the instruction.
1148  */
1149 #define SWI_SYS_SIGRETURN	(0xef000000|(TARGET_NR_sigreturn + ARM_SYSCALL_BASE))
1150 #define SWI_SYS_RT_SIGRETURN	(0xef000000|(TARGET_NR_rt_sigreturn + ARM_SYSCALL_BASE))
1151 
1152 /*
1153  * For Thumb syscalls, we pass the syscall number via r7.  We therefore
1154  * need two 16-bit instructions.
1155  */
1156 #define SWI_THUMB_SIGRETURN	(0xdf00 << 16 | 0x2700 | (TARGET_NR_sigreturn))
1157 #define SWI_THUMB_RT_SIGRETURN	(0xdf00 << 16 | 0x2700 | (TARGET_NR_rt_sigreturn))
1158 
1159 static const abi_ulong retcodes[4] = {
1160 	SWI_SYS_SIGRETURN,	SWI_THUMB_SIGRETURN,
1161 	SWI_SYS_RT_SIGRETURN,	SWI_THUMB_RT_SIGRETURN
1162 };
1163 
1164 
1165 #define __get_user_error(x,p,e) __get_user(x, p)
1166 
1167 static inline int valid_user_regs(CPUState *regs)
1168 {
1169     return 1;
1170 }
1171 
1172 static void
1173 setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/
1174 		 CPUState *env, abi_ulong mask)
1175 {
1176 	__put_user(env->regs[0], &sc->arm_r0);
1177 	__put_user(env->regs[1], &sc->arm_r1);
1178 	__put_user(env->regs[2], &sc->arm_r2);
1179 	__put_user(env->regs[3], &sc->arm_r3);
1180 	__put_user(env->regs[4], &sc->arm_r4);
1181 	__put_user(env->regs[5], &sc->arm_r5);
1182 	__put_user(env->regs[6], &sc->arm_r6);
1183 	__put_user(env->regs[7], &sc->arm_r7);
1184 	__put_user(env->regs[8], &sc->arm_r8);
1185 	__put_user(env->regs[9], &sc->arm_r9);
1186 	__put_user(env->regs[10], &sc->arm_r10);
1187 	__put_user(env->regs[11], &sc->arm_fp);
1188 	__put_user(env->regs[12], &sc->arm_ip);
1189 	__put_user(env->regs[13], &sc->arm_sp);
1190 	__put_user(env->regs[14], &sc->arm_lr);
1191 	__put_user(env->regs[15], &sc->arm_pc);
1192 #ifdef TARGET_CONFIG_CPU_32
1193 	__put_user(cpsr_read(env), &sc->arm_cpsr);
1194 #endif
1195 
1196 	__put_user(/* current->thread.trap_no */ 0, &sc->trap_no);
1197 	__put_user(/* current->thread.error_code */ 0, &sc->error_code);
1198 	__put_user(/* current->thread.address */ 0, &sc->fault_address);
1199 	__put_user(mask, &sc->oldmask);
1200 }
1201 
1202 static inline abi_ulong
1203 get_sigframe(struct target_sigaction *ka, CPUState *regs, int framesize)
1204 {
1205 	unsigned long sp = regs->regs[13];
1206 
1207 	/*
1208 	 * This is the X/Open sanctioned signal stack switching.
1209 	 */
1210 	if ((ka->sa_flags & TARGET_SA_ONSTACK) && !sas_ss_flags(sp))
1211             sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
1212 	/*
1213 	 * ATPCS B01 mandates 8-byte alignment
1214 	 */
1215 	return (sp - framesize) & ~7;
1216 }
1217 
1218 static int
1219 setup_return(CPUState *env, struct target_sigaction *ka,
1220 	     abi_ulong *rc, abi_ulong frame_addr, int usig, abi_ulong rc_addr)
1221 {
1222 	abi_ulong handler = ka->_sa_handler;
1223 	abi_ulong retcode;
1224 	int thumb = handler & 1;
1225 
1226 	if (ka->sa_flags & TARGET_SA_RESTORER) {
1227 		retcode = ka->sa_restorer;
1228 	} else {
1229 		unsigned int idx = thumb;
1230 
1231 		if (ka->sa_flags & TARGET_SA_SIGINFO)
1232 			idx += 2;
1233 
1234 		if (__put_user(retcodes[idx], rc))
1235 			return 1;
1236 #if 0
1237 		flush_icache_range((abi_ulong)rc,
1238 				   (abi_ulong)(rc + 1));
1239 #endif
1240 		retcode = rc_addr + thumb;
1241 	}
1242 
1243 	env->regs[0] = usig;
1244 	env->regs[13] = frame_addr;
1245 	env->regs[14] = retcode;
1246 	env->regs[15] = handler & (thumb ? ~1 : ~3);
1247 	env->thumb = thumb;
1248 
1249 #if 0
1250 #ifdef TARGET_CONFIG_CPU_32
1251 	env->cpsr = cpsr;
1252 #endif
1253 #endif
1254 
1255 	return 0;
1256 }
1257 
1258 static void setup_sigframe_v2(struct target_ucontext_v2 *uc,
1259                               target_sigset_t *set, CPUState *env)
1260 {
1261     struct target_sigaltstack stack;
1262     int i;
1263 
1264     /* Clear all the bits of the ucontext we don't use.  */
1265     memset(uc, 0, offsetof(struct target_ucontext_v2, tuc_mcontext));
1266 
1267     memset(&stack, 0, sizeof(stack));
1268     __put_user(target_sigaltstack_used.ss_sp, &stack.ss_sp);
1269     __put_user(target_sigaltstack_used.ss_size, &stack.ss_size);
1270     __put_user(sas_ss_flags(get_sp_from_cpustate(env)), &stack.ss_flags);
1271     memcpy(&uc->tuc_stack, &stack, sizeof(stack));
1272 
1273     setup_sigcontext(&uc->tuc_mcontext, env, set->sig[0]);
1274     /* FIXME: Save coprocessor signal frame.  */
1275     for(i = 0; i < TARGET_NSIG_WORDS; i++) {
1276         __put_user(set->sig[i], &uc->tuc_sigmask.sig[i]);
1277     }
1278 }
1279 
1280 /* compare linux/arch/arm/kernel/signal.c:setup_frame() */
1281 static void setup_frame_v1(int usig, struct target_sigaction *ka,
1282 			   target_sigset_t *set, CPUState *regs)
1283 {
1284 	struct sigframe_v1 *frame;
1285 	abi_ulong frame_addr = get_sigframe(ka, regs, sizeof(*frame));
1286 	int i;
1287 
1288 	if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
1289 		return;
1290 
1291 	setup_sigcontext(&frame->sc, regs, set->sig[0]);
1292 
1293         for(i = 1; i < TARGET_NSIG_WORDS; i++) {
1294             if (__put_user(set->sig[i], &frame->extramask[i - 1]))
1295                 goto end;
1296 	}
1297 
1298         setup_return(regs, ka, &frame->retcode, frame_addr, usig,
1299                      frame_addr + offsetof(struct sigframe_v1, retcode));
1300 
1301 end:
1302 	unlock_user_struct(frame, frame_addr, 1);
1303 }
1304 
1305 static void setup_frame_v2(int usig, struct target_sigaction *ka,
1306 			   target_sigset_t *set, CPUState *regs)
1307 {
1308 	struct sigframe_v2 *frame;
1309 	abi_ulong frame_addr = get_sigframe(ka, regs, sizeof(*frame));
1310 
1311 	if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
1312 		return;
1313 
1314         setup_sigframe_v2(&frame->uc, set, regs);
1315 
1316         setup_return(regs, ka, &frame->retcode, frame_addr, usig,
1317                      frame_addr + offsetof(struct sigframe_v2, retcode));
1318 
1319 	unlock_user_struct(frame, frame_addr, 1);
1320 }
1321 
1322 static void setup_frame(int usig, struct target_sigaction *ka,
1323 			target_sigset_t *set, CPUState *regs)
1324 {
1325     if (get_osversion() >= 0x020612) {
1326         setup_frame_v2(usig, ka, set, regs);
1327     } else {
1328         setup_frame_v1(usig, ka, set, regs);
1329     }
1330 }
1331 
1332 /* compare linux/arch/arm/kernel/signal.c:setup_rt_frame() */
1333 static void setup_rt_frame_v1(int usig, struct target_sigaction *ka,
1334                               target_siginfo_t *info,
1335 			      target_sigset_t *set, CPUState *env)
1336 {
1337 	struct rt_sigframe_v1 *frame;
1338 	abi_ulong frame_addr = get_sigframe(ka, env, sizeof(*frame));
1339 	struct target_sigaltstack stack;
1340 	int i;
1341         abi_ulong info_addr, uc_addr;
1342 
1343 	if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
1344             return /* 1 */;
1345 
1346         info_addr = frame_addr + offsetof(struct rt_sigframe_v1, info);
1347 	__put_user(info_addr, &frame->pinfo);
1348         uc_addr = frame_addr + offsetof(struct rt_sigframe_v1, uc);
1349 	__put_user(uc_addr, &frame->puc);
1350 	copy_siginfo_to_user(&frame->info, info);
1351 
1352 	/* Clear all the bits of the ucontext we don't use.  */
1353 	memset(&frame->uc, 0, offsetof(struct target_ucontext_v1, tuc_mcontext));
1354 
1355         memset(&stack, 0, sizeof(stack));
1356         __put_user(target_sigaltstack_used.ss_sp, &stack.ss_sp);
1357         __put_user(target_sigaltstack_used.ss_size, &stack.ss_size);
1358         __put_user(sas_ss_flags(get_sp_from_cpustate(env)), &stack.ss_flags);
1359         memcpy(&frame->uc.tuc_stack, &stack, sizeof(stack));
1360 
1361 	setup_sigcontext(&frame->uc.tuc_mcontext, env, set->sig[0]);
1362         for(i = 0; i < TARGET_NSIG_WORDS; i++) {
1363             if (__put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]))
1364                 goto end;
1365         }
1366 
1367         setup_return(env, ka, &frame->retcode, frame_addr, usig,
1368                      frame_addr + offsetof(struct rt_sigframe_v1, retcode));
1369 
1370         env->regs[1] = info_addr;
1371         env->regs[2] = uc_addr;
1372 
1373 end:
1374 	unlock_user_struct(frame, frame_addr, 1);
1375 }
1376 
1377 static void setup_rt_frame_v2(int usig, struct target_sigaction *ka,
1378                               target_siginfo_t *info,
1379                               target_sigset_t *set, CPUState *env)
1380 {
1381 	struct rt_sigframe_v2 *frame;
1382 	abi_ulong frame_addr = get_sigframe(ka, env, sizeof(*frame));
1383         abi_ulong info_addr, uc_addr;
1384 
1385 	if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
1386             return /* 1 */;
1387 
1388         info_addr = frame_addr + offsetof(struct rt_sigframe_v2, info);
1389         uc_addr = frame_addr + offsetof(struct rt_sigframe_v2, uc);
1390 	copy_siginfo_to_user(&frame->info, info);
1391 
1392         setup_sigframe_v2(&frame->uc, set, env);
1393 
1394         setup_return(env, ka, &frame->retcode, frame_addr, usig,
1395                      frame_addr + offsetof(struct rt_sigframe_v2, retcode));
1396 
1397         env->regs[1] = info_addr;
1398         env->regs[2] = uc_addr;
1399 
1400 	unlock_user_struct(frame, frame_addr, 1);
1401 }
1402 
1403 static void setup_rt_frame(int usig, struct target_sigaction *ka,
1404                            target_siginfo_t *info,
1405 			   target_sigset_t *set, CPUState *env)
1406 {
1407     if (get_osversion() >= 0x020612) {
1408         setup_rt_frame_v2(usig, ka, info, set, env);
1409     } else {
1410         setup_rt_frame_v1(usig, ka, info, set, env);
1411     }
1412 }
1413 
1414 static int
1415 restore_sigcontext(CPUState *env, struct target_sigcontext *sc)
1416 {
1417 	int err = 0;
1418         uint32_t cpsr;
1419 
1420 	__get_user_error(env->regs[0], &sc->arm_r0, err);
1421 	__get_user_error(env->regs[1], &sc->arm_r1, err);
1422 	__get_user_error(env->regs[2], &sc->arm_r2, err);
1423 	__get_user_error(env->regs[3], &sc->arm_r3, err);
1424 	__get_user_error(env->regs[4], &sc->arm_r4, err);
1425 	__get_user_error(env->regs[5], &sc->arm_r5, err);
1426 	__get_user_error(env->regs[6], &sc->arm_r6, err);
1427 	__get_user_error(env->regs[7], &sc->arm_r7, err);
1428 	__get_user_error(env->regs[8], &sc->arm_r8, err);
1429 	__get_user_error(env->regs[9], &sc->arm_r9, err);
1430 	__get_user_error(env->regs[10], &sc->arm_r10, err);
1431 	__get_user_error(env->regs[11], &sc->arm_fp, err);
1432 	__get_user_error(env->regs[12], &sc->arm_ip, err);
1433 	__get_user_error(env->regs[13], &sc->arm_sp, err);
1434 	__get_user_error(env->regs[14], &sc->arm_lr, err);
1435 	__get_user_error(env->regs[15], &sc->arm_pc, err);
1436 #ifdef TARGET_CONFIG_CPU_32
1437 	__get_user_error(cpsr, &sc->arm_cpsr, err);
1438         cpsr_write(env, cpsr, CPSR_USER | CPSR_EXEC);
1439 #endif
1440 
1441 	err |= !valid_user_regs(env);
1442 
1443 	return err;
1444 }
1445 
1446 static long do_sigreturn_v1(CPUState *env)
1447 {
1448         abi_ulong frame_addr;
1449 	struct sigframe_v1 *frame;
1450 	target_sigset_t set;
1451         sigset_t host_set;
1452         int i;
1453 
1454 	/*
1455 	 * Since we stacked the signal on a 64-bit boundary,
1456 	 * then 'sp' should be word aligned here.  If it's
1457 	 * not, then the user is trying to mess with us.
1458 	 */
1459 	if (env->regs[13] & 7)
1460 		goto badframe;
1461 
1462         frame_addr = env->regs[13];
1463 	if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1464                 goto badframe;
1465 
1466 	if (__get_user(set.sig[0], &frame->sc.oldmask))
1467             goto badframe;
1468         for(i = 1; i < TARGET_NSIG_WORDS; i++) {
1469             if (__get_user(set.sig[i], &frame->extramask[i - 1]))
1470                 goto badframe;
1471         }
1472 
1473         target_to_host_sigset_internal(&host_set, &set);
1474         sigprocmask(SIG_SETMASK, &host_set, NULL);
1475 
1476 	if (restore_sigcontext(env, &frame->sc))
1477 		goto badframe;
1478 
1479 #if 0
1480 	/* Send SIGTRAP if we're single-stepping */
1481 	if (ptrace_cancel_bpt(current))
1482 		send_sig(SIGTRAP, current, 1);
1483 #endif
1484 	unlock_user_struct(frame, frame_addr, 0);
1485         return env->regs[0];
1486 
1487 badframe:
1488 	unlock_user_struct(frame, frame_addr, 0);
1489         force_sig(TARGET_SIGSEGV /* , current */);
1490 	return 0;
1491 }
1492 
1493 static int do_sigframe_return_v2(CPUState *env, target_ulong frame_addr,
1494                                  struct target_ucontext_v2 *uc)
1495 {
1496     sigset_t host_set;
1497 
1498     target_to_host_sigset(&host_set, &uc->tuc_sigmask);
1499     sigprocmask(SIG_SETMASK, &host_set, NULL);
1500 
1501     if (restore_sigcontext(env, &uc->tuc_mcontext))
1502         return 1;
1503 
1504     if (do_sigaltstack(frame_addr + offsetof(struct target_ucontext_v2, tuc_stack), 0, get_sp_from_cpustate(env)) == -EFAULT)
1505         return 1;
1506 
1507 #if 0
1508     /* Send SIGTRAP if we're single-stepping */
1509     if (ptrace_cancel_bpt(current))
1510             send_sig(SIGTRAP, current, 1);
1511 #endif
1512 
1513     return 0;
1514 }
1515 
1516 static long do_sigreturn_v2(CPUState *env)
1517 {
1518         abi_ulong frame_addr;
1519 	struct sigframe_v2 *frame;
1520 
1521 	/*
1522 	 * Since we stacked the signal on a 64-bit boundary,
1523 	 * then 'sp' should be word aligned here.  If it's
1524 	 * not, then the user is trying to mess with us.
1525 	 */
1526 	if (env->regs[13] & 7)
1527 		goto badframe;
1528 
1529         frame_addr = env->regs[13];
1530 	if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1531                 goto badframe;
1532 
1533         if (do_sigframe_return_v2(env, frame_addr, &frame->uc))
1534                 goto badframe;
1535 
1536 	unlock_user_struct(frame, frame_addr, 0);
1537 	return env->regs[0];
1538 
1539 badframe:
1540 	unlock_user_struct(frame, frame_addr, 0);
1541         force_sig(TARGET_SIGSEGV /* , current */);
1542 	return 0;
1543 }
1544 
1545 long do_sigreturn(CPUState *env)
1546 {
1547     if (get_osversion() >= 0x020612) {
1548         return do_sigreturn_v2(env);
1549     } else {
1550         return do_sigreturn_v1(env);
1551     }
1552 }
1553 
1554 static long do_rt_sigreturn_v1(CPUState *env)
1555 {
1556         abi_ulong frame_addr;
1557 	struct rt_sigframe_v1 *frame;
1558         sigset_t host_set;
1559 
1560 	/*
1561 	 * Since we stacked the signal on a 64-bit boundary,
1562 	 * then 'sp' should be word aligned here.  If it's
1563 	 * not, then the user is trying to mess with us.
1564 	 */
1565 	if (env->regs[13] & 7)
1566 		goto badframe;
1567 
1568         frame_addr = env->regs[13];
1569 	if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1570                 goto badframe;
1571 
1572         target_to_host_sigset(&host_set, &frame->uc.tuc_sigmask);
1573         sigprocmask(SIG_SETMASK, &host_set, NULL);
1574 
1575 	if (restore_sigcontext(env, &frame->uc.tuc_mcontext))
1576 		goto badframe;
1577 
1578 	if (do_sigaltstack(frame_addr + offsetof(struct rt_sigframe_v1, uc.tuc_stack), 0, get_sp_from_cpustate(env)) == -EFAULT)
1579 		goto badframe;
1580 
1581 #if 0
1582 	/* Send SIGTRAP if we're single-stepping */
1583 	if (ptrace_cancel_bpt(current))
1584 		send_sig(SIGTRAP, current, 1);
1585 #endif
1586 	unlock_user_struct(frame, frame_addr, 0);
1587 	return env->regs[0];
1588 
1589 badframe:
1590 	unlock_user_struct(frame, frame_addr, 0);
1591         force_sig(TARGET_SIGSEGV /* , current */);
1592 	return 0;
1593 }
1594 
1595 static long do_rt_sigreturn_v2(CPUState *env)
1596 {
1597         abi_ulong frame_addr;
1598 	struct rt_sigframe_v2 *frame;
1599 
1600 	/*
1601 	 * Since we stacked the signal on a 64-bit boundary,
1602 	 * then 'sp' should be word aligned here.  If it's
1603 	 * not, then the user is trying to mess with us.
1604 	 */
1605 	if (env->regs[13] & 7)
1606 		goto badframe;
1607 
1608         frame_addr = env->regs[13];
1609 	if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1610                 goto badframe;
1611 
1612         if (do_sigframe_return_v2(env, frame_addr, &frame->uc))
1613                 goto badframe;
1614 
1615 	unlock_user_struct(frame, frame_addr, 0);
1616 	return env->regs[0];
1617 
1618 badframe:
1619 	unlock_user_struct(frame, frame_addr, 0);
1620         force_sig(TARGET_SIGSEGV /* , current */);
1621 	return 0;
1622 }
1623 
1624 long do_rt_sigreturn(CPUState *env)
1625 {
1626     if (get_osversion() >= 0x020612) {
1627         return do_rt_sigreturn_v2(env);
1628     } else {
1629         return do_rt_sigreturn_v1(env);
1630     }
1631 }
1632 
1633 #elif defined(TARGET_SPARC)
1634 
1635 #define __SUNOS_MAXWIN   31
1636 
1637 /* This is what SunOS does, so shall I. */
1638 struct target_sigcontext {
1639         abi_ulong sigc_onstack;      /* state to restore */
1640 
1641         abi_ulong sigc_mask;         /* sigmask to restore */
1642         abi_ulong sigc_sp;           /* stack pointer */
1643         abi_ulong sigc_pc;           /* program counter */
1644         abi_ulong sigc_npc;          /* next program counter */
1645         abi_ulong sigc_psr;          /* for condition codes etc */
1646         abi_ulong sigc_g1;           /* User uses these two registers */
1647         abi_ulong sigc_o0;           /* within the trampoline code. */
1648 
1649         /* Now comes information regarding the users window set
1650          * at the time of the signal.
1651          */
1652         abi_ulong sigc_oswins;       /* outstanding windows */
1653 
1654         /* stack ptrs for each regwin buf */
1655         char *sigc_spbuf[__SUNOS_MAXWIN];
1656 
1657         /* Windows to restore after signal */
1658         struct {
1659                 abi_ulong locals[8];
1660                 abi_ulong ins[8];
1661         } sigc_wbuf[__SUNOS_MAXWIN];
1662 };
1663 /* A Sparc stack frame */
1664 struct sparc_stackf {
1665         abi_ulong locals[8];
1666         abi_ulong ins[6];
1667         struct sparc_stackf *fp;
1668         abi_ulong callers_pc;
1669         char *structptr;
1670         abi_ulong xargs[6];
1671         abi_ulong xxargs[1];
1672 };
1673 
1674 typedef struct {
1675         struct {
1676                 abi_ulong psr;
1677                 abi_ulong pc;
1678                 abi_ulong npc;
1679                 abi_ulong y;
1680                 abi_ulong u_regs[16]; /* globals and ins */
1681         }               si_regs;
1682         int             si_mask;
1683 } __siginfo_t;
1684 
1685 typedef struct {
1686         unsigned   long si_float_regs [32];
1687         unsigned   long si_fsr;
1688         unsigned   long si_fpqdepth;
1689         struct {
1690                 unsigned long *insn_addr;
1691                 unsigned long insn;
1692         } si_fpqueue [16];
1693 } qemu_siginfo_fpu_t;
1694 
1695 
1696 struct target_signal_frame {
1697 	struct sparc_stackf	ss;
1698 	__siginfo_t		info;
1699 	abi_ulong               fpu_save;
1700 	abi_ulong		insns[2] __attribute__ ((aligned (8)));
1701 	abi_ulong		extramask[TARGET_NSIG_WORDS - 1];
1702 	abi_ulong		extra_size; /* Should be 0 */
1703 	qemu_siginfo_fpu_t	fpu_state;
1704 };
1705 struct target_rt_signal_frame {
1706 	struct sparc_stackf	ss;
1707 	siginfo_t		info;
1708 	abi_ulong		regs[20];
1709 	sigset_t		mask;
1710 	abi_ulong               fpu_save;
1711 	unsigned int		insns[2];
1712 	stack_t			stack;
1713 	unsigned int		extra_size; /* Should be 0 */
1714 	qemu_siginfo_fpu_t	fpu_state;
1715 };
1716 
1717 #define UREG_O0        16
1718 #define UREG_O6        22
1719 #define UREG_I0        0
1720 #define UREG_I1        1
1721 #define UREG_I2        2
1722 #define UREG_I3        3
1723 #define UREG_I4        4
1724 #define UREG_I5        5
1725 #define UREG_I6        6
1726 #define UREG_I7        7
1727 #define UREG_L0	       8
1728 #define UREG_FP        UREG_I6
1729 #define UREG_SP        UREG_O6
1730 
1731 static inline abi_ulong get_sigframe(struct target_sigaction *sa,
1732                                      CPUState *env, unsigned long framesize)
1733 {
1734 	abi_ulong sp;
1735 
1736 	sp = env->regwptr[UREG_FP];
1737 
1738 	/* This is the X/Open sanctioned signal stack switching.  */
1739 	if (sa->sa_flags & TARGET_SA_ONSTACK) {
1740             if (!on_sig_stack(sp)
1741                 && !((target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size) & 7))
1742                 sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
1743 	}
1744 	return sp - framesize;
1745 }
1746 
1747 static int
1748 setup___siginfo(__siginfo_t *si, CPUState *env, abi_ulong mask)
1749 {
1750 	int err = 0, i;
1751 
1752 	err |= __put_user(env->psr, &si->si_regs.psr);
1753 	err |= __put_user(env->pc, &si->si_regs.pc);
1754 	err |= __put_user(env->npc, &si->si_regs.npc);
1755 	err |= __put_user(env->y, &si->si_regs.y);
1756 	for (i=0; i < 8; i++) {
1757 		err |= __put_user(env->gregs[i], &si->si_regs.u_regs[i]);
1758 	}
1759 	for (i=0; i < 8; i++) {
1760 		err |= __put_user(env->regwptr[UREG_I0 + i], &si->si_regs.u_regs[i+8]);
1761 	}
1762 	err |= __put_user(mask, &si->si_mask);
1763 	return err;
1764 }
1765 
1766 #if 0
1767 static int
1768 setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/
1769 		 CPUState *env, unsigned long mask)
1770 {
1771 	int err = 0;
1772 
1773 	err |= __put_user(mask, &sc->sigc_mask);
1774 	err |= __put_user(env->regwptr[UREG_SP], &sc->sigc_sp);
1775 	err |= __put_user(env->pc, &sc->sigc_pc);
1776 	err |= __put_user(env->npc, &sc->sigc_npc);
1777 	err |= __put_user(env->psr, &sc->sigc_psr);
1778 	err |= __put_user(env->gregs[1], &sc->sigc_g1);
1779 	err |= __put_user(env->regwptr[UREG_O0], &sc->sigc_o0);
1780 
1781 	return err;
1782 }
1783 #endif
1784 #define NF_ALIGNEDSZ  (((sizeof(struct target_signal_frame) + 7) & (~7)))
1785 
1786 static void setup_frame(int sig, struct target_sigaction *ka,
1787 			target_sigset_t *set, CPUState *env)
1788 {
1789         abi_ulong sf_addr;
1790 	struct target_signal_frame *sf;
1791 	int sigframe_size, err, i;
1792 
1793 	/* 1. Make sure everything is clean */
1794 	//synchronize_user_stack();
1795 
1796         sigframe_size = NF_ALIGNEDSZ;
1797 	sf_addr = get_sigframe(ka, env, sigframe_size);
1798 
1799         sf = lock_user(VERIFY_WRITE, sf_addr,
1800                        sizeof(struct target_signal_frame), 0);
1801         if (!sf)
1802 		goto sigsegv;
1803 
1804 	//fprintf(stderr, "sf: %x pc %x fp %x sp %x\n", sf, env->pc, env->regwptr[UREG_FP], env->regwptr[UREG_SP]);
1805 #if 0
1806 	if (invalid_frame_pointer(sf, sigframe_size))
1807 		goto sigill_and_return;
1808 #endif
1809 	/* 2. Save the current process state */
1810 	err = setup___siginfo(&sf->info, env, set->sig[0]);
1811 	err |= __put_user(0, &sf->extra_size);
1812 
1813 	//err |= save_fpu_state(regs, &sf->fpu_state);
1814 	//err |= __put_user(&sf->fpu_state, &sf->fpu_save);
1815 
1816 	err |= __put_user(set->sig[0], &sf->info.si_mask);
1817 	for (i = 0; i < TARGET_NSIG_WORDS - 1; i++) {
1818 		err |= __put_user(set->sig[i + 1], &sf->extramask[i]);
1819 	}
1820 
1821 	for (i = 0; i < 8; i++) {
1822 	  	err |= __put_user(env->regwptr[i + UREG_L0], &sf->ss.locals[i]);
1823 	}
1824 	for (i = 0; i < 8; i++) {
1825 	  	err |= __put_user(env->regwptr[i + UREG_I0], &sf->ss.ins[i]);
1826 	}
1827 	if (err)
1828 		goto sigsegv;
1829 
1830 	/* 3. signal handler back-trampoline and parameters */
1831 	env->regwptr[UREG_FP] = sf_addr;
1832 	env->regwptr[UREG_I0] = sig;
1833 	env->regwptr[UREG_I1] = sf_addr +
1834                 offsetof(struct target_signal_frame, info);
1835 	env->regwptr[UREG_I2] = sf_addr +
1836                 offsetof(struct target_signal_frame, info);
1837 
1838 	/* 4. signal handler */
1839 	env->pc = ka->_sa_handler;
1840 	env->npc = (env->pc + 4);
1841 	/* 5. return to kernel instructions */
1842 	if (ka->sa_restorer)
1843 		env->regwptr[UREG_I7] = ka->sa_restorer;
1844 	else {
1845                 uint32_t val32;
1846 
1847 		env->regwptr[UREG_I7] = sf_addr +
1848                         offsetof(struct target_signal_frame, insns) - 2 * 4;
1849 
1850 		/* mov __NR_sigreturn, %g1 */
1851                 val32 = 0x821020d8;
1852 		err |= __put_user(val32, &sf->insns[0]);
1853 
1854 		/* t 0x10 */
1855                 val32 = 0x91d02010;
1856 		err |= __put_user(val32, &sf->insns[1]);
1857 		if (err)
1858 			goto sigsegv;
1859 
1860 		/* Flush instruction space. */
1861 		//flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0]));
1862                 //		tb_flush(env);
1863 	}
1864         unlock_user(sf, sf_addr, sizeof(struct target_signal_frame));
1865 	return;
1866 #if 0
1867 sigill_and_return:
1868 	force_sig(TARGET_SIGILL);
1869 #endif
1870 sigsegv:
1871 	//fprintf(stderr, "force_sig\n");
1872         unlock_user(sf, sf_addr, sizeof(struct target_signal_frame));
1873 	force_sig(TARGET_SIGSEGV);
1874 }
1875 static inline int
1876 restore_fpu_state(CPUState *env, qemu_siginfo_fpu_t *fpu)
1877 {
1878         int err;
1879 #if 0
1880 #ifdef CONFIG_SMP
1881         if (current->flags & PF_USEDFPU)
1882                 regs->psr &= ~PSR_EF;
1883 #else
1884         if (current == last_task_used_math) {
1885                 last_task_used_math = 0;
1886                 regs->psr &= ~PSR_EF;
1887         }
1888 #endif
1889         current->used_math = 1;
1890         current->flags &= ~PF_USEDFPU;
1891 #endif
1892 #if 0
1893         if (verify_area (VERIFY_READ, fpu, sizeof(*fpu)))
1894                 return -EFAULT;
1895 #endif
1896 
1897 #if 0
1898         /* XXX: incorrect */
1899         err = __copy_from_user(&env->fpr[0], &fpu->si_float_regs[0],
1900 	                             (sizeof(unsigned long) * 32));
1901 #endif
1902         err |= __get_user(env->fsr, &fpu->si_fsr);
1903 #if 0
1904         err |= __get_user(current->thread.fpqdepth, &fpu->si_fpqdepth);
1905         if (current->thread.fpqdepth != 0)
1906                 err |= __copy_from_user(&current->thread.fpqueue[0],
1907                                         &fpu->si_fpqueue[0],
1908                                         ((sizeof(unsigned long) +
1909                                         (sizeof(unsigned long *)))*16));
1910 #endif
1911         return err;
1912 }
1913 
1914 
1915 static void setup_rt_frame(int sig, struct target_sigaction *ka,
1916                            target_siginfo_t *info,
1917 			   target_sigset_t *set, CPUState *env)
1918 {
1919     fprintf(stderr, "setup_rt_frame: not implemented\n");
1920 }
1921 
1922 long do_sigreturn(CPUState *env)
1923 {
1924         abi_ulong sf_addr;
1925         struct target_signal_frame *sf;
1926         uint32_t up_psr, pc, npc;
1927         target_sigset_t set;
1928         sigset_t host_set;
1929         abi_ulong fpu_save_addr;
1930         int err, i;
1931 
1932         sf_addr = env->regwptr[UREG_FP];
1933         if (!lock_user_struct(VERIFY_READ, sf, sf_addr, 1))
1934                 goto segv_and_exit;
1935 #if 0
1936 	fprintf(stderr, "sigreturn\n");
1937 	fprintf(stderr, "sf: %x pc %x fp %x sp %x\n", sf, env->pc, env->regwptr[UREG_FP], env->regwptr[UREG_SP]);
1938 #endif
1939 	//cpu_dump_state(env, stderr, fprintf, 0);
1940 
1941         /* 1. Make sure we are not getting garbage from the user */
1942 
1943         if (sf_addr & 3)
1944                 goto segv_and_exit;
1945 
1946         err = __get_user(pc,  &sf->info.si_regs.pc);
1947         err |= __get_user(npc, &sf->info.si_regs.npc);
1948 
1949         if ((pc | npc) & 3)
1950                 goto segv_and_exit;
1951 
1952         /* 2. Restore the state */
1953         err |= __get_user(up_psr, &sf->info.si_regs.psr);
1954 
1955         /* User can only change condition codes and FPU enabling in %psr. */
1956         env->psr = (up_psr & (PSR_ICC /* | PSR_EF */))
1957                   | (env->psr & ~(PSR_ICC /* | PSR_EF */));
1958 
1959 	env->pc = pc;
1960 	env->npc = npc;
1961         err |= __get_user(env->y, &sf->info.si_regs.y);
1962 	for (i=0; i < 8; i++) {
1963 		err |= __get_user(env->gregs[i], &sf->info.si_regs.u_regs[i]);
1964 	}
1965 	for (i=0; i < 8; i++) {
1966 		err |= __get_user(env->regwptr[i + UREG_I0], &sf->info.si_regs.u_regs[i+8]);
1967 	}
1968 
1969         err |= __get_user(fpu_save_addr, &sf->fpu_save);
1970 
1971         //if (fpu_save)
1972         //        err |= restore_fpu_state(env, fpu_save);
1973 
1974         /* This is pretty much atomic, no amount locking would prevent
1975          * the races which exist anyways.
1976          */
1977         err |= __get_user(set.sig[0], &sf->info.si_mask);
1978         for(i = 1; i < TARGET_NSIG_WORDS; i++) {
1979             err |= (__get_user(set.sig[i], &sf->extramask[i - 1]));
1980         }
1981 
1982         target_to_host_sigset_internal(&host_set, &set);
1983         sigprocmask(SIG_SETMASK, &host_set, NULL);
1984 
1985         if (err)
1986                 goto segv_and_exit;
1987         unlock_user_struct(sf, sf_addr, 0);
1988         return env->regwptr[0];
1989 
1990 segv_and_exit:
1991         unlock_user_struct(sf, sf_addr, 0);
1992 	force_sig(TARGET_SIGSEGV);
1993 }
1994 
1995 long do_rt_sigreturn(CPUState *env)
1996 {
1997     fprintf(stderr, "do_rt_sigreturn: not implemented\n");
1998     return -TARGET_ENOSYS;
1999 }
2000 
2001 #if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
2002 #define MC_TSTATE 0
2003 #define MC_PC 1
2004 #define MC_NPC 2
2005 #define MC_Y 3
2006 #define MC_G1 4
2007 #define MC_G2 5
2008 #define MC_G3 6
2009 #define MC_G4 7
2010 #define MC_G5 8
2011 #define MC_G6 9
2012 #define MC_G7 10
2013 #define MC_O0 11
2014 #define MC_O1 12
2015 #define MC_O2 13
2016 #define MC_O3 14
2017 #define MC_O4 15
2018 #define MC_O5 16
2019 #define MC_O6 17
2020 #define MC_O7 18
2021 #define MC_NGREG 19
2022 
2023 typedef abi_ulong target_mc_greg_t;
2024 typedef target_mc_greg_t target_mc_gregset_t[MC_NGREG];
2025 
2026 struct target_mc_fq {
2027     abi_ulong *mcfq_addr;
2028     uint32_t mcfq_insn;
2029 };
2030 
2031 struct target_mc_fpu {
2032     union {
2033         uint32_t sregs[32];
2034         uint64_t dregs[32];
2035         //uint128_t qregs[16];
2036     } mcfpu_fregs;
2037     abi_ulong mcfpu_fsr;
2038     abi_ulong mcfpu_fprs;
2039     abi_ulong mcfpu_gsr;
2040     struct target_mc_fq *mcfpu_fq;
2041     unsigned char mcfpu_qcnt;
2042     unsigned char mcfpu_qentsz;
2043     unsigned char mcfpu_enab;
2044 };
2045 typedef struct target_mc_fpu target_mc_fpu_t;
2046 
2047 typedef struct {
2048     target_mc_gregset_t mc_gregs;
2049     target_mc_greg_t mc_fp;
2050     target_mc_greg_t mc_i7;
2051     target_mc_fpu_t mc_fpregs;
2052 } target_mcontext_t;
2053 
2054 struct target_ucontext {
2055     struct target_ucontext *tuc_link;
2056     abi_ulong tuc_flags;
2057     target_sigset_t tuc_sigmask;
2058     target_mcontext_t tuc_mcontext;
2059 };
2060 
2061 /* A V9 register window */
2062 struct target_reg_window {
2063     abi_ulong locals[8];
2064     abi_ulong ins[8];
2065 };
2066 
2067 #define TARGET_STACK_BIAS 2047
2068 
2069 /* {set, get}context() needed for 64-bit SparcLinux userland. */
2070 void sparc64_set_context(CPUSPARCState *env)
2071 {
2072     abi_ulong ucp_addr;
2073     struct target_ucontext *ucp;
2074     target_mc_gregset_t *grp;
2075     abi_ulong pc, npc, tstate;
2076     abi_ulong fp, i7, w_addr;
2077     unsigned char fenab;
2078     int err;
2079     unsigned int i;
2080 
2081     ucp_addr = env->regwptr[UREG_I0];
2082     if (!lock_user_struct(VERIFY_READ, ucp, ucp_addr, 1))
2083         goto do_sigsegv;
2084     grp  = &ucp->tuc_mcontext.mc_gregs;
2085     err  = __get_user(pc, &((*grp)[MC_PC]));
2086     err |= __get_user(npc, &((*grp)[MC_NPC]));
2087     if (err || ((pc | npc) & 3))
2088         goto do_sigsegv;
2089     if (env->regwptr[UREG_I1]) {
2090         target_sigset_t target_set;
2091         sigset_t set;
2092 
2093         if (TARGET_NSIG_WORDS == 1) {
2094             if (__get_user(target_set.sig[0], &ucp->tuc_sigmask.sig[0]))
2095                 goto do_sigsegv;
2096         } else {
2097             abi_ulong *src, *dst;
2098             src = ucp->tuc_sigmask.sig;
2099             dst = target_set.sig;
2100             for (i = 0; i < sizeof(target_sigset_t) / sizeof(abi_ulong);
2101                  i++, dst++, src++)
2102                 err |= __get_user(*dst, src);
2103             if (err)
2104                 goto do_sigsegv;
2105         }
2106         target_to_host_sigset_internal(&set, &target_set);
2107         sigprocmask(SIG_SETMASK, &set, NULL);
2108     }
2109     env->pc = pc;
2110     env->npc = npc;
2111     err |= __get_user(env->y, &((*grp)[MC_Y]));
2112     err |= __get_user(tstate, &((*grp)[MC_TSTATE]));
2113     env->asi = (tstate >> 24) & 0xff;
2114     cpu_put_ccr(env, tstate >> 32);
2115     cpu_put_cwp64(env, tstate & 0x1f);
2116     err |= __get_user(env->gregs[1], (&(*grp)[MC_G1]));
2117     err |= __get_user(env->gregs[2], (&(*grp)[MC_G2]));
2118     err |= __get_user(env->gregs[3], (&(*grp)[MC_G3]));
2119     err |= __get_user(env->gregs[4], (&(*grp)[MC_G4]));
2120     err |= __get_user(env->gregs[5], (&(*grp)[MC_G5]));
2121     err |= __get_user(env->gregs[6], (&(*grp)[MC_G6]));
2122     err |= __get_user(env->gregs[7], (&(*grp)[MC_G7]));
2123     err |= __get_user(env->regwptr[UREG_I0], (&(*grp)[MC_O0]));
2124     err |= __get_user(env->regwptr[UREG_I1], (&(*grp)[MC_O1]));
2125     err |= __get_user(env->regwptr[UREG_I2], (&(*grp)[MC_O2]));
2126     err |= __get_user(env->regwptr[UREG_I3], (&(*grp)[MC_O3]));
2127     err |= __get_user(env->regwptr[UREG_I4], (&(*grp)[MC_O4]));
2128     err |= __get_user(env->regwptr[UREG_I5], (&(*grp)[MC_O5]));
2129     err |= __get_user(env->regwptr[UREG_I6], (&(*grp)[MC_O6]));
2130     err |= __get_user(env->regwptr[UREG_I7], (&(*grp)[MC_O7]));
2131 
2132     err |= __get_user(fp, &(ucp->tuc_mcontext.mc_fp));
2133     err |= __get_user(i7, &(ucp->tuc_mcontext.mc_i7));
2134 
2135     w_addr = TARGET_STACK_BIAS+env->regwptr[UREG_I6];
2136     if (put_user(fp, w_addr + offsetof(struct target_reg_window, ins[6]),
2137                  abi_ulong) != 0)
2138         goto do_sigsegv;
2139     if (put_user(i7, w_addr + offsetof(struct target_reg_window, ins[7]),
2140                  abi_ulong) != 0)
2141         goto do_sigsegv;
2142     err |= __get_user(fenab, &(ucp->tuc_mcontext.mc_fpregs.mcfpu_enab));
2143     err |= __get_user(env->fprs, &(ucp->tuc_mcontext.mc_fpregs.mcfpu_fprs));
2144     {
2145         uint32_t *src, *dst;
2146         src = ucp->tuc_mcontext.mc_fpregs.mcfpu_fregs.sregs;
2147         dst = env->fpr;
2148         /* XXX: check that the CPU storage is the same as user context */
2149         for (i = 0; i < 64; i++, dst++, src++)
2150             err |= __get_user(*dst, src);
2151     }
2152     err |= __get_user(env->fsr,
2153                       &(ucp->tuc_mcontext.mc_fpregs.mcfpu_fsr));
2154     err |= __get_user(env->gsr,
2155                       &(ucp->tuc_mcontext.mc_fpregs.mcfpu_gsr));
2156     if (err)
2157         goto do_sigsegv;
2158     unlock_user_struct(ucp, ucp_addr, 0);
2159     return;
2160  do_sigsegv:
2161     unlock_user_struct(ucp, ucp_addr, 0);
2162     force_sig(TARGET_SIGSEGV);
2163 }
2164 
2165 void sparc64_get_context(CPUSPARCState *env)
2166 {
2167     abi_ulong ucp_addr;
2168     struct target_ucontext *ucp;
2169     target_mc_gregset_t *grp;
2170     target_mcontext_t *mcp;
2171     abi_ulong fp, i7, w_addr;
2172     int err;
2173     unsigned int i;
2174     target_sigset_t target_set;
2175     sigset_t set;
2176 
2177     ucp_addr = env->regwptr[UREG_I0];
2178     if (!lock_user_struct(VERIFY_WRITE, ucp, ucp_addr, 0))
2179         goto do_sigsegv;
2180 
2181     mcp = &ucp->tuc_mcontext;
2182     grp = &mcp->mc_gregs;
2183 
2184     /* Skip over the trap instruction, first. */
2185     env->pc = env->npc;
2186     env->npc += 4;
2187 
2188     err = 0;
2189 
2190     sigprocmask(0, NULL, &set);
2191     host_to_target_sigset_internal(&target_set, &set);
2192     if (TARGET_NSIG_WORDS == 1) {
2193         err |= __put_user(target_set.sig[0],
2194                           (abi_ulong *)&ucp->tuc_sigmask);
2195     } else {
2196         abi_ulong *src, *dst;
2197         src = target_set.sig;
2198         dst = ucp->tuc_sigmask.sig;
2199         for (i = 0; i < sizeof(target_sigset_t) / sizeof(abi_ulong);
2200              i++, dst++, src++)
2201             err |= __put_user(*src, dst);
2202         if (err)
2203             goto do_sigsegv;
2204     }
2205 
2206     /* XXX: tstate must be saved properly */
2207     //    err |= __put_user(env->tstate, &((*grp)[MC_TSTATE]));
2208     err |= __put_user(env->pc, &((*grp)[MC_PC]));
2209     err |= __put_user(env->npc, &((*grp)[MC_NPC]));
2210     err |= __put_user(env->y, &((*grp)[MC_Y]));
2211     err |= __put_user(env->gregs[1], &((*grp)[MC_G1]));
2212     err |= __put_user(env->gregs[2], &((*grp)[MC_G2]));
2213     err |= __put_user(env->gregs[3], &((*grp)[MC_G3]));
2214     err |= __put_user(env->gregs[4], &((*grp)[MC_G4]));
2215     err |= __put_user(env->gregs[5], &((*grp)[MC_G5]));
2216     err |= __put_user(env->gregs[6], &((*grp)[MC_G6]));
2217     err |= __put_user(env->gregs[7], &((*grp)[MC_G7]));
2218     err |= __put_user(env->regwptr[UREG_I0], &((*grp)[MC_O0]));
2219     err |= __put_user(env->regwptr[UREG_I1], &((*grp)[MC_O1]));
2220     err |= __put_user(env->regwptr[UREG_I2], &((*grp)[MC_O2]));
2221     err |= __put_user(env->regwptr[UREG_I3], &((*grp)[MC_O3]));
2222     err |= __put_user(env->regwptr[UREG_I4], &((*grp)[MC_O4]));
2223     err |= __put_user(env->regwptr[UREG_I5], &((*grp)[MC_O5]));
2224     err |= __put_user(env->regwptr[UREG_I6], &((*grp)[MC_O6]));
2225     err |= __put_user(env->regwptr[UREG_I7], &((*grp)[MC_O7]));
2226 
2227     w_addr = TARGET_STACK_BIAS+env->regwptr[UREG_I6];
2228     fp = i7 = 0;
2229     if (get_user(fp, w_addr + offsetof(struct target_reg_window, ins[6]),
2230                  abi_ulong) != 0)
2231         goto do_sigsegv;
2232     if (get_user(i7, w_addr + offsetof(struct target_reg_window, ins[7]),
2233                  abi_ulong) != 0)
2234         goto do_sigsegv;
2235     err |= __put_user(fp, &(mcp->mc_fp));
2236     err |= __put_user(i7, &(mcp->mc_i7));
2237 
2238     {
2239         uint32_t *src, *dst;
2240         src = env->fpr;
2241         dst = ucp->tuc_mcontext.mc_fpregs.mcfpu_fregs.sregs;
2242         /* XXX: check that the CPU storage is the same as user context */
2243         for (i = 0; i < 64; i++, dst++, src++)
2244             err |= __put_user(*src, dst);
2245     }
2246     err |= __put_user(env->fsr, &(mcp->mc_fpregs.mcfpu_fsr));
2247     err |= __put_user(env->gsr, &(mcp->mc_fpregs.mcfpu_gsr));
2248     err |= __put_user(env->fprs, &(mcp->mc_fpregs.mcfpu_fprs));
2249 
2250     if (err)
2251         goto do_sigsegv;
2252     unlock_user_struct(ucp, ucp_addr, 1);
2253     return;
2254  do_sigsegv:
2255     unlock_user_struct(ucp, ucp_addr, 1);
2256     force_sig(TARGET_SIGSEGV);
2257 }
2258 #endif
2259 #elif defined(TARGET_ABI_MIPSN64)
2260 
2261 # warning signal handling not implemented
2262 
2263 static void setup_frame(int sig, struct target_sigaction *ka,
2264 			target_sigset_t *set, CPUState *env)
2265 {
2266     fprintf(stderr, "setup_frame: not implemented\n");
2267 }
2268 
2269 static void setup_rt_frame(int sig, struct target_sigaction *ka,
2270                            target_siginfo_t *info,
2271 			   target_sigset_t *set, CPUState *env)
2272 {
2273     fprintf(stderr, "setup_rt_frame: not implemented\n");
2274 }
2275 
2276 long do_sigreturn(CPUState *env)
2277 {
2278     fprintf(stderr, "do_sigreturn: not implemented\n");
2279     return -TARGET_ENOSYS;
2280 }
2281 
2282 long do_rt_sigreturn(CPUState *env)
2283 {
2284     fprintf(stderr, "do_rt_sigreturn: not implemented\n");
2285     return -TARGET_ENOSYS;
2286 }
2287 
2288 #elif defined(TARGET_ABI_MIPSN32)
2289 
2290 # warning signal handling not implemented
2291 
2292 static void setup_frame(int sig, struct target_sigaction *ka,
2293 			target_sigset_t *set, CPUState *env)
2294 {
2295     fprintf(stderr, "setup_frame: not implemented\n");
2296 }
2297 
2298 static void setup_rt_frame(int sig, struct target_sigaction *ka,
2299                            target_siginfo_t *info,
2300 			   target_sigset_t *set, CPUState *env)
2301 {
2302     fprintf(stderr, "setup_rt_frame: not implemented\n");
2303 }
2304 
2305 long do_sigreturn(CPUState *env)
2306 {
2307     fprintf(stderr, "do_sigreturn: not implemented\n");
2308     return -TARGET_ENOSYS;
2309 }
2310 
2311 long do_rt_sigreturn(CPUState *env)
2312 {
2313     fprintf(stderr, "do_rt_sigreturn: not implemented\n");
2314     return -TARGET_ENOSYS;
2315 }
2316 
2317 #elif defined(TARGET_ABI_MIPSO32)
2318 
2319 struct target_sigcontext {
2320     uint32_t   sc_regmask;     /* Unused */
2321     uint32_t   sc_status;
2322     uint64_t   sc_pc;
2323     uint64_t   sc_regs[32];
2324     uint64_t   sc_fpregs[32];
2325     uint32_t   sc_ownedfp;     /* Unused */
2326     uint32_t   sc_fpc_csr;
2327     uint32_t   sc_fpc_eir;     /* Unused */
2328     uint32_t   sc_used_math;
2329     uint32_t   sc_dsp;         /* dsp status, was sc_ssflags */
2330     uint32_t   pad0;
2331     uint64_t   sc_mdhi;
2332     uint64_t   sc_mdlo;
2333     target_ulong   sc_hi1;         /* Was sc_cause */
2334     target_ulong   sc_lo1;         /* Was sc_badvaddr */
2335     target_ulong   sc_hi2;         /* Was sc_sigset[4] */
2336     target_ulong   sc_lo2;
2337     target_ulong   sc_hi3;
2338     target_ulong   sc_lo3;
2339 };
2340 
2341 struct sigframe {
2342     uint32_t sf_ass[4];			/* argument save space for o32 */
2343     uint32_t sf_code[2];			/* signal trampoline */
2344     struct target_sigcontext sf_sc;
2345     target_sigset_t sf_mask;
2346 };
2347 
2348 struct target_ucontext {
2349     target_ulong tuc_flags;
2350     target_ulong tuc_link;
2351     target_stack_t tuc_stack;
2352     target_ulong pad0;
2353     struct target_sigcontext tuc_mcontext;
2354     target_sigset_t tuc_sigmask;
2355 };
2356 
2357 struct target_rt_sigframe {
2358     uint32_t rs_ass[4];               /* argument save space for o32 */
2359     uint32_t rs_code[2];              /* signal trampoline */
2360     struct target_siginfo rs_info;
2361     struct target_ucontext rs_uc;
2362 };
2363 
2364 /* Install trampoline to jump back from signal handler */
2365 static inline int install_sigtramp(unsigned int *tramp,   unsigned int syscall)
2366 {
2367     int err;
2368 
2369     /*
2370     * Set up the return code ...
2371     *
2372     *         li      v0, __NR__foo_sigreturn
2373     *         syscall
2374     */
2375 
2376     err = __put_user(0x24020000 + syscall, tramp + 0);
2377     err |= __put_user(0x0000000c          , tramp + 1);
2378     /* flush_cache_sigtramp((unsigned long) tramp); */
2379     return err;
2380 }
2381 
2382 static inline int
2383 setup_sigcontext(CPUState *regs, struct target_sigcontext *sc)
2384 {
2385     int err = 0;
2386 
2387     err |= __put_user(regs->active_tc.PC, &sc->sc_pc);
2388 
2389 #define save_gp_reg(i) do {   						\
2390         err |= __put_user(regs->active_tc.gpr[i], &sc->sc_regs[i]);	\
2391     } while(0)
2392     __put_user(0, &sc->sc_regs[0]); save_gp_reg(1); save_gp_reg(2);
2393     save_gp_reg(3); save_gp_reg(4); save_gp_reg(5); save_gp_reg(6);
2394     save_gp_reg(7); save_gp_reg(8); save_gp_reg(9); save_gp_reg(10);
2395     save_gp_reg(11); save_gp_reg(12); save_gp_reg(13); save_gp_reg(14);
2396     save_gp_reg(15); save_gp_reg(16); save_gp_reg(17); save_gp_reg(18);
2397     save_gp_reg(19); save_gp_reg(20); save_gp_reg(21); save_gp_reg(22);
2398     save_gp_reg(23); save_gp_reg(24); save_gp_reg(25); save_gp_reg(26);
2399     save_gp_reg(27); save_gp_reg(28); save_gp_reg(29); save_gp_reg(30);
2400     save_gp_reg(31);
2401 #undef save_gp_reg
2402 
2403     err |= __put_user(regs->active_tc.HI[0], &sc->sc_mdhi);
2404     err |= __put_user(regs->active_tc.LO[0], &sc->sc_mdlo);
2405 
2406     /* Not used yet, but might be useful if we ever have DSP suppport */
2407 #if 0
2408     if (cpu_has_dsp) {
2409 	err |= __put_user(mfhi1(), &sc->sc_hi1);
2410 	err |= __put_user(mflo1(), &sc->sc_lo1);
2411 	err |= __put_user(mfhi2(), &sc->sc_hi2);
2412 	err |= __put_user(mflo2(), &sc->sc_lo2);
2413 	err |= __put_user(mfhi3(), &sc->sc_hi3);
2414 	err |= __put_user(mflo3(), &sc->sc_lo3);
2415 	err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp);
2416     }
2417     /* same with 64 bit */
2418 #ifdef CONFIG_64BIT
2419     err |= __put_user(regs->hi, &sc->sc_hi[0]);
2420     err |= __put_user(regs->lo, &sc->sc_lo[0]);
2421     if (cpu_has_dsp) {
2422 	err |= __put_user(mfhi1(), &sc->sc_hi[1]);
2423 	err |= __put_user(mflo1(), &sc->sc_lo[1]);
2424 	err |= __put_user(mfhi2(), &sc->sc_hi[2]);
2425 	err |= __put_user(mflo2(), &sc->sc_lo[2]);
2426 	err |= __put_user(mfhi3(), &sc->sc_hi[3]);
2427 	err |= __put_user(mflo3(), &sc->sc_lo[3]);
2428 	err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp);
2429     }
2430 #endif
2431 #endif
2432 
2433 #if 0
2434     err |= __put_user(!!used_math(), &sc->sc_used_math);
2435 
2436     if (!used_math())
2437 	goto out;
2438 
2439     /*
2440     * Save FPU state to signal context.  Signal handler will "inherit"
2441     * current FPU state.
2442     */
2443     preempt_disable();
2444 
2445     if (!is_fpu_owner()) {
2446 	own_fpu();
2447 	restore_fp(current);
2448     }
2449     err |= save_fp_context(sc);
2450 
2451     preempt_enable();
2452     out:
2453 #endif
2454     return err;
2455 }
2456 
2457 static inline int
2458 restore_sigcontext(CPUState *regs, struct target_sigcontext *sc)
2459 {
2460     int err = 0;
2461 
2462     err |= __get_user(regs->CP0_EPC, &sc->sc_pc);
2463 
2464     err |= __get_user(regs->active_tc.HI[0], &sc->sc_mdhi);
2465     err |= __get_user(regs->active_tc.LO[0], &sc->sc_mdlo);
2466 
2467 #define restore_gp_reg(i) do {   							\
2468         err |= __get_user(regs->active_tc.gpr[i], &sc->sc_regs[i]);		\
2469     } while(0)
2470     restore_gp_reg( 1); restore_gp_reg( 2); restore_gp_reg( 3);
2471     restore_gp_reg( 4); restore_gp_reg( 5); restore_gp_reg( 6);
2472     restore_gp_reg( 7); restore_gp_reg( 8); restore_gp_reg( 9);
2473     restore_gp_reg(10); restore_gp_reg(11); restore_gp_reg(12);
2474     restore_gp_reg(13); restore_gp_reg(14); restore_gp_reg(15);
2475     restore_gp_reg(16); restore_gp_reg(17); restore_gp_reg(18);
2476     restore_gp_reg(19); restore_gp_reg(20); restore_gp_reg(21);
2477     restore_gp_reg(22); restore_gp_reg(23); restore_gp_reg(24);
2478     restore_gp_reg(25); restore_gp_reg(26); restore_gp_reg(27);
2479     restore_gp_reg(28); restore_gp_reg(29); restore_gp_reg(30);
2480     restore_gp_reg(31);
2481 #undef restore_gp_reg
2482 
2483 #if 0
2484     if (cpu_has_dsp) {
2485 	err |= __get_user(treg, &sc->sc_hi1); mthi1(treg);
2486 	err |= __get_user(treg, &sc->sc_lo1); mtlo1(treg);
2487 	err |= __get_user(treg, &sc->sc_hi2); mthi2(treg);
2488 	err |= __get_user(treg, &sc->sc_lo2); mtlo2(treg);
2489 	err |= __get_user(treg, &sc->sc_hi3); mthi3(treg);
2490 	err |= __get_user(treg, &sc->sc_lo3); mtlo3(treg);
2491 	err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK);
2492     }
2493 #ifdef CONFIG_64BIT
2494     err |= __get_user(regs->hi, &sc->sc_hi[0]);
2495     err |= __get_user(regs->lo, &sc->sc_lo[0]);
2496     if (cpu_has_dsp) {
2497 	err |= __get_user(treg, &sc->sc_hi[1]); mthi1(treg);
2498 	err |= __get_user(treg, &sc->sc_lo[1]); mthi1(treg);
2499 	err |= __get_user(treg, &sc->sc_hi[2]); mthi2(treg);
2500 	err |= __get_user(treg, &sc->sc_lo[2]); mthi2(treg);
2501 	err |= __get_user(treg, &sc->sc_hi[3]); mthi3(treg);
2502 	err |= __get_user(treg, &sc->sc_lo[3]); mthi3(treg);
2503 	err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK);
2504     }
2505 #endif
2506 
2507     err |= __get_user(used_math, &sc->sc_used_math);
2508     conditional_used_math(used_math);
2509 
2510     preempt_disable();
2511 
2512     if (used_math()) {
2513 	/* restore fpu context if we have used it before */
2514 	own_fpu();
2515 	err |= restore_fp_context(sc);
2516     } else {
2517 	/* signal handler may have used FPU.  Give it up. */
2518 	lose_fpu();
2519     }
2520 
2521     preempt_enable();
2522 #endif
2523     return err;
2524 }
2525 /*
2526  * Determine which stack to use..
2527  */
2528 static inline abi_ulong
2529 get_sigframe(struct target_sigaction *ka, CPUState *regs, size_t frame_size)
2530 {
2531     unsigned long sp;
2532 
2533     /* Default to using normal stack */
2534     sp = regs->active_tc.gpr[29];
2535 
2536     /*
2537      * FPU emulator may have it's own trampoline active just
2538      * above the user stack, 16-bytes before the next lowest
2539      * 16 byte boundary.  Try to avoid trashing it.
2540      */
2541     sp -= 32;
2542 
2543     /* This is the X/Open sanctioned signal stack switching.  */
2544     if ((ka->sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags (sp) == 0)) {
2545         sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
2546     }
2547 
2548     return (sp - frame_size) & ~7;
2549 }
2550 
2551 /* compare linux/arch/mips/kernel/signal.c:setup_frame() */
2552 static void setup_frame(int sig, struct target_sigaction * ka,
2553                         target_sigset_t *set, CPUState *regs)
2554 {
2555     struct sigframe *frame;
2556     abi_ulong frame_addr;
2557     int i;
2558 
2559     frame_addr = get_sigframe(ka, regs, sizeof(*frame));
2560     if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
2561 	goto give_sigsegv;
2562 
2563     install_sigtramp(frame->sf_code, TARGET_NR_sigreturn);
2564 
2565     if(setup_sigcontext(regs, &frame->sf_sc))
2566 	goto give_sigsegv;
2567 
2568     for(i = 0; i < TARGET_NSIG_WORDS; i++) {
2569 	if(__put_user(set->sig[i], &frame->sf_mask.sig[i]))
2570 	    goto give_sigsegv;
2571     }
2572 
2573     /*
2574     * Arguments to signal handler:
2575     *
2576     *   a0 = signal number
2577     *   a1 = 0 (should be cause)
2578     *   a2 = pointer to struct sigcontext
2579     *
2580     * $25 and PC point to the signal handler, $29 points to the
2581     * struct sigframe.
2582     */
2583     regs->active_tc.gpr[ 4] = sig;
2584     regs->active_tc.gpr[ 5] = 0;
2585     regs->active_tc.gpr[ 6] = frame_addr + offsetof(struct sigframe, sf_sc);
2586     regs->active_tc.gpr[29] = frame_addr;
2587     regs->active_tc.gpr[31] = frame_addr + offsetof(struct sigframe, sf_code);
2588     /* The original kernel code sets CP0_EPC to the handler
2589     * since it returns to userland using eret
2590     * we cannot do this here, and we must set PC directly */
2591     regs->active_tc.PC = regs->active_tc.gpr[25] = ka->_sa_handler;
2592     unlock_user_struct(frame, frame_addr, 1);
2593     return;
2594 
2595 give_sigsegv:
2596     unlock_user_struct(frame, frame_addr, 1);
2597     force_sig(TARGET_SIGSEGV/*, current*/);
2598     return;
2599 }
2600 
2601 long do_sigreturn(CPUState *regs)
2602 {
2603     struct sigframe *frame;
2604     abi_ulong frame_addr;
2605     sigset_t blocked;
2606     target_sigset_t target_set;
2607     int i;
2608 
2609 #if defined(DEBUG_SIGNAL)
2610     fprintf(stderr, "do_sigreturn\n");
2611 #endif
2612     frame_addr = regs->active_tc.gpr[29];
2613     if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
2614    	goto badframe;
2615 
2616     for(i = 0; i < TARGET_NSIG_WORDS; i++) {
2617    	if(__get_user(target_set.sig[i], &frame->sf_mask.sig[i]))
2618 	    goto badframe;
2619     }
2620 
2621     target_to_host_sigset_internal(&blocked, &target_set);
2622     sigprocmask(SIG_SETMASK, &blocked, NULL);
2623 
2624     if (restore_sigcontext(regs, &frame->sf_sc))
2625    	goto badframe;
2626 
2627 #if 0
2628     /*
2629      * Don't let your children do this ...
2630      */
2631     __asm__ __volatile__(
2632    	"move\t$29, %0\n\t"
2633    	"j\tsyscall_exit"
2634    	:/* no outputs */
2635    	:"r" (&regs));
2636     /* Unreached */
2637 #endif
2638 
2639     regs->active_tc.PC = regs->CP0_EPC;
2640     /* I am not sure this is right, but it seems to work
2641     * maybe a problem with nested signals ? */
2642     regs->CP0_EPC = 0;
2643     return -TARGET_QEMU_ESIGRETURN;
2644 
2645 badframe:
2646     force_sig(TARGET_SIGSEGV/*, current*/);
2647     return 0;
2648 }
2649 
2650 static void setup_rt_frame(int sig, struct target_sigaction *ka,
2651                            target_siginfo_t *info,
2652 			   target_sigset_t *set, CPUState *env)
2653 {
2654     struct target_rt_sigframe *frame;
2655     abi_ulong frame_addr;
2656     int i;
2657 
2658     frame_addr = get_sigframe(ka, env, sizeof(*frame));
2659     if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
2660 	goto give_sigsegv;
2661 
2662     install_sigtramp(frame->rs_code, TARGET_NR_rt_sigreturn);
2663 
2664     copy_siginfo_to_user(&frame->rs_info, info);
2665 
2666     __put_user(0, &frame->rs_uc.tuc_flags);
2667     __put_user(0, &frame->rs_uc.tuc_link);
2668     __put_user(target_sigaltstack_used.ss_sp, &frame->rs_uc.tuc_stack.ss_sp);
2669     __put_user(target_sigaltstack_used.ss_size, &frame->rs_uc.tuc_stack.ss_size);
2670     __put_user(sas_ss_flags(get_sp_from_cpustate(env)),
2671                &frame->rs_uc.tuc_stack.ss_flags);
2672 
2673     setup_sigcontext(env, &frame->rs_uc.tuc_mcontext);
2674 
2675     for(i = 0; i < TARGET_NSIG_WORDS; i++) {
2676         __put_user(set->sig[i], &frame->rs_uc.tuc_sigmask.sig[i]);
2677     }
2678 
2679     /*
2680     * Arguments to signal handler:
2681     *
2682     *   a0 = signal number
2683     *   a1 = pointer to struct siginfo
2684     *   a2 = pointer to struct ucontext
2685     *
2686     * $25 and PC point to the signal handler, $29 points to the
2687     * struct sigframe.
2688     */
2689     env->active_tc.gpr[ 4] = sig;
2690     env->active_tc.gpr[ 5] = frame_addr
2691                              + offsetof(struct target_rt_sigframe, rs_info);
2692     env->active_tc.gpr[ 6] = frame_addr
2693                              + offsetof(struct target_rt_sigframe, rs_uc);
2694     env->active_tc.gpr[29] = frame_addr;
2695     env->active_tc.gpr[31] = frame_addr
2696                              + offsetof(struct target_rt_sigframe, rs_code);
2697     /* The original kernel code sets CP0_EPC to the handler
2698     * since it returns to userland using eret
2699     * we cannot do this here, and we must set PC directly */
2700     env->active_tc.PC = env->active_tc.gpr[25] = ka->_sa_handler;
2701     unlock_user_struct(frame, frame_addr, 1);
2702     return;
2703 
2704 give_sigsegv:
2705     unlock_user_struct(frame, frame_addr, 1);
2706     force_sig(TARGET_SIGSEGV/*, current*/);
2707     return;
2708 }
2709 
2710 long do_rt_sigreturn(CPUState *env)
2711 {
2712     struct target_rt_sigframe *frame;
2713     abi_ulong frame_addr;
2714     sigset_t blocked;
2715 
2716 #if defined(DEBUG_SIGNAL)
2717     fprintf(stderr, "do_rt_sigreturn\n");
2718 #endif
2719     frame_addr = env->active_tc.gpr[29];
2720     if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
2721    	goto badframe;
2722 
2723     target_to_host_sigset(&blocked, &frame->rs_uc.tuc_sigmask);
2724     sigprocmask(SIG_SETMASK, &blocked, NULL);
2725 
2726     if (restore_sigcontext(env, &frame->rs_uc.tuc_mcontext))
2727         goto badframe;
2728 
2729     if (do_sigaltstack(frame_addr +
2730 		       offsetof(struct target_rt_sigframe, rs_uc.tuc_stack),
2731 		       0, get_sp_from_cpustate(env)) == -EFAULT)
2732         goto badframe;
2733 
2734     env->active_tc.PC = env->CP0_EPC;
2735     /* I am not sure this is right, but it seems to work
2736     * maybe a problem with nested signals ? */
2737     env->CP0_EPC = 0;
2738     return -TARGET_QEMU_ESIGRETURN;
2739 
2740 badframe:
2741     force_sig(TARGET_SIGSEGV/*, current*/);
2742     return 0;
2743 }
2744 
2745 #elif defined(TARGET_SH4)
2746 
2747 /*
2748  * code and data structures from linux kernel:
2749  * include/asm-sh/sigcontext.h
2750  * arch/sh/kernel/signal.c
2751  */
2752 
2753 struct target_sigcontext {
2754     target_ulong  oldmask;
2755 
2756     /* CPU registers */
2757     target_ulong  sc_gregs[16];
2758     target_ulong  sc_pc;
2759     target_ulong  sc_pr;
2760     target_ulong  sc_sr;
2761     target_ulong  sc_gbr;
2762     target_ulong  sc_mach;
2763     target_ulong  sc_macl;
2764 
2765     /* FPU registers */
2766     target_ulong  sc_fpregs[16];
2767     target_ulong  sc_xfpregs[16];
2768     unsigned int sc_fpscr;
2769     unsigned int sc_fpul;
2770     unsigned int sc_ownedfp;
2771 };
2772 
2773 struct target_sigframe
2774 {
2775     struct target_sigcontext sc;
2776     target_ulong extramask[TARGET_NSIG_WORDS-1];
2777     uint16_t retcode[3];
2778 };
2779 
2780 
2781 struct target_ucontext {
2782     target_ulong tuc_flags;
2783     struct target_ucontext *tuc_link;
2784     target_stack_t tuc_stack;
2785     struct target_sigcontext tuc_mcontext;
2786     target_sigset_t tuc_sigmask;	/* mask last for extensibility */
2787 };
2788 
2789 struct target_rt_sigframe
2790 {
2791     struct target_siginfo info;
2792     struct target_ucontext uc;
2793     uint16_t retcode[3];
2794 };
2795 
2796 
2797 #define MOVW(n)  (0x9300|((n)-2)) /* Move mem word at PC+n to R3 */
2798 #define TRAP_NOARG 0xc310         /* Syscall w/no args (NR in R3) SH3/4 */
2799 
2800 static abi_ulong get_sigframe(struct target_sigaction *ka,
2801                          unsigned long sp, size_t frame_size)
2802 {
2803     if ((ka->sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags(sp) == 0)) {
2804         sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
2805     }
2806 
2807     return (sp - frame_size) & -8ul;
2808 }
2809 
2810 static int setup_sigcontext(struct target_sigcontext *sc,
2811 			    CPUState *regs, unsigned long mask)
2812 {
2813     int err = 0;
2814     int i;
2815 
2816 #define COPY(x)         err |= __put_user(regs->x, &sc->sc_##x)
2817     COPY(gregs[0]); COPY(gregs[1]);
2818     COPY(gregs[2]); COPY(gregs[3]);
2819     COPY(gregs[4]); COPY(gregs[5]);
2820     COPY(gregs[6]); COPY(gregs[7]);
2821     COPY(gregs[8]); COPY(gregs[9]);
2822     COPY(gregs[10]); COPY(gregs[11]);
2823     COPY(gregs[12]); COPY(gregs[13]);
2824     COPY(gregs[14]); COPY(gregs[15]);
2825     COPY(gbr); COPY(mach);
2826     COPY(macl); COPY(pr);
2827     COPY(sr); COPY(pc);
2828 #undef COPY
2829 
2830     for (i=0; i<16; i++) {
2831         err |= __put_user(regs->fregs[i], &sc->sc_fpregs[i]);
2832     }
2833     err |= __put_user(regs->fpscr, &sc->sc_fpscr);
2834     err |= __put_user(regs->fpul, &sc->sc_fpul);
2835 
2836     /* non-iBCS2 extensions.. */
2837     err |= __put_user(mask, &sc->oldmask);
2838 
2839     return err;
2840 }
2841 
2842 static int restore_sigcontext(CPUState *regs, struct target_sigcontext *sc,
2843                               target_ulong *r0_p)
2844 {
2845     unsigned int err = 0;
2846     int i;
2847 
2848 #define COPY(x)         err |= __get_user(regs->x, &sc->sc_##x)
2849     COPY(gregs[1]);
2850     COPY(gregs[2]); COPY(gregs[3]);
2851     COPY(gregs[4]); COPY(gregs[5]);
2852     COPY(gregs[6]); COPY(gregs[7]);
2853     COPY(gregs[8]); COPY(gregs[9]);
2854     COPY(gregs[10]); COPY(gregs[11]);
2855     COPY(gregs[12]); COPY(gregs[13]);
2856     COPY(gregs[14]); COPY(gregs[15]);
2857     COPY(gbr); COPY(mach);
2858     COPY(macl); COPY(pr);
2859     COPY(sr); COPY(pc);
2860 #undef COPY
2861 
2862     for (i=0; i<16; i++) {
2863         err |= __get_user(regs->fregs[i], &sc->sc_fpregs[i]);
2864     }
2865     err |= __get_user(regs->fpscr, &sc->sc_fpscr);
2866     err |= __get_user(regs->fpul, &sc->sc_fpul);
2867 
2868     regs->tra = -1;         /* disable syscall checks */
2869     err |= __get_user(*r0_p, &sc->sc_gregs[0]);
2870     return err;
2871 }
2872 
2873 static void setup_frame(int sig, struct target_sigaction *ka,
2874 			target_sigset_t *set, CPUState *regs)
2875 {
2876     struct target_sigframe *frame;
2877     abi_ulong frame_addr;
2878     int i;
2879     int err = 0;
2880     int signal;
2881 
2882     frame_addr = get_sigframe(ka, regs->gregs[15], sizeof(*frame));
2883     if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
2884 	goto give_sigsegv;
2885 
2886     signal = current_exec_domain_sig(sig);
2887 
2888     err |= setup_sigcontext(&frame->sc, regs, set->sig[0]);
2889 
2890     for (i = 0; i < TARGET_NSIG_WORDS - 1; i++) {
2891         err |= __put_user(set->sig[i + 1], &frame->extramask[i]);
2892     }
2893 
2894     /* Set up to return from userspace.  If provided, use a stub
2895        already in userspace.  */
2896     if (ka->sa_flags & TARGET_SA_RESTORER) {
2897         regs->pr = (unsigned long) ka->sa_restorer;
2898     } else {
2899         /* Generate return code (system call to sigreturn) */
2900         err |= __put_user(MOVW(2), &frame->retcode[0]);
2901         err |= __put_user(TRAP_NOARG, &frame->retcode[1]);
2902         err |= __put_user((TARGET_NR_sigreturn), &frame->retcode[2]);
2903         regs->pr = (unsigned long) frame->retcode;
2904     }
2905 
2906     if (err)
2907         goto give_sigsegv;
2908 
2909     /* Set up registers for signal handler */
2910     regs->gregs[15] = (unsigned long) frame;
2911     regs->gregs[4] = signal; /* Arg for signal handler */
2912     regs->gregs[5] = 0;
2913     regs->gregs[6] = (unsigned long) &frame->sc;
2914     regs->pc = (unsigned long) ka->_sa_handler;
2915 
2916     unlock_user_struct(frame, frame_addr, 1);
2917     return;
2918 
2919 give_sigsegv:
2920     unlock_user_struct(frame, frame_addr, 1);
2921     force_sig(TARGET_SIGSEGV);
2922 }
2923 
2924 static void setup_rt_frame(int sig, struct target_sigaction *ka,
2925                            target_siginfo_t *info,
2926 			   target_sigset_t *set, CPUState *regs)
2927 {
2928     struct target_rt_sigframe *frame;
2929     abi_ulong frame_addr;
2930     int i;
2931     int err = 0;
2932     int signal;
2933 
2934     frame_addr = get_sigframe(ka, regs->gregs[15], sizeof(*frame));
2935     if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
2936 	goto give_sigsegv;
2937 
2938     signal = current_exec_domain_sig(sig);
2939 
2940     err |= copy_siginfo_to_user(&frame->info, info);
2941 
2942     /* Create the ucontext.  */
2943     err |= __put_user(0, &frame->uc.tuc_flags);
2944     err |= __put_user(0, (unsigned long *)&frame->uc.tuc_link);
2945     err |= __put_user((unsigned long)target_sigaltstack_used.ss_sp,
2946 		      &frame->uc.tuc_stack.ss_sp);
2947     err |= __put_user(sas_ss_flags(regs->gregs[15]),
2948 		      &frame->uc.tuc_stack.ss_flags);
2949     err |= __put_user(target_sigaltstack_used.ss_size,
2950 		      &frame->uc.tuc_stack.ss_size);
2951     err |= setup_sigcontext(&frame->uc.tuc_mcontext,
2952 			    regs, set->sig[0]);
2953     for(i = 0; i < TARGET_NSIG_WORDS; i++) {
2954         err |= __put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]);
2955     }
2956 
2957     /* Set up to return from userspace.  If provided, use a stub
2958        already in userspace.  */
2959     if (ka->sa_flags & TARGET_SA_RESTORER) {
2960         regs->pr = (unsigned long) ka->sa_restorer;
2961     } else {
2962         /* Generate return code (system call to sigreturn) */
2963         err |= __put_user(MOVW(2), &frame->retcode[0]);
2964         err |= __put_user(TRAP_NOARG, &frame->retcode[1]);
2965         err |= __put_user((TARGET_NR_rt_sigreturn), &frame->retcode[2]);
2966         regs->pr = (unsigned long) frame->retcode;
2967     }
2968 
2969     if (err)
2970         goto give_sigsegv;
2971 
2972     /* Set up registers for signal handler */
2973     regs->gregs[15] = (unsigned long) frame;
2974     regs->gregs[4] = signal; /* Arg for signal handler */
2975     regs->gregs[5] = (unsigned long) &frame->info;
2976     regs->gregs[6] = (unsigned long) &frame->uc;
2977     regs->pc = (unsigned long) ka->_sa_handler;
2978 
2979     unlock_user_struct(frame, frame_addr, 1);
2980     return;
2981 
2982 give_sigsegv:
2983     unlock_user_struct(frame, frame_addr, 1);
2984     force_sig(TARGET_SIGSEGV);
2985 }
2986 
2987 long do_sigreturn(CPUState *regs)
2988 {
2989     struct target_sigframe *frame;
2990     abi_ulong frame_addr;
2991     sigset_t blocked;
2992     target_sigset_t target_set;
2993     target_ulong r0;
2994     int i;
2995     int err = 0;
2996 
2997 #if defined(DEBUG_SIGNAL)
2998     fprintf(stderr, "do_sigreturn\n");
2999 #endif
3000     frame_addr = regs->gregs[15];
3001     if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
3002    	goto badframe;
3003 
3004     err |= __get_user(target_set.sig[0], &frame->sc.oldmask);
3005     for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3006         err |= (__get_user(target_set.sig[i], &frame->extramask[i - 1]));
3007     }
3008 
3009     if (err)
3010         goto badframe;
3011 
3012     target_to_host_sigset_internal(&blocked, &target_set);
3013     sigprocmask(SIG_SETMASK, &blocked, NULL);
3014 
3015     if (restore_sigcontext(regs, &frame->sc, &r0))
3016         goto badframe;
3017 
3018     unlock_user_struct(frame, frame_addr, 0);
3019     return r0;
3020 
3021 badframe:
3022     unlock_user_struct(frame, frame_addr, 0);
3023     force_sig(TARGET_SIGSEGV);
3024     return 0;
3025 }
3026 
3027 long do_rt_sigreturn(CPUState *regs)
3028 {
3029     struct target_rt_sigframe *frame;
3030     abi_ulong frame_addr;
3031     sigset_t blocked;
3032     target_ulong r0;
3033 
3034 #if defined(DEBUG_SIGNAL)
3035     fprintf(stderr, "do_rt_sigreturn\n");
3036 #endif
3037     frame_addr = regs->gregs[15];
3038     if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
3039    	goto badframe;
3040 
3041     target_to_host_sigset(&blocked, &frame->uc.tuc_sigmask);
3042     sigprocmask(SIG_SETMASK, &blocked, NULL);
3043 
3044     if (restore_sigcontext(regs, &frame->uc.tuc_mcontext, &r0))
3045         goto badframe;
3046 
3047     if (do_sigaltstack(frame_addr +
3048 		       offsetof(struct target_rt_sigframe, uc.tuc_stack),
3049 		       0, get_sp_from_cpustate(regs)) == -EFAULT)
3050         goto badframe;
3051 
3052     unlock_user_struct(frame, frame_addr, 0);
3053     return r0;
3054 
3055 badframe:
3056     unlock_user_struct(frame, frame_addr, 0);
3057     force_sig(TARGET_SIGSEGV);
3058     return 0;
3059 }
3060 #elif defined(TARGET_MICROBLAZE)
3061 
3062 struct target_sigcontext {
3063     struct target_pt_regs regs;  /* needs to be first */
3064     uint32_t oldmask;
3065 };
3066 
3067 /* Signal frames. */
3068 struct target_signal_frame {
3069     struct target_sigcontext sc;
3070     uint32_t extramask[TARGET_NSIG_WORDS - 1];
3071     uint32_t tramp[2];
3072 };
3073 
3074 struct rt_signal_frame {
3075     struct siginfo info;
3076     struct ucontext uc;
3077     uint32_t tramp[2];
3078 };
3079 
3080 static void setup_sigcontext(struct target_sigcontext *sc, CPUState *env)
3081 {
3082     __put_user(env->regs[0], &sc->regs.r0);
3083     __put_user(env->regs[1], &sc->regs.r1);
3084     __put_user(env->regs[2], &sc->regs.r2);
3085     __put_user(env->regs[3], &sc->regs.r3);
3086     __put_user(env->regs[4], &sc->regs.r4);
3087     __put_user(env->regs[5], &sc->regs.r5);
3088     __put_user(env->regs[6], &sc->regs.r6);
3089     __put_user(env->regs[7], &sc->regs.r7);
3090     __put_user(env->regs[8], &sc->regs.r8);
3091     __put_user(env->regs[9], &sc->regs.r9);
3092     __put_user(env->regs[10], &sc->regs.r10);
3093     __put_user(env->regs[11], &sc->regs.r11);
3094     __put_user(env->regs[12], &sc->regs.r12);
3095     __put_user(env->regs[13], &sc->regs.r13);
3096     __put_user(env->regs[14], &sc->regs.r14);
3097     __put_user(env->regs[15], &sc->regs.r15);
3098     __put_user(env->regs[16], &sc->regs.r16);
3099     __put_user(env->regs[17], &sc->regs.r17);
3100     __put_user(env->regs[18], &sc->regs.r18);
3101     __put_user(env->regs[19], &sc->regs.r19);
3102     __put_user(env->regs[20], &sc->regs.r20);
3103     __put_user(env->regs[21], &sc->regs.r21);
3104     __put_user(env->regs[22], &sc->regs.r22);
3105     __put_user(env->regs[23], &sc->regs.r23);
3106     __put_user(env->regs[24], &sc->regs.r24);
3107     __put_user(env->regs[25], &sc->regs.r25);
3108     __put_user(env->regs[26], &sc->regs.r26);
3109     __put_user(env->regs[27], &sc->regs.r27);
3110     __put_user(env->regs[28], &sc->regs.r28);
3111     __put_user(env->regs[29], &sc->regs.r29);
3112     __put_user(env->regs[30], &sc->regs.r30);
3113     __put_user(env->regs[31], &sc->regs.r31);
3114     __put_user(env->sregs[SR_PC], &sc->regs.pc);
3115 }
3116 
3117 static void restore_sigcontext(struct target_sigcontext *sc, CPUState *env)
3118 {
3119     __get_user(env->regs[0], &sc->regs.r0);
3120     __get_user(env->regs[1], &sc->regs.r1);
3121     __get_user(env->regs[2], &sc->regs.r2);
3122     __get_user(env->regs[3], &sc->regs.r3);
3123     __get_user(env->regs[4], &sc->regs.r4);
3124     __get_user(env->regs[5], &sc->regs.r5);
3125     __get_user(env->regs[6], &sc->regs.r6);
3126     __get_user(env->regs[7], &sc->regs.r7);
3127     __get_user(env->regs[8], &sc->regs.r8);
3128     __get_user(env->regs[9], &sc->regs.r9);
3129     __get_user(env->regs[10], &sc->regs.r10);
3130     __get_user(env->regs[11], &sc->regs.r11);
3131     __get_user(env->regs[12], &sc->regs.r12);
3132     __get_user(env->regs[13], &sc->regs.r13);
3133     __get_user(env->regs[14], &sc->regs.r14);
3134     __get_user(env->regs[15], &sc->regs.r15);
3135     __get_user(env->regs[16], &sc->regs.r16);
3136     __get_user(env->regs[17], &sc->regs.r17);
3137     __get_user(env->regs[18], &sc->regs.r18);
3138     __get_user(env->regs[19], &sc->regs.r19);
3139     __get_user(env->regs[20], &sc->regs.r20);
3140     __get_user(env->regs[21], &sc->regs.r21);
3141     __get_user(env->regs[22], &sc->regs.r22);
3142     __get_user(env->regs[23], &sc->regs.r23);
3143     __get_user(env->regs[24], &sc->regs.r24);
3144     __get_user(env->regs[25], &sc->regs.r25);
3145     __get_user(env->regs[26], &sc->regs.r26);
3146     __get_user(env->regs[27], &sc->regs.r27);
3147     __get_user(env->regs[28], &sc->regs.r28);
3148     __get_user(env->regs[29], &sc->regs.r29);
3149     __get_user(env->regs[30], &sc->regs.r30);
3150     __get_user(env->regs[31], &sc->regs.r31);
3151     __get_user(env->sregs[SR_PC], &sc->regs.pc);
3152 }
3153 
3154 static abi_ulong get_sigframe(struct target_sigaction *ka,
3155                               CPUState *env, int frame_size)
3156 {
3157     abi_ulong sp = env->regs[1];
3158 
3159     if ((ka->sa_flags & SA_ONSTACK) != 0 && !on_sig_stack(sp))
3160         sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
3161 
3162     return ((sp - frame_size) & -8UL);
3163 }
3164 
3165 static void setup_frame(int sig, struct target_sigaction *ka,
3166 			target_sigset_t *set, CPUState *env)
3167 {
3168     struct target_signal_frame *frame;
3169     abi_ulong frame_addr;
3170     int err = 0;
3171     int i;
3172 
3173     frame_addr = get_sigframe(ka, env, sizeof *frame);
3174     if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
3175         goto badframe;
3176 
3177     /* Save the mask.  */
3178     err |= __put_user(set->sig[0], &frame->sc.oldmask);
3179     if (err)
3180         goto badframe;
3181 
3182     for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3183         if (__put_user(set->sig[i], &frame->extramask[i - 1]))
3184             goto badframe;
3185     }
3186 
3187     setup_sigcontext(&frame->sc, env);
3188 
3189     /* Set up to return from userspace. If provided, use a stub
3190        already in userspace. */
3191     /* minus 8 is offset to cater for "rtsd r15,8" offset */
3192     if (ka->sa_flags & TARGET_SA_RESTORER) {
3193         env->regs[15] = ((unsigned long)ka->sa_restorer)-8;
3194     } else {
3195         uint32_t t;
3196         /* Note, these encodings are _big endian_! */
3197         /* addi r12, r0, __NR_sigreturn */
3198         t = 0x31800000UL | TARGET_NR_sigreturn;
3199         err |= __put_user(t, frame->tramp + 0);
3200         /* brki r14, 0x8 */
3201         t = 0xb9cc0008UL;
3202         err |= __put_user(t, frame->tramp + 1);
3203 
3204         /* Return from sighandler will jump to the tramp.
3205            Negative 8 offset because return is rtsd r15, 8 */
3206         env->regs[15] = ((unsigned long)frame->tramp) - 8;
3207     }
3208 
3209     if (err)
3210         goto badframe;
3211 
3212     /* Set up registers for signal handler */
3213     env->regs[1] = (unsigned long) frame;
3214     /* Signal handler args: */
3215     env->regs[5] = sig; /* Arg 0: signum */
3216     env->regs[6] = 0;
3217     env->regs[7] = (unsigned long) &frame->sc; /* arg 1: sigcontext */
3218 
3219     /* Offset of 4 to handle microblaze rtid r14, 0 */
3220     env->sregs[SR_PC] = (unsigned long)ka->_sa_handler;
3221 
3222     unlock_user_struct(frame, frame_addr, 1);
3223     return;
3224   badframe:
3225     unlock_user_struct(frame, frame_addr, 1);
3226     force_sig(TARGET_SIGSEGV);
3227 }
3228 
3229 static void setup_rt_frame(int sig, struct target_sigaction *ka,
3230                            target_siginfo_t *info,
3231 			   target_sigset_t *set, CPUState *env)
3232 {
3233     fprintf(stderr, "Microblaze setup_rt_frame: not implemented\n");
3234 }
3235 
3236 long do_sigreturn(CPUState *env)
3237 {
3238     struct target_signal_frame *frame;
3239     abi_ulong frame_addr;
3240     target_sigset_t target_set;
3241     sigset_t set;
3242     int i;
3243 
3244     frame_addr = env->regs[R_SP];
3245     /* Make sure the guest isn't playing games.  */
3246     if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 1))
3247         goto badframe;
3248 
3249     /* Restore blocked signals */
3250     if (__get_user(target_set.sig[0], &frame->sc.oldmask))
3251         goto badframe;
3252     for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3253         if (__get_user(target_set.sig[i], &frame->extramask[i - 1]))
3254             goto badframe;
3255     }
3256     target_to_host_sigset_internal(&set, &target_set);
3257     sigprocmask(SIG_SETMASK, &set, NULL);
3258 
3259     restore_sigcontext(&frame->sc, env);
3260     /* We got here through a sigreturn syscall, our path back is via an
3261        rtb insn so setup r14 for that.  */
3262     env->regs[14] = env->sregs[SR_PC];
3263 
3264     unlock_user_struct(frame, frame_addr, 0);
3265     return env->regs[10];
3266   badframe:
3267     unlock_user_struct(frame, frame_addr, 0);
3268     force_sig(TARGET_SIGSEGV);
3269 }
3270 
3271 long do_rt_sigreturn(CPUState *env)
3272 {
3273     fprintf(stderr, "Microblaze do_rt_sigreturn: not implemented\n");
3274     return -TARGET_ENOSYS;
3275 }
3276 
3277 #elif defined(TARGET_CRIS)
3278 
3279 struct target_sigcontext {
3280         struct target_pt_regs regs;  /* needs to be first */
3281         uint32_t oldmask;
3282         uint32_t usp;    /* usp before stacking this gunk on it */
3283 };
3284 
3285 /* Signal frames. */
3286 struct target_signal_frame {
3287         struct target_sigcontext sc;
3288         uint32_t extramask[TARGET_NSIG_WORDS - 1];
3289         uint8_t retcode[8];       /* Trampoline code. */
3290 };
3291 
3292 struct rt_signal_frame {
3293         struct siginfo *pinfo;
3294         void *puc;
3295         struct siginfo info;
3296         struct ucontext uc;
3297         uint8_t retcode[8];       /* Trampoline code. */
3298 };
3299 
3300 static void setup_sigcontext(struct target_sigcontext *sc, CPUState *env)
3301 {
3302 	__put_user(env->regs[0], &sc->regs.r0);
3303 	__put_user(env->regs[1], &sc->regs.r1);
3304 	__put_user(env->regs[2], &sc->regs.r2);
3305 	__put_user(env->regs[3], &sc->regs.r3);
3306 	__put_user(env->regs[4], &sc->regs.r4);
3307 	__put_user(env->regs[5], &sc->regs.r5);
3308 	__put_user(env->regs[6], &sc->regs.r6);
3309 	__put_user(env->regs[7], &sc->regs.r7);
3310 	__put_user(env->regs[8], &sc->regs.r8);
3311 	__put_user(env->regs[9], &sc->regs.r9);
3312 	__put_user(env->regs[10], &sc->regs.r10);
3313 	__put_user(env->regs[11], &sc->regs.r11);
3314 	__put_user(env->regs[12], &sc->regs.r12);
3315 	__put_user(env->regs[13], &sc->regs.r13);
3316 	__put_user(env->regs[14], &sc->usp);
3317 	__put_user(env->regs[15], &sc->regs.acr);
3318 	__put_user(env->pregs[PR_MOF], &sc->regs.mof);
3319 	__put_user(env->pregs[PR_SRP], &sc->regs.srp);
3320 	__put_user(env->pc, &sc->regs.erp);
3321 }
3322 
3323 static void restore_sigcontext(struct target_sigcontext *sc, CPUState *env)
3324 {
3325 	__get_user(env->regs[0], &sc->regs.r0);
3326 	__get_user(env->regs[1], &sc->regs.r1);
3327 	__get_user(env->regs[2], &sc->regs.r2);
3328 	__get_user(env->regs[3], &sc->regs.r3);
3329 	__get_user(env->regs[4], &sc->regs.r4);
3330 	__get_user(env->regs[5], &sc->regs.r5);
3331 	__get_user(env->regs[6], &sc->regs.r6);
3332 	__get_user(env->regs[7], &sc->regs.r7);
3333 	__get_user(env->regs[8], &sc->regs.r8);
3334 	__get_user(env->regs[9], &sc->regs.r9);
3335 	__get_user(env->regs[10], &sc->regs.r10);
3336 	__get_user(env->regs[11], &sc->regs.r11);
3337 	__get_user(env->regs[12], &sc->regs.r12);
3338 	__get_user(env->regs[13], &sc->regs.r13);
3339 	__get_user(env->regs[14], &sc->usp);
3340 	__get_user(env->regs[15], &sc->regs.acr);
3341 	__get_user(env->pregs[PR_MOF], &sc->regs.mof);
3342 	__get_user(env->pregs[PR_SRP], &sc->regs.srp);
3343 	__get_user(env->pc, &sc->regs.erp);
3344 }
3345 
3346 static abi_ulong get_sigframe(CPUState *env, int framesize)
3347 {
3348 	abi_ulong sp;
3349 	/* Align the stack downwards to 4.  */
3350 	sp = (env->regs[R_SP] & ~3);
3351 	return sp - framesize;
3352 }
3353 
3354 static void setup_frame(int sig, struct target_sigaction *ka,
3355 			target_sigset_t *set, CPUState *env)
3356 {
3357 	struct target_signal_frame *frame;
3358 	abi_ulong frame_addr;
3359 	int err = 0;
3360 	int i;
3361 
3362 	frame_addr = get_sigframe(env, sizeof *frame);
3363 	if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
3364 		goto badframe;
3365 
3366 	/*
3367 	 * The CRIS signal return trampoline. A real linux/CRIS kernel doesn't
3368 	 * use this trampoline anymore but it sets it up for GDB.
3369 	 * In QEMU, using the trampoline simplifies things a bit so we use it.
3370 	 *
3371 	 * This is movu.w __NR_sigreturn, r9; break 13;
3372 	 */
3373 	err |= __put_user(0x9c5f, frame->retcode+0);
3374 	err |= __put_user(TARGET_NR_sigreturn,
3375 			  frame->retcode+2);
3376 	err |= __put_user(0xe93d, frame->retcode+4);
3377 
3378 	/* Save the mask.  */
3379 	err |= __put_user(set->sig[0], &frame->sc.oldmask);
3380 	if (err)
3381 		goto badframe;
3382 
3383 	for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3384 		if (__put_user(set->sig[i], &frame->extramask[i - 1]))
3385 			goto badframe;
3386 	}
3387 
3388 	setup_sigcontext(&frame->sc, env);
3389 
3390 	/* Move the stack and setup the arguments for the handler.  */
3391 	env->regs[R_SP] = (uint32_t) (unsigned long) frame;
3392 	env->regs[10] = sig;
3393 	env->pc = (unsigned long) ka->_sa_handler;
3394 	/* Link SRP so the guest returns through the trampoline.  */
3395 	env->pregs[PR_SRP] = (uint32_t) (unsigned long) &frame->retcode[0];
3396 
3397 	unlock_user_struct(frame, frame_addr, 1);
3398 	return;
3399   badframe:
3400 	unlock_user_struct(frame, frame_addr, 1);
3401 	force_sig(TARGET_SIGSEGV);
3402 }
3403 
3404 static void setup_rt_frame(int sig, struct target_sigaction *ka,
3405                            target_siginfo_t *info,
3406 			   target_sigset_t *set, CPUState *env)
3407 {
3408     fprintf(stderr, "CRIS setup_rt_frame: not implemented\n");
3409 }
3410 
3411 long do_sigreturn(CPUState *env)
3412 {
3413 	struct target_signal_frame *frame;
3414 	abi_ulong frame_addr;
3415 	target_sigset_t target_set;
3416 	sigset_t set;
3417 	int i;
3418 
3419 	frame_addr = env->regs[R_SP];
3420 	/* Make sure the guest isn't playing games.  */
3421 	if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 1))
3422 		goto badframe;
3423 
3424 	/* Restore blocked signals */
3425 	if (__get_user(target_set.sig[0], &frame->sc.oldmask))
3426 		goto badframe;
3427 	for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3428 		if (__get_user(target_set.sig[i], &frame->extramask[i - 1]))
3429 			goto badframe;
3430 	}
3431 	target_to_host_sigset_internal(&set, &target_set);
3432 	sigprocmask(SIG_SETMASK, &set, NULL);
3433 
3434 	restore_sigcontext(&frame->sc, env);
3435 	unlock_user_struct(frame, frame_addr, 0);
3436 	return env->regs[10];
3437   badframe:
3438 	unlock_user_struct(frame, frame_addr, 0);
3439 	force_sig(TARGET_SIGSEGV);
3440 }
3441 
3442 long do_rt_sigreturn(CPUState *env)
3443 {
3444     fprintf(stderr, "CRIS do_rt_sigreturn: not implemented\n");
3445     return -TARGET_ENOSYS;
3446 }
3447 
3448 #elif defined(TARGET_PPC) && !defined(TARGET_PPC64)
3449 
3450 /* FIXME: Many of the structures are defined for both PPC and PPC64, but
3451    the signal handling is different enough that we haven't implemented
3452    support for PPC64 yet.  Hence the restriction above.
3453 
3454    There are various #if'd blocks for code for TARGET_PPC64.  These
3455    blocks should go away so that we can successfully run 32-bit and
3456    64-bit binaries on a QEMU configured for PPC64.  */
3457 
3458 /* Size of dummy stack frame allocated when calling signal handler.
3459    See arch/powerpc/include/asm/ptrace.h.  */
3460 #if defined(TARGET_PPC64)
3461 #define SIGNAL_FRAMESIZE 128
3462 #else
3463 #define SIGNAL_FRAMESIZE 64
3464 #endif
3465 
3466 /* See arch/powerpc/include/asm/sigcontext.h.  */
3467 struct target_sigcontext {
3468     target_ulong _unused[4];
3469     int32_t signal;
3470 #if defined(TARGET_PPC64)
3471     int32_t pad0;
3472 #endif
3473     target_ulong handler;
3474     target_ulong oldmask;
3475     target_ulong regs;      /* struct pt_regs __user * */
3476     /* TODO: PPC64 includes extra bits here.  */
3477 };
3478 
3479 /* Indices for target_mcontext.mc_gregs, below.
3480    See arch/powerpc/include/asm/ptrace.h for details.  */
3481 enum {
3482     TARGET_PT_R0 = 0,
3483     TARGET_PT_R1 = 1,
3484     TARGET_PT_R2 = 2,
3485     TARGET_PT_R3 = 3,
3486     TARGET_PT_R4 = 4,
3487     TARGET_PT_R5 = 5,
3488     TARGET_PT_R6 = 6,
3489     TARGET_PT_R7 = 7,
3490     TARGET_PT_R8 = 8,
3491     TARGET_PT_R9 = 9,
3492     TARGET_PT_R10 = 10,
3493     TARGET_PT_R11 = 11,
3494     TARGET_PT_R12 = 12,
3495     TARGET_PT_R13 = 13,
3496     TARGET_PT_R14 = 14,
3497     TARGET_PT_R15 = 15,
3498     TARGET_PT_R16 = 16,
3499     TARGET_PT_R17 = 17,
3500     TARGET_PT_R18 = 18,
3501     TARGET_PT_R19 = 19,
3502     TARGET_PT_R20 = 20,
3503     TARGET_PT_R21 = 21,
3504     TARGET_PT_R22 = 22,
3505     TARGET_PT_R23 = 23,
3506     TARGET_PT_R24 = 24,
3507     TARGET_PT_R25 = 25,
3508     TARGET_PT_R26 = 26,
3509     TARGET_PT_R27 = 27,
3510     TARGET_PT_R28 = 28,
3511     TARGET_PT_R29 = 29,
3512     TARGET_PT_R30 = 30,
3513     TARGET_PT_R31 = 31,
3514     TARGET_PT_NIP = 32,
3515     TARGET_PT_MSR = 33,
3516     TARGET_PT_ORIG_R3 = 34,
3517     TARGET_PT_CTR = 35,
3518     TARGET_PT_LNK = 36,
3519     TARGET_PT_XER = 37,
3520     TARGET_PT_CCR = 38,
3521     /* Yes, there are two registers with #39.  One is 64-bit only.  */
3522     TARGET_PT_MQ = 39,
3523     TARGET_PT_SOFTE = 39,
3524     TARGET_PT_TRAP = 40,
3525     TARGET_PT_DAR = 41,
3526     TARGET_PT_DSISR = 42,
3527     TARGET_PT_RESULT = 43,
3528     TARGET_PT_REGS_COUNT = 44
3529 };
3530 
3531 /* See arch/powerpc/include/asm/ucontext.h.  Only used for 32-bit PPC;
3532    on 64-bit PPC, sigcontext and mcontext are one and the same.  */
3533 struct target_mcontext {
3534     target_ulong mc_gregs[48];
3535     /* Includes fpscr.  */
3536     uint64_t mc_fregs[33];
3537     target_ulong mc_pad[2];
3538     /* We need to handle Altivec and SPE at the same time, which no
3539        kernel needs to do.  Fortunately, the kernel defines this bit to
3540        be Altivec-register-large all the time, rather than trying to
3541        twiddle it based on the specific platform.  */
3542     union {
3543         /* SPE vector registers.  One extra for SPEFSCR.  */
3544         uint32_t spe[33];
3545         /* Altivec vector registers.  The packing of VSCR and VRSAVE
3546            varies depending on whether we're PPC64 or not: PPC64 splits
3547            them apart; PPC32 stuffs them together.  */
3548 #if defined(TARGET_PPC64)
3549 #define QEMU_NVRREG 34
3550 #else
3551 #define QEMU_NVRREG 33
3552 #endif
3553         ppc_avr_t altivec[QEMU_NVRREG];
3554 #undef QEMU_NVRREG
3555     } mc_vregs __attribute__((__aligned__(16)));
3556 };
3557 
3558 struct target_ucontext {
3559     target_ulong tuc_flags;
3560     target_ulong tuc_link;    /* struct ucontext __user * */
3561     struct target_sigaltstack tuc_stack;
3562 #if !defined(TARGET_PPC64)
3563     int32_t tuc_pad[7];
3564     target_ulong tuc_regs;    /* struct mcontext __user *
3565                                 points to uc_mcontext field */
3566 #endif
3567     target_sigset_t tuc_sigmask;
3568 #if defined(TARGET_PPC64)
3569     target_sigset_t unused[15]; /* Allow for uc_sigmask growth */
3570     struct target_sigcontext tuc_mcontext;
3571 #else
3572     int32_t tuc_maskext[30];
3573     int32_t tuc_pad2[3];
3574     struct target_mcontext tuc_mcontext;
3575 #endif
3576 };
3577 
3578 /* See arch/powerpc/kernel/signal_32.c.  */
3579 struct target_sigframe {
3580     struct target_sigcontext sctx;
3581     struct target_mcontext mctx;
3582     int32_t abigap[56];
3583 };
3584 
3585 struct target_rt_sigframe {
3586     struct target_siginfo info;
3587     struct target_ucontext uc;
3588     int32_t abigap[56];
3589 };
3590 
3591 /* We use the mc_pad field for the signal return trampoline.  */
3592 #define tramp mc_pad
3593 
3594 /* See arch/powerpc/kernel/signal.c.  */
3595 static target_ulong get_sigframe(struct target_sigaction *ka,
3596                                  CPUState *env,
3597                                  int frame_size)
3598 {
3599     target_ulong oldsp, newsp;
3600 
3601     oldsp = env->gpr[1];
3602 
3603     if ((ka->sa_flags & TARGET_SA_ONSTACK) &&
3604         (sas_ss_flags(oldsp))) {
3605         oldsp = (target_sigaltstack_used.ss_sp
3606                  + target_sigaltstack_used.ss_size);
3607     }
3608 
3609     newsp = (oldsp - frame_size) & ~0xFUL;
3610 
3611     return newsp;
3612 }
3613 
3614 static int save_user_regs(CPUState *env, struct target_mcontext *frame,
3615                           int sigret)
3616 {
3617     target_ulong msr = env->msr;
3618     int i;
3619     target_ulong ccr = 0;
3620 
3621     /* In general, the kernel attempts to be intelligent about what it
3622        needs to save for Altivec/FP/SPE registers.  We don't care that
3623        much, so we just go ahead and save everything.  */
3624 
3625     /* Save general registers.  */
3626     for (i = 0; i < ARRAY_SIZE(env->gpr); i++) {
3627         if (__put_user(env->gpr[i], &frame->mc_gregs[i])) {
3628             return 1;
3629         }
3630     }
3631     if (__put_user(env->nip, &frame->mc_gregs[TARGET_PT_NIP])
3632         || __put_user(env->ctr, &frame->mc_gregs[TARGET_PT_CTR])
3633         || __put_user(env->lr, &frame->mc_gregs[TARGET_PT_LNK])
3634         || __put_user(env->xer, &frame->mc_gregs[TARGET_PT_XER]))
3635         return 1;
3636 
3637     for (i = 0; i < ARRAY_SIZE(env->crf); i++) {
3638         ccr |= env->crf[i] << (32 - ((i + 1) * 4));
3639     }
3640     if (__put_user(ccr, &frame->mc_gregs[TARGET_PT_CCR]))
3641         return 1;
3642 
3643     /* Save Altivec registers if necessary.  */
3644     if (env->insns_flags & PPC_ALTIVEC) {
3645         for (i = 0; i < ARRAY_SIZE(env->avr); i++) {
3646             ppc_avr_t *avr = &env->avr[i];
3647             ppc_avr_t *vreg = &frame->mc_vregs.altivec[i];
3648 
3649             if (__put_user(avr->u64[0], &vreg->u64[0]) ||
3650                 __put_user(avr->u64[1], &vreg->u64[1])) {
3651                 return 1;
3652             }
3653         }
3654         /* Set MSR_VR in the saved MSR value to indicate that
3655            frame->mc_vregs contains valid data.  */
3656         msr |= MSR_VR;
3657         if (__put_user((uint32_t)env->spr[SPR_VRSAVE],
3658                        &frame->mc_vregs.altivec[32].u32[3]))
3659             return 1;
3660     }
3661 
3662     /* Save floating point registers.  */
3663     if (env->insns_flags & PPC_FLOAT) {
3664         for (i = 0; i < ARRAY_SIZE(env->fpr); i++) {
3665             if (__put_user(env->fpr[i], &frame->mc_fregs[i])) {
3666                 return 1;
3667             }
3668         }
3669         if (__put_user((uint64_t) env->fpscr, &frame->mc_fregs[32]))
3670             return 1;
3671     }
3672 
3673     /* Save SPE registers.  The kernel only saves the high half.  */
3674     if (env->insns_flags & PPC_SPE) {
3675 #if defined(TARGET_PPC64)
3676         for (i = 0; i < ARRAY_SIZE(env->gpr); i++) {
3677             if (__put_user(env->gpr[i] >> 32, &frame->mc_vregs.spe[i])) {
3678                 return 1;
3679             }
3680         }
3681 #else
3682         for (i = 0; i < ARRAY_SIZE(env->gprh); i++) {
3683             if (__put_user(env->gprh[i], &frame->mc_vregs.spe[i])) {
3684                 return 1;
3685             }
3686         }
3687 #endif
3688         /* Set MSR_SPE in the saved MSR value to indicate that
3689            frame->mc_vregs contains valid data.  */
3690         msr |= MSR_SPE;
3691         if (__put_user(env->spe_fscr, &frame->mc_vregs.spe[32]))
3692             return 1;
3693     }
3694 
3695     /* Store MSR.  */
3696     if (__put_user(msr, &frame->mc_gregs[TARGET_PT_MSR]))
3697         return 1;
3698 
3699     /* Set up the sigreturn trampoline: li r0,sigret; sc.  */
3700     if (sigret) {
3701         if (__put_user(0x38000000UL | sigret, &frame->tramp[0]) ||
3702             __put_user(0x44000002UL, &frame->tramp[1])) {
3703             return 1;
3704         }
3705     }
3706 
3707     return 0;
3708 }
3709 
3710 static int restore_user_regs(CPUState *env,
3711                              struct target_mcontext *frame, int sig)
3712 {
3713     target_ulong save_r2 = 0;
3714     target_ulong msr;
3715     target_ulong ccr;
3716 
3717     int i;
3718 
3719     if (!sig) {
3720         save_r2 = env->gpr[2];
3721     }
3722 
3723     /* Restore general registers.  */
3724     for (i = 0; i < ARRAY_SIZE(env->gpr); i++) {
3725         if (__get_user(env->gpr[i], &frame->mc_gregs[i])) {
3726             return 1;
3727         }
3728     }
3729     if (__get_user(env->nip, &frame->mc_gregs[TARGET_PT_NIP])
3730         || __get_user(env->ctr, &frame->mc_gregs[TARGET_PT_CTR])
3731         || __get_user(env->lr, &frame->mc_gregs[TARGET_PT_LNK])
3732         || __get_user(env->xer, &frame->mc_gregs[TARGET_PT_XER]))
3733         return 1;
3734     if (__get_user(ccr, &frame->mc_gregs[TARGET_PT_CCR]))
3735         return 1;
3736 
3737     for (i = 0; i < ARRAY_SIZE(env->crf); i++) {
3738         env->crf[i] = (ccr >> (32 - ((i + 1) * 4))) & 0xf;
3739     }
3740 
3741     if (!sig) {
3742         env->gpr[2] = save_r2;
3743     }
3744     /* Restore MSR.  */
3745     if (__get_user(msr, &frame->mc_gregs[TARGET_PT_MSR]))
3746         return 1;
3747 
3748     /* If doing signal return, restore the previous little-endian mode.  */
3749     if (sig)
3750         env->msr = (env->msr & ~MSR_LE) | (msr & MSR_LE);
3751 
3752     /* Restore Altivec registers if necessary.  */
3753     if (env->insns_flags & PPC_ALTIVEC) {
3754         for (i = 0; i < ARRAY_SIZE(env->avr); i++) {
3755             ppc_avr_t *avr = &env->avr[i];
3756             ppc_avr_t *vreg = &frame->mc_vregs.altivec[i];
3757 
3758             if (__get_user(avr->u64[0], &vreg->u64[0]) ||
3759                 __get_user(avr->u64[1], &vreg->u64[1])) {
3760                 return 1;
3761             }
3762         }
3763         /* Set MSR_VEC in the saved MSR value to indicate that
3764            frame->mc_vregs contains valid data.  */
3765         if (__get_user(env->spr[SPR_VRSAVE],
3766                        (target_ulong *)(&frame->mc_vregs.altivec[32].u32[3])))
3767             return 1;
3768     }
3769 
3770     /* Restore floating point registers.  */
3771     if (env->insns_flags & PPC_FLOAT) {
3772         uint64_t fpscr;
3773         for (i = 0; i < ARRAY_SIZE(env->fpr); i++) {
3774             if (__get_user(env->fpr[i], &frame->mc_fregs[i])) {
3775                 return 1;
3776             }
3777         }
3778         if (__get_user(fpscr, &frame->mc_fregs[32]))
3779             return 1;
3780         env->fpscr = (uint32_t) fpscr;
3781     }
3782 
3783     /* Save SPE registers.  The kernel only saves the high half.  */
3784     if (env->insns_flags & PPC_SPE) {
3785 #if defined(TARGET_PPC64)
3786         for (i = 0; i < ARRAY_SIZE(env->gpr); i++) {
3787             uint32_t hi;
3788 
3789             if (__get_user(hi, &frame->mc_vregs.spe[i])) {
3790                 return 1;
3791             }
3792             env->gpr[i] = ((uint64_t)hi << 32) | ((uint32_t) env->gpr[i]);
3793         }
3794 #else
3795         for (i = 0; i < ARRAY_SIZE(env->gprh); i++) {
3796             if (__get_user(env->gprh[i], &frame->mc_vregs.spe[i])) {
3797                 return 1;
3798             }
3799         }
3800 #endif
3801         if (__get_user(env->spe_fscr, &frame->mc_vregs.spe[32]))
3802             return 1;
3803     }
3804 
3805     return 0;
3806 }
3807 
3808 static void setup_frame(int sig, struct target_sigaction *ka,
3809                         target_sigset_t *set, CPUState *env)
3810 {
3811     struct target_sigframe *frame;
3812     struct target_sigcontext *sc;
3813     target_ulong frame_addr, newsp;
3814     int err = 0;
3815     int signal;
3816 
3817     frame_addr = get_sigframe(ka, env, sizeof(*frame));
3818     if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 1))
3819         goto sigsegv;
3820     sc = &frame->sctx;
3821 
3822     signal = current_exec_domain_sig(sig);
3823 
3824     err |= __put_user(h2g(ka->_sa_handler), &sc->handler);
3825     err |= __put_user(set->sig[0], &sc->oldmask);
3826 #if defined(TARGET_PPC64)
3827     err |= __put_user(set->sig[0] >> 32, &sc->_unused[3]);
3828 #else
3829     err |= __put_user(set->sig[1], &sc->_unused[3]);
3830 #endif
3831     err |= __put_user(h2g(&frame->mctx), &sc->regs);
3832     err |= __put_user(sig, &sc->signal);
3833 
3834     /* Save user regs.  */
3835     err |= save_user_regs(env, &frame->mctx, TARGET_NR_sigreturn);
3836 
3837     /* The kernel checks for the presence of a VDSO here.  We don't
3838        emulate a vdso, so use a sigreturn system call.  */
3839     env->lr = (target_ulong) h2g(frame->mctx.tramp);
3840 
3841     /* Turn off all fp exceptions.  */
3842     env->fpscr = 0;
3843 
3844     /* Create a stack frame for the caller of the handler.  */
3845     newsp = frame_addr - SIGNAL_FRAMESIZE;
3846     err |= __put_user(env->gpr[1], (target_ulong *)(uintptr_t) newsp);
3847 
3848     if (err)
3849         goto sigsegv;
3850 
3851     /* Set up registers for signal handler.  */
3852     env->gpr[1] = newsp;
3853     env->gpr[3] = signal;
3854     env->gpr[4] = (target_ulong) h2g(sc);
3855     env->nip = (target_ulong) ka->_sa_handler;
3856     /* Signal handlers are entered in big-endian mode.  */
3857     env->msr &= ~MSR_LE;
3858 
3859     unlock_user_struct(frame, frame_addr, 1);
3860     return;
3861 
3862 sigsegv:
3863     unlock_user_struct(frame, frame_addr, 1);
3864     if (logfile)
3865         fprintf (logfile, "segfaulting from setup_frame\n");
3866     force_sig(TARGET_SIGSEGV);
3867 }
3868 
3869 static void setup_rt_frame(int sig, struct target_sigaction *ka,
3870                            target_siginfo_t *info,
3871                            target_sigset_t *set, CPUState *env)
3872 {
3873     struct target_rt_sigframe *rt_sf;
3874     struct target_mcontext *frame;
3875     target_ulong rt_sf_addr, newsp = 0;
3876     int i, err = 0;
3877     int signal;
3878 
3879     rt_sf_addr = get_sigframe(ka, env, sizeof(*rt_sf));
3880     if (!lock_user_struct(VERIFY_WRITE, rt_sf, rt_sf_addr, 1))
3881         goto sigsegv;
3882 
3883     signal = current_exec_domain_sig(sig);
3884 
3885     err |= copy_siginfo_to_user(&rt_sf->info, info);
3886 
3887     err |= __put_user(0, &rt_sf->uc.tuc_flags);
3888     err |= __put_user(0, &rt_sf->uc.tuc_link);
3889     err |= __put_user((target_ulong)target_sigaltstack_used.ss_sp,
3890                       &rt_sf->uc.tuc_stack.ss_sp);
3891     err |= __put_user(sas_ss_flags(env->gpr[1]),
3892                       &rt_sf->uc.tuc_stack.ss_flags);
3893     err |= __put_user(target_sigaltstack_used.ss_size,
3894                       &rt_sf->uc.tuc_stack.ss_size);
3895     err |= __put_user(h2g (&rt_sf->uc.tuc_mcontext),
3896                       &rt_sf->uc.tuc_regs);
3897     for(i = 0; i < TARGET_NSIG_WORDS; i++) {
3898         err |= __put_user(set->sig[i], &rt_sf->uc.tuc_sigmask.sig[i]);
3899     }
3900 
3901     frame = &rt_sf->uc.tuc_mcontext;
3902     err |= save_user_regs(env, frame, TARGET_NR_rt_sigreturn);
3903 
3904     /* The kernel checks for the presence of a VDSO here.  We don't
3905        emulate a vdso, so use a sigreturn system call.  */
3906     env->lr = (target_ulong) h2g(frame->tramp);
3907 
3908     /* Turn off all fp exceptions.  */
3909     env->fpscr = 0;
3910 
3911     /* Create a stack frame for the caller of the handler.  */
3912     newsp = rt_sf_addr - (SIGNAL_FRAMESIZE + 16);
3913     err |= __put_user(env->gpr[1], (target_ulong *)(uintptr_t) newsp);
3914 
3915     if (err)
3916         goto sigsegv;
3917 
3918     /* Set up registers for signal handler.  */
3919     env->gpr[1] = newsp;
3920     env->gpr[3] = (target_ulong) signal;
3921     env->gpr[4] = (target_ulong) h2g(&rt_sf->info);
3922     env->gpr[5] = (target_ulong) h2g(&rt_sf->uc);
3923     env->gpr[6] = (target_ulong) h2g(rt_sf);
3924     env->nip = (target_ulong) ka->_sa_handler;
3925     /* Signal handlers are entered in big-endian mode.  */
3926     env->msr &= ~MSR_LE;
3927 
3928     unlock_user_struct(rt_sf, rt_sf_addr, 1);
3929     return;
3930 
3931 sigsegv:
3932     unlock_user_struct(rt_sf, rt_sf_addr, 1);
3933     if (logfile)
3934         fprintf (logfile, "segfaulting from setup_rt_frame\n");
3935     force_sig(TARGET_SIGSEGV);
3936 
3937 }
3938 
3939 long do_sigreturn(CPUState *env)
3940 {
3941     struct target_sigcontext *sc = NULL;
3942     struct target_mcontext *sr = NULL;
3943     target_ulong sr_addr, sc_addr;
3944     sigset_t blocked;
3945     target_sigset_t set;
3946 
3947     sc_addr = env->gpr[1] + SIGNAL_FRAMESIZE;
3948     if (!lock_user_struct(VERIFY_READ, sc, sc_addr, 1))
3949         goto sigsegv;
3950 
3951 #if defined(TARGET_PPC64)
3952     set.sig[0] = sc->oldmask + ((long)(sc->_unused[3]) << 32);
3953 #else
3954     if(__get_user(set.sig[0], &sc->oldmask) ||
3955        __get_user(set.sig[1], &sc->_unused[3]))
3956        goto sigsegv;
3957 #endif
3958     target_to_host_sigset_internal(&blocked, &set);
3959     sigprocmask(SIG_SETMASK, &blocked, NULL);
3960 
3961     if (__get_user(sr_addr, &sc->regs))
3962         goto sigsegv;
3963     if (!lock_user_struct(VERIFY_READ, sr, sr_addr, 1))
3964         goto sigsegv;
3965     if (restore_user_regs(env, sr, 1))
3966         goto sigsegv;
3967 
3968     unlock_user_struct(sr, sr_addr, 1);
3969     unlock_user_struct(sc, sc_addr, 1);
3970     return -TARGET_QEMU_ESIGRETURN;
3971 
3972 sigsegv:
3973     unlock_user_struct(sr, sr_addr, 1);
3974     unlock_user_struct(sc, sc_addr, 1);
3975     if (logfile)
3976         fprintf (logfile, "segfaulting from do_sigreturn\n");
3977     force_sig(TARGET_SIGSEGV);
3978     return 0;
3979 }
3980 
3981 /* See arch/powerpc/kernel/signal_32.c.  */
3982 static int do_setcontext(struct target_ucontext *ucp, CPUState *env, int sig)
3983 {
3984     struct target_mcontext *mcp;
3985     target_ulong mcp_addr;
3986     sigset_t blocked;
3987     target_sigset_t set;
3988 
3989     if (copy_from_user(&set, h2g(ucp) + offsetof(struct target_ucontext, tuc_sigmask),
3990                        sizeof (set)))
3991         return 1;
3992 
3993 #if defined(TARGET_PPC64)
3994     fprintf (stderr, "do_setcontext: not implemented\n");
3995     return 0;
3996 #else
3997     if (__get_user(mcp_addr, &ucp->tuc_regs))
3998         return 1;
3999 
4000     if (!lock_user_struct(VERIFY_READ, mcp, mcp_addr, 1))
4001         return 1;
4002 
4003     target_to_host_sigset_internal(&blocked, &set);
4004     sigprocmask(SIG_SETMASK, &blocked, NULL);
4005     if (restore_user_regs(env, mcp, sig))
4006         goto sigsegv;
4007 
4008     unlock_user_struct(mcp, mcp_addr, 1);
4009     return 0;
4010 
4011 sigsegv:
4012     unlock_user_struct(mcp, mcp_addr, 1);
4013     return 1;
4014 #endif
4015 }
4016 
4017 long do_rt_sigreturn(CPUState *env)
4018 {
4019     struct target_rt_sigframe *rt_sf = NULL;
4020     target_ulong rt_sf_addr;
4021 
4022     rt_sf_addr = env->gpr[1] + SIGNAL_FRAMESIZE + 16;
4023     if (!lock_user_struct(VERIFY_READ, rt_sf, rt_sf_addr, 1))
4024         goto sigsegv;
4025 
4026     if (do_setcontext(&rt_sf->uc, env, 1))
4027         goto sigsegv;
4028 
4029     do_sigaltstack(rt_sf_addr
4030                    + offsetof(struct target_rt_sigframe, uc.tuc_stack),
4031                    0, env->gpr[1]);
4032 
4033     unlock_user_struct(rt_sf, rt_sf_addr, 1);
4034     return -TARGET_QEMU_ESIGRETURN;
4035 
4036 sigsegv:
4037     unlock_user_struct(rt_sf, rt_sf_addr, 1);
4038     if (logfile)
4039         fprintf (logfile, "segfaulting from do_rt_sigreturn\n");
4040     force_sig(TARGET_SIGSEGV);
4041     return 0;
4042 }
4043 
4044 #elif defined(TARGET_M68K)
4045 
4046 struct target_sigcontext {
4047     abi_ulong  sc_mask;
4048     abi_ulong  sc_usp;
4049     abi_ulong  sc_d0;
4050     abi_ulong  sc_d1;
4051     abi_ulong  sc_a0;
4052     abi_ulong  sc_a1;
4053     unsigned short sc_sr;
4054     abi_ulong  sc_pc;
4055 };
4056 
4057 struct target_sigframe
4058 {
4059     abi_ulong pretcode;
4060     int sig;
4061     int code;
4062     abi_ulong psc;
4063     char retcode[8];
4064     abi_ulong extramask[TARGET_NSIG_WORDS-1];
4065     struct target_sigcontext sc;
4066 };
4067 
4068 typedef int target_greg_t;
4069 #define TARGET_NGREG 18
4070 typedef target_greg_t target_gregset_t[TARGET_NGREG];
4071 
4072 typedef struct target_fpregset {
4073     int f_fpcntl[3];
4074     int f_fpregs[8*3];
4075 } target_fpregset_t;
4076 
4077 struct target_mcontext {
4078     int version;
4079     target_gregset_t gregs;
4080     target_fpregset_t fpregs;
4081 };
4082 
4083 #define TARGET_MCONTEXT_VERSION 2
4084 
4085 struct target_ucontext {
4086     abi_ulong tuc_flags;
4087     abi_ulong tuc_link;
4088     target_stack_t tuc_stack;
4089     struct target_mcontext tuc_mcontext;
4090     abi_long tuc_filler[80];
4091     target_sigset_t tuc_sigmask;
4092 };
4093 
4094 struct target_rt_sigframe
4095 {
4096     abi_ulong pretcode;
4097     int sig;
4098     abi_ulong pinfo;
4099     abi_ulong puc;
4100     char retcode[8];
4101     struct target_siginfo info;
4102     struct target_ucontext uc;
4103 };
4104 
4105 static int
4106 setup_sigcontext(struct target_sigcontext *sc, CPUState *env, abi_ulong mask)
4107 {
4108     int err = 0;
4109 
4110     err |= __put_user(mask, &sc->sc_mask);
4111     err |= __put_user(env->aregs[7], &sc->sc_usp);
4112     err |= __put_user(env->dregs[0], &sc->sc_d0);
4113     err |= __put_user(env->dregs[1], &sc->sc_d1);
4114     err |= __put_user(env->aregs[0], &sc->sc_a0);
4115     err |= __put_user(env->aregs[1], &sc->sc_a1);
4116     err |= __put_user(env->sr, &sc->sc_sr);
4117     err |= __put_user(env->pc, &sc->sc_pc);
4118 
4119     return err;
4120 }
4121 
4122 static int
4123 restore_sigcontext(CPUState *env, struct target_sigcontext *sc, int *pd0)
4124 {
4125     int err = 0;
4126     int temp;
4127 
4128     err |= __get_user(env->aregs[7], &sc->sc_usp);
4129     err |= __get_user(env->dregs[1], &sc->sc_d1);
4130     err |= __get_user(env->aregs[0], &sc->sc_a0);
4131     err |= __get_user(env->aregs[1], &sc->sc_a1);
4132     err |= __get_user(env->pc, &sc->sc_pc);
4133     err |= __get_user(temp, &sc->sc_sr);
4134     env->sr = (env->sr & 0xff00) | (temp & 0xff);
4135 
4136     *pd0 = tswapl(sc->sc_d0);
4137 
4138     return err;
4139 }
4140 
4141 /*
4142  * Determine which stack to use..
4143  */
4144 static inline abi_ulong
4145 get_sigframe(struct target_sigaction *ka, CPUState *regs, size_t frame_size)
4146 {
4147     unsigned long sp;
4148 
4149     sp = regs->aregs[7];
4150 
4151     /* This is the X/Open sanctioned signal stack switching.  */
4152     if ((ka->sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags (sp) == 0)) {
4153         sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
4154     }
4155 
4156     return ((sp - frame_size) & -8UL);
4157 }
4158 
4159 static void setup_frame(int sig, struct target_sigaction *ka,
4160 			target_sigset_t *set, CPUState *env)
4161 {
4162     struct target_sigframe *frame;
4163     abi_ulong frame_addr;
4164     abi_ulong retcode_addr;
4165     abi_ulong sc_addr;
4166     int err = 0;
4167     int i;
4168 
4169     frame_addr = get_sigframe(ka, env, sizeof *frame);
4170     if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
4171 	goto give_sigsegv;
4172 
4173     err |= __put_user(sig, &frame->sig);
4174 
4175     sc_addr = frame_addr + offsetof(struct target_sigframe, sc);
4176     err |= __put_user(sc_addr, &frame->psc);
4177 
4178     err |= setup_sigcontext(&frame->sc, env, set->sig[0]);
4179     if (err)
4180 	goto give_sigsegv;
4181 
4182     for(i = 1; i < TARGET_NSIG_WORDS; i++) {
4183         if (__put_user(set->sig[i], &frame->extramask[i - 1]))
4184             goto give_sigsegv;
4185     }
4186 
4187     /* Set up to return from userspace.  */
4188 
4189     retcode_addr = frame_addr + offsetof(struct target_sigframe, retcode);
4190     err |= __put_user(retcode_addr, &frame->pretcode);
4191 
4192     /* moveq #,d0; trap #0 */
4193 
4194     err |= __put_user(0x70004e40 + (TARGET_NR_sigreturn << 16),
4195                       (long *)(frame->retcode));
4196 
4197     if (err)
4198         goto give_sigsegv;
4199 
4200     /* Set up to return from userspace */
4201 
4202     env->aregs[7] = frame_addr;
4203     env->pc = ka->_sa_handler;
4204 
4205     unlock_user_struct(frame, frame_addr, 1);
4206     return;
4207 
4208 give_sigsegv:
4209     unlock_user_struct(frame, frame_addr, 1);
4210     force_sig(TARGET_SIGSEGV);
4211 }
4212 
4213 static inline int target_rt_setup_ucontext(struct target_ucontext *uc,
4214                                            CPUState *env)
4215 {
4216     target_greg_t *gregs = uc->tuc_mcontext.gregs;
4217     int err;
4218 
4219     err = __put_user(TARGET_MCONTEXT_VERSION, &uc->tuc_mcontext.version);
4220     err |= __put_user(env->dregs[0], &gregs[0]);
4221     err |= __put_user(env->dregs[1], &gregs[1]);
4222     err |= __put_user(env->dregs[2], &gregs[2]);
4223     err |= __put_user(env->dregs[3], &gregs[3]);
4224     err |= __put_user(env->dregs[4], &gregs[4]);
4225     err |= __put_user(env->dregs[5], &gregs[5]);
4226     err |= __put_user(env->dregs[6], &gregs[6]);
4227     err |= __put_user(env->dregs[7], &gregs[7]);
4228     err |= __put_user(env->aregs[0], &gregs[8]);
4229     err |= __put_user(env->aregs[1], &gregs[9]);
4230     err |= __put_user(env->aregs[2], &gregs[10]);
4231     err |= __put_user(env->aregs[3], &gregs[11]);
4232     err |= __put_user(env->aregs[4], &gregs[12]);
4233     err |= __put_user(env->aregs[5], &gregs[13]);
4234     err |= __put_user(env->aregs[6], &gregs[14]);
4235     err |= __put_user(env->aregs[7], &gregs[15]);
4236     err |= __put_user(env->pc, &gregs[16]);
4237     err |= __put_user(env->sr, &gregs[17]);
4238 
4239     return err;
4240 }
4241 
4242 static inline int target_rt_restore_ucontext(CPUState *env,
4243                                              struct target_ucontext *uc,
4244                                              int *pd0)
4245 {
4246     int temp;
4247     int err;
4248     target_greg_t *gregs = uc->tuc_mcontext.gregs;
4249 
4250     err = __get_user(temp, &uc->tuc_mcontext.version);
4251     if (temp != TARGET_MCONTEXT_VERSION)
4252         goto badframe;
4253 
4254     /* restore passed registers */
4255     err |= __get_user(env->dregs[0], &gregs[0]);
4256     err |= __get_user(env->dregs[1], &gregs[1]);
4257     err |= __get_user(env->dregs[2], &gregs[2]);
4258     err |= __get_user(env->dregs[3], &gregs[3]);
4259     err |= __get_user(env->dregs[4], &gregs[4]);
4260     err |= __get_user(env->dregs[5], &gregs[5]);
4261     err |= __get_user(env->dregs[6], &gregs[6]);
4262     err |= __get_user(env->dregs[7], &gregs[7]);
4263     err |= __get_user(env->aregs[0], &gregs[8]);
4264     err |= __get_user(env->aregs[1], &gregs[9]);
4265     err |= __get_user(env->aregs[2], &gregs[10]);
4266     err |= __get_user(env->aregs[3], &gregs[11]);
4267     err |= __get_user(env->aregs[4], &gregs[12]);
4268     err |= __get_user(env->aregs[5], &gregs[13]);
4269     err |= __get_user(env->aregs[6], &gregs[14]);
4270     err |= __get_user(env->aregs[7], &gregs[15]);
4271     err |= __get_user(env->pc, &gregs[16]);
4272     err |= __get_user(temp, &gregs[17]);
4273     env->sr = (env->sr & 0xff00) | (temp & 0xff);
4274 
4275     *pd0 = env->dregs[0];
4276     return err;
4277 
4278 badframe:
4279     return 1;
4280 }
4281 
4282 static void setup_rt_frame(int sig, struct target_sigaction *ka,
4283                            target_siginfo_t *info,
4284 			   target_sigset_t *set, CPUState *env)
4285 {
4286     struct target_rt_sigframe *frame;
4287     abi_ulong frame_addr;
4288     abi_ulong retcode_addr;
4289     abi_ulong info_addr;
4290     abi_ulong uc_addr;
4291     int err = 0;
4292     int i;
4293 
4294     frame_addr = get_sigframe(ka, env, sizeof *frame);
4295     if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
4296 	goto give_sigsegv;
4297 
4298     err |= __put_user(sig, &frame->sig);
4299 
4300     info_addr = frame_addr + offsetof(struct target_rt_sigframe, info);
4301     err |= __put_user(info_addr, &frame->pinfo);
4302 
4303     uc_addr = frame_addr + offsetof(struct target_rt_sigframe, uc);
4304     err |= __put_user(uc_addr, &frame->puc);
4305 
4306     err |= copy_siginfo_to_user(&frame->info, info);
4307 
4308     /* Create the ucontext */
4309 
4310     err |= __put_user(0, &frame->uc.tuc_flags);
4311     err |= __put_user(0, &frame->uc.tuc_link);
4312     err |= __put_user(target_sigaltstack_used.ss_sp,
4313                       &frame->uc.tuc_stack.ss_sp);
4314     err |= __put_user(sas_ss_flags(env->aregs[7]),
4315                       &frame->uc.tuc_stack.ss_flags);
4316     err |= __put_user(target_sigaltstack_used.ss_size,
4317                       &frame->uc.tuc_stack.ss_size);
4318     err |= target_rt_setup_ucontext(&frame->uc, env);
4319 
4320     if (err)
4321             goto give_sigsegv;
4322 
4323     for(i = 0; i < TARGET_NSIG_WORDS; i++) {
4324         if (__put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]))
4325             goto give_sigsegv;
4326     }
4327 
4328     /* Set up to return from userspace.  */
4329 
4330     retcode_addr = frame_addr + offsetof(struct target_sigframe, retcode);
4331     err |= __put_user(retcode_addr, &frame->pretcode);
4332 
4333     /* moveq #,d0; notb d0; trap #0 */
4334 
4335     err |= __put_user(0x70004600 + ((TARGET_NR_rt_sigreturn ^ 0xff) << 16),
4336                       (long *)(frame->retcode + 0));
4337     err |= __put_user(0x4e40, (short *)(frame->retcode + 4));
4338 
4339     if (err)
4340         goto give_sigsegv;
4341 
4342     /* Set up to return from userspace */
4343 
4344     env->aregs[7] = frame_addr;
4345     env->pc = ka->_sa_handler;
4346 
4347     unlock_user_struct(frame, frame_addr, 1);
4348     return;
4349 
4350 give_sigsegv:
4351     unlock_user_struct(frame, frame_addr, 1);
4352     force_sig(TARGET_SIGSEGV);
4353 }
4354 
4355 long do_sigreturn(CPUState *env)
4356 {
4357     struct target_sigframe *frame;
4358     abi_ulong frame_addr = env->aregs[7] - 4;
4359     target_sigset_t target_set;
4360     sigset_t set;
4361     int d0, i;
4362 
4363     if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
4364         goto badframe;
4365 
4366     /* set blocked signals */
4367 
4368     if (__get_user(target_set.sig[0], &frame->sc.sc_mask))
4369         goto badframe;
4370 
4371     for(i = 1; i < TARGET_NSIG_WORDS; i++) {
4372         if (__get_user(target_set.sig[i], &frame->extramask[i - 1]))
4373             goto badframe;
4374     }
4375 
4376     target_to_host_sigset_internal(&set, &target_set);
4377     sigprocmask(SIG_SETMASK, &set, NULL);
4378 
4379     /* restore registers */
4380 
4381     if (restore_sigcontext(env, &frame->sc, &d0))
4382         goto badframe;
4383 
4384     unlock_user_struct(frame, frame_addr, 0);
4385     return d0;
4386 
4387 badframe:
4388     unlock_user_struct(frame, frame_addr, 0);
4389     force_sig(TARGET_SIGSEGV);
4390     return 0;
4391 }
4392 
4393 long do_rt_sigreturn(CPUState *env)
4394 {
4395     struct target_rt_sigframe *frame;
4396     abi_ulong frame_addr = env->aregs[7] - 4;
4397     target_sigset_t target_set;
4398     sigset_t set;
4399     int d0;
4400 
4401     if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
4402         goto badframe;
4403 
4404     target_to_host_sigset_internal(&set, &target_set);
4405     sigprocmask(SIG_SETMASK, &set, NULL);
4406 
4407     /* restore registers */
4408 
4409     if (target_rt_restore_ucontext(env, &frame->uc, &d0))
4410         goto badframe;
4411 
4412     if (do_sigaltstack(frame_addr +
4413                        offsetof(struct target_rt_sigframe, uc.tuc_stack),
4414                        0, get_sp_from_cpustate(env)) == -EFAULT)
4415         goto badframe;
4416 
4417     unlock_user_struct(frame, frame_addr, 0);
4418     return d0;
4419 
4420 badframe:
4421     unlock_user_struct(frame, frame_addr, 0);
4422     force_sig(TARGET_SIGSEGV);
4423     return 0;
4424 }
4425 
4426 #elif defined(TARGET_ALPHA)
4427 
4428 struct target_sigcontext {
4429     abi_long sc_onstack;
4430     abi_long sc_mask;
4431     abi_long sc_pc;
4432     abi_long sc_ps;
4433     abi_long sc_regs[32];
4434     abi_long sc_ownedfp;
4435     abi_long sc_fpregs[32];
4436     abi_ulong sc_fpcr;
4437     abi_ulong sc_fp_control;
4438     abi_ulong sc_reserved1;
4439     abi_ulong sc_reserved2;
4440     abi_ulong sc_ssize;
4441     abi_ulong sc_sbase;
4442     abi_ulong sc_traparg_a0;
4443     abi_ulong sc_traparg_a1;
4444     abi_ulong sc_traparg_a2;
4445     abi_ulong sc_fp_trap_pc;
4446     abi_ulong sc_fp_trigger_sum;
4447     abi_ulong sc_fp_trigger_inst;
4448 };
4449 
4450 struct target_ucontext {
4451     abi_ulong tuc_flags;
4452     abi_ulong tuc_link;
4453     abi_ulong tuc_osf_sigmask;
4454     target_stack_t tuc_stack;
4455     struct target_sigcontext tuc_mcontext;
4456     target_sigset_t tuc_sigmask;
4457 };
4458 
4459 struct target_sigframe {
4460     struct target_sigcontext sc;
4461     unsigned int retcode[3];
4462 };
4463 
4464 struct target_rt_sigframe {
4465     target_siginfo_t info;
4466     struct target_ucontext uc;
4467     unsigned int retcode[3];
4468 };
4469 
4470 #define INSN_MOV_R30_R16        0x47fe0410
4471 #define INSN_LDI_R0             0x201f0000
4472 #define INSN_CALLSYS            0x00000083
4473 
4474 static int setup_sigcontext(struct target_sigcontext *sc, CPUState *env,
4475                             abi_ulong frame_addr, target_sigset_t *set)
4476 {
4477     int i, err = 0;
4478 
4479     err |= __put_user(on_sig_stack(frame_addr), &sc->sc_onstack);
4480     err |= __put_user(set->sig[0], &sc->sc_mask);
4481     err |= __put_user(env->pc, &sc->sc_pc);
4482     err |= __put_user(8, &sc->sc_ps);
4483 
4484     for (i = 0; i < 31; ++i) {
4485         err |= __put_user(env->ir[i], &sc->sc_regs[i]);
4486     }
4487     err |= __put_user(0, &sc->sc_regs[31]);
4488 
4489     for (i = 0; i < 31; ++i) {
4490         err |= __put_user(env->fir[i], &sc->sc_fpregs[i]);
4491     }
4492     err |= __put_user(0, &sc->sc_fpregs[31]);
4493     err |= __put_user(cpu_alpha_load_fpcr(env), &sc->sc_fpcr);
4494 
4495     err |= __put_user(0, &sc->sc_traparg_a0); /* FIXME */
4496     err |= __put_user(0, &sc->sc_traparg_a1); /* FIXME */
4497     err |= __put_user(0, &sc->sc_traparg_a2); /* FIXME */
4498 
4499     return err;
4500 }
4501 
4502 static int restore_sigcontext(CPUState *env, struct target_sigcontext *sc)
4503 {
4504     uint64_t fpcr;
4505     int i, err = 0;
4506 
4507     err |= __get_user(env->pc, &sc->sc_pc);
4508 
4509     for (i = 0; i < 31; ++i) {
4510         err |= __get_user(env->ir[i], &sc->sc_regs[i]);
4511     }
4512     for (i = 0; i < 31; ++i) {
4513         err |= __get_user(env->fir[i], &sc->sc_fpregs[i]);
4514     }
4515 
4516     err |= __get_user(fpcr, &sc->sc_fpcr);
4517     cpu_alpha_store_fpcr(env, fpcr);
4518 
4519     return err;
4520 }
4521 
4522 static inline abi_ulong get_sigframe(struct target_sigaction *sa,
4523                                      CPUState *env, unsigned long framesize)
4524 {
4525     abi_ulong sp = env->ir[IR_SP];
4526 
4527     /* This is the X/Open sanctioned signal stack switching.  */
4528     if ((sa->sa_flags & TARGET_SA_ONSTACK) != 0 && !sas_ss_flags(sp)) {
4529         sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
4530     }
4531     return (sp - framesize) & -32;
4532 }
4533 
4534 static void setup_frame(int sig, struct target_sigaction *ka,
4535                         target_sigset_t *set, CPUState *env)
4536 {
4537     abi_ulong frame_addr, r26;
4538     struct target_sigframe *frame;
4539     int err = 0;
4540 
4541     frame_addr = get_sigframe(ka, env, sizeof(*frame));
4542     if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) {
4543         goto give_sigsegv;
4544     }
4545 
4546     err |= setup_sigcontext(&frame->sc, env, frame_addr, set);
4547 
4548     if (ka->sa_restorer) {
4549         r26 = ka->sa_restorer;
4550     } else {
4551         err |= __put_user(INSN_MOV_R30_R16, &frame->retcode[0]);
4552         err |= __put_user(INSN_LDI_R0 + TARGET_NR_sigreturn,
4553                           &frame->retcode[1]);
4554         err |= __put_user(INSN_CALLSYS, &frame->retcode[2]);
4555         /* imb() */
4556         r26 = frame_addr;
4557     }
4558 
4559     unlock_user_struct(frame, frame_addr, 1);
4560 
4561     if (err) {
4562     give_sigsegv:
4563         if (sig == TARGET_SIGSEGV) {
4564             ka->_sa_handler = TARGET_SIG_DFL;
4565         }
4566         force_sig(TARGET_SIGSEGV);
4567     }
4568 
4569     env->ir[IR_RA] = r26;
4570     env->ir[IR_PV] = env->pc = ka->_sa_handler;
4571     env->ir[IR_A0] = sig;
4572     env->ir[IR_A1] = 0;
4573     env->ir[IR_A2] = frame_addr + offsetof(struct target_sigframe, sc);
4574     env->ir[IR_SP] = frame_addr;
4575 }
4576 
4577 static void setup_rt_frame(int sig, struct target_sigaction *ka,
4578                            target_siginfo_t *info,
4579 			   target_sigset_t *set, CPUState *env)
4580 {
4581     abi_ulong frame_addr, r26;
4582     struct target_rt_sigframe *frame;
4583     int i, err = 0;
4584 
4585     frame_addr = get_sigframe(ka, env, sizeof(*frame));
4586     if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) {
4587         goto give_sigsegv;
4588     }
4589 
4590     err |= copy_siginfo_to_user(&frame->info, info);
4591 
4592     err |= __put_user(0, &frame->uc.tuc_flags);
4593     err |= __put_user(0, &frame->uc.tuc_link);
4594     err |= __put_user(set->sig[0], &frame->uc.tuc_osf_sigmask);
4595     err |= __put_user(target_sigaltstack_used.ss_sp,
4596                       &frame->uc.tuc_stack.ss_sp);
4597     err |= __put_user(sas_ss_flags(env->ir[IR_SP]),
4598                       &frame->uc.tuc_stack.ss_flags);
4599     err |= __put_user(target_sigaltstack_used.ss_size,
4600                       &frame->uc.tuc_stack.ss_size);
4601     err |= setup_sigcontext(&frame->uc.tuc_mcontext, env, frame_addr, set);
4602     for (i = 0; i < TARGET_NSIG_WORDS; ++i) {
4603         err |= __put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]);
4604     }
4605 
4606     if (ka->sa_restorer) {
4607         r26 = ka->sa_restorer;
4608     } else {
4609         err |= __put_user(INSN_MOV_R30_R16, &frame->retcode[0]);
4610         err |= __put_user(INSN_LDI_R0 + TARGET_NR_rt_sigreturn,
4611                           &frame->retcode[1]);
4612         err |= __put_user(INSN_CALLSYS, &frame->retcode[2]);
4613         /* imb(); */
4614         r26 = frame_addr;
4615     }
4616 
4617     if (err) {
4618     give_sigsegv:
4619        if (sig == TARGET_SIGSEGV) {
4620             ka->_sa_handler = TARGET_SIG_DFL;
4621         }
4622         force_sig(TARGET_SIGSEGV);
4623     }
4624 
4625     env->ir[IR_RA] = r26;
4626     env->ir[IR_PV] = env->pc = ka->_sa_handler;
4627     env->ir[IR_A0] = sig;
4628     env->ir[IR_A1] = frame_addr + offsetof(struct target_rt_sigframe, info);
4629     env->ir[IR_A2] = frame_addr + offsetof(struct target_rt_sigframe, uc);
4630     env->ir[IR_SP] = frame_addr;
4631 }
4632 
4633 long do_sigreturn(CPUState *env)
4634 {
4635     struct target_sigcontext *sc;
4636     abi_ulong sc_addr = env->ir[IR_A0];
4637     target_sigset_t target_set;
4638     sigset_t set;
4639 
4640     if (!lock_user_struct(VERIFY_READ, sc, sc_addr, 1)) {
4641         goto badframe;
4642     }
4643 
4644     target_sigemptyset(&target_set);
4645     if (__get_user(target_set.sig[0], &sc->sc_mask)) {
4646         goto badframe;
4647     }
4648 
4649     target_to_host_sigset_internal(&set, &target_set);
4650     sigprocmask(SIG_SETMASK, &set, NULL);
4651 
4652     if (restore_sigcontext(env, sc)) {
4653         goto badframe;
4654     }
4655     unlock_user_struct(sc, sc_addr, 0);
4656     return env->ir[IR_V0];
4657 
4658  badframe:
4659     unlock_user_struct(sc, sc_addr, 0);
4660     force_sig(TARGET_SIGSEGV);
4661 }
4662 
4663 long do_rt_sigreturn(CPUState *env)
4664 {
4665     abi_ulong frame_addr = env->ir[IR_A0];
4666     struct target_rt_sigframe *frame;
4667     sigset_t set;
4668 
4669     if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) {
4670         goto badframe;
4671     }
4672     target_to_host_sigset(&set, &frame->uc.tuc_sigmask);
4673     sigprocmask(SIG_SETMASK, &set, NULL);
4674 
4675     if (restore_sigcontext(env, &frame->uc.tuc_mcontext)) {
4676         goto badframe;
4677     }
4678     if (do_sigaltstack(frame_addr + offsetof(struct target_rt_sigframe,
4679                                              uc.tuc_stack),
4680                        0, env->ir[IR_SP]) == -EFAULT) {
4681         goto badframe;
4682     }
4683 
4684     unlock_user_struct(frame, frame_addr, 0);
4685     return env->ir[IR_V0];
4686 
4687 
4688  badframe:
4689     unlock_user_struct(frame, frame_addr, 0);
4690     force_sig(TARGET_SIGSEGV);
4691 }
4692 
4693 #else
4694 
4695 static void setup_frame(int sig, struct target_sigaction *ka,
4696 			target_sigset_t *set, CPUState *env)
4697 {
4698     fprintf(stderr, "setup_frame: not implemented\n");
4699 }
4700 
4701 static void setup_rt_frame(int sig, struct target_sigaction *ka,
4702                            target_siginfo_t *info,
4703 			   target_sigset_t *set, CPUState *env)
4704 {
4705     fprintf(stderr, "setup_rt_frame: not implemented\n");
4706 }
4707 
4708 long do_sigreturn(CPUState *env)
4709 {
4710     fprintf(stderr, "do_sigreturn: not implemented\n");
4711     return -TARGET_ENOSYS;
4712 }
4713 
4714 long do_rt_sigreturn(CPUState *env)
4715 {
4716     fprintf(stderr, "do_rt_sigreturn: not implemented\n");
4717     return -TARGET_ENOSYS;
4718 }
4719 
4720 #endif
4721 
4722 void process_pending_signals(CPUState *cpu_env)
4723 {
4724     int sig;
4725     abi_ulong handler;
4726     sigset_t set, old_set;
4727     target_sigset_t target_old_set;
4728     struct emulated_sigtable *k;
4729     struct target_sigaction *sa;
4730     struct sigqueue *q;
4731     TaskState *ts = cpu_env->opaque;
4732 
4733     if (!ts->signal_pending)
4734         return;
4735 
4736     /* FIXME: This is not threadsafe.  */
4737     k = ts->sigtab;
4738     for(sig = 1; sig <= TARGET_NSIG; sig++) {
4739         if (k->pending)
4740             goto handle_signal;
4741         k++;
4742     }
4743     /* if no signal is pending, just return */
4744     ts->signal_pending = 0;
4745     return;
4746 
4747  handle_signal:
4748 #ifdef DEBUG_SIGNAL
4749     fprintf(stderr, "qemu: process signal %d\n", sig);
4750 #endif
4751     /* dequeue signal */
4752     q = k->first;
4753     k->first = q->next;
4754     if (!k->first)
4755         k->pending = 0;
4756 
4757     sig = gdb_handlesig (cpu_env, sig);
4758     if (!sig) {
4759         sa = NULL;
4760         handler = TARGET_SIG_IGN;
4761     } else {
4762         sa = &sigact_table[sig - 1];
4763         handler = sa->_sa_handler;
4764     }
4765 
4766     if (handler == TARGET_SIG_DFL) {
4767         /* default handler : ignore some signal. The other are job control or fatal */
4768         if (sig == TARGET_SIGTSTP || sig == TARGET_SIGTTIN || sig == TARGET_SIGTTOU) {
4769             kill(getpid(),SIGSTOP);
4770         } else if (sig != TARGET_SIGCHLD &&
4771                    sig != TARGET_SIGURG &&
4772                    sig != TARGET_SIGWINCH &&
4773                    sig != TARGET_SIGCONT) {
4774             force_sig(sig);
4775         }
4776     } else if (handler == TARGET_SIG_IGN) {
4777         /* ignore sig */
4778     } else if (handler == TARGET_SIG_ERR) {
4779         force_sig(sig);
4780     } else {
4781         /* compute the blocked signals during the handler execution */
4782         target_to_host_sigset(&set, &sa->sa_mask);
4783         /* SA_NODEFER indicates that the current signal should not be
4784            blocked during the handler */
4785         if (!(sa->sa_flags & TARGET_SA_NODEFER))
4786             sigaddset(&set, target_to_host_signal(sig));
4787 
4788         /* block signals in the handler using Linux */
4789         sigprocmask(SIG_BLOCK, &set, &old_set);
4790         /* save the previous blocked signal state to restore it at the
4791            end of the signal execution (see do_sigreturn) */
4792         host_to_target_sigset_internal(&target_old_set, &old_set);
4793 
4794         /* if the CPU is in VM86 mode, we restore the 32 bit values */
4795 #if defined(TARGET_I386) && !defined(TARGET_X86_64)
4796         {
4797             CPUX86State *env = cpu_env;
4798             if (env->eflags & VM_MASK)
4799                 save_v86_state(env);
4800         }
4801 #endif
4802         /* prepare the stack frame of the virtual CPU */
4803         if (sa->sa_flags & TARGET_SA_SIGINFO)
4804             setup_rt_frame(sig, sa, &q->info, &target_old_set, cpu_env);
4805         else
4806             setup_frame(sig, sa, &target_old_set, cpu_env);
4807 	if (sa->sa_flags & TARGET_SA_RESETHAND)
4808             sa->_sa_handler = TARGET_SIG_DFL;
4809     }
4810     if (q != &k->info)
4811         free_sigqueue(cpu_env, q);
4812 }
4813