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