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