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