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