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