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