xref: /qemu/linux-user/signal.c (revision 08e11256f6a0caae9b8f18fb6a71359b590d97c6)
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(target_sigset_t)];
1112     abi_ulong tuc_regspace[128] __attribute__((__aligned__(8)));
1113 };
1114 
1115 struct target_user_vfp {
1116     uint64_t fpregs[32];
1117     abi_ulong fpscr;
1118 };
1119 
1120 struct target_user_vfp_exc {
1121     abi_ulong fpexc;
1122     abi_ulong fpinst;
1123     abi_ulong fpinst2;
1124 };
1125 
1126 struct target_vfp_sigframe {
1127     abi_ulong magic;
1128     abi_ulong size;
1129     struct target_user_vfp ufp;
1130     struct target_user_vfp_exc ufp_exc;
1131 } __attribute__((__aligned__(8)));
1132 
1133 struct target_iwmmxt_sigframe {
1134     abi_ulong magic;
1135     abi_ulong size;
1136     uint64_t regs[16];
1137     /* Note that not all the coprocessor control registers are stored here */
1138     uint32_t wcssf;
1139     uint32_t wcasf;
1140     uint32_t wcgr0;
1141     uint32_t wcgr1;
1142     uint32_t wcgr2;
1143     uint32_t wcgr3;
1144 } __attribute__((__aligned__(8)));
1145 
1146 #define TARGET_VFP_MAGIC 0x56465001
1147 #define TARGET_IWMMXT_MAGIC 0x12ef842a
1148 
1149 struct sigframe_v1
1150 {
1151     struct target_sigcontext sc;
1152     abi_ulong extramask[TARGET_NSIG_WORDS-1];
1153     abi_ulong retcode;
1154 };
1155 
1156 struct sigframe_v2
1157 {
1158     struct target_ucontext_v2 uc;
1159     abi_ulong retcode;
1160 };
1161 
1162 struct rt_sigframe_v1
1163 {
1164     abi_ulong pinfo;
1165     abi_ulong puc;
1166     struct target_siginfo info;
1167     struct target_ucontext_v1 uc;
1168     abi_ulong retcode;
1169 };
1170 
1171 struct rt_sigframe_v2
1172 {
1173     struct target_siginfo info;
1174     struct target_ucontext_v2 uc;
1175     abi_ulong retcode;
1176 };
1177 
1178 #define TARGET_CONFIG_CPU_32 1
1179 
1180 /*
1181  * For ARM syscalls, we encode the syscall number into the instruction.
1182  */
1183 #define SWI_SYS_SIGRETURN	(0xef000000|(TARGET_NR_sigreturn + ARM_SYSCALL_BASE))
1184 #define SWI_SYS_RT_SIGRETURN	(0xef000000|(TARGET_NR_rt_sigreturn + ARM_SYSCALL_BASE))
1185 
1186 /*
1187  * For Thumb syscalls, we pass the syscall number via r7.  We therefore
1188  * need two 16-bit instructions.
1189  */
1190 #define SWI_THUMB_SIGRETURN	(0xdf00 << 16 | 0x2700 | (TARGET_NR_sigreturn))
1191 #define SWI_THUMB_RT_SIGRETURN	(0xdf00 << 16 | 0x2700 | (TARGET_NR_rt_sigreturn))
1192 
1193 static const abi_ulong retcodes[4] = {
1194 	SWI_SYS_SIGRETURN,	SWI_THUMB_SIGRETURN,
1195 	SWI_SYS_RT_SIGRETURN,	SWI_THUMB_RT_SIGRETURN
1196 };
1197 
1198 
1199 #define __get_user_error(x,p,e) __get_user(x, p)
1200 
1201 static inline int valid_user_regs(CPUState *regs)
1202 {
1203     return 1;
1204 }
1205 
1206 static void
1207 setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/
1208 		 CPUState *env, abi_ulong mask)
1209 {
1210 	__put_user(env->regs[0], &sc->arm_r0);
1211 	__put_user(env->regs[1], &sc->arm_r1);
1212 	__put_user(env->regs[2], &sc->arm_r2);
1213 	__put_user(env->regs[3], &sc->arm_r3);
1214 	__put_user(env->regs[4], &sc->arm_r4);
1215 	__put_user(env->regs[5], &sc->arm_r5);
1216 	__put_user(env->regs[6], &sc->arm_r6);
1217 	__put_user(env->regs[7], &sc->arm_r7);
1218 	__put_user(env->regs[8], &sc->arm_r8);
1219 	__put_user(env->regs[9], &sc->arm_r9);
1220 	__put_user(env->regs[10], &sc->arm_r10);
1221 	__put_user(env->regs[11], &sc->arm_fp);
1222 	__put_user(env->regs[12], &sc->arm_ip);
1223 	__put_user(env->regs[13], &sc->arm_sp);
1224 	__put_user(env->regs[14], &sc->arm_lr);
1225 	__put_user(env->regs[15], &sc->arm_pc);
1226 #ifdef TARGET_CONFIG_CPU_32
1227 	__put_user(cpsr_read(env), &sc->arm_cpsr);
1228 #endif
1229 
1230 	__put_user(/* current->thread.trap_no */ 0, &sc->trap_no);
1231 	__put_user(/* current->thread.error_code */ 0, &sc->error_code);
1232 	__put_user(/* current->thread.address */ 0, &sc->fault_address);
1233 	__put_user(mask, &sc->oldmask);
1234 }
1235 
1236 static inline abi_ulong
1237 get_sigframe(struct target_sigaction *ka, CPUState *regs, int framesize)
1238 {
1239 	unsigned long sp = regs->regs[13];
1240 
1241 	/*
1242 	 * This is the X/Open sanctioned signal stack switching.
1243 	 */
1244 	if ((ka->sa_flags & TARGET_SA_ONSTACK) && !sas_ss_flags(sp))
1245             sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
1246 	/*
1247 	 * ATPCS B01 mandates 8-byte alignment
1248 	 */
1249 	return (sp - framesize) & ~7;
1250 }
1251 
1252 static int
1253 setup_return(CPUState *env, struct target_sigaction *ka,
1254 	     abi_ulong *rc, abi_ulong frame_addr, int usig, abi_ulong rc_addr)
1255 {
1256 	abi_ulong handler = ka->_sa_handler;
1257 	abi_ulong retcode;
1258 	int thumb = handler & 1;
1259 
1260 	if (ka->sa_flags & TARGET_SA_RESTORER) {
1261 		retcode = ka->sa_restorer;
1262 	} else {
1263 		unsigned int idx = thumb;
1264 
1265 		if (ka->sa_flags & TARGET_SA_SIGINFO)
1266 			idx += 2;
1267 
1268 		if (__put_user(retcodes[idx], rc))
1269 			return 1;
1270 #if 0
1271 		flush_icache_range((abi_ulong)rc,
1272 				   (abi_ulong)(rc + 1));
1273 #endif
1274 		retcode = rc_addr + thumb;
1275 	}
1276 
1277 	env->regs[0] = usig;
1278 	env->regs[13] = frame_addr;
1279 	env->regs[14] = retcode;
1280 	env->regs[15] = handler & (thumb ? ~1 : ~3);
1281 	env->thumb = thumb;
1282 
1283 #if 0
1284 #ifdef TARGET_CONFIG_CPU_32
1285 	env->cpsr = cpsr;
1286 #endif
1287 #endif
1288 
1289 	return 0;
1290 }
1291 
1292 static abi_ulong *setup_sigframe_v2_vfp(abi_ulong *regspace, CPUState *env)
1293 {
1294     int i;
1295     struct target_vfp_sigframe *vfpframe;
1296     vfpframe = (struct target_vfp_sigframe *)regspace;
1297     __put_user(TARGET_VFP_MAGIC, &vfpframe->magic);
1298     __put_user(sizeof(*vfpframe), &vfpframe->size);
1299     for (i = 0; i < 32; i++) {
1300         __put_user(env->vfp.regs[i], &vfpframe->ufp.fpregs[i]);
1301     }
1302     __put_user(vfp_get_fpscr(env), &vfpframe->ufp.fpscr);
1303     __put_user(env->vfp.xregs[ARM_VFP_FPEXC], &vfpframe->ufp_exc.fpexc);
1304     __put_user(env->vfp.xregs[ARM_VFP_FPINST], &vfpframe->ufp_exc.fpinst);
1305     __put_user(env->vfp.xregs[ARM_VFP_FPINST2], &vfpframe->ufp_exc.fpinst2);
1306     return (abi_ulong*)(vfpframe+1);
1307 }
1308 
1309 static abi_ulong *setup_sigframe_v2_iwmmxt(abi_ulong *regspace, CPUState *env)
1310 {
1311     int i;
1312     struct target_iwmmxt_sigframe *iwmmxtframe;
1313     iwmmxtframe = (struct target_iwmmxt_sigframe *)regspace;
1314     __put_user(TARGET_IWMMXT_MAGIC, &iwmmxtframe->magic);
1315     __put_user(sizeof(*iwmmxtframe), &iwmmxtframe->size);
1316     for (i = 0; i < 16; i++) {
1317         __put_user(env->iwmmxt.regs[i], &iwmmxtframe->regs[i]);
1318     }
1319     __put_user(env->vfp.xregs[ARM_IWMMXT_wCSSF], &iwmmxtframe->wcssf);
1320     __put_user(env->vfp.xregs[ARM_IWMMXT_wCASF], &iwmmxtframe->wcssf);
1321     __put_user(env->vfp.xregs[ARM_IWMMXT_wCGR0], &iwmmxtframe->wcgr0);
1322     __put_user(env->vfp.xregs[ARM_IWMMXT_wCGR1], &iwmmxtframe->wcgr1);
1323     __put_user(env->vfp.xregs[ARM_IWMMXT_wCGR2], &iwmmxtframe->wcgr2);
1324     __put_user(env->vfp.xregs[ARM_IWMMXT_wCGR3], &iwmmxtframe->wcgr3);
1325     return (abi_ulong*)(iwmmxtframe+1);
1326 }
1327 
1328 static void setup_sigframe_v2(struct target_ucontext_v2 *uc,
1329                               target_sigset_t *set, CPUState *env)
1330 {
1331     struct target_sigaltstack stack;
1332     int i;
1333     abi_ulong *regspace;
1334 
1335     /* Clear all the bits of the ucontext we don't use.  */
1336     memset(uc, 0, offsetof(struct target_ucontext_v2, tuc_mcontext));
1337 
1338     memset(&stack, 0, sizeof(stack));
1339     __put_user(target_sigaltstack_used.ss_sp, &stack.ss_sp);
1340     __put_user(target_sigaltstack_used.ss_size, &stack.ss_size);
1341     __put_user(sas_ss_flags(get_sp_from_cpustate(env)), &stack.ss_flags);
1342     memcpy(&uc->tuc_stack, &stack, sizeof(stack));
1343 
1344     setup_sigcontext(&uc->tuc_mcontext, env, set->sig[0]);
1345     /* Save coprocessor signal frame.  */
1346     regspace = uc->tuc_regspace;
1347     if (arm_feature(env, ARM_FEATURE_VFP)) {
1348         regspace = setup_sigframe_v2_vfp(regspace, env);
1349     }
1350     if (arm_feature(env, ARM_FEATURE_IWMMXT)) {
1351         regspace = setup_sigframe_v2_iwmmxt(regspace, env);
1352     }
1353 
1354     /* Write terminating magic word */
1355     __put_user(0, regspace);
1356 
1357     for(i = 0; i < TARGET_NSIG_WORDS; i++) {
1358         __put_user(set->sig[i], &uc->tuc_sigmask.sig[i]);
1359     }
1360 }
1361 
1362 /* compare linux/arch/arm/kernel/signal.c:setup_frame() */
1363 static void setup_frame_v1(int usig, struct target_sigaction *ka,
1364 			   target_sigset_t *set, CPUState *regs)
1365 {
1366 	struct sigframe_v1 *frame;
1367 	abi_ulong frame_addr = get_sigframe(ka, regs, sizeof(*frame));
1368 	int i;
1369 
1370 	if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
1371 		return;
1372 
1373 	setup_sigcontext(&frame->sc, regs, set->sig[0]);
1374 
1375         for(i = 1; i < TARGET_NSIG_WORDS; i++) {
1376             if (__put_user(set->sig[i], &frame->extramask[i - 1]))
1377                 goto end;
1378 	}
1379 
1380         setup_return(regs, ka, &frame->retcode, frame_addr, usig,
1381                      frame_addr + offsetof(struct sigframe_v1, retcode));
1382 
1383 end:
1384 	unlock_user_struct(frame, frame_addr, 1);
1385 }
1386 
1387 static void setup_frame_v2(int usig, struct target_sigaction *ka,
1388 			   target_sigset_t *set, CPUState *regs)
1389 {
1390 	struct sigframe_v2 *frame;
1391 	abi_ulong frame_addr = get_sigframe(ka, regs, sizeof(*frame));
1392 
1393 	if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
1394 		return;
1395 
1396         setup_sigframe_v2(&frame->uc, set, regs);
1397 
1398         setup_return(regs, ka, &frame->retcode, frame_addr, usig,
1399                      frame_addr + offsetof(struct sigframe_v2, retcode));
1400 
1401 	unlock_user_struct(frame, frame_addr, 1);
1402 }
1403 
1404 static void setup_frame(int usig, struct target_sigaction *ka,
1405 			target_sigset_t *set, CPUState *regs)
1406 {
1407     if (get_osversion() >= 0x020612) {
1408         setup_frame_v2(usig, ka, set, regs);
1409     } else {
1410         setup_frame_v1(usig, ka, set, regs);
1411     }
1412 }
1413 
1414 /* compare linux/arch/arm/kernel/signal.c:setup_rt_frame() */
1415 static void setup_rt_frame_v1(int usig, struct target_sigaction *ka,
1416                               target_siginfo_t *info,
1417 			      target_sigset_t *set, CPUState *env)
1418 {
1419 	struct rt_sigframe_v1 *frame;
1420 	abi_ulong frame_addr = get_sigframe(ka, env, sizeof(*frame));
1421 	struct target_sigaltstack stack;
1422 	int i;
1423         abi_ulong info_addr, uc_addr;
1424 
1425 	if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
1426             return /* 1 */;
1427 
1428         info_addr = frame_addr + offsetof(struct rt_sigframe_v1, info);
1429 	__put_user(info_addr, &frame->pinfo);
1430         uc_addr = frame_addr + offsetof(struct rt_sigframe_v1, uc);
1431 	__put_user(uc_addr, &frame->puc);
1432 	copy_siginfo_to_user(&frame->info, info);
1433 
1434 	/* Clear all the bits of the ucontext we don't use.  */
1435 	memset(&frame->uc, 0, offsetof(struct target_ucontext_v1, tuc_mcontext));
1436 
1437         memset(&stack, 0, sizeof(stack));
1438         __put_user(target_sigaltstack_used.ss_sp, &stack.ss_sp);
1439         __put_user(target_sigaltstack_used.ss_size, &stack.ss_size);
1440         __put_user(sas_ss_flags(get_sp_from_cpustate(env)), &stack.ss_flags);
1441         memcpy(&frame->uc.tuc_stack, &stack, sizeof(stack));
1442 
1443 	setup_sigcontext(&frame->uc.tuc_mcontext, env, set->sig[0]);
1444         for(i = 0; i < TARGET_NSIG_WORDS; i++) {
1445             if (__put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]))
1446                 goto end;
1447         }
1448 
1449         setup_return(env, ka, &frame->retcode, frame_addr, usig,
1450                      frame_addr + offsetof(struct rt_sigframe_v1, retcode));
1451 
1452         env->regs[1] = info_addr;
1453         env->regs[2] = uc_addr;
1454 
1455 end:
1456 	unlock_user_struct(frame, frame_addr, 1);
1457 }
1458 
1459 static void setup_rt_frame_v2(int usig, struct target_sigaction *ka,
1460                               target_siginfo_t *info,
1461                               target_sigset_t *set, CPUState *env)
1462 {
1463 	struct rt_sigframe_v2 *frame;
1464 	abi_ulong frame_addr = get_sigframe(ka, env, sizeof(*frame));
1465         abi_ulong info_addr, uc_addr;
1466 
1467 	if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
1468             return /* 1 */;
1469 
1470         info_addr = frame_addr + offsetof(struct rt_sigframe_v2, info);
1471         uc_addr = frame_addr + offsetof(struct rt_sigframe_v2, uc);
1472 	copy_siginfo_to_user(&frame->info, info);
1473 
1474         setup_sigframe_v2(&frame->uc, set, env);
1475 
1476         setup_return(env, ka, &frame->retcode, frame_addr, usig,
1477                      frame_addr + offsetof(struct rt_sigframe_v2, retcode));
1478 
1479         env->regs[1] = info_addr;
1480         env->regs[2] = uc_addr;
1481 
1482 	unlock_user_struct(frame, frame_addr, 1);
1483 }
1484 
1485 static void setup_rt_frame(int usig, struct target_sigaction *ka,
1486                            target_siginfo_t *info,
1487 			   target_sigset_t *set, CPUState *env)
1488 {
1489     if (get_osversion() >= 0x020612) {
1490         setup_rt_frame_v2(usig, ka, info, set, env);
1491     } else {
1492         setup_rt_frame_v1(usig, ka, info, set, env);
1493     }
1494 }
1495 
1496 static int
1497 restore_sigcontext(CPUState *env, struct target_sigcontext *sc)
1498 {
1499 	int err = 0;
1500         uint32_t cpsr;
1501 
1502 	__get_user_error(env->regs[0], &sc->arm_r0, err);
1503 	__get_user_error(env->regs[1], &sc->arm_r1, err);
1504 	__get_user_error(env->regs[2], &sc->arm_r2, err);
1505 	__get_user_error(env->regs[3], &sc->arm_r3, err);
1506 	__get_user_error(env->regs[4], &sc->arm_r4, err);
1507 	__get_user_error(env->regs[5], &sc->arm_r5, err);
1508 	__get_user_error(env->regs[6], &sc->arm_r6, err);
1509 	__get_user_error(env->regs[7], &sc->arm_r7, err);
1510 	__get_user_error(env->regs[8], &sc->arm_r8, err);
1511 	__get_user_error(env->regs[9], &sc->arm_r9, err);
1512 	__get_user_error(env->regs[10], &sc->arm_r10, err);
1513 	__get_user_error(env->regs[11], &sc->arm_fp, err);
1514 	__get_user_error(env->regs[12], &sc->arm_ip, err);
1515 	__get_user_error(env->regs[13], &sc->arm_sp, err);
1516 	__get_user_error(env->regs[14], &sc->arm_lr, err);
1517 	__get_user_error(env->regs[15], &sc->arm_pc, err);
1518 #ifdef TARGET_CONFIG_CPU_32
1519 	__get_user_error(cpsr, &sc->arm_cpsr, err);
1520         cpsr_write(env, cpsr, CPSR_USER | CPSR_EXEC);
1521 #endif
1522 
1523 	err |= !valid_user_regs(env);
1524 
1525 	return err;
1526 }
1527 
1528 static long do_sigreturn_v1(CPUState *env)
1529 {
1530         abi_ulong frame_addr;
1531 	struct sigframe_v1 *frame;
1532 	target_sigset_t set;
1533         sigset_t host_set;
1534         int i;
1535 
1536 	/*
1537 	 * Since we stacked the signal on a 64-bit boundary,
1538 	 * then 'sp' should be word aligned here.  If it's
1539 	 * not, then the user is trying to mess with us.
1540 	 */
1541 	if (env->regs[13] & 7)
1542 		goto badframe;
1543 
1544         frame_addr = env->regs[13];
1545 	if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1546                 goto badframe;
1547 
1548 	if (__get_user(set.sig[0], &frame->sc.oldmask))
1549             goto badframe;
1550         for(i = 1; i < TARGET_NSIG_WORDS; i++) {
1551             if (__get_user(set.sig[i], &frame->extramask[i - 1]))
1552                 goto badframe;
1553         }
1554 
1555         target_to_host_sigset_internal(&host_set, &set);
1556         sigprocmask(SIG_SETMASK, &host_set, NULL);
1557 
1558 	if (restore_sigcontext(env, &frame->sc))
1559 		goto badframe;
1560 
1561 #if 0
1562 	/* Send SIGTRAP if we're single-stepping */
1563 	if (ptrace_cancel_bpt(current))
1564 		send_sig(SIGTRAP, current, 1);
1565 #endif
1566 	unlock_user_struct(frame, frame_addr, 0);
1567         return env->regs[0];
1568 
1569 badframe:
1570 	unlock_user_struct(frame, frame_addr, 0);
1571         force_sig(TARGET_SIGSEGV /* , current */);
1572 	return 0;
1573 }
1574 
1575 static abi_ulong *restore_sigframe_v2_vfp(CPUState *env, abi_ulong *regspace)
1576 {
1577     int i;
1578     abi_ulong magic, sz;
1579     uint32_t fpscr, fpexc;
1580     struct target_vfp_sigframe *vfpframe;
1581     vfpframe = (struct target_vfp_sigframe *)regspace;
1582 
1583     __get_user(magic, &vfpframe->magic);
1584     __get_user(sz, &vfpframe->size);
1585     if (magic != TARGET_VFP_MAGIC || sz != sizeof(*vfpframe)) {
1586         return 0;
1587     }
1588     for (i = 0; i < 32; i++) {
1589         __get_user(env->vfp.regs[i], &vfpframe->ufp.fpregs[i]);
1590     }
1591     __get_user(fpscr, &vfpframe->ufp.fpscr);
1592     vfp_set_fpscr(env, fpscr);
1593     __get_user(fpexc, &vfpframe->ufp_exc.fpexc);
1594     /* Sanitise FPEXC: ensure VFP is enabled, FPINST2 is invalid
1595      * and the exception flag is cleared
1596      */
1597     fpexc |= (1 << 30);
1598     fpexc &= ~((1 << 31) | (1 << 28));
1599     env->vfp.xregs[ARM_VFP_FPEXC] = fpexc;
1600     __get_user(env->vfp.xregs[ARM_VFP_FPINST], &vfpframe->ufp_exc.fpinst);
1601     __get_user(env->vfp.xregs[ARM_VFP_FPINST2], &vfpframe->ufp_exc.fpinst2);
1602     return (abi_ulong*)(vfpframe + 1);
1603 }
1604 
1605 static int do_sigframe_return_v2(CPUState *env, target_ulong frame_addr,
1606                                  struct target_ucontext_v2 *uc)
1607 {
1608     sigset_t host_set;
1609     abi_ulong *regspace;
1610 
1611     target_to_host_sigset(&host_set, &uc->tuc_sigmask);
1612     sigprocmask(SIG_SETMASK, &host_set, NULL);
1613 
1614     if (restore_sigcontext(env, &uc->tuc_mcontext))
1615         return 1;
1616 
1617     /* Restore coprocessor signal frame */
1618     regspace = uc->tuc_regspace;
1619     if (arm_feature(env, ARM_FEATURE_VFP)) {
1620         regspace = restore_sigframe_v2_vfp(env, regspace);
1621         if (!regspace) {
1622             return 1;
1623         }
1624     }
1625 
1626     if (do_sigaltstack(frame_addr + offsetof(struct target_ucontext_v2, tuc_stack), 0, get_sp_from_cpustate(env)) == -EFAULT)
1627         return 1;
1628 
1629 #if 0
1630     /* Send SIGTRAP if we're single-stepping */
1631     if (ptrace_cancel_bpt(current))
1632             send_sig(SIGTRAP, current, 1);
1633 #endif
1634 
1635     return 0;
1636 }
1637 
1638 static long do_sigreturn_v2(CPUState *env)
1639 {
1640         abi_ulong frame_addr;
1641 	struct sigframe_v2 *frame;
1642 
1643 	/*
1644 	 * Since we stacked the signal on a 64-bit boundary,
1645 	 * then 'sp' should be word aligned here.  If it's
1646 	 * not, then the user is trying to mess with us.
1647 	 */
1648 	if (env->regs[13] & 7)
1649 		goto badframe;
1650 
1651         frame_addr = env->regs[13];
1652 	if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1653                 goto badframe;
1654 
1655         if (do_sigframe_return_v2(env, frame_addr, &frame->uc))
1656                 goto badframe;
1657 
1658 	unlock_user_struct(frame, frame_addr, 0);
1659 	return env->regs[0];
1660 
1661 badframe:
1662 	unlock_user_struct(frame, frame_addr, 0);
1663         force_sig(TARGET_SIGSEGV /* , current */);
1664 	return 0;
1665 }
1666 
1667 long do_sigreturn(CPUState *env)
1668 {
1669     if (get_osversion() >= 0x020612) {
1670         return do_sigreturn_v2(env);
1671     } else {
1672         return do_sigreturn_v1(env);
1673     }
1674 }
1675 
1676 static long do_rt_sigreturn_v1(CPUState *env)
1677 {
1678         abi_ulong frame_addr;
1679 	struct rt_sigframe_v1 *frame;
1680         sigset_t host_set;
1681 
1682 	/*
1683 	 * Since we stacked the signal on a 64-bit boundary,
1684 	 * then 'sp' should be word aligned here.  If it's
1685 	 * not, then the user is trying to mess with us.
1686 	 */
1687 	if (env->regs[13] & 7)
1688 		goto badframe;
1689 
1690         frame_addr = env->regs[13];
1691 	if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1692                 goto badframe;
1693 
1694         target_to_host_sigset(&host_set, &frame->uc.tuc_sigmask);
1695         sigprocmask(SIG_SETMASK, &host_set, NULL);
1696 
1697 	if (restore_sigcontext(env, &frame->uc.tuc_mcontext))
1698 		goto badframe;
1699 
1700 	if (do_sigaltstack(frame_addr + offsetof(struct rt_sigframe_v1, uc.tuc_stack), 0, get_sp_from_cpustate(env)) == -EFAULT)
1701 		goto badframe;
1702 
1703 #if 0
1704 	/* Send SIGTRAP if we're single-stepping */
1705 	if (ptrace_cancel_bpt(current))
1706 		send_sig(SIGTRAP, current, 1);
1707 #endif
1708 	unlock_user_struct(frame, frame_addr, 0);
1709 	return env->regs[0];
1710 
1711 badframe:
1712 	unlock_user_struct(frame, frame_addr, 0);
1713         force_sig(TARGET_SIGSEGV /* , current */);
1714 	return 0;
1715 }
1716 
1717 static long do_rt_sigreturn_v2(CPUState *env)
1718 {
1719         abi_ulong frame_addr;
1720 	struct rt_sigframe_v2 *frame;
1721 
1722 	/*
1723 	 * Since we stacked the signal on a 64-bit boundary,
1724 	 * then 'sp' should be word aligned here.  If it's
1725 	 * not, then the user is trying to mess with us.
1726 	 */
1727 	if (env->regs[13] & 7)
1728 		goto badframe;
1729 
1730         frame_addr = env->regs[13];
1731 	if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1732                 goto badframe;
1733 
1734         if (do_sigframe_return_v2(env, frame_addr, &frame->uc))
1735                 goto badframe;
1736 
1737 	unlock_user_struct(frame, frame_addr, 0);
1738 	return env->regs[0];
1739 
1740 badframe:
1741 	unlock_user_struct(frame, frame_addr, 0);
1742         force_sig(TARGET_SIGSEGV /* , current */);
1743 	return 0;
1744 }
1745 
1746 long do_rt_sigreturn(CPUState *env)
1747 {
1748     if (get_osversion() >= 0x020612) {
1749         return do_rt_sigreturn_v2(env);
1750     } else {
1751         return do_rt_sigreturn_v1(env);
1752     }
1753 }
1754 
1755 #elif defined(TARGET_SPARC)
1756 
1757 #define __SUNOS_MAXWIN   31
1758 
1759 /* This is what SunOS does, so shall I. */
1760 struct target_sigcontext {
1761         abi_ulong sigc_onstack;      /* state to restore */
1762 
1763         abi_ulong sigc_mask;         /* sigmask to restore */
1764         abi_ulong sigc_sp;           /* stack pointer */
1765         abi_ulong sigc_pc;           /* program counter */
1766         abi_ulong sigc_npc;          /* next program counter */
1767         abi_ulong sigc_psr;          /* for condition codes etc */
1768         abi_ulong sigc_g1;           /* User uses these two registers */
1769         abi_ulong sigc_o0;           /* within the trampoline code. */
1770 
1771         /* Now comes information regarding the users window set
1772          * at the time of the signal.
1773          */
1774         abi_ulong sigc_oswins;       /* outstanding windows */
1775 
1776         /* stack ptrs for each regwin buf */
1777         char *sigc_spbuf[__SUNOS_MAXWIN];
1778 
1779         /* Windows to restore after signal */
1780         struct {
1781                 abi_ulong locals[8];
1782                 abi_ulong ins[8];
1783         } sigc_wbuf[__SUNOS_MAXWIN];
1784 };
1785 /* A Sparc stack frame */
1786 struct sparc_stackf {
1787         abi_ulong locals[8];
1788         abi_ulong ins[6];
1789         struct sparc_stackf *fp;
1790         abi_ulong callers_pc;
1791         char *structptr;
1792         abi_ulong xargs[6];
1793         abi_ulong xxargs[1];
1794 };
1795 
1796 typedef struct {
1797         struct {
1798                 abi_ulong psr;
1799                 abi_ulong pc;
1800                 abi_ulong npc;
1801                 abi_ulong y;
1802                 abi_ulong u_regs[16]; /* globals and ins */
1803         }               si_regs;
1804         int             si_mask;
1805 } __siginfo_t;
1806 
1807 typedef struct {
1808         unsigned   long si_float_regs [32];
1809         unsigned   long si_fsr;
1810         unsigned   long si_fpqdepth;
1811         struct {
1812                 unsigned long *insn_addr;
1813                 unsigned long insn;
1814         } si_fpqueue [16];
1815 } qemu_siginfo_fpu_t;
1816 
1817 
1818 struct target_signal_frame {
1819 	struct sparc_stackf	ss;
1820 	__siginfo_t		info;
1821 	abi_ulong               fpu_save;
1822 	abi_ulong		insns[2] __attribute__ ((aligned (8)));
1823 	abi_ulong		extramask[TARGET_NSIG_WORDS - 1];
1824 	abi_ulong		extra_size; /* Should be 0 */
1825 	qemu_siginfo_fpu_t	fpu_state;
1826 };
1827 struct target_rt_signal_frame {
1828 	struct sparc_stackf	ss;
1829 	siginfo_t		info;
1830 	abi_ulong		regs[20];
1831 	sigset_t		mask;
1832 	abi_ulong               fpu_save;
1833 	unsigned int		insns[2];
1834 	stack_t			stack;
1835 	unsigned int		extra_size; /* Should be 0 */
1836 	qemu_siginfo_fpu_t	fpu_state;
1837 };
1838 
1839 #define UREG_O0        16
1840 #define UREG_O6        22
1841 #define UREG_I0        0
1842 #define UREG_I1        1
1843 #define UREG_I2        2
1844 #define UREG_I3        3
1845 #define UREG_I4        4
1846 #define UREG_I5        5
1847 #define UREG_I6        6
1848 #define UREG_I7        7
1849 #define UREG_L0	       8
1850 #define UREG_FP        UREG_I6
1851 #define UREG_SP        UREG_O6
1852 
1853 static inline abi_ulong get_sigframe(struct target_sigaction *sa,
1854                                      CPUState *env, unsigned long framesize)
1855 {
1856 	abi_ulong sp;
1857 
1858 	sp = env->regwptr[UREG_FP];
1859 
1860 	/* This is the X/Open sanctioned signal stack switching.  */
1861 	if (sa->sa_flags & TARGET_SA_ONSTACK) {
1862             if (!on_sig_stack(sp)
1863                 && !((target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size) & 7))
1864                 sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
1865 	}
1866 	return sp - framesize;
1867 }
1868 
1869 static int
1870 setup___siginfo(__siginfo_t *si, CPUState *env, abi_ulong mask)
1871 {
1872 	int err = 0, i;
1873 
1874 	err |= __put_user(env->psr, &si->si_regs.psr);
1875 	err |= __put_user(env->pc, &si->si_regs.pc);
1876 	err |= __put_user(env->npc, &si->si_regs.npc);
1877 	err |= __put_user(env->y, &si->si_regs.y);
1878 	for (i=0; i < 8; i++) {
1879 		err |= __put_user(env->gregs[i], &si->si_regs.u_regs[i]);
1880 	}
1881 	for (i=0; i < 8; i++) {
1882 		err |= __put_user(env->regwptr[UREG_I0 + i], &si->si_regs.u_regs[i+8]);
1883 	}
1884 	err |= __put_user(mask, &si->si_mask);
1885 	return err;
1886 }
1887 
1888 #if 0
1889 static int
1890 setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/
1891 		 CPUState *env, unsigned long mask)
1892 {
1893 	int err = 0;
1894 
1895 	err |= __put_user(mask, &sc->sigc_mask);
1896 	err |= __put_user(env->regwptr[UREG_SP], &sc->sigc_sp);
1897 	err |= __put_user(env->pc, &sc->sigc_pc);
1898 	err |= __put_user(env->npc, &sc->sigc_npc);
1899 	err |= __put_user(env->psr, &sc->sigc_psr);
1900 	err |= __put_user(env->gregs[1], &sc->sigc_g1);
1901 	err |= __put_user(env->regwptr[UREG_O0], &sc->sigc_o0);
1902 
1903 	return err;
1904 }
1905 #endif
1906 #define NF_ALIGNEDSZ  (((sizeof(struct target_signal_frame) + 7) & (~7)))
1907 
1908 static void setup_frame(int sig, struct target_sigaction *ka,
1909 			target_sigset_t *set, CPUState *env)
1910 {
1911         abi_ulong sf_addr;
1912 	struct target_signal_frame *sf;
1913 	int sigframe_size, err, i;
1914 
1915 	/* 1. Make sure everything is clean */
1916 	//synchronize_user_stack();
1917 
1918         sigframe_size = NF_ALIGNEDSZ;
1919 	sf_addr = get_sigframe(ka, env, sigframe_size);
1920 
1921         sf = lock_user(VERIFY_WRITE, sf_addr,
1922                        sizeof(struct target_signal_frame), 0);
1923         if (!sf)
1924 		goto sigsegv;
1925 
1926 	//fprintf(stderr, "sf: %x pc %x fp %x sp %x\n", sf, env->pc, env->regwptr[UREG_FP], env->regwptr[UREG_SP]);
1927 #if 0
1928 	if (invalid_frame_pointer(sf, sigframe_size))
1929 		goto sigill_and_return;
1930 #endif
1931 	/* 2. Save the current process state */
1932 	err = setup___siginfo(&sf->info, env, set->sig[0]);
1933 	err |= __put_user(0, &sf->extra_size);
1934 
1935 	//err |= save_fpu_state(regs, &sf->fpu_state);
1936 	//err |= __put_user(&sf->fpu_state, &sf->fpu_save);
1937 
1938 	err |= __put_user(set->sig[0], &sf->info.si_mask);
1939 	for (i = 0; i < TARGET_NSIG_WORDS - 1; i++) {
1940 		err |= __put_user(set->sig[i + 1], &sf->extramask[i]);
1941 	}
1942 
1943 	for (i = 0; i < 8; i++) {
1944 	  	err |= __put_user(env->regwptr[i + UREG_L0], &sf->ss.locals[i]);
1945 	}
1946 	for (i = 0; i < 8; i++) {
1947 	  	err |= __put_user(env->regwptr[i + UREG_I0], &sf->ss.ins[i]);
1948 	}
1949 	if (err)
1950 		goto sigsegv;
1951 
1952 	/* 3. signal handler back-trampoline and parameters */
1953 	env->regwptr[UREG_FP] = sf_addr;
1954 	env->regwptr[UREG_I0] = sig;
1955 	env->regwptr[UREG_I1] = sf_addr +
1956                 offsetof(struct target_signal_frame, info);
1957 	env->regwptr[UREG_I2] = sf_addr +
1958                 offsetof(struct target_signal_frame, info);
1959 
1960 	/* 4. signal handler */
1961 	env->pc = ka->_sa_handler;
1962 	env->npc = (env->pc + 4);
1963 	/* 5. return to kernel instructions */
1964 	if (ka->sa_restorer)
1965 		env->regwptr[UREG_I7] = ka->sa_restorer;
1966 	else {
1967                 uint32_t val32;
1968 
1969 		env->regwptr[UREG_I7] = sf_addr +
1970                         offsetof(struct target_signal_frame, insns) - 2 * 4;
1971 
1972 		/* mov __NR_sigreturn, %g1 */
1973                 val32 = 0x821020d8;
1974 		err |= __put_user(val32, &sf->insns[0]);
1975 
1976 		/* t 0x10 */
1977                 val32 = 0x91d02010;
1978 		err |= __put_user(val32, &sf->insns[1]);
1979 		if (err)
1980 			goto sigsegv;
1981 
1982 		/* Flush instruction space. */
1983 		//flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0]));
1984                 //		tb_flush(env);
1985 	}
1986         unlock_user(sf, sf_addr, sizeof(struct target_signal_frame));
1987 	return;
1988 #if 0
1989 sigill_and_return:
1990 	force_sig(TARGET_SIGILL);
1991 #endif
1992 sigsegv:
1993 	//fprintf(stderr, "force_sig\n");
1994         unlock_user(sf, sf_addr, sizeof(struct target_signal_frame));
1995 	force_sig(TARGET_SIGSEGV);
1996 }
1997 static inline int
1998 restore_fpu_state(CPUState *env, qemu_siginfo_fpu_t *fpu)
1999 {
2000         int err;
2001 #if 0
2002 #ifdef CONFIG_SMP
2003         if (current->flags & PF_USEDFPU)
2004                 regs->psr &= ~PSR_EF;
2005 #else
2006         if (current == last_task_used_math) {
2007                 last_task_used_math = 0;
2008                 regs->psr &= ~PSR_EF;
2009         }
2010 #endif
2011         current->used_math = 1;
2012         current->flags &= ~PF_USEDFPU;
2013 #endif
2014 #if 0
2015         if (verify_area (VERIFY_READ, fpu, sizeof(*fpu)))
2016                 return -EFAULT;
2017 #endif
2018 
2019 #if 0
2020         /* XXX: incorrect */
2021         err = __copy_from_user(&env->fpr[0], &fpu->si_float_regs[0],
2022 	                             (sizeof(unsigned long) * 32));
2023 #endif
2024         err |= __get_user(env->fsr, &fpu->si_fsr);
2025 #if 0
2026         err |= __get_user(current->thread.fpqdepth, &fpu->si_fpqdepth);
2027         if (current->thread.fpqdepth != 0)
2028                 err |= __copy_from_user(&current->thread.fpqueue[0],
2029                                         &fpu->si_fpqueue[0],
2030                                         ((sizeof(unsigned long) +
2031                                         (sizeof(unsigned long *)))*16));
2032 #endif
2033         return err;
2034 }
2035 
2036 
2037 static void setup_rt_frame(int sig, struct target_sigaction *ka,
2038                            target_siginfo_t *info,
2039 			   target_sigset_t *set, CPUState *env)
2040 {
2041     fprintf(stderr, "setup_rt_frame: not implemented\n");
2042 }
2043 
2044 long do_sigreturn(CPUState *env)
2045 {
2046         abi_ulong sf_addr;
2047         struct target_signal_frame *sf;
2048         uint32_t up_psr, pc, npc;
2049         target_sigset_t set;
2050         sigset_t host_set;
2051         abi_ulong fpu_save_addr;
2052         int err, i;
2053 
2054         sf_addr = env->regwptr[UREG_FP];
2055         if (!lock_user_struct(VERIFY_READ, sf, sf_addr, 1))
2056                 goto segv_and_exit;
2057 #if 0
2058 	fprintf(stderr, "sigreturn\n");
2059 	fprintf(stderr, "sf: %x pc %x fp %x sp %x\n", sf, env->pc, env->regwptr[UREG_FP], env->regwptr[UREG_SP]);
2060 #endif
2061 	//cpu_dump_state(env, stderr, fprintf, 0);
2062 
2063         /* 1. Make sure we are not getting garbage from the user */
2064 
2065         if (sf_addr & 3)
2066                 goto segv_and_exit;
2067 
2068         err = __get_user(pc,  &sf->info.si_regs.pc);
2069         err |= __get_user(npc, &sf->info.si_regs.npc);
2070 
2071         if ((pc | npc) & 3)
2072                 goto segv_and_exit;
2073 
2074         /* 2. Restore the state */
2075         err |= __get_user(up_psr, &sf->info.si_regs.psr);
2076 
2077         /* User can only change condition codes and FPU enabling in %psr. */
2078         env->psr = (up_psr & (PSR_ICC /* | PSR_EF */))
2079                   | (env->psr & ~(PSR_ICC /* | PSR_EF */));
2080 
2081 	env->pc = pc;
2082 	env->npc = npc;
2083         err |= __get_user(env->y, &sf->info.si_regs.y);
2084 	for (i=0; i < 8; i++) {
2085 		err |= __get_user(env->gregs[i], &sf->info.si_regs.u_regs[i]);
2086 	}
2087 	for (i=0; i < 8; i++) {
2088 		err |= __get_user(env->regwptr[i + UREG_I0], &sf->info.si_regs.u_regs[i+8]);
2089 	}
2090 
2091         err |= __get_user(fpu_save_addr, &sf->fpu_save);
2092 
2093         //if (fpu_save)
2094         //        err |= restore_fpu_state(env, fpu_save);
2095 
2096         /* This is pretty much atomic, no amount locking would prevent
2097          * the races which exist anyways.
2098          */
2099         err |= __get_user(set.sig[0], &sf->info.si_mask);
2100         for(i = 1; i < TARGET_NSIG_WORDS; i++) {
2101             err |= (__get_user(set.sig[i], &sf->extramask[i - 1]));
2102         }
2103 
2104         target_to_host_sigset_internal(&host_set, &set);
2105         sigprocmask(SIG_SETMASK, &host_set, NULL);
2106 
2107         if (err)
2108                 goto segv_and_exit;
2109         unlock_user_struct(sf, sf_addr, 0);
2110         return env->regwptr[0];
2111 
2112 segv_and_exit:
2113         unlock_user_struct(sf, sf_addr, 0);
2114 	force_sig(TARGET_SIGSEGV);
2115 }
2116 
2117 long do_rt_sigreturn(CPUState *env)
2118 {
2119     fprintf(stderr, "do_rt_sigreturn: not implemented\n");
2120     return -TARGET_ENOSYS;
2121 }
2122 
2123 #if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
2124 #define MC_TSTATE 0
2125 #define MC_PC 1
2126 #define MC_NPC 2
2127 #define MC_Y 3
2128 #define MC_G1 4
2129 #define MC_G2 5
2130 #define MC_G3 6
2131 #define MC_G4 7
2132 #define MC_G5 8
2133 #define MC_G6 9
2134 #define MC_G7 10
2135 #define MC_O0 11
2136 #define MC_O1 12
2137 #define MC_O2 13
2138 #define MC_O3 14
2139 #define MC_O4 15
2140 #define MC_O5 16
2141 #define MC_O6 17
2142 #define MC_O7 18
2143 #define MC_NGREG 19
2144 
2145 typedef abi_ulong target_mc_greg_t;
2146 typedef target_mc_greg_t target_mc_gregset_t[MC_NGREG];
2147 
2148 struct target_mc_fq {
2149     abi_ulong *mcfq_addr;
2150     uint32_t mcfq_insn;
2151 };
2152 
2153 struct target_mc_fpu {
2154     union {
2155         uint32_t sregs[32];
2156         uint64_t dregs[32];
2157         //uint128_t qregs[16];
2158     } mcfpu_fregs;
2159     abi_ulong mcfpu_fsr;
2160     abi_ulong mcfpu_fprs;
2161     abi_ulong mcfpu_gsr;
2162     struct target_mc_fq *mcfpu_fq;
2163     unsigned char mcfpu_qcnt;
2164     unsigned char mcfpu_qentsz;
2165     unsigned char mcfpu_enab;
2166 };
2167 typedef struct target_mc_fpu target_mc_fpu_t;
2168 
2169 typedef struct {
2170     target_mc_gregset_t mc_gregs;
2171     target_mc_greg_t mc_fp;
2172     target_mc_greg_t mc_i7;
2173     target_mc_fpu_t mc_fpregs;
2174 } target_mcontext_t;
2175 
2176 struct target_ucontext {
2177     struct target_ucontext *tuc_link;
2178     abi_ulong tuc_flags;
2179     target_sigset_t tuc_sigmask;
2180     target_mcontext_t tuc_mcontext;
2181 };
2182 
2183 /* A V9 register window */
2184 struct target_reg_window {
2185     abi_ulong locals[8];
2186     abi_ulong ins[8];
2187 };
2188 
2189 #define TARGET_STACK_BIAS 2047
2190 
2191 /* {set, get}context() needed for 64-bit SparcLinux userland. */
2192 void sparc64_set_context(CPUSPARCState *env)
2193 {
2194     abi_ulong ucp_addr;
2195     struct target_ucontext *ucp;
2196     target_mc_gregset_t *grp;
2197     abi_ulong pc, npc, tstate;
2198     abi_ulong fp, i7, w_addr;
2199     unsigned char fenab;
2200     int err;
2201     unsigned int i;
2202 
2203     ucp_addr = env->regwptr[UREG_I0];
2204     if (!lock_user_struct(VERIFY_READ, ucp, ucp_addr, 1))
2205         goto do_sigsegv;
2206     grp  = &ucp->tuc_mcontext.mc_gregs;
2207     err  = __get_user(pc, &((*grp)[MC_PC]));
2208     err |= __get_user(npc, &((*grp)[MC_NPC]));
2209     if (err || ((pc | npc) & 3))
2210         goto do_sigsegv;
2211     if (env->regwptr[UREG_I1]) {
2212         target_sigset_t target_set;
2213         sigset_t set;
2214 
2215         if (TARGET_NSIG_WORDS == 1) {
2216             if (__get_user(target_set.sig[0], &ucp->tuc_sigmask.sig[0]))
2217                 goto do_sigsegv;
2218         } else {
2219             abi_ulong *src, *dst;
2220             src = ucp->tuc_sigmask.sig;
2221             dst = target_set.sig;
2222             for (i = 0; i < sizeof(target_sigset_t) / sizeof(abi_ulong);
2223                  i++, dst++, src++)
2224                 err |= __get_user(*dst, src);
2225             if (err)
2226                 goto do_sigsegv;
2227         }
2228         target_to_host_sigset_internal(&set, &target_set);
2229         sigprocmask(SIG_SETMASK, &set, NULL);
2230     }
2231     env->pc = pc;
2232     env->npc = npc;
2233     err |= __get_user(env->y, &((*grp)[MC_Y]));
2234     err |= __get_user(tstate, &((*grp)[MC_TSTATE]));
2235     env->asi = (tstate >> 24) & 0xff;
2236     cpu_put_ccr(env, tstate >> 32);
2237     cpu_put_cwp64(env, tstate & 0x1f);
2238     err |= __get_user(env->gregs[1], (&(*grp)[MC_G1]));
2239     err |= __get_user(env->gregs[2], (&(*grp)[MC_G2]));
2240     err |= __get_user(env->gregs[3], (&(*grp)[MC_G3]));
2241     err |= __get_user(env->gregs[4], (&(*grp)[MC_G4]));
2242     err |= __get_user(env->gregs[5], (&(*grp)[MC_G5]));
2243     err |= __get_user(env->gregs[6], (&(*grp)[MC_G6]));
2244     err |= __get_user(env->gregs[7], (&(*grp)[MC_G7]));
2245     err |= __get_user(env->regwptr[UREG_I0], (&(*grp)[MC_O0]));
2246     err |= __get_user(env->regwptr[UREG_I1], (&(*grp)[MC_O1]));
2247     err |= __get_user(env->regwptr[UREG_I2], (&(*grp)[MC_O2]));
2248     err |= __get_user(env->regwptr[UREG_I3], (&(*grp)[MC_O3]));
2249     err |= __get_user(env->regwptr[UREG_I4], (&(*grp)[MC_O4]));
2250     err |= __get_user(env->regwptr[UREG_I5], (&(*grp)[MC_O5]));
2251     err |= __get_user(env->regwptr[UREG_I6], (&(*grp)[MC_O6]));
2252     err |= __get_user(env->regwptr[UREG_I7], (&(*grp)[MC_O7]));
2253 
2254     err |= __get_user(fp, &(ucp->tuc_mcontext.mc_fp));
2255     err |= __get_user(i7, &(ucp->tuc_mcontext.mc_i7));
2256 
2257     w_addr = TARGET_STACK_BIAS+env->regwptr[UREG_I6];
2258     if (put_user(fp, w_addr + offsetof(struct target_reg_window, ins[6]),
2259                  abi_ulong) != 0)
2260         goto do_sigsegv;
2261     if (put_user(i7, w_addr + offsetof(struct target_reg_window, ins[7]),
2262                  abi_ulong) != 0)
2263         goto do_sigsegv;
2264     err |= __get_user(fenab, &(ucp->tuc_mcontext.mc_fpregs.mcfpu_enab));
2265     err |= __get_user(env->fprs, &(ucp->tuc_mcontext.mc_fpregs.mcfpu_fprs));
2266     {
2267         uint32_t *src, *dst;
2268         src = ucp->tuc_mcontext.mc_fpregs.mcfpu_fregs.sregs;
2269         dst = env->fpr;
2270         /* XXX: check that the CPU storage is the same as user context */
2271         for (i = 0; i < 64; i++, dst++, src++)
2272             err |= __get_user(*dst, src);
2273     }
2274     err |= __get_user(env->fsr,
2275                       &(ucp->tuc_mcontext.mc_fpregs.mcfpu_fsr));
2276     err |= __get_user(env->gsr,
2277                       &(ucp->tuc_mcontext.mc_fpregs.mcfpu_gsr));
2278     if (err)
2279         goto do_sigsegv;
2280     unlock_user_struct(ucp, ucp_addr, 0);
2281     return;
2282  do_sigsegv:
2283     unlock_user_struct(ucp, ucp_addr, 0);
2284     force_sig(TARGET_SIGSEGV);
2285 }
2286 
2287 void sparc64_get_context(CPUSPARCState *env)
2288 {
2289     abi_ulong ucp_addr;
2290     struct target_ucontext *ucp;
2291     target_mc_gregset_t *grp;
2292     target_mcontext_t *mcp;
2293     abi_ulong fp, i7, w_addr;
2294     int err;
2295     unsigned int i;
2296     target_sigset_t target_set;
2297     sigset_t set;
2298 
2299     ucp_addr = env->regwptr[UREG_I0];
2300     if (!lock_user_struct(VERIFY_WRITE, ucp, ucp_addr, 0))
2301         goto do_sigsegv;
2302 
2303     mcp = &ucp->tuc_mcontext;
2304     grp = &mcp->mc_gregs;
2305 
2306     /* Skip over the trap instruction, first. */
2307     env->pc = env->npc;
2308     env->npc += 4;
2309 
2310     err = 0;
2311 
2312     sigprocmask(0, NULL, &set);
2313     host_to_target_sigset_internal(&target_set, &set);
2314     if (TARGET_NSIG_WORDS == 1) {
2315         err |= __put_user(target_set.sig[0],
2316                           (abi_ulong *)&ucp->tuc_sigmask);
2317     } else {
2318         abi_ulong *src, *dst;
2319         src = target_set.sig;
2320         dst = ucp->tuc_sigmask.sig;
2321         for (i = 0; i < sizeof(target_sigset_t) / sizeof(abi_ulong);
2322              i++, dst++, src++)
2323             err |= __put_user(*src, dst);
2324         if (err)
2325             goto do_sigsegv;
2326     }
2327 
2328     /* XXX: tstate must be saved properly */
2329     //    err |= __put_user(env->tstate, &((*grp)[MC_TSTATE]));
2330     err |= __put_user(env->pc, &((*grp)[MC_PC]));
2331     err |= __put_user(env->npc, &((*grp)[MC_NPC]));
2332     err |= __put_user(env->y, &((*grp)[MC_Y]));
2333     err |= __put_user(env->gregs[1], &((*grp)[MC_G1]));
2334     err |= __put_user(env->gregs[2], &((*grp)[MC_G2]));
2335     err |= __put_user(env->gregs[3], &((*grp)[MC_G3]));
2336     err |= __put_user(env->gregs[4], &((*grp)[MC_G4]));
2337     err |= __put_user(env->gregs[5], &((*grp)[MC_G5]));
2338     err |= __put_user(env->gregs[6], &((*grp)[MC_G6]));
2339     err |= __put_user(env->gregs[7], &((*grp)[MC_G7]));
2340     err |= __put_user(env->regwptr[UREG_I0], &((*grp)[MC_O0]));
2341     err |= __put_user(env->regwptr[UREG_I1], &((*grp)[MC_O1]));
2342     err |= __put_user(env->regwptr[UREG_I2], &((*grp)[MC_O2]));
2343     err |= __put_user(env->regwptr[UREG_I3], &((*grp)[MC_O3]));
2344     err |= __put_user(env->regwptr[UREG_I4], &((*grp)[MC_O4]));
2345     err |= __put_user(env->regwptr[UREG_I5], &((*grp)[MC_O5]));
2346     err |= __put_user(env->regwptr[UREG_I6], &((*grp)[MC_O6]));
2347     err |= __put_user(env->regwptr[UREG_I7], &((*grp)[MC_O7]));
2348 
2349     w_addr = TARGET_STACK_BIAS+env->regwptr[UREG_I6];
2350     fp = i7 = 0;
2351     if (get_user(fp, w_addr + offsetof(struct target_reg_window, ins[6]),
2352                  abi_ulong) != 0)
2353         goto do_sigsegv;
2354     if (get_user(i7, w_addr + offsetof(struct target_reg_window, ins[7]),
2355                  abi_ulong) != 0)
2356         goto do_sigsegv;
2357     err |= __put_user(fp, &(mcp->mc_fp));
2358     err |= __put_user(i7, &(mcp->mc_i7));
2359 
2360     {
2361         uint32_t *src, *dst;
2362         src = env->fpr;
2363         dst = ucp->tuc_mcontext.mc_fpregs.mcfpu_fregs.sregs;
2364         /* XXX: check that the CPU storage is the same as user context */
2365         for (i = 0; i < 64; i++, dst++, src++)
2366             err |= __put_user(*src, dst);
2367     }
2368     err |= __put_user(env->fsr, &(mcp->mc_fpregs.mcfpu_fsr));
2369     err |= __put_user(env->gsr, &(mcp->mc_fpregs.mcfpu_gsr));
2370     err |= __put_user(env->fprs, &(mcp->mc_fpregs.mcfpu_fprs));
2371 
2372     if (err)
2373         goto do_sigsegv;
2374     unlock_user_struct(ucp, ucp_addr, 1);
2375     return;
2376  do_sigsegv:
2377     unlock_user_struct(ucp, ucp_addr, 1);
2378     force_sig(TARGET_SIGSEGV);
2379 }
2380 #endif
2381 #elif defined(TARGET_ABI_MIPSN64)
2382 
2383 # warning signal handling not implemented
2384 
2385 static void setup_frame(int sig, struct target_sigaction *ka,
2386 			target_sigset_t *set, CPUState *env)
2387 {
2388     fprintf(stderr, "setup_frame: not implemented\n");
2389 }
2390 
2391 static void setup_rt_frame(int sig, struct target_sigaction *ka,
2392                            target_siginfo_t *info,
2393 			   target_sigset_t *set, CPUState *env)
2394 {
2395     fprintf(stderr, "setup_rt_frame: not implemented\n");
2396 }
2397 
2398 long do_sigreturn(CPUState *env)
2399 {
2400     fprintf(stderr, "do_sigreturn: not implemented\n");
2401     return -TARGET_ENOSYS;
2402 }
2403 
2404 long do_rt_sigreturn(CPUState *env)
2405 {
2406     fprintf(stderr, "do_rt_sigreturn: not implemented\n");
2407     return -TARGET_ENOSYS;
2408 }
2409 
2410 #elif defined(TARGET_ABI_MIPSN32)
2411 
2412 # warning signal handling not implemented
2413 
2414 static void setup_frame(int sig, struct target_sigaction *ka,
2415 			target_sigset_t *set, CPUState *env)
2416 {
2417     fprintf(stderr, "setup_frame: not implemented\n");
2418 }
2419 
2420 static void setup_rt_frame(int sig, struct target_sigaction *ka,
2421                            target_siginfo_t *info,
2422 			   target_sigset_t *set, CPUState *env)
2423 {
2424     fprintf(stderr, "setup_rt_frame: not implemented\n");
2425 }
2426 
2427 long do_sigreturn(CPUState *env)
2428 {
2429     fprintf(stderr, "do_sigreturn: not implemented\n");
2430     return -TARGET_ENOSYS;
2431 }
2432 
2433 long do_rt_sigreturn(CPUState *env)
2434 {
2435     fprintf(stderr, "do_rt_sigreturn: not implemented\n");
2436     return -TARGET_ENOSYS;
2437 }
2438 
2439 #elif defined(TARGET_ABI_MIPSO32)
2440 
2441 struct target_sigcontext {
2442     uint32_t   sc_regmask;     /* Unused */
2443     uint32_t   sc_status;
2444     uint64_t   sc_pc;
2445     uint64_t   sc_regs[32];
2446     uint64_t   sc_fpregs[32];
2447     uint32_t   sc_ownedfp;     /* Unused */
2448     uint32_t   sc_fpc_csr;
2449     uint32_t   sc_fpc_eir;     /* Unused */
2450     uint32_t   sc_used_math;
2451     uint32_t   sc_dsp;         /* dsp status, was sc_ssflags */
2452     uint32_t   pad0;
2453     uint64_t   sc_mdhi;
2454     uint64_t   sc_mdlo;
2455     target_ulong   sc_hi1;         /* Was sc_cause */
2456     target_ulong   sc_lo1;         /* Was sc_badvaddr */
2457     target_ulong   sc_hi2;         /* Was sc_sigset[4] */
2458     target_ulong   sc_lo2;
2459     target_ulong   sc_hi3;
2460     target_ulong   sc_lo3;
2461 };
2462 
2463 struct sigframe {
2464     uint32_t sf_ass[4];			/* argument save space for o32 */
2465     uint32_t sf_code[2];			/* signal trampoline */
2466     struct target_sigcontext sf_sc;
2467     target_sigset_t sf_mask;
2468 };
2469 
2470 struct target_ucontext {
2471     target_ulong tuc_flags;
2472     target_ulong tuc_link;
2473     target_stack_t tuc_stack;
2474     target_ulong pad0;
2475     struct target_sigcontext tuc_mcontext;
2476     target_sigset_t tuc_sigmask;
2477 };
2478 
2479 struct target_rt_sigframe {
2480     uint32_t rs_ass[4];               /* argument save space for o32 */
2481     uint32_t rs_code[2];              /* signal trampoline */
2482     struct target_siginfo rs_info;
2483     struct target_ucontext rs_uc;
2484 };
2485 
2486 /* Install trampoline to jump back from signal handler */
2487 static inline int install_sigtramp(unsigned int *tramp,   unsigned int syscall)
2488 {
2489     int err;
2490 
2491     /*
2492     * Set up the return code ...
2493     *
2494     *         li      v0, __NR__foo_sigreturn
2495     *         syscall
2496     */
2497 
2498     err = __put_user(0x24020000 + syscall, tramp + 0);
2499     err |= __put_user(0x0000000c          , tramp + 1);
2500     /* flush_cache_sigtramp((unsigned long) tramp); */
2501     return err;
2502 }
2503 
2504 static inline int
2505 setup_sigcontext(CPUState *regs, struct target_sigcontext *sc)
2506 {
2507     int err = 0;
2508 
2509     err |= __put_user(regs->active_tc.PC, &sc->sc_pc);
2510 
2511 #define save_gp_reg(i) do {   						\
2512         err |= __put_user(regs->active_tc.gpr[i], &sc->sc_regs[i]);	\
2513     } while(0)
2514     __put_user(0, &sc->sc_regs[0]); save_gp_reg(1); save_gp_reg(2);
2515     save_gp_reg(3); save_gp_reg(4); save_gp_reg(5); save_gp_reg(6);
2516     save_gp_reg(7); save_gp_reg(8); save_gp_reg(9); save_gp_reg(10);
2517     save_gp_reg(11); save_gp_reg(12); save_gp_reg(13); save_gp_reg(14);
2518     save_gp_reg(15); save_gp_reg(16); save_gp_reg(17); save_gp_reg(18);
2519     save_gp_reg(19); save_gp_reg(20); save_gp_reg(21); save_gp_reg(22);
2520     save_gp_reg(23); save_gp_reg(24); save_gp_reg(25); save_gp_reg(26);
2521     save_gp_reg(27); save_gp_reg(28); save_gp_reg(29); save_gp_reg(30);
2522     save_gp_reg(31);
2523 #undef save_gp_reg
2524 
2525     err |= __put_user(regs->active_tc.HI[0], &sc->sc_mdhi);
2526     err |= __put_user(regs->active_tc.LO[0], &sc->sc_mdlo);
2527 
2528     /* Not used yet, but might be useful if we ever have DSP suppport */
2529 #if 0
2530     if (cpu_has_dsp) {
2531 	err |= __put_user(mfhi1(), &sc->sc_hi1);
2532 	err |= __put_user(mflo1(), &sc->sc_lo1);
2533 	err |= __put_user(mfhi2(), &sc->sc_hi2);
2534 	err |= __put_user(mflo2(), &sc->sc_lo2);
2535 	err |= __put_user(mfhi3(), &sc->sc_hi3);
2536 	err |= __put_user(mflo3(), &sc->sc_lo3);
2537 	err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp);
2538     }
2539     /* same with 64 bit */
2540 #ifdef CONFIG_64BIT
2541     err |= __put_user(regs->hi, &sc->sc_hi[0]);
2542     err |= __put_user(regs->lo, &sc->sc_lo[0]);
2543     if (cpu_has_dsp) {
2544 	err |= __put_user(mfhi1(), &sc->sc_hi[1]);
2545 	err |= __put_user(mflo1(), &sc->sc_lo[1]);
2546 	err |= __put_user(mfhi2(), &sc->sc_hi[2]);
2547 	err |= __put_user(mflo2(), &sc->sc_lo[2]);
2548 	err |= __put_user(mfhi3(), &sc->sc_hi[3]);
2549 	err |= __put_user(mflo3(), &sc->sc_lo[3]);
2550 	err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp);
2551     }
2552 #endif
2553 #endif
2554 
2555 #if 0
2556     err |= __put_user(!!used_math(), &sc->sc_used_math);
2557 
2558     if (!used_math())
2559 	goto out;
2560 
2561     /*
2562     * Save FPU state to signal context.  Signal handler will "inherit"
2563     * current FPU state.
2564     */
2565     preempt_disable();
2566 
2567     if (!is_fpu_owner()) {
2568 	own_fpu();
2569 	restore_fp(current);
2570     }
2571     err |= save_fp_context(sc);
2572 
2573     preempt_enable();
2574     out:
2575 #endif
2576     return err;
2577 }
2578 
2579 static inline int
2580 restore_sigcontext(CPUState *regs, struct target_sigcontext *sc)
2581 {
2582     int err = 0;
2583 
2584     err |= __get_user(regs->CP0_EPC, &sc->sc_pc);
2585 
2586     err |= __get_user(regs->active_tc.HI[0], &sc->sc_mdhi);
2587     err |= __get_user(regs->active_tc.LO[0], &sc->sc_mdlo);
2588 
2589 #define restore_gp_reg(i) do {   							\
2590         err |= __get_user(regs->active_tc.gpr[i], &sc->sc_regs[i]);		\
2591     } while(0)
2592     restore_gp_reg( 1); restore_gp_reg( 2); restore_gp_reg( 3);
2593     restore_gp_reg( 4); restore_gp_reg( 5); restore_gp_reg( 6);
2594     restore_gp_reg( 7); restore_gp_reg( 8); restore_gp_reg( 9);
2595     restore_gp_reg(10); restore_gp_reg(11); restore_gp_reg(12);
2596     restore_gp_reg(13); restore_gp_reg(14); restore_gp_reg(15);
2597     restore_gp_reg(16); restore_gp_reg(17); restore_gp_reg(18);
2598     restore_gp_reg(19); restore_gp_reg(20); restore_gp_reg(21);
2599     restore_gp_reg(22); restore_gp_reg(23); restore_gp_reg(24);
2600     restore_gp_reg(25); restore_gp_reg(26); restore_gp_reg(27);
2601     restore_gp_reg(28); restore_gp_reg(29); restore_gp_reg(30);
2602     restore_gp_reg(31);
2603 #undef restore_gp_reg
2604 
2605 #if 0
2606     if (cpu_has_dsp) {
2607 	err |= __get_user(treg, &sc->sc_hi1); mthi1(treg);
2608 	err |= __get_user(treg, &sc->sc_lo1); mtlo1(treg);
2609 	err |= __get_user(treg, &sc->sc_hi2); mthi2(treg);
2610 	err |= __get_user(treg, &sc->sc_lo2); mtlo2(treg);
2611 	err |= __get_user(treg, &sc->sc_hi3); mthi3(treg);
2612 	err |= __get_user(treg, &sc->sc_lo3); mtlo3(treg);
2613 	err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK);
2614     }
2615 #ifdef CONFIG_64BIT
2616     err |= __get_user(regs->hi, &sc->sc_hi[0]);
2617     err |= __get_user(regs->lo, &sc->sc_lo[0]);
2618     if (cpu_has_dsp) {
2619 	err |= __get_user(treg, &sc->sc_hi[1]); mthi1(treg);
2620 	err |= __get_user(treg, &sc->sc_lo[1]); mthi1(treg);
2621 	err |= __get_user(treg, &sc->sc_hi[2]); mthi2(treg);
2622 	err |= __get_user(treg, &sc->sc_lo[2]); mthi2(treg);
2623 	err |= __get_user(treg, &sc->sc_hi[3]); mthi3(treg);
2624 	err |= __get_user(treg, &sc->sc_lo[3]); mthi3(treg);
2625 	err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK);
2626     }
2627 #endif
2628 
2629     err |= __get_user(used_math, &sc->sc_used_math);
2630     conditional_used_math(used_math);
2631 
2632     preempt_disable();
2633 
2634     if (used_math()) {
2635 	/* restore fpu context if we have used it before */
2636 	own_fpu();
2637 	err |= restore_fp_context(sc);
2638     } else {
2639 	/* signal handler may have used FPU.  Give it up. */
2640 	lose_fpu();
2641     }
2642 
2643     preempt_enable();
2644 #endif
2645     return err;
2646 }
2647 /*
2648  * Determine which stack to use..
2649  */
2650 static inline abi_ulong
2651 get_sigframe(struct target_sigaction *ka, CPUState *regs, size_t frame_size)
2652 {
2653     unsigned long sp;
2654 
2655     /* Default to using normal stack */
2656     sp = regs->active_tc.gpr[29];
2657 
2658     /*
2659      * FPU emulator may have it's own trampoline active just
2660      * above the user stack, 16-bytes before the next lowest
2661      * 16 byte boundary.  Try to avoid trashing it.
2662      */
2663     sp -= 32;
2664 
2665     /* This is the X/Open sanctioned signal stack switching.  */
2666     if ((ka->sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags (sp) == 0)) {
2667         sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
2668     }
2669 
2670     return (sp - frame_size) & ~7;
2671 }
2672 
2673 /* compare linux/arch/mips/kernel/signal.c:setup_frame() */
2674 static void setup_frame(int sig, struct target_sigaction * ka,
2675                         target_sigset_t *set, CPUState *regs)
2676 {
2677     struct sigframe *frame;
2678     abi_ulong frame_addr;
2679     int i;
2680 
2681     frame_addr = get_sigframe(ka, regs, sizeof(*frame));
2682     if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
2683 	goto give_sigsegv;
2684 
2685     install_sigtramp(frame->sf_code, TARGET_NR_sigreturn);
2686 
2687     if(setup_sigcontext(regs, &frame->sf_sc))
2688 	goto give_sigsegv;
2689 
2690     for(i = 0; i < TARGET_NSIG_WORDS; i++) {
2691 	if(__put_user(set->sig[i], &frame->sf_mask.sig[i]))
2692 	    goto give_sigsegv;
2693     }
2694 
2695     /*
2696     * Arguments to signal handler:
2697     *
2698     *   a0 = signal number
2699     *   a1 = 0 (should be cause)
2700     *   a2 = pointer to struct sigcontext
2701     *
2702     * $25 and PC point to the signal handler, $29 points to the
2703     * struct sigframe.
2704     */
2705     regs->active_tc.gpr[ 4] = sig;
2706     regs->active_tc.gpr[ 5] = 0;
2707     regs->active_tc.gpr[ 6] = frame_addr + offsetof(struct sigframe, sf_sc);
2708     regs->active_tc.gpr[29] = frame_addr;
2709     regs->active_tc.gpr[31] = frame_addr + offsetof(struct sigframe, sf_code);
2710     /* The original kernel code sets CP0_EPC to the handler
2711     * since it returns to userland using eret
2712     * we cannot do this here, and we must set PC directly */
2713     regs->active_tc.PC = regs->active_tc.gpr[25] = ka->_sa_handler;
2714     unlock_user_struct(frame, frame_addr, 1);
2715     return;
2716 
2717 give_sigsegv:
2718     unlock_user_struct(frame, frame_addr, 1);
2719     force_sig(TARGET_SIGSEGV/*, current*/);
2720     return;
2721 }
2722 
2723 long do_sigreturn(CPUState *regs)
2724 {
2725     struct sigframe *frame;
2726     abi_ulong frame_addr;
2727     sigset_t blocked;
2728     target_sigset_t target_set;
2729     int i;
2730 
2731 #if defined(DEBUG_SIGNAL)
2732     fprintf(stderr, "do_sigreturn\n");
2733 #endif
2734     frame_addr = regs->active_tc.gpr[29];
2735     if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
2736    	goto badframe;
2737 
2738     for(i = 0; i < TARGET_NSIG_WORDS; i++) {
2739    	if(__get_user(target_set.sig[i], &frame->sf_mask.sig[i]))
2740 	    goto badframe;
2741     }
2742 
2743     target_to_host_sigset_internal(&blocked, &target_set);
2744     sigprocmask(SIG_SETMASK, &blocked, NULL);
2745 
2746     if (restore_sigcontext(regs, &frame->sf_sc))
2747    	goto badframe;
2748 
2749 #if 0
2750     /*
2751      * Don't let your children do this ...
2752      */
2753     __asm__ __volatile__(
2754    	"move\t$29, %0\n\t"
2755    	"j\tsyscall_exit"
2756    	:/* no outputs */
2757    	:"r" (&regs));
2758     /* Unreached */
2759 #endif
2760 
2761     regs->active_tc.PC = regs->CP0_EPC;
2762     /* I am not sure this is right, but it seems to work
2763     * maybe a problem with nested signals ? */
2764     regs->CP0_EPC = 0;
2765     return -TARGET_QEMU_ESIGRETURN;
2766 
2767 badframe:
2768     force_sig(TARGET_SIGSEGV/*, current*/);
2769     return 0;
2770 }
2771 
2772 static void setup_rt_frame(int sig, struct target_sigaction *ka,
2773                            target_siginfo_t *info,
2774 			   target_sigset_t *set, CPUState *env)
2775 {
2776     struct target_rt_sigframe *frame;
2777     abi_ulong frame_addr;
2778     int i;
2779 
2780     frame_addr = get_sigframe(ka, env, sizeof(*frame));
2781     if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
2782 	goto give_sigsegv;
2783 
2784     install_sigtramp(frame->rs_code, TARGET_NR_rt_sigreturn);
2785 
2786     copy_siginfo_to_user(&frame->rs_info, info);
2787 
2788     __put_user(0, &frame->rs_uc.tuc_flags);
2789     __put_user(0, &frame->rs_uc.tuc_link);
2790     __put_user(target_sigaltstack_used.ss_sp, &frame->rs_uc.tuc_stack.ss_sp);
2791     __put_user(target_sigaltstack_used.ss_size, &frame->rs_uc.tuc_stack.ss_size);
2792     __put_user(sas_ss_flags(get_sp_from_cpustate(env)),
2793                &frame->rs_uc.tuc_stack.ss_flags);
2794 
2795     setup_sigcontext(env, &frame->rs_uc.tuc_mcontext);
2796 
2797     for(i = 0; i < TARGET_NSIG_WORDS; i++) {
2798         __put_user(set->sig[i], &frame->rs_uc.tuc_sigmask.sig[i]);
2799     }
2800 
2801     /*
2802     * Arguments to signal handler:
2803     *
2804     *   a0 = signal number
2805     *   a1 = pointer to struct siginfo
2806     *   a2 = pointer to struct ucontext
2807     *
2808     * $25 and PC point to the signal handler, $29 points to the
2809     * struct sigframe.
2810     */
2811     env->active_tc.gpr[ 4] = sig;
2812     env->active_tc.gpr[ 5] = frame_addr
2813                              + offsetof(struct target_rt_sigframe, rs_info);
2814     env->active_tc.gpr[ 6] = frame_addr
2815                              + offsetof(struct target_rt_sigframe, rs_uc);
2816     env->active_tc.gpr[29] = frame_addr;
2817     env->active_tc.gpr[31] = frame_addr
2818                              + offsetof(struct target_rt_sigframe, rs_code);
2819     /* The original kernel code sets CP0_EPC to the handler
2820     * since it returns to userland using eret
2821     * we cannot do this here, and we must set PC directly */
2822     env->active_tc.PC = env->active_tc.gpr[25] = ka->_sa_handler;
2823     unlock_user_struct(frame, frame_addr, 1);
2824     return;
2825 
2826 give_sigsegv:
2827     unlock_user_struct(frame, frame_addr, 1);
2828     force_sig(TARGET_SIGSEGV/*, current*/);
2829     return;
2830 }
2831 
2832 long do_rt_sigreturn(CPUState *env)
2833 {
2834     struct target_rt_sigframe *frame;
2835     abi_ulong frame_addr;
2836     sigset_t blocked;
2837 
2838 #if defined(DEBUG_SIGNAL)
2839     fprintf(stderr, "do_rt_sigreturn\n");
2840 #endif
2841     frame_addr = env->active_tc.gpr[29];
2842     if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
2843    	goto badframe;
2844 
2845     target_to_host_sigset(&blocked, &frame->rs_uc.tuc_sigmask);
2846     sigprocmask(SIG_SETMASK, &blocked, NULL);
2847 
2848     if (restore_sigcontext(env, &frame->rs_uc.tuc_mcontext))
2849         goto badframe;
2850 
2851     if (do_sigaltstack(frame_addr +
2852 		       offsetof(struct target_rt_sigframe, rs_uc.tuc_stack),
2853 		       0, get_sp_from_cpustate(env)) == -EFAULT)
2854         goto badframe;
2855 
2856     env->active_tc.PC = env->CP0_EPC;
2857     /* I am not sure this is right, but it seems to work
2858     * maybe a problem with nested signals ? */
2859     env->CP0_EPC = 0;
2860     return -TARGET_QEMU_ESIGRETURN;
2861 
2862 badframe:
2863     force_sig(TARGET_SIGSEGV/*, current*/);
2864     return 0;
2865 }
2866 
2867 #elif defined(TARGET_SH4)
2868 
2869 /*
2870  * code and data structures from linux kernel:
2871  * include/asm-sh/sigcontext.h
2872  * arch/sh/kernel/signal.c
2873  */
2874 
2875 struct target_sigcontext {
2876     target_ulong  oldmask;
2877 
2878     /* CPU registers */
2879     target_ulong  sc_gregs[16];
2880     target_ulong  sc_pc;
2881     target_ulong  sc_pr;
2882     target_ulong  sc_sr;
2883     target_ulong  sc_gbr;
2884     target_ulong  sc_mach;
2885     target_ulong  sc_macl;
2886 
2887     /* FPU registers */
2888     target_ulong  sc_fpregs[16];
2889     target_ulong  sc_xfpregs[16];
2890     unsigned int sc_fpscr;
2891     unsigned int sc_fpul;
2892     unsigned int sc_ownedfp;
2893 };
2894 
2895 struct target_sigframe
2896 {
2897     struct target_sigcontext sc;
2898     target_ulong extramask[TARGET_NSIG_WORDS-1];
2899     uint16_t retcode[3];
2900 };
2901 
2902 
2903 struct target_ucontext {
2904     target_ulong tuc_flags;
2905     struct target_ucontext *tuc_link;
2906     target_stack_t tuc_stack;
2907     struct target_sigcontext tuc_mcontext;
2908     target_sigset_t tuc_sigmask;	/* mask last for extensibility */
2909 };
2910 
2911 struct target_rt_sigframe
2912 {
2913     struct target_siginfo info;
2914     struct target_ucontext uc;
2915     uint16_t retcode[3];
2916 };
2917 
2918 
2919 #define MOVW(n)  (0x9300|((n)-2)) /* Move mem word at PC+n to R3 */
2920 #define TRAP_NOARG 0xc310         /* Syscall w/no args (NR in R3) SH3/4 */
2921 
2922 static abi_ulong get_sigframe(struct target_sigaction *ka,
2923                          unsigned long sp, size_t frame_size)
2924 {
2925     if ((ka->sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags(sp) == 0)) {
2926         sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
2927     }
2928 
2929     return (sp - frame_size) & -8ul;
2930 }
2931 
2932 static int setup_sigcontext(struct target_sigcontext *sc,
2933 			    CPUState *regs, unsigned long mask)
2934 {
2935     int err = 0;
2936     int i;
2937 
2938 #define COPY(x)         err |= __put_user(regs->x, &sc->sc_##x)
2939     COPY(gregs[0]); COPY(gregs[1]);
2940     COPY(gregs[2]); COPY(gregs[3]);
2941     COPY(gregs[4]); COPY(gregs[5]);
2942     COPY(gregs[6]); COPY(gregs[7]);
2943     COPY(gregs[8]); COPY(gregs[9]);
2944     COPY(gregs[10]); COPY(gregs[11]);
2945     COPY(gregs[12]); COPY(gregs[13]);
2946     COPY(gregs[14]); COPY(gregs[15]);
2947     COPY(gbr); COPY(mach);
2948     COPY(macl); COPY(pr);
2949     COPY(sr); COPY(pc);
2950 #undef COPY
2951 
2952     for (i=0; i<16; i++) {
2953         err |= __put_user(regs->fregs[i], &sc->sc_fpregs[i]);
2954     }
2955     err |= __put_user(regs->fpscr, &sc->sc_fpscr);
2956     err |= __put_user(regs->fpul, &sc->sc_fpul);
2957 
2958     /* non-iBCS2 extensions.. */
2959     err |= __put_user(mask, &sc->oldmask);
2960 
2961     return err;
2962 }
2963 
2964 static int restore_sigcontext(CPUState *regs, struct target_sigcontext *sc,
2965                               target_ulong *r0_p)
2966 {
2967     unsigned int err = 0;
2968     int i;
2969 
2970 #define COPY(x)         err |= __get_user(regs->x, &sc->sc_##x)
2971     COPY(gregs[1]);
2972     COPY(gregs[2]); COPY(gregs[3]);
2973     COPY(gregs[4]); COPY(gregs[5]);
2974     COPY(gregs[6]); COPY(gregs[7]);
2975     COPY(gregs[8]); COPY(gregs[9]);
2976     COPY(gregs[10]); COPY(gregs[11]);
2977     COPY(gregs[12]); COPY(gregs[13]);
2978     COPY(gregs[14]); COPY(gregs[15]);
2979     COPY(gbr); COPY(mach);
2980     COPY(macl); COPY(pr);
2981     COPY(sr); COPY(pc);
2982 #undef COPY
2983 
2984     for (i=0; i<16; i++) {
2985         err |= __get_user(regs->fregs[i], &sc->sc_fpregs[i]);
2986     }
2987     err |= __get_user(regs->fpscr, &sc->sc_fpscr);
2988     err |= __get_user(regs->fpul, &sc->sc_fpul);
2989 
2990     regs->tra = -1;         /* disable syscall checks */
2991     err |= __get_user(*r0_p, &sc->sc_gregs[0]);
2992     return err;
2993 }
2994 
2995 static void setup_frame(int sig, struct target_sigaction *ka,
2996 			target_sigset_t *set, CPUState *regs)
2997 {
2998     struct target_sigframe *frame;
2999     abi_ulong frame_addr;
3000     int i;
3001     int err = 0;
3002     int signal;
3003 
3004     frame_addr = get_sigframe(ka, regs->gregs[15], sizeof(*frame));
3005     if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
3006 	goto give_sigsegv;
3007 
3008     signal = current_exec_domain_sig(sig);
3009 
3010     err |= setup_sigcontext(&frame->sc, regs, set->sig[0]);
3011 
3012     for (i = 0; i < TARGET_NSIG_WORDS - 1; i++) {
3013         err |= __put_user(set->sig[i + 1], &frame->extramask[i]);
3014     }
3015 
3016     /* Set up to return from userspace.  If provided, use a stub
3017        already in userspace.  */
3018     if (ka->sa_flags & TARGET_SA_RESTORER) {
3019         regs->pr = (unsigned long) ka->sa_restorer;
3020     } else {
3021         /* Generate return code (system call to sigreturn) */
3022         err |= __put_user(MOVW(2), &frame->retcode[0]);
3023         err |= __put_user(TRAP_NOARG, &frame->retcode[1]);
3024         err |= __put_user((TARGET_NR_sigreturn), &frame->retcode[2]);
3025         regs->pr = (unsigned long) frame->retcode;
3026     }
3027 
3028     if (err)
3029         goto give_sigsegv;
3030 
3031     /* Set up registers for signal handler */
3032     regs->gregs[15] = (unsigned long) frame;
3033     regs->gregs[4] = signal; /* Arg for signal handler */
3034     regs->gregs[5] = 0;
3035     regs->gregs[6] = (unsigned long) &frame->sc;
3036     regs->pc = (unsigned long) ka->_sa_handler;
3037 
3038     unlock_user_struct(frame, frame_addr, 1);
3039     return;
3040 
3041 give_sigsegv:
3042     unlock_user_struct(frame, frame_addr, 1);
3043     force_sig(TARGET_SIGSEGV);
3044 }
3045 
3046 static void setup_rt_frame(int sig, struct target_sigaction *ka,
3047                            target_siginfo_t *info,
3048 			   target_sigset_t *set, CPUState *regs)
3049 {
3050     struct target_rt_sigframe *frame;
3051     abi_ulong frame_addr;
3052     int i;
3053     int err = 0;
3054     int signal;
3055 
3056     frame_addr = get_sigframe(ka, regs->gregs[15], sizeof(*frame));
3057     if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
3058 	goto give_sigsegv;
3059 
3060     signal = current_exec_domain_sig(sig);
3061 
3062     err |= copy_siginfo_to_user(&frame->info, info);
3063 
3064     /* Create the ucontext.  */
3065     err |= __put_user(0, &frame->uc.tuc_flags);
3066     err |= __put_user(0, (unsigned long *)&frame->uc.tuc_link);
3067     err |= __put_user((unsigned long)target_sigaltstack_used.ss_sp,
3068 		      &frame->uc.tuc_stack.ss_sp);
3069     err |= __put_user(sas_ss_flags(regs->gregs[15]),
3070 		      &frame->uc.tuc_stack.ss_flags);
3071     err |= __put_user(target_sigaltstack_used.ss_size,
3072 		      &frame->uc.tuc_stack.ss_size);
3073     err |= setup_sigcontext(&frame->uc.tuc_mcontext,
3074 			    regs, set->sig[0]);
3075     for(i = 0; i < TARGET_NSIG_WORDS; i++) {
3076         err |= __put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]);
3077     }
3078 
3079     /* Set up to return from userspace.  If provided, use a stub
3080        already in userspace.  */
3081     if (ka->sa_flags & TARGET_SA_RESTORER) {
3082         regs->pr = (unsigned long) ka->sa_restorer;
3083     } else {
3084         /* Generate return code (system call to sigreturn) */
3085         err |= __put_user(MOVW(2), &frame->retcode[0]);
3086         err |= __put_user(TRAP_NOARG, &frame->retcode[1]);
3087         err |= __put_user((TARGET_NR_rt_sigreturn), &frame->retcode[2]);
3088         regs->pr = (unsigned long) frame->retcode;
3089     }
3090 
3091     if (err)
3092         goto give_sigsegv;
3093 
3094     /* Set up registers for signal handler */
3095     regs->gregs[15] = (unsigned long) frame;
3096     regs->gregs[4] = signal; /* Arg for signal handler */
3097     regs->gregs[5] = (unsigned long) &frame->info;
3098     regs->gregs[6] = (unsigned long) &frame->uc;
3099     regs->pc = (unsigned long) ka->_sa_handler;
3100 
3101     unlock_user_struct(frame, frame_addr, 1);
3102     return;
3103 
3104 give_sigsegv:
3105     unlock_user_struct(frame, frame_addr, 1);
3106     force_sig(TARGET_SIGSEGV);
3107 }
3108 
3109 long do_sigreturn(CPUState *regs)
3110 {
3111     struct target_sigframe *frame;
3112     abi_ulong frame_addr;
3113     sigset_t blocked;
3114     target_sigset_t target_set;
3115     target_ulong r0;
3116     int i;
3117     int err = 0;
3118 
3119 #if defined(DEBUG_SIGNAL)
3120     fprintf(stderr, "do_sigreturn\n");
3121 #endif
3122     frame_addr = regs->gregs[15];
3123     if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
3124    	goto badframe;
3125 
3126     err |= __get_user(target_set.sig[0], &frame->sc.oldmask);
3127     for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3128         err |= (__get_user(target_set.sig[i], &frame->extramask[i - 1]));
3129     }
3130 
3131     if (err)
3132         goto badframe;
3133 
3134     target_to_host_sigset_internal(&blocked, &target_set);
3135     sigprocmask(SIG_SETMASK, &blocked, NULL);
3136 
3137     if (restore_sigcontext(regs, &frame->sc, &r0))
3138         goto badframe;
3139 
3140     unlock_user_struct(frame, frame_addr, 0);
3141     return r0;
3142 
3143 badframe:
3144     unlock_user_struct(frame, frame_addr, 0);
3145     force_sig(TARGET_SIGSEGV);
3146     return 0;
3147 }
3148 
3149 long do_rt_sigreturn(CPUState *regs)
3150 {
3151     struct target_rt_sigframe *frame;
3152     abi_ulong frame_addr;
3153     sigset_t blocked;
3154     target_ulong r0;
3155 
3156 #if defined(DEBUG_SIGNAL)
3157     fprintf(stderr, "do_rt_sigreturn\n");
3158 #endif
3159     frame_addr = regs->gregs[15];
3160     if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
3161    	goto badframe;
3162 
3163     target_to_host_sigset(&blocked, &frame->uc.tuc_sigmask);
3164     sigprocmask(SIG_SETMASK, &blocked, NULL);
3165 
3166     if (restore_sigcontext(regs, &frame->uc.tuc_mcontext, &r0))
3167         goto badframe;
3168 
3169     if (do_sigaltstack(frame_addr +
3170 		       offsetof(struct target_rt_sigframe, uc.tuc_stack),
3171 		       0, get_sp_from_cpustate(regs)) == -EFAULT)
3172         goto badframe;
3173 
3174     unlock_user_struct(frame, frame_addr, 0);
3175     return r0;
3176 
3177 badframe:
3178     unlock_user_struct(frame, frame_addr, 0);
3179     force_sig(TARGET_SIGSEGV);
3180     return 0;
3181 }
3182 #elif defined(TARGET_MICROBLAZE)
3183 
3184 struct target_sigcontext {
3185     struct target_pt_regs regs;  /* needs to be first */
3186     uint32_t oldmask;
3187 };
3188 
3189 struct target_stack_t {
3190     abi_ulong ss_sp;
3191     int ss_flags;
3192     unsigned int ss_size;
3193 };
3194 
3195 struct target_ucontext {
3196     abi_ulong tuc_flags;
3197     abi_ulong tuc_link;
3198     struct target_stack_t tuc_stack;
3199     struct target_sigcontext tuc_mcontext;
3200     uint32_t tuc_extramask[TARGET_NSIG_WORDS - 1];
3201 };
3202 
3203 /* Signal frames. */
3204 struct target_signal_frame {
3205     struct target_ucontext uc;
3206     uint32_t extramask[TARGET_NSIG_WORDS - 1];
3207     uint32_t tramp[2];
3208 };
3209 
3210 struct rt_signal_frame {
3211     struct siginfo info;
3212     struct ucontext uc;
3213     uint32_t tramp[2];
3214 };
3215 
3216 static void setup_sigcontext(struct target_sigcontext *sc, CPUState *env)
3217 {
3218     __put_user(env->regs[0], &sc->regs.r0);
3219     __put_user(env->regs[1], &sc->regs.r1);
3220     __put_user(env->regs[2], &sc->regs.r2);
3221     __put_user(env->regs[3], &sc->regs.r3);
3222     __put_user(env->regs[4], &sc->regs.r4);
3223     __put_user(env->regs[5], &sc->regs.r5);
3224     __put_user(env->regs[6], &sc->regs.r6);
3225     __put_user(env->regs[7], &sc->regs.r7);
3226     __put_user(env->regs[8], &sc->regs.r8);
3227     __put_user(env->regs[9], &sc->regs.r9);
3228     __put_user(env->regs[10], &sc->regs.r10);
3229     __put_user(env->regs[11], &sc->regs.r11);
3230     __put_user(env->regs[12], &sc->regs.r12);
3231     __put_user(env->regs[13], &sc->regs.r13);
3232     __put_user(env->regs[14], &sc->regs.r14);
3233     __put_user(env->regs[15], &sc->regs.r15);
3234     __put_user(env->regs[16], &sc->regs.r16);
3235     __put_user(env->regs[17], &sc->regs.r17);
3236     __put_user(env->regs[18], &sc->regs.r18);
3237     __put_user(env->regs[19], &sc->regs.r19);
3238     __put_user(env->regs[20], &sc->regs.r20);
3239     __put_user(env->regs[21], &sc->regs.r21);
3240     __put_user(env->regs[22], &sc->regs.r22);
3241     __put_user(env->regs[23], &sc->regs.r23);
3242     __put_user(env->regs[24], &sc->regs.r24);
3243     __put_user(env->regs[25], &sc->regs.r25);
3244     __put_user(env->regs[26], &sc->regs.r26);
3245     __put_user(env->regs[27], &sc->regs.r27);
3246     __put_user(env->regs[28], &sc->regs.r28);
3247     __put_user(env->regs[29], &sc->regs.r29);
3248     __put_user(env->regs[30], &sc->regs.r30);
3249     __put_user(env->regs[31], &sc->regs.r31);
3250     __put_user(env->sregs[SR_PC], &sc->regs.pc);
3251 }
3252 
3253 static void restore_sigcontext(struct target_sigcontext *sc, CPUState *env)
3254 {
3255     __get_user(env->regs[0], &sc->regs.r0);
3256     __get_user(env->regs[1], &sc->regs.r1);
3257     __get_user(env->regs[2], &sc->regs.r2);
3258     __get_user(env->regs[3], &sc->regs.r3);
3259     __get_user(env->regs[4], &sc->regs.r4);
3260     __get_user(env->regs[5], &sc->regs.r5);
3261     __get_user(env->regs[6], &sc->regs.r6);
3262     __get_user(env->regs[7], &sc->regs.r7);
3263     __get_user(env->regs[8], &sc->regs.r8);
3264     __get_user(env->regs[9], &sc->regs.r9);
3265     __get_user(env->regs[10], &sc->regs.r10);
3266     __get_user(env->regs[11], &sc->regs.r11);
3267     __get_user(env->regs[12], &sc->regs.r12);
3268     __get_user(env->regs[13], &sc->regs.r13);
3269     __get_user(env->regs[14], &sc->regs.r14);
3270     __get_user(env->regs[15], &sc->regs.r15);
3271     __get_user(env->regs[16], &sc->regs.r16);
3272     __get_user(env->regs[17], &sc->regs.r17);
3273     __get_user(env->regs[18], &sc->regs.r18);
3274     __get_user(env->regs[19], &sc->regs.r19);
3275     __get_user(env->regs[20], &sc->regs.r20);
3276     __get_user(env->regs[21], &sc->regs.r21);
3277     __get_user(env->regs[22], &sc->regs.r22);
3278     __get_user(env->regs[23], &sc->regs.r23);
3279     __get_user(env->regs[24], &sc->regs.r24);
3280     __get_user(env->regs[25], &sc->regs.r25);
3281     __get_user(env->regs[26], &sc->regs.r26);
3282     __get_user(env->regs[27], &sc->regs.r27);
3283     __get_user(env->regs[28], &sc->regs.r28);
3284     __get_user(env->regs[29], &sc->regs.r29);
3285     __get_user(env->regs[30], &sc->regs.r30);
3286     __get_user(env->regs[31], &sc->regs.r31);
3287     __get_user(env->sregs[SR_PC], &sc->regs.pc);
3288 }
3289 
3290 static abi_ulong get_sigframe(struct target_sigaction *ka,
3291                               CPUState *env, int frame_size)
3292 {
3293     abi_ulong sp = env->regs[1];
3294 
3295     if ((ka->sa_flags & SA_ONSTACK) != 0 && !on_sig_stack(sp))
3296         sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
3297 
3298     return ((sp - frame_size) & -8UL);
3299 }
3300 
3301 static void setup_frame(int sig, struct target_sigaction *ka,
3302 			target_sigset_t *set, CPUState *env)
3303 {
3304     struct target_signal_frame *frame;
3305     abi_ulong frame_addr;
3306     int err = 0;
3307     int i;
3308 
3309     frame_addr = get_sigframe(ka, env, sizeof *frame);
3310     if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
3311         goto badframe;
3312 
3313     /* Save the mask.  */
3314     err |= __put_user(set->sig[0], &frame->uc.tuc_mcontext.oldmask);
3315     if (err)
3316         goto badframe;
3317 
3318     for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3319         if (__put_user(set->sig[i], &frame->extramask[i - 1]))
3320             goto badframe;
3321     }
3322 
3323     setup_sigcontext(&frame->uc.tuc_mcontext, env);
3324 
3325     /* Set up to return from userspace. If provided, use a stub
3326        already in userspace. */
3327     /* minus 8 is offset to cater for "rtsd r15,8" offset */
3328     if (ka->sa_flags & TARGET_SA_RESTORER) {
3329         env->regs[15] = ((unsigned long)ka->sa_restorer)-8;
3330     } else {
3331         uint32_t t;
3332         /* Note, these encodings are _big endian_! */
3333         /* addi r12, r0, __NR_sigreturn */
3334         t = 0x31800000UL | TARGET_NR_sigreturn;
3335         err |= __put_user(t, frame->tramp + 0);
3336         /* brki r14, 0x8 */
3337         t = 0xb9cc0008UL;
3338         err |= __put_user(t, frame->tramp + 1);
3339 
3340         /* Return from sighandler will jump to the tramp.
3341            Negative 8 offset because return is rtsd r15, 8 */
3342         env->regs[15] = ((unsigned long)frame->tramp) - 8;
3343     }
3344 
3345     if (err)
3346         goto badframe;
3347 
3348     /* Set up registers for signal handler */
3349     env->regs[1] = (unsigned long) frame;
3350     /* Signal handler args: */
3351     env->regs[5] = sig; /* Arg 0: signum */
3352     env->regs[6] = 0;
3353     env->regs[7] = (unsigned long) &frame->uc; /* arg 1: sigcontext */
3354 
3355     /* Offset of 4 to handle microblaze rtid r14, 0 */
3356     env->sregs[SR_PC] = (unsigned long)ka->_sa_handler;
3357 
3358     unlock_user_struct(frame, frame_addr, 1);
3359     return;
3360   badframe:
3361     unlock_user_struct(frame, frame_addr, 1);
3362     force_sig(TARGET_SIGSEGV);
3363 }
3364 
3365 static void setup_rt_frame(int sig, struct target_sigaction *ka,
3366                            target_siginfo_t *info,
3367 			   target_sigset_t *set, CPUState *env)
3368 {
3369     fprintf(stderr, "Microblaze setup_rt_frame: not implemented\n");
3370 }
3371 
3372 long do_sigreturn(CPUState *env)
3373 {
3374     struct target_signal_frame *frame;
3375     abi_ulong frame_addr;
3376     target_sigset_t target_set;
3377     sigset_t set;
3378     int i;
3379 
3380     frame_addr = env->regs[R_SP];
3381     /* Make sure the guest isn't playing games.  */
3382     if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 1))
3383         goto badframe;
3384 
3385     /* Restore blocked signals */
3386     if (__get_user(target_set.sig[0], &frame->uc.tuc_mcontext.oldmask))
3387         goto badframe;
3388     for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3389         if (__get_user(target_set.sig[i], &frame->extramask[i - 1]))
3390             goto badframe;
3391     }
3392     target_to_host_sigset_internal(&set, &target_set);
3393     sigprocmask(SIG_SETMASK, &set, NULL);
3394 
3395     restore_sigcontext(&frame->uc.tuc_mcontext, env);
3396     /* We got here through a sigreturn syscall, our path back is via an
3397        rtb insn so setup r14 for that.  */
3398     env->regs[14] = env->sregs[SR_PC];
3399 
3400     unlock_user_struct(frame, frame_addr, 0);
3401     return env->regs[10];
3402   badframe:
3403     unlock_user_struct(frame, frame_addr, 0);
3404     force_sig(TARGET_SIGSEGV);
3405 }
3406 
3407 long do_rt_sigreturn(CPUState *env)
3408 {
3409     fprintf(stderr, "Microblaze do_rt_sigreturn: not implemented\n");
3410     return -TARGET_ENOSYS;
3411 }
3412 
3413 #elif defined(TARGET_CRIS)
3414 
3415 struct target_sigcontext {
3416         struct target_pt_regs regs;  /* needs to be first */
3417         uint32_t oldmask;
3418         uint32_t usp;    /* usp before stacking this gunk on it */
3419 };
3420 
3421 /* Signal frames. */
3422 struct target_signal_frame {
3423         struct target_sigcontext sc;
3424         uint32_t extramask[TARGET_NSIG_WORDS - 1];
3425         uint8_t retcode[8];       /* Trampoline code. */
3426 };
3427 
3428 struct rt_signal_frame {
3429         struct siginfo *pinfo;
3430         void *puc;
3431         struct siginfo info;
3432         struct ucontext uc;
3433         uint8_t retcode[8];       /* Trampoline code. */
3434 };
3435 
3436 static void setup_sigcontext(struct target_sigcontext *sc, CPUState *env)
3437 {
3438 	__put_user(env->regs[0], &sc->regs.r0);
3439 	__put_user(env->regs[1], &sc->regs.r1);
3440 	__put_user(env->regs[2], &sc->regs.r2);
3441 	__put_user(env->regs[3], &sc->regs.r3);
3442 	__put_user(env->regs[4], &sc->regs.r4);
3443 	__put_user(env->regs[5], &sc->regs.r5);
3444 	__put_user(env->regs[6], &sc->regs.r6);
3445 	__put_user(env->regs[7], &sc->regs.r7);
3446 	__put_user(env->regs[8], &sc->regs.r8);
3447 	__put_user(env->regs[9], &sc->regs.r9);
3448 	__put_user(env->regs[10], &sc->regs.r10);
3449 	__put_user(env->regs[11], &sc->regs.r11);
3450 	__put_user(env->regs[12], &sc->regs.r12);
3451 	__put_user(env->regs[13], &sc->regs.r13);
3452 	__put_user(env->regs[14], &sc->usp);
3453 	__put_user(env->regs[15], &sc->regs.acr);
3454 	__put_user(env->pregs[PR_MOF], &sc->regs.mof);
3455 	__put_user(env->pregs[PR_SRP], &sc->regs.srp);
3456 	__put_user(env->pc, &sc->regs.erp);
3457 }
3458 
3459 static void restore_sigcontext(struct target_sigcontext *sc, CPUState *env)
3460 {
3461 	__get_user(env->regs[0], &sc->regs.r0);
3462 	__get_user(env->regs[1], &sc->regs.r1);
3463 	__get_user(env->regs[2], &sc->regs.r2);
3464 	__get_user(env->regs[3], &sc->regs.r3);
3465 	__get_user(env->regs[4], &sc->regs.r4);
3466 	__get_user(env->regs[5], &sc->regs.r5);
3467 	__get_user(env->regs[6], &sc->regs.r6);
3468 	__get_user(env->regs[7], &sc->regs.r7);
3469 	__get_user(env->regs[8], &sc->regs.r8);
3470 	__get_user(env->regs[9], &sc->regs.r9);
3471 	__get_user(env->regs[10], &sc->regs.r10);
3472 	__get_user(env->regs[11], &sc->regs.r11);
3473 	__get_user(env->regs[12], &sc->regs.r12);
3474 	__get_user(env->regs[13], &sc->regs.r13);
3475 	__get_user(env->regs[14], &sc->usp);
3476 	__get_user(env->regs[15], &sc->regs.acr);
3477 	__get_user(env->pregs[PR_MOF], &sc->regs.mof);
3478 	__get_user(env->pregs[PR_SRP], &sc->regs.srp);
3479 	__get_user(env->pc, &sc->regs.erp);
3480 }
3481 
3482 static abi_ulong get_sigframe(CPUState *env, int framesize)
3483 {
3484 	abi_ulong sp;
3485 	/* Align the stack downwards to 4.  */
3486 	sp = (env->regs[R_SP] & ~3);
3487 	return sp - framesize;
3488 }
3489 
3490 static void setup_frame(int sig, struct target_sigaction *ka,
3491 			target_sigset_t *set, CPUState *env)
3492 {
3493 	struct target_signal_frame *frame;
3494 	abi_ulong frame_addr;
3495 	int err = 0;
3496 	int i;
3497 
3498 	frame_addr = get_sigframe(env, sizeof *frame);
3499 	if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
3500 		goto badframe;
3501 
3502 	/*
3503 	 * The CRIS signal return trampoline. A real linux/CRIS kernel doesn't
3504 	 * use this trampoline anymore but it sets it up for GDB.
3505 	 * In QEMU, using the trampoline simplifies things a bit so we use it.
3506 	 *
3507 	 * This is movu.w __NR_sigreturn, r9; break 13;
3508 	 */
3509 	err |= __put_user(0x9c5f, frame->retcode+0);
3510 	err |= __put_user(TARGET_NR_sigreturn,
3511 			  frame->retcode+2);
3512 	err |= __put_user(0xe93d, frame->retcode+4);
3513 
3514 	/* Save the mask.  */
3515 	err |= __put_user(set->sig[0], &frame->sc.oldmask);
3516 	if (err)
3517 		goto badframe;
3518 
3519 	for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3520 		if (__put_user(set->sig[i], &frame->extramask[i - 1]))
3521 			goto badframe;
3522 	}
3523 
3524 	setup_sigcontext(&frame->sc, env);
3525 
3526 	/* Move the stack and setup the arguments for the handler.  */
3527 	env->regs[R_SP] = (uint32_t) (unsigned long) frame;
3528 	env->regs[10] = sig;
3529 	env->pc = (unsigned long) ka->_sa_handler;
3530 	/* Link SRP so the guest returns through the trampoline.  */
3531 	env->pregs[PR_SRP] = (uint32_t) (unsigned long) &frame->retcode[0];
3532 
3533 	unlock_user_struct(frame, frame_addr, 1);
3534 	return;
3535   badframe:
3536 	unlock_user_struct(frame, frame_addr, 1);
3537 	force_sig(TARGET_SIGSEGV);
3538 }
3539 
3540 static void setup_rt_frame(int sig, struct target_sigaction *ka,
3541                            target_siginfo_t *info,
3542 			   target_sigset_t *set, CPUState *env)
3543 {
3544     fprintf(stderr, "CRIS setup_rt_frame: not implemented\n");
3545 }
3546 
3547 long do_sigreturn(CPUState *env)
3548 {
3549 	struct target_signal_frame *frame;
3550 	abi_ulong frame_addr;
3551 	target_sigset_t target_set;
3552 	sigset_t set;
3553 	int i;
3554 
3555 	frame_addr = env->regs[R_SP];
3556 	/* Make sure the guest isn't playing games.  */
3557 	if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 1))
3558 		goto badframe;
3559 
3560 	/* Restore blocked signals */
3561 	if (__get_user(target_set.sig[0], &frame->sc.oldmask))
3562 		goto badframe;
3563 	for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3564 		if (__get_user(target_set.sig[i], &frame->extramask[i - 1]))
3565 			goto badframe;
3566 	}
3567 	target_to_host_sigset_internal(&set, &target_set);
3568 	sigprocmask(SIG_SETMASK, &set, NULL);
3569 
3570 	restore_sigcontext(&frame->sc, env);
3571 	unlock_user_struct(frame, frame_addr, 0);
3572 	return env->regs[10];
3573   badframe:
3574 	unlock_user_struct(frame, frame_addr, 0);
3575 	force_sig(TARGET_SIGSEGV);
3576 }
3577 
3578 long do_rt_sigreturn(CPUState *env)
3579 {
3580     fprintf(stderr, "CRIS do_rt_sigreturn: not implemented\n");
3581     return -TARGET_ENOSYS;
3582 }
3583 
3584 #elif defined(TARGET_PPC) && !defined(TARGET_PPC64)
3585 
3586 /* FIXME: Many of the structures are defined for both PPC and PPC64, but
3587    the signal handling is different enough that we haven't implemented
3588    support for PPC64 yet.  Hence the restriction above.
3589 
3590    There are various #if'd blocks for code for TARGET_PPC64.  These
3591    blocks should go away so that we can successfully run 32-bit and
3592    64-bit binaries on a QEMU configured for PPC64.  */
3593 
3594 /* Size of dummy stack frame allocated when calling signal handler.
3595    See arch/powerpc/include/asm/ptrace.h.  */
3596 #if defined(TARGET_PPC64)
3597 #define SIGNAL_FRAMESIZE 128
3598 #else
3599 #define SIGNAL_FRAMESIZE 64
3600 #endif
3601 
3602 /* See arch/powerpc/include/asm/sigcontext.h.  */
3603 struct target_sigcontext {
3604     target_ulong _unused[4];
3605     int32_t signal;
3606 #if defined(TARGET_PPC64)
3607     int32_t pad0;
3608 #endif
3609     target_ulong handler;
3610     target_ulong oldmask;
3611     target_ulong regs;      /* struct pt_regs __user * */
3612     /* TODO: PPC64 includes extra bits here.  */
3613 };
3614 
3615 /* Indices for target_mcontext.mc_gregs, below.
3616    See arch/powerpc/include/asm/ptrace.h for details.  */
3617 enum {
3618     TARGET_PT_R0 = 0,
3619     TARGET_PT_R1 = 1,
3620     TARGET_PT_R2 = 2,
3621     TARGET_PT_R3 = 3,
3622     TARGET_PT_R4 = 4,
3623     TARGET_PT_R5 = 5,
3624     TARGET_PT_R6 = 6,
3625     TARGET_PT_R7 = 7,
3626     TARGET_PT_R8 = 8,
3627     TARGET_PT_R9 = 9,
3628     TARGET_PT_R10 = 10,
3629     TARGET_PT_R11 = 11,
3630     TARGET_PT_R12 = 12,
3631     TARGET_PT_R13 = 13,
3632     TARGET_PT_R14 = 14,
3633     TARGET_PT_R15 = 15,
3634     TARGET_PT_R16 = 16,
3635     TARGET_PT_R17 = 17,
3636     TARGET_PT_R18 = 18,
3637     TARGET_PT_R19 = 19,
3638     TARGET_PT_R20 = 20,
3639     TARGET_PT_R21 = 21,
3640     TARGET_PT_R22 = 22,
3641     TARGET_PT_R23 = 23,
3642     TARGET_PT_R24 = 24,
3643     TARGET_PT_R25 = 25,
3644     TARGET_PT_R26 = 26,
3645     TARGET_PT_R27 = 27,
3646     TARGET_PT_R28 = 28,
3647     TARGET_PT_R29 = 29,
3648     TARGET_PT_R30 = 30,
3649     TARGET_PT_R31 = 31,
3650     TARGET_PT_NIP = 32,
3651     TARGET_PT_MSR = 33,
3652     TARGET_PT_ORIG_R3 = 34,
3653     TARGET_PT_CTR = 35,
3654     TARGET_PT_LNK = 36,
3655     TARGET_PT_XER = 37,
3656     TARGET_PT_CCR = 38,
3657     /* Yes, there are two registers with #39.  One is 64-bit only.  */
3658     TARGET_PT_MQ = 39,
3659     TARGET_PT_SOFTE = 39,
3660     TARGET_PT_TRAP = 40,
3661     TARGET_PT_DAR = 41,
3662     TARGET_PT_DSISR = 42,
3663     TARGET_PT_RESULT = 43,
3664     TARGET_PT_REGS_COUNT = 44
3665 };
3666 
3667 /* See arch/powerpc/include/asm/ucontext.h.  Only used for 32-bit PPC;
3668    on 64-bit PPC, sigcontext and mcontext are one and the same.  */
3669 struct target_mcontext {
3670     target_ulong mc_gregs[48];
3671     /* Includes fpscr.  */
3672     uint64_t mc_fregs[33];
3673     target_ulong mc_pad[2];
3674     /* We need to handle Altivec and SPE at the same time, which no
3675        kernel needs to do.  Fortunately, the kernel defines this bit to
3676        be Altivec-register-large all the time, rather than trying to
3677        twiddle it based on the specific platform.  */
3678     union {
3679         /* SPE vector registers.  One extra for SPEFSCR.  */
3680         uint32_t spe[33];
3681         /* Altivec vector registers.  The packing of VSCR and VRSAVE
3682            varies depending on whether we're PPC64 or not: PPC64 splits
3683            them apart; PPC32 stuffs them together.  */
3684 #if defined(TARGET_PPC64)
3685 #define QEMU_NVRREG 34
3686 #else
3687 #define QEMU_NVRREG 33
3688 #endif
3689         ppc_avr_t altivec[QEMU_NVRREG];
3690 #undef QEMU_NVRREG
3691     } mc_vregs __attribute__((__aligned__(16)));
3692 };
3693 
3694 struct target_ucontext {
3695     target_ulong tuc_flags;
3696     target_ulong tuc_link;    /* struct ucontext __user * */
3697     struct target_sigaltstack tuc_stack;
3698 #if !defined(TARGET_PPC64)
3699     int32_t tuc_pad[7];
3700     target_ulong tuc_regs;    /* struct mcontext __user *
3701                                 points to uc_mcontext field */
3702 #endif
3703     target_sigset_t tuc_sigmask;
3704 #if defined(TARGET_PPC64)
3705     target_sigset_t unused[15]; /* Allow for uc_sigmask growth */
3706     struct target_sigcontext tuc_mcontext;
3707 #else
3708     int32_t tuc_maskext[30];
3709     int32_t tuc_pad2[3];
3710     struct target_mcontext tuc_mcontext;
3711 #endif
3712 };
3713 
3714 /* See arch/powerpc/kernel/signal_32.c.  */
3715 struct target_sigframe {
3716     struct target_sigcontext sctx;
3717     struct target_mcontext mctx;
3718     int32_t abigap[56];
3719 };
3720 
3721 struct target_rt_sigframe {
3722     struct target_siginfo info;
3723     struct target_ucontext uc;
3724     int32_t abigap[56];
3725 };
3726 
3727 /* We use the mc_pad field for the signal return trampoline.  */
3728 #define tramp mc_pad
3729 
3730 /* See arch/powerpc/kernel/signal.c.  */
3731 static target_ulong get_sigframe(struct target_sigaction *ka,
3732                                  CPUState *env,
3733                                  int frame_size)
3734 {
3735     target_ulong oldsp, newsp;
3736 
3737     oldsp = env->gpr[1];
3738 
3739     if ((ka->sa_flags & TARGET_SA_ONSTACK) &&
3740         (sas_ss_flags(oldsp))) {
3741         oldsp = (target_sigaltstack_used.ss_sp
3742                  + target_sigaltstack_used.ss_size);
3743     }
3744 
3745     newsp = (oldsp - frame_size) & ~0xFUL;
3746 
3747     return newsp;
3748 }
3749 
3750 static int save_user_regs(CPUState *env, struct target_mcontext *frame,
3751                           int sigret)
3752 {
3753     target_ulong msr = env->msr;
3754     int i;
3755     target_ulong ccr = 0;
3756 
3757     /* In general, the kernel attempts to be intelligent about what it
3758        needs to save for Altivec/FP/SPE registers.  We don't care that
3759        much, so we just go ahead and save everything.  */
3760 
3761     /* Save general registers.  */
3762     for (i = 0; i < ARRAY_SIZE(env->gpr); i++) {
3763         if (__put_user(env->gpr[i], &frame->mc_gregs[i])) {
3764             return 1;
3765         }
3766     }
3767     if (__put_user(env->nip, &frame->mc_gregs[TARGET_PT_NIP])
3768         || __put_user(env->ctr, &frame->mc_gregs[TARGET_PT_CTR])
3769         || __put_user(env->lr, &frame->mc_gregs[TARGET_PT_LNK])
3770         || __put_user(env->xer, &frame->mc_gregs[TARGET_PT_XER]))
3771         return 1;
3772 
3773     for (i = 0; i < ARRAY_SIZE(env->crf); i++) {
3774         ccr |= env->crf[i] << (32 - ((i + 1) * 4));
3775     }
3776     if (__put_user(ccr, &frame->mc_gregs[TARGET_PT_CCR]))
3777         return 1;
3778 
3779     /* Save Altivec registers if necessary.  */
3780     if (env->insns_flags & PPC_ALTIVEC) {
3781         for (i = 0; i < ARRAY_SIZE(env->avr); i++) {
3782             ppc_avr_t *avr = &env->avr[i];
3783             ppc_avr_t *vreg = &frame->mc_vregs.altivec[i];
3784 
3785             if (__put_user(avr->u64[0], &vreg->u64[0]) ||
3786                 __put_user(avr->u64[1], &vreg->u64[1])) {
3787                 return 1;
3788             }
3789         }
3790         /* Set MSR_VR in the saved MSR value to indicate that
3791            frame->mc_vregs contains valid data.  */
3792         msr |= MSR_VR;
3793         if (__put_user((uint32_t)env->spr[SPR_VRSAVE],
3794                        &frame->mc_vregs.altivec[32].u32[3]))
3795             return 1;
3796     }
3797 
3798     /* Save floating point registers.  */
3799     if (env->insns_flags & PPC_FLOAT) {
3800         for (i = 0; i < ARRAY_SIZE(env->fpr); i++) {
3801             if (__put_user(env->fpr[i], &frame->mc_fregs[i])) {
3802                 return 1;
3803             }
3804         }
3805         if (__put_user((uint64_t) env->fpscr, &frame->mc_fregs[32]))
3806             return 1;
3807     }
3808 
3809     /* Save SPE registers.  The kernel only saves the high half.  */
3810     if (env->insns_flags & PPC_SPE) {
3811 #if defined(TARGET_PPC64)
3812         for (i = 0; i < ARRAY_SIZE(env->gpr); i++) {
3813             if (__put_user(env->gpr[i] >> 32, &frame->mc_vregs.spe[i])) {
3814                 return 1;
3815             }
3816         }
3817 #else
3818         for (i = 0; i < ARRAY_SIZE(env->gprh); i++) {
3819             if (__put_user(env->gprh[i], &frame->mc_vregs.spe[i])) {
3820                 return 1;
3821             }
3822         }
3823 #endif
3824         /* Set MSR_SPE in the saved MSR value to indicate that
3825            frame->mc_vregs contains valid data.  */
3826         msr |= MSR_SPE;
3827         if (__put_user(env->spe_fscr, &frame->mc_vregs.spe[32]))
3828             return 1;
3829     }
3830 
3831     /* Store MSR.  */
3832     if (__put_user(msr, &frame->mc_gregs[TARGET_PT_MSR]))
3833         return 1;
3834 
3835     /* Set up the sigreturn trampoline: li r0,sigret; sc.  */
3836     if (sigret) {
3837         if (__put_user(0x38000000UL | sigret, &frame->tramp[0]) ||
3838             __put_user(0x44000002UL, &frame->tramp[1])) {
3839             return 1;
3840         }
3841     }
3842 
3843     return 0;
3844 }
3845 
3846 static int restore_user_regs(CPUState *env,
3847                              struct target_mcontext *frame, int sig)
3848 {
3849     target_ulong save_r2 = 0;
3850     target_ulong msr;
3851     target_ulong ccr;
3852 
3853     int i;
3854 
3855     if (!sig) {
3856         save_r2 = env->gpr[2];
3857     }
3858 
3859     /* Restore general registers.  */
3860     for (i = 0; i < ARRAY_SIZE(env->gpr); i++) {
3861         if (__get_user(env->gpr[i], &frame->mc_gregs[i])) {
3862             return 1;
3863         }
3864     }
3865     if (__get_user(env->nip, &frame->mc_gregs[TARGET_PT_NIP])
3866         || __get_user(env->ctr, &frame->mc_gregs[TARGET_PT_CTR])
3867         || __get_user(env->lr, &frame->mc_gregs[TARGET_PT_LNK])
3868         || __get_user(env->xer, &frame->mc_gregs[TARGET_PT_XER]))
3869         return 1;
3870     if (__get_user(ccr, &frame->mc_gregs[TARGET_PT_CCR]))
3871         return 1;
3872 
3873     for (i = 0; i < ARRAY_SIZE(env->crf); i++) {
3874         env->crf[i] = (ccr >> (32 - ((i + 1) * 4))) & 0xf;
3875     }
3876 
3877     if (!sig) {
3878         env->gpr[2] = save_r2;
3879     }
3880     /* Restore MSR.  */
3881     if (__get_user(msr, &frame->mc_gregs[TARGET_PT_MSR]))
3882         return 1;
3883 
3884     /* If doing signal return, restore the previous little-endian mode.  */
3885     if (sig)
3886         env->msr = (env->msr & ~MSR_LE) | (msr & MSR_LE);
3887 
3888     /* Restore Altivec registers if necessary.  */
3889     if (env->insns_flags & PPC_ALTIVEC) {
3890         for (i = 0; i < ARRAY_SIZE(env->avr); i++) {
3891             ppc_avr_t *avr = &env->avr[i];
3892             ppc_avr_t *vreg = &frame->mc_vregs.altivec[i];
3893 
3894             if (__get_user(avr->u64[0], &vreg->u64[0]) ||
3895                 __get_user(avr->u64[1], &vreg->u64[1])) {
3896                 return 1;
3897             }
3898         }
3899         /* Set MSR_VEC in the saved MSR value to indicate that
3900            frame->mc_vregs contains valid data.  */
3901         if (__get_user(env->spr[SPR_VRSAVE],
3902                        (target_ulong *)(&frame->mc_vregs.altivec[32].u32[3])))
3903             return 1;
3904     }
3905 
3906     /* Restore floating point registers.  */
3907     if (env->insns_flags & PPC_FLOAT) {
3908         uint64_t fpscr;
3909         for (i = 0; i < ARRAY_SIZE(env->fpr); i++) {
3910             if (__get_user(env->fpr[i], &frame->mc_fregs[i])) {
3911                 return 1;
3912             }
3913         }
3914         if (__get_user(fpscr, &frame->mc_fregs[32]))
3915             return 1;
3916         env->fpscr = (uint32_t) fpscr;
3917     }
3918 
3919     /* Save SPE registers.  The kernel only saves the high half.  */
3920     if (env->insns_flags & PPC_SPE) {
3921 #if defined(TARGET_PPC64)
3922         for (i = 0; i < ARRAY_SIZE(env->gpr); i++) {
3923             uint32_t hi;
3924 
3925             if (__get_user(hi, &frame->mc_vregs.spe[i])) {
3926                 return 1;
3927             }
3928             env->gpr[i] = ((uint64_t)hi << 32) | ((uint32_t) env->gpr[i]);
3929         }
3930 #else
3931         for (i = 0; i < ARRAY_SIZE(env->gprh); i++) {
3932             if (__get_user(env->gprh[i], &frame->mc_vregs.spe[i])) {
3933                 return 1;
3934             }
3935         }
3936 #endif
3937         if (__get_user(env->spe_fscr, &frame->mc_vregs.spe[32]))
3938             return 1;
3939     }
3940 
3941     return 0;
3942 }
3943 
3944 static void setup_frame(int sig, struct target_sigaction *ka,
3945                         target_sigset_t *set, CPUState *env)
3946 {
3947     struct target_sigframe *frame;
3948     struct target_sigcontext *sc;
3949     target_ulong frame_addr, newsp;
3950     int err = 0;
3951     int signal;
3952 
3953     frame_addr = get_sigframe(ka, env, sizeof(*frame));
3954     if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 1))
3955         goto sigsegv;
3956     sc = &frame->sctx;
3957 
3958     signal = current_exec_domain_sig(sig);
3959 
3960     err |= __put_user(h2g(ka->_sa_handler), &sc->handler);
3961     err |= __put_user(set->sig[0], &sc->oldmask);
3962 #if defined(TARGET_PPC64)
3963     err |= __put_user(set->sig[0] >> 32, &sc->_unused[3]);
3964 #else
3965     err |= __put_user(set->sig[1], &sc->_unused[3]);
3966 #endif
3967     err |= __put_user(h2g(&frame->mctx), &sc->regs);
3968     err |= __put_user(sig, &sc->signal);
3969 
3970     /* Save user regs.  */
3971     err |= save_user_regs(env, &frame->mctx, TARGET_NR_sigreturn);
3972 
3973     /* The kernel checks for the presence of a VDSO here.  We don't
3974        emulate a vdso, so use a sigreturn system call.  */
3975     env->lr = (target_ulong) h2g(frame->mctx.tramp);
3976 
3977     /* Turn off all fp exceptions.  */
3978     env->fpscr = 0;
3979 
3980     /* Create a stack frame for the caller of the handler.  */
3981     newsp = frame_addr - SIGNAL_FRAMESIZE;
3982     err |= __put_user(env->gpr[1], (target_ulong *)(uintptr_t) newsp);
3983 
3984     if (err)
3985         goto sigsegv;
3986 
3987     /* Set up registers for signal handler.  */
3988     env->gpr[1] = newsp;
3989     env->gpr[3] = signal;
3990     env->gpr[4] = (target_ulong) h2g(sc);
3991     env->nip = (target_ulong) ka->_sa_handler;
3992     /* Signal handlers are entered in big-endian mode.  */
3993     env->msr &= ~MSR_LE;
3994 
3995     unlock_user_struct(frame, frame_addr, 1);
3996     return;
3997 
3998 sigsegv:
3999     unlock_user_struct(frame, frame_addr, 1);
4000     if (logfile)
4001         fprintf (logfile, "segfaulting from setup_frame\n");
4002     force_sig(TARGET_SIGSEGV);
4003 }
4004 
4005 static void setup_rt_frame(int sig, struct target_sigaction *ka,
4006                            target_siginfo_t *info,
4007                            target_sigset_t *set, CPUState *env)
4008 {
4009     struct target_rt_sigframe *rt_sf;
4010     struct target_mcontext *frame;
4011     target_ulong rt_sf_addr, newsp = 0;
4012     int i, err = 0;
4013     int signal;
4014 
4015     rt_sf_addr = get_sigframe(ka, env, sizeof(*rt_sf));
4016     if (!lock_user_struct(VERIFY_WRITE, rt_sf, rt_sf_addr, 1))
4017         goto sigsegv;
4018 
4019     signal = current_exec_domain_sig(sig);
4020 
4021     err |= copy_siginfo_to_user(&rt_sf->info, info);
4022 
4023     err |= __put_user(0, &rt_sf->uc.tuc_flags);
4024     err |= __put_user(0, &rt_sf->uc.tuc_link);
4025     err |= __put_user((target_ulong)target_sigaltstack_used.ss_sp,
4026                       &rt_sf->uc.tuc_stack.ss_sp);
4027     err |= __put_user(sas_ss_flags(env->gpr[1]),
4028                       &rt_sf->uc.tuc_stack.ss_flags);
4029     err |= __put_user(target_sigaltstack_used.ss_size,
4030                       &rt_sf->uc.tuc_stack.ss_size);
4031     err |= __put_user(h2g (&rt_sf->uc.tuc_mcontext),
4032                       &rt_sf->uc.tuc_regs);
4033     for(i = 0; i < TARGET_NSIG_WORDS; i++) {
4034         err |= __put_user(set->sig[i], &rt_sf->uc.tuc_sigmask.sig[i]);
4035     }
4036 
4037     frame = &rt_sf->uc.tuc_mcontext;
4038     err |= save_user_regs(env, frame, TARGET_NR_rt_sigreturn);
4039 
4040     /* The kernel checks for the presence of a VDSO here.  We don't
4041        emulate a vdso, so use a sigreturn system call.  */
4042     env->lr = (target_ulong) h2g(frame->tramp);
4043 
4044     /* Turn off all fp exceptions.  */
4045     env->fpscr = 0;
4046 
4047     /* Create a stack frame for the caller of the handler.  */
4048     newsp = rt_sf_addr - (SIGNAL_FRAMESIZE + 16);
4049     err |= __put_user(env->gpr[1], (target_ulong *)(uintptr_t) newsp);
4050 
4051     if (err)
4052         goto sigsegv;
4053 
4054     /* Set up registers for signal handler.  */
4055     env->gpr[1] = newsp;
4056     env->gpr[3] = (target_ulong) signal;
4057     env->gpr[4] = (target_ulong) h2g(&rt_sf->info);
4058     env->gpr[5] = (target_ulong) h2g(&rt_sf->uc);
4059     env->gpr[6] = (target_ulong) h2g(rt_sf);
4060     env->nip = (target_ulong) ka->_sa_handler;
4061     /* Signal handlers are entered in big-endian mode.  */
4062     env->msr &= ~MSR_LE;
4063 
4064     unlock_user_struct(rt_sf, rt_sf_addr, 1);
4065     return;
4066 
4067 sigsegv:
4068     unlock_user_struct(rt_sf, rt_sf_addr, 1);
4069     if (logfile)
4070         fprintf (logfile, "segfaulting from setup_rt_frame\n");
4071     force_sig(TARGET_SIGSEGV);
4072 
4073 }
4074 
4075 long do_sigreturn(CPUState *env)
4076 {
4077     struct target_sigcontext *sc = NULL;
4078     struct target_mcontext *sr = NULL;
4079     target_ulong sr_addr, sc_addr;
4080     sigset_t blocked;
4081     target_sigset_t set;
4082 
4083     sc_addr = env->gpr[1] + SIGNAL_FRAMESIZE;
4084     if (!lock_user_struct(VERIFY_READ, sc, sc_addr, 1))
4085         goto sigsegv;
4086 
4087 #if defined(TARGET_PPC64)
4088     set.sig[0] = sc->oldmask + ((long)(sc->_unused[3]) << 32);
4089 #else
4090     if(__get_user(set.sig[0], &sc->oldmask) ||
4091        __get_user(set.sig[1], &sc->_unused[3]))
4092        goto sigsegv;
4093 #endif
4094     target_to_host_sigset_internal(&blocked, &set);
4095     sigprocmask(SIG_SETMASK, &blocked, NULL);
4096 
4097     if (__get_user(sr_addr, &sc->regs))
4098         goto sigsegv;
4099     if (!lock_user_struct(VERIFY_READ, sr, sr_addr, 1))
4100         goto sigsegv;
4101     if (restore_user_regs(env, sr, 1))
4102         goto sigsegv;
4103 
4104     unlock_user_struct(sr, sr_addr, 1);
4105     unlock_user_struct(sc, sc_addr, 1);
4106     return -TARGET_QEMU_ESIGRETURN;
4107 
4108 sigsegv:
4109     unlock_user_struct(sr, sr_addr, 1);
4110     unlock_user_struct(sc, sc_addr, 1);
4111     if (logfile)
4112         fprintf (logfile, "segfaulting from do_sigreturn\n");
4113     force_sig(TARGET_SIGSEGV);
4114     return 0;
4115 }
4116 
4117 /* See arch/powerpc/kernel/signal_32.c.  */
4118 static int do_setcontext(struct target_ucontext *ucp, CPUState *env, int sig)
4119 {
4120     struct target_mcontext *mcp;
4121     target_ulong mcp_addr;
4122     sigset_t blocked;
4123     target_sigset_t set;
4124 
4125     if (copy_from_user(&set, h2g(ucp) + offsetof(struct target_ucontext, tuc_sigmask),
4126                        sizeof (set)))
4127         return 1;
4128 
4129 #if defined(TARGET_PPC64)
4130     fprintf (stderr, "do_setcontext: not implemented\n");
4131     return 0;
4132 #else
4133     if (__get_user(mcp_addr, &ucp->tuc_regs))
4134         return 1;
4135 
4136     if (!lock_user_struct(VERIFY_READ, mcp, mcp_addr, 1))
4137         return 1;
4138 
4139     target_to_host_sigset_internal(&blocked, &set);
4140     sigprocmask(SIG_SETMASK, &blocked, NULL);
4141     if (restore_user_regs(env, mcp, sig))
4142         goto sigsegv;
4143 
4144     unlock_user_struct(mcp, mcp_addr, 1);
4145     return 0;
4146 
4147 sigsegv:
4148     unlock_user_struct(mcp, mcp_addr, 1);
4149     return 1;
4150 #endif
4151 }
4152 
4153 long do_rt_sigreturn(CPUState *env)
4154 {
4155     struct target_rt_sigframe *rt_sf = NULL;
4156     target_ulong rt_sf_addr;
4157 
4158     rt_sf_addr = env->gpr[1] + SIGNAL_FRAMESIZE + 16;
4159     if (!lock_user_struct(VERIFY_READ, rt_sf, rt_sf_addr, 1))
4160         goto sigsegv;
4161 
4162     if (do_setcontext(&rt_sf->uc, env, 1))
4163         goto sigsegv;
4164 
4165     do_sigaltstack(rt_sf_addr
4166                    + offsetof(struct target_rt_sigframe, uc.tuc_stack),
4167                    0, env->gpr[1]);
4168 
4169     unlock_user_struct(rt_sf, rt_sf_addr, 1);
4170     return -TARGET_QEMU_ESIGRETURN;
4171 
4172 sigsegv:
4173     unlock_user_struct(rt_sf, rt_sf_addr, 1);
4174     if (logfile)
4175         fprintf (logfile, "segfaulting from do_rt_sigreturn\n");
4176     force_sig(TARGET_SIGSEGV);
4177     return 0;
4178 }
4179 
4180 #elif defined(TARGET_M68K)
4181 
4182 struct target_sigcontext {
4183     abi_ulong  sc_mask;
4184     abi_ulong  sc_usp;
4185     abi_ulong  sc_d0;
4186     abi_ulong  sc_d1;
4187     abi_ulong  sc_a0;
4188     abi_ulong  sc_a1;
4189     unsigned short sc_sr;
4190     abi_ulong  sc_pc;
4191 };
4192 
4193 struct target_sigframe
4194 {
4195     abi_ulong pretcode;
4196     int sig;
4197     int code;
4198     abi_ulong psc;
4199     char retcode[8];
4200     abi_ulong extramask[TARGET_NSIG_WORDS-1];
4201     struct target_sigcontext sc;
4202 };
4203 
4204 typedef int target_greg_t;
4205 #define TARGET_NGREG 18
4206 typedef target_greg_t target_gregset_t[TARGET_NGREG];
4207 
4208 typedef struct target_fpregset {
4209     int f_fpcntl[3];
4210     int f_fpregs[8*3];
4211 } target_fpregset_t;
4212 
4213 struct target_mcontext {
4214     int version;
4215     target_gregset_t gregs;
4216     target_fpregset_t fpregs;
4217 };
4218 
4219 #define TARGET_MCONTEXT_VERSION 2
4220 
4221 struct target_ucontext {
4222     abi_ulong tuc_flags;
4223     abi_ulong tuc_link;
4224     target_stack_t tuc_stack;
4225     struct target_mcontext tuc_mcontext;
4226     abi_long tuc_filler[80];
4227     target_sigset_t tuc_sigmask;
4228 };
4229 
4230 struct target_rt_sigframe
4231 {
4232     abi_ulong pretcode;
4233     int sig;
4234     abi_ulong pinfo;
4235     abi_ulong puc;
4236     char retcode[8];
4237     struct target_siginfo info;
4238     struct target_ucontext uc;
4239 };
4240 
4241 static int
4242 setup_sigcontext(struct target_sigcontext *sc, CPUState *env, abi_ulong mask)
4243 {
4244     int err = 0;
4245 
4246     err |= __put_user(mask, &sc->sc_mask);
4247     err |= __put_user(env->aregs[7], &sc->sc_usp);
4248     err |= __put_user(env->dregs[0], &sc->sc_d0);
4249     err |= __put_user(env->dregs[1], &sc->sc_d1);
4250     err |= __put_user(env->aregs[0], &sc->sc_a0);
4251     err |= __put_user(env->aregs[1], &sc->sc_a1);
4252     err |= __put_user(env->sr, &sc->sc_sr);
4253     err |= __put_user(env->pc, &sc->sc_pc);
4254 
4255     return err;
4256 }
4257 
4258 static int
4259 restore_sigcontext(CPUState *env, struct target_sigcontext *sc, int *pd0)
4260 {
4261     int err = 0;
4262     int temp;
4263 
4264     err |= __get_user(env->aregs[7], &sc->sc_usp);
4265     err |= __get_user(env->dregs[1], &sc->sc_d1);
4266     err |= __get_user(env->aregs[0], &sc->sc_a0);
4267     err |= __get_user(env->aregs[1], &sc->sc_a1);
4268     err |= __get_user(env->pc, &sc->sc_pc);
4269     err |= __get_user(temp, &sc->sc_sr);
4270     env->sr = (env->sr & 0xff00) | (temp & 0xff);
4271 
4272     *pd0 = tswapl(sc->sc_d0);
4273 
4274     return err;
4275 }
4276 
4277 /*
4278  * Determine which stack to use..
4279  */
4280 static inline abi_ulong
4281 get_sigframe(struct target_sigaction *ka, CPUState *regs, size_t frame_size)
4282 {
4283     unsigned long sp;
4284 
4285     sp = regs->aregs[7];
4286 
4287     /* This is the X/Open sanctioned signal stack switching.  */
4288     if ((ka->sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags (sp) == 0)) {
4289         sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
4290     }
4291 
4292     return ((sp - frame_size) & -8UL);
4293 }
4294 
4295 static void setup_frame(int sig, struct target_sigaction *ka,
4296 			target_sigset_t *set, CPUState *env)
4297 {
4298     struct target_sigframe *frame;
4299     abi_ulong frame_addr;
4300     abi_ulong retcode_addr;
4301     abi_ulong sc_addr;
4302     int err = 0;
4303     int i;
4304 
4305     frame_addr = get_sigframe(ka, env, sizeof *frame);
4306     if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
4307 	goto give_sigsegv;
4308 
4309     err |= __put_user(sig, &frame->sig);
4310 
4311     sc_addr = frame_addr + offsetof(struct target_sigframe, sc);
4312     err |= __put_user(sc_addr, &frame->psc);
4313 
4314     err |= setup_sigcontext(&frame->sc, env, set->sig[0]);
4315     if (err)
4316 	goto give_sigsegv;
4317 
4318     for(i = 1; i < TARGET_NSIG_WORDS; i++) {
4319         if (__put_user(set->sig[i], &frame->extramask[i - 1]))
4320             goto give_sigsegv;
4321     }
4322 
4323     /* Set up to return from userspace.  */
4324 
4325     retcode_addr = frame_addr + offsetof(struct target_sigframe, retcode);
4326     err |= __put_user(retcode_addr, &frame->pretcode);
4327 
4328     /* moveq #,d0; trap #0 */
4329 
4330     err |= __put_user(0x70004e40 + (TARGET_NR_sigreturn << 16),
4331                       (long *)(frame->retcode));
4332 
4333     if (err)
4334         goto give_sigsegv;
4335 
4336     /* Set up to return from userspace */
4337 
4338     env->aregs[7] = frame_addr;
4339     env->pc = ka->_sa_handler;
4340 
4341     unlock_user_struct(frame, frame_addr, 1);
4342     return;
4343 
4344 give_sigsegv:
4345     unlock_user_struct(frame, frame_addr, 1);
4346     force_sig(TARGET_SIGSEGV);
4347 }
4348 
4349 static inline int target_rt_setup_ucontext(struct target_ucontext *uc,
4350                                            CPUState *env)
4351 {
4352     target_greg_t *gregs = uc->tuc_mcontext.gregs;
4353     int err;
4354 
4355     err = __put_user(TARGET_MCONTEXT_VERSION, &uc->tuc_mcontext.version);
4356     err |= __put_user(env->dregs[0], &gregs[0]);
4357     err |= __put_user(env->dregs[1], &gregs[1]);
4358     err |= __put_user(env->dregs[2], &gregs[2]);
4359     err |= __put_user(env->dregs[3], &gregs[3]);
4360     err |= __put_user(env->dregs[4], &gregs[4]);
4361     err |= __put_user(env->dregs[5], &gregs[5]);
4362     err |= __put_user(env->dregs[6], &gregs[6]);
4363     err |= __put_user(env->dregs[7], &gregs[7]);
4364     err |= __put_user(env->aregs[0], &gregs[8]);
4365     err |= __put_user(env->aregs[1], &gregs[9]);
4366     err |= __put_user(env->aregs[2], &gregs[10]);
4367     err |= __put_user(env->aregs[3], &gregs[11]);
4368     err |= __put_user(env->aregs[4], &gregs[12]);
4369     err |= __put_user(env->aregs[5], &gregs[13]);
4370     err |= __put_user(env->aregs[6], &gregs[14]);
4371     err |= __put_user(env->aregs[7], &gregs[15]);
4372     err |= __put_user(env->pc, &gregs[16]);
4373     err |= __put_user(env->sr, &gregs[17]);
4374 
4375     return err;
4376 }
4377 
4378 static inline int target_rt_restore_ucontext(CPUState *env,
4379                                              struct target_ucontext *uc,
4380                                              int *pd0)
4381 {
4382     int temp;
4383     int err;
4384     target_greg_t *gregs = uc->tuc_mcontext.gregs;
4385 
4386     err = __get_user(temp, &uc->tuc_mcontext.version);
4387     if (temp != TARGET_MCONTEXT_VERSION)
4388         goto badframe;
4389 
4390     /* restore passed registers */
4391     err |= __get_user(env->dregs[0], &gregs[0]);
4392     err |= __get_user(env->dregs[1], &gregs[1]);
4393     err |= __get_user(env->dregs[2], &gregs[2]);
4394     err |= __get_user(env->dregs[3], &gregs[3]);
4395     err |= __get_user(env->dregs[4], &gregs[4]);
4396     err |= __get_user(env->dregs[5], &gregs[5]);
4397     err |= __get_user(env->dregs[6], &gregs[6]);
4398     err |= __get_user(env->dregs[7], &gregs[7]);
4399     err |= __get_user(env->aregs[0], &gregs[8]);
4400     err |= __get_user(env->aregs[1], &gregs[9]);
4401     err |= __get_user(env->aregs[2], &gregs[10]);
4402     err |= __get_user(env->aregs[3], &gregs[11]);
4403     err |= __get_user(env->aregs[4], &gregs[12]);
4404     err |= __get_user(env->aregs[5], &gregs[13]);
4405     err |= __get_user(env->aregs[6], &gregs[14]);
4406     err |= __get_user(env->aregs[7], &gregs[15]);
4407     err |= __get_user(env->pc, &gregs[16]);
4408     err |= __get_user(temp, &gregs[17]);
4409     env->sr = (env->sr & 0xff00) | (temp & 0xff);
4410 
4411     *pd0 = env->dregs[0];
4412     return err;
4413 
4414 badframe:
4415     return 1;
4416 }
4417 
4418 static void setup_rt_frame(int sig, struct target_sigaction *ka,
4419                            target_siginfo_t *info,
4420 			   target_sigset_t *set, CPUState *env)
4421 {
4422     struct target_rt_sigframe *frame;
4423     abi_ulong frame_addr;
4424     abi_ulong retcode_addr;
4425     abi_ulong info_addr;
4426     abi_ulong uc_addr;
4427     int err = 0;
4428     int i;
4429 
4430     frame_addr = get_sigframe(ka, env, sizeof *frame);
4431     if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
4432 	goto give_sigsegv;
4433 
4434     err |= __put_user(sig, &frame->sig);
4435 
4436     info_addr = frame_addr + offsetof(struct target_rt_sigframe, info);
4437     err |= __put_user(info_addr, &frame->pinfo);
4438 
4439     uc_addr = frame_addr + offsetof(struct target_rt_sigframe, uc);
4440     err |= __put_user(uc_addr, &frame->puc);
4441 
4442     err |= copy_siginfo_to_user(&frame->info, info);
4443 
4444     /* Create the ucontext */
4445 
4446     err |= __put_user(0, &frame->uc.tuc_flags);
4447     err |= __put_user(0, &frame->uc.tuc_link);
4448     err |= __put_user(target_sigaltstack_used.ss_sp,
4449                       &frame->uc.tuc_stack.ss_sp);
4450     err |= __put_user(sas_ss_flags(env->aregs[7]),
4451                       &frame->uc.tuc_stack.ss_flags);
4452     err |= __put_user(target_sigaltstack_used.ss_size,
4453                       &frame->uc.tuc_stack.ss_size);
4454     err |= target_rt_setup_ucontext(&frame->uc, env);
4455 
4456     if (err)
4457             goto give_sigsegv;
4458 
4459     for(i = 0; i < TARGET_NSIG_WORDS; i++) {
4460         if (__put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]))
4461             goto give_sigsegv;
4462     }
4463 
4464     /* Set up to return from userspace.  */
4465 
4466     retcode_addr = frame_addr + offsetof(struct target_sigframe, retcode);
4467     err |= __put_user(retcode_addr, &frame->pretcode);
4468 
4469     /* moveq #,d0; notb d0; trap #0 */
4470 
4471     err |= __put_user(0x70004600 + ((TARGET_NR_rt_sigreturn ^ 0xff) << 16),
4472                       (long *)(frame->retcode + 0));
4473     err |= __put_user(0x4e40, (short *)(frame->retcode + 4));
4474 
4475     if (err)
4476         goto give_sigsegv;
4477 
4478     /* Set up to return from userspace */
4479 
4480     env->aregs[7] = frame_addr;
4481     env->pc = ka->_sa_handler;
4482 
4483     unlock_user_struct(frame, frame_addr, 1);
4484     return;
4485 
4486 give_sigsegv:
4487     unlock_user_struct(frame, frame_addr, 1);
4488     force_sig(TARGET_SIGSEGV);
4489 }
4490 
4491 long do_sigreturn(CPUState *env)
4492 {
4493     struct target_sigframe *frame;
4494     abi_ulong frame_addr = env->aregs[7] - 4;
4495     target_sigset_t target_set;
4496     sigset_t set;
4497     int d0, i;
4498 
4499     if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
4500         goto badframe;
4501 
4502     /* set blocked signals */
4503 
4504     if (__get_user(target_set.sig[0], &frame->sc.sc_mask))
4505         goto badframe;
4506 
4507     for(i = 1; i < TARGET_NSIG_WORDS; i++) {
4508         if (__get_user(target_set.sig[i], &frame->extramask[i - 1]))
4509             goto badframe;
4510     }
4511 
4512     target_to_host_sigset_internal(&set, &target_set);
4513     sigprocmask(SIG_SETMASK, &set, NULL);
4514 
4515     /* restore registers */
4516 
4517     if (restore_sigcontext(env, &frame->sc, &d0))
4518         goto badframe;
4519 
4520     unlock_user_struct(frame, frame_addr, 0);
4521     return d0;
4522 
4523 badframe:
4524     unlock_user_struct(frame, frame_addr, 0);
4525     force_sig(TARGET_SIGSEGV);
4526     return 0;
4527 }
4528 
4529 long do_rt_sigreturn(CPUState *env)
4530 {
4531     struct target_rt_sigframe *frame;
4532     abi_ulong frame_addr = env->aregs[7] - 4;
4533     target_sigset_t target_set;
4534     sigset_t set;
4535     int d0;
4536 
4537     if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
4538         goto badframe;
4539 
4540     target_to_host_sigset_internal(&set, &target_set);
4541     sigprocmask(SIG_SETMASK, &set, NULL);
4542 
4543     /* restore registers */
4544 
4545     if (target_rt_restore_ucontext(env, &frame->uc, &d0))
4546         goto badframe;
4547 
4548     if (do_sigaltstack(frame_addr +
4549                        offsetof(struct target_rt_sigframe, uc.tuc_stack),
4550                        0, get_sp_from_cpustate(env)) == -EFAULT)
4551         goto badframe;
4552 
4553     unlock_user_struct(frame, frame_addr, 0);
4554     return d0;
4555 
4556 badframe:
4557     unlock_user_struct(frame, frame_addr, 0);
4558     force_sig(TARGET_SIGSEGV);
4559     return 0;
4560 }
4561 
4562 #elif defined(TARGET_ALPHA)
4563 
4564 struct target_sigcontext {
4565     abi_long sc_onstack;
4566     abi_long sc_mask;
4567     abi_long sc_pc;
4568     abi_long sc_ps;
4569     abi_long sc_regs[32];
4570     abi_long sc_ownedfp;
4571     abi_long sc_fpregs[32];
4572     abi_ulong sc_fpcr;
4573     abi_ulong sc_fp_control;
4574     abi_ulong sc_reserved1;
4575     abi_ulong sc_reserved2;
4576     abi_ulong sc_ssize;
4577     abi_ulong sc_sbase;
4578     abi_ulong sc_traparg_a0;
4579     abi_ulong sc_traparg_a1;
4580     abi_ulong sc_traparg_a2;
4581     abi_ulong sc_fp_trap_pc;
4582     abi_ulong sc_fp_trigger_sum;
4583     abi_ulong sc_fp_trigger_inst;
4584 };
4585 
4586 struct target_ucontext {
4587     abi_ulong tuc_flags;
4588     abi_ulong tuc_link;
4589     abi_ulong tuc_osf_sigmask;
4590     target_stack_t tuc_stack;
4591     struct target_sigcontext tuc_mcontext;
4592     target_sigset_t tuc_sigmask;
4593 };
4594 
4595 struct target_sigframe {
4596     struct target_sigcontext sc;
4597     unsigned int retcode[3];
4598 };
4599 
4600 struct target_rt_sigframe {
4601     target_siginfo_t info;
4602     struct target_ucontext uc;
4603     unsigned int retcode[3];
4604 };
4605 
4606 #define INSN_MOV_R30_R16        0x47fe0410
4607 #define INSN_LDI_R0             0x201f0000
4608 #define INSN_CALLSYS            0x00000083
4609 
4610 static int setup_sigcontext(struct target_sigcontext *sc, CPUState *env,
4611                             abi_ulong frame_addr, target_sigset_t *set)
4612 {
4613     int i, err = 0;
4614 
4615     err |= __put_user(on_sig_stack(frame_addr), &sc->sc_onstack);
4616     err |= __put_user(set->sig[0], &sc->sc_mask);
4617     err |= __put_user(env->pc, &sc->sc_pc);
4618     err |= __put_user(8, &sc->sc_ps);
4619 
4620     for (i = 0; i < 31; ++i) {
4621         err |= __put_user(env->ir[i], &sc->sc_regs[i]);
4622     }
4623     err |= __put_user(0, &sc->sc_regs[31]);
4624 
4625     for (i = 0; i < 31; ++i) {
4626         err |= __put_user(env->fir[i], &sc->sc_fpregs[i]);
4627     }
4628     err |= __put_user(0, &sc->sc_fpregs[31]);
4629     err |= __put_user(cpu_alpha_load_fpcr(env), &sc->sc_fpcr);
4630 
4631     err |= __put_user(0, &sc->sc_traparg_a0); /* FIXME */
4632     err |= __put_user(0, &sc->sc_traparg_a1); /* FIXME */
4633     err |= __put_user(0, &sc->sc_traparg_a2); /* FIXME */
4634 
4635     return err;
4636 }
4637 
4638 static int restore_sigcontext(CPUState *env, struct target_sigcontext *sc)
4639 {
4640     uint64_t fpcr;
4641     int i, err = 0;
4642 
4643     err |= __get_user(env->pc, &sc->sc_pc);
4644 
4645     for (i = 0; i < 31; ++i) {
4646         err |= __get_user(env->ir[i], &sc->sc_regs[i]);
4647     }
4648     for (i = 0; i < 31; ++i) {
4649         err |= __get_user(env->fir[i], &sc->sc_fpregs[i]);
4650     }
4651 
4652     err |= __get_user(fpcr, &sc->sc_fpcr);
4653     cpu_alpha_store_fpcr(env, fpcr);
4654 
4655     return err;
4656 }
4657 
4658 static inline abi_ulong get_sigframe(struct target_sigaction *sa,
4659                                      CPUState *env, unsigned long framesize)
4660 {
4661     abi_ulong sp = env->ir[IR_SP];
4662 
4663     /* This is the X/Open sanctioned signal stack switching.  */
4664     if ((sa->sa_flags & TARGET_SA_ONSTACK) != 0 && !sas_ss_flags(sp)) {
4665         sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
4666     }
4667     return (sp - framesize) & -32;
4668 }
4669 
4670 static void setup_frame(int sig, struct target_sigaction *ka,
4671                         target_sigset_t *set, CPUState *env)
4672 {
4673     abi_ulong frame_addr, r26;
4674     struct target_sigframe *frame;
4675     int err = 0;
4676 
4677     frame_addr = get_sigframe(ka, env, sizeof(*frame));
4678     if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) {
4679         goto give_sigsegv;
4680     }
4681 
4682     err |= setup_sigcontext(&frame->sc, env, frame_addr, set);
4683 
4684     if (ka->sa_restorer) {
4685         r26 = ka->sa_restorer;
4686     } else {
4687         err |= __put_user(INSN_MOV_R30_R16, &frame->retcode[0]);
4688         err |= __put_user(INSN_LDI_R0 + TARGET_NR_sigreturn,
4689                           &frame->retcode[1]);
4690         err |= __put_user(INSN_CALLSYS, &frame->retcode[2]);
4691         /* imb() */
4692         r26 = frame_addr;
4693     }
4694 
4695     unlock_user_struct(frame, frame_addr, 1);
4696 
4697     if (err) {
4698     give_sigsegv:
4699         if (sig == TARGET_SIGSEGV) {
4700             ka->_sa_handler = TARGET_SIG_DFL;
4701         }
4702         force_sig(TARGET_SIGSEGV);
4703     }
4704 
4705     env->ir[IR_RA] = r26;
4706     env->ir[IR_PV] = env->pc = ka->_sa_handler;
4707     env->ir[IR_A0] = sig;
4708     env->ir[IR_A1] = 0;
4709     env->ir[IR_A2] = frame_addr + offsetof(struct target_sigframe, sc);
4710     env->ir[IR_SP] = frame_addr;
4711 }
4712 
4713 static void setup_rt_frame(int sig, struct target_sigaction *ka,
4714                            target_siginfo_t *info,
4715 			   target_sigset_t *set, CPUState *env)
4716 {
4717     abi_ulong frame_addr, r26;
4718     struct target_rt_sigframe *frame;
4719     int i, err = 0;
4720 
4721     frame_addr = get_sigframe(ka, env, sizeof(*frame));
4722     if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) {
4723         goto give_sigsegv;
4724     }
4725 
4726     err |= copy_siginfo_to_user(&frame->info, info);
4727 
4728     err |= __put_user(0, &frame->uc.tuc_flags);
4729     err |= __put_user(0, &frame->uc.tuc_link);
4730     err |= __put_user(set->sig[0], &frame->uc.tuc_osf_sigmask);
4731     err |= __put_user(target_sigaltstack_used.ss_sp,
4732                       &frame->uc.tuc_stack.ss_sp);
4733     err |= __put_user(sas_ss_flags(env->ir[IR_SP]),
4734                       &frame->uc.tuc_stack.ss_flags);
4735     err |= __put_user(target_sigaltstack_used.ss_size,
4736                       &frame->uc.tuc_stack.ss_size);
4737     err |= setup_sigcontext(&frame->uc.tuc_mcontext, env, frame_addr, set);
4738     for (i = 0; i < TARGET_NSIG_WORDS; ++i) {
4739         err |= __put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]);
4740     }
4741 
4742     if (ka->sa_restorer) {
4743         r26 = ka->sa_restorer;
4744     } else {
4745         err |= __put_user(INSN_MOV_R30_R16, &frame->retcode[0]);
4746         err |= __put_user(INSN_LDI_R0 + TARGET_NR_rt_sigreturn,
4747                           &frame->retcode[1]);
4748         err |= __put_user(INSN_CALLSYS, &frame->retcode[2]);
4749         /* imb(); */
4750         r26 = frame_addr;
4751     }
4752 
4753     if (err) {
4754     give_sigsegv:
4755        if (sig == TARGET_SIGSEGV) {
4756             ka->_sa_handler = TARGET_SIG_DFL;
4757         }
4758         force_sig(TARGET_SIGSEGV);
4759     }
4760 
4761     env->ir[IR_RA] = r26;
4762     env->ir[IR_PV] = env->pc = ka->_sa_handler;
4763     env->ir[IR_A0] = sig;
4764     env->ir[IR_A1] = frame_addr + offsetof(struct target_rt_sigframe, info);
4765     env->ir[IR_A2] = frame_addr + offsetof(struct target_rt_sigframe, uc);
4766     env->ir[IR_SP] = frame_addr;
4767 }
4768 
4769 long do_sigreturn(CPUState *env)
4770 {
4771     struct target_sigcontext *sc;
4772     abi_ulong sc_addr = env->ir[IR_A0];
4773     target_sigset_t target_set;
4774     sigset_t set;
4775 
4776     if (!lock_user_struct(VERIFY_READ, sc, sc_addr, 1)) {
4777         goto badframe;
4778     }
4779 
4780     target_sigemptyset(&target_set);
4781     if (__get_user(target_set.sig[0], &sc->sc_mask)) {
4782         goto badframe;
4783     }
4784 
4785     target_to_host_sigset_internal(&set, &target_set);
4786     sigprocmask(SIG_SETMASK, &set, NULL);
4787 
4788     if (restore_sigcontext(env, sc)) {
4789         goto badframe;
4790     }
4791     unlock_user_struct(sc, sc_addr, 0);
4792     return env->ir[IR_V0];
4793 
4794  badframe:
4795     unlock_user_struct(sc, sc_addr, 0);
4796     force_sig(TARGET_SIGSEGV);
4797 }
4798 
4799 long do_rt_sigreturn(CPUState *env)
4800 {
4801     abi_ulong frame_addr = env->ir[IR_A0];
4802     struct target_rt_sigframe *frame;
4803     sigset_t set;
4804 
4805     if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) {
4806         goto badframe;
4807     }
4808     target_to_host_sigset(&set, &frame->uc.tuc_sigmask);
4809     sigprocmask(SIG_SETMASK, &set, NULL);
4810 
4811     if (restore_sigcontext(env, &frame->uc.tuc_mcontext)) {
4812         goto badframe;
4813     }
4814     if (do_sigaltstack(frame_addr + offsetof(struct target_rt_sigframe,
4815                                              uc.tuc_stack),
4816                        0, env->ir[IR_SP]) == -EFAULT) {
4817         goto badframe;
4818     }
4819 
4820     unlock_user_struct(frame, frame_addr, 0);
4821     return env->ir[IR_V0];
4822 
4823 
4824  badframe:
4825     unlock_user_struct(frame, frame_addr, 0);
4826     force_sig(TARGET_SIGSEGV);
4827 }
4828 
4829 #else
4830 
4831 static void setup_frame(int sig, struct target_sigaction *ka,
4832 			target_sigset_t *set, CPUState *env)
4833 {
4834     fprintf(stderr, "setup_frame: not implemented\n");
4835 }
4836 
4837 static void setup_rt_frame(int sig, struct target_sigaction *ka,
4838                            target_siginfo_t *info,
4839 			   target_sigset_t *set, CPUState *env)
4840 {
4841     fprintf(stderr, "setup_rt_frame: not implemented\n");
4842 }
4843 
4844 long do_sigreturn(CPUState *env)
4845 {
4846     fprintf(stderr, "do_sigreturn: not implemented\n");
4847     return -TARGET_ENOSYS;
4848 }
4849 
4850 long do_rt_sigreturn(CPUState *env)
4851 {
4852     fprintf(stderr, "do_rt_sigreturn: not implemented\n");
4853     return -TARGET_ENOSYS;
4854 }
4855 
4856 #endif
4857 
4858 void process_pending_signals(CPUState *cpu_env)
4859 {
4860     int sig;
4861     abi_ulong handler;
4862     sigset_t set, old_set;
4863     target_sigset_t target_old_set;
4864     struct emulated_sigtable *k;
4865     struct target_sigaction *sa;
4866     struct sigqueue *q;
4867     TaskState *ts = cpu_env->opaque;
4868 
4869     if (!ts->signal_pending)
4870         return;
4871 
4872     /* FIXME: This is not threadsafe.  */
4873     k = ts->sigtab;
4874     for(sig = 1; sig <= TARGET_NSIG; sig++) {
4875         if (k->pending)
4876             goto handle_signal;
4877         k++;
4878     }
4879     /* if no signal is pending, just return */
4880     ts->signal_pending = 0;
4881     return;
4882 
4883  handle_signal:
4884 #ifdef DEBUG_SIGNAL
4885     fprintf(stderr, "qemu: process signal %d\n", sig);
4886 #endif
4887     /* dequeue signal */
4888     q = k->first;
4889     k->first = q->next;
4890     if (!k->first)
4891         k->pending = 0;
4892 
4893     sig = gdb_handlesig (cpu_env, sig);
4894     if (!sig) {
4895         sa = NULL;
4896         handler = TARGET_SIG_IGN;
4897     } else {
4898         sa = &sigact_table[sig - 1];
4899         handler = sa->_sa_handler;
4900     }
4901 
4902     if (handler == TARGET_SIG_DFL) {
4903         /* default handler : ignore some signal. The other are job control or fatal */
4904         if (sig == TARGET_SIGTSTP || sig == TARGET_SIGTTIN || sig == TARGET_SIGTTOU) {
4905             kill(getpid(),SIGSTOP);
4906         } else if (sig != TARGET_SIGCHLD &&
4907                    sig != TARGET_SIGURG &&
4908                    sig != TARGET_SIGWINCH &&
4909                    sig != TARGET_SIGCONT) {
4910             force_sig(sig);
4911         }
4912     } else if (handler == TARGET_SIG_IGN) {
4913         /* ignore sig */
4914     } else if (handler == TARGET_SIG_ERR) {
4915         force_sig(sig);
4916     } else {
4917         /* compute the blocked signals during the handler execution */
4918         target_to_host_sigset(&set, &sa->sa_mask);
4919         /* SA_NODEFER indicates that the current signal should not be
4920            blocked during the handler */
4921         if (!(sa->sa_flags & TARGET_SA_NODEFER))
4922             sigaddset(&set, target_to_host_signal(sig));
4923 
4924         /* block signals in the handler using Linux */
4925         sigprocmask(SIG_BLOCK, &set, &old_set);
4926         /* save the previous blocked signal state to restore it at the
4927            end of the signal execution (see do_sigreturn) */
4928         host_to_target_sigset_internal(&target_old_set, &old_set);
4929 
4930         /* if the CPU is in VM86 mode, we restore the 32 bit values */
4931 #if defined(TARGET_I386) && !defined(TARGET_X86_64)
4932         {
4933             CPUX86State *env = cpu_env;
4934             if (env->eflags & VM_MASK)
4935                 save_v86_state(env);
4936         }
4937 #endif
4938         /* prepare the stack frame of the virtual CPU */
4939         if (sa->sa_flags & TARGET_SA_SIGINFO)
4940             setup_rt_frame(sig, sa, &q->info, &target_old_set, cpu_env);
4941         else
4942             setup_frame(sig, sa, &target_old_set, cpu_env);
4943 	if (sa->sa_flags & TARGET_SA_RESETHAND)
4944             sa->_sa_handler = TARGET_SIG_DFL;
4945     }
4946     if (q != &k->info)
4947         free_sigqueue(cpu_env, q);
4948 }
4949