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