xref: /qemu/linux-user/signal.c (revision 530e7615ce3c01882e582c84dc6304ab98a3d5c5)
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, write to the Free Software
18  *  Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19  *  MA 02110-1301, USA.
20  */
21 #include <stdlib.h>
22 #include <stdio.h>
23 #include <string.h>
24 #include <stdarg.h>
25 #include <unistd.h>
26 #include <signal.h>
27 #include <errno.h>
28 #include <sys/ucontext.h>
29 
30 #include "qemu.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[65] = {
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 noone 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[65];
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 static inline int host_to_target_signal(int sig)
104 {
105     if (sig > 64)
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 > 64)
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] = tswapl(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] = tswapl(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             tswapl(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             tswapl(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)tswapl(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 void signal_init(void)
289 {
290     struct sigaction act;
291     struct sigaction oact;
292     int i, j;
293     int host_sig;
294 
295     /* generate signal conversion tables */
296     for(i = 1; i <= 64; i++) {
297         if (host_to_target_signal_table[i] == 0)
298             host_to_target_signal_table[i] = i;
299     }
300     for(i = 1; i <= 64; i++) {
301         j = host_to_target_signal_table[i];
302         target_to_host_signal_table[j] = i;
303     }
304 
305     /* set all host signal handlers. ALL signals are blocked during
306        the handlers to serialize them. */
307     memset(sigact_table, 0, sizeof(sigact_table));
308 
309     sigfillset(&act.sa_mask);
310     act.sa_flags = SA_SIGINFO;
311     act.sa_sigaction = host_signal_handler;
312     for(i = 1; i <= TARGET_NSIG; i++) {
313         host_sig = target_to_host_signal(i);
314         sigaction(host_sig, NULL, &oact);
315         if (oact.sa_sigaction == (void *)SIG_IGN) {
316             sigact_table[i - 1]._sa_handler = TARGET_SIG_IGN;
317         } else if (oact.sa_sigaction == (void *)SIG_DFL) {
318             sigact_table[i - 1]._sa_handler = TARGET_SIG_DFL;
319         }
320         /* If there's already a handler installed then something has
321            gone horribly wrong, so don't even try to handle that case.  */
322         /* Install some handlers for our own use.  We need at least
323            SIGSEGV and SIGBUS, to detect exceptions.  We can not just
324            trap all signals because it affects syscall interrupt
325            behavior.  But do trap all default-fatal signals.  */
326         if (fatal_signal (i))
327             sigaction(host_sig, &act, NULL);
328     }
329 }
330 
331 /* signal queue handling */
332 
333 static inline struct sigqueue *alloc_sigqueue(CPUState *env)
334 {
335     TaskState *ts = env->opaque;
336     struct sigqueue *q = ts->first_free;
337     if (!q)
338         return NULL;
339     ts->first_free = q->next;
340     return q;
341 }
342 
343 static inline void free_sigqueue(CPUState *env, struct sigqueue *q)
344 {
345     TaskState *ts = env->opaque;
346     q->next = ts->first_free;
347     ts->first_free = q;
348 }
349 
350 /* abort execution with signal */
351 static void __attribute((noreturn)) force_sig(int sig)
352 {
353     int host_sig;
354     host_sig = target_to_host_signal(sig);
355     fprintf(stderr, "qemu: uncaught target signal %d (%s) - exiting\n",
356             sig, strsignal(host_sig));
357 #if 1
358     gdb_signalled(thread_env, sig);
359     _exit(-host_sig);
360 #else
361     {
362         struct sigaction act;
363         sigemptyset(&act.sa_mask);
364         act.sa_flags = SA_SIGINFO;
365         act.sa_sigaction = SIG_DFL;
366         sigaction(SIGABRT, &act, NULL);
367         abort();
368     }
369 #endif
370 }
371 
372 /* queue a signal so that it will be send to the virtual CPU as soon
373    as possible */
374 int queue_signal(CPUState *env, int sig, target_siginfo_t *info)
375 {
376     TaskState *ts = env->opaque;
377     struct emulated_sigtable *k;
378     struct sigqueue *q, **pq;
379     abi_ulong handler;
380     int queue;
381 
382 #if defined(DEBUG_SIGNAL)
383     fprintf(stderr, "queue_signal: sig=%d\n",
384             sig);
385 #endif
386     k = &ts->sigtab[sig - 1];
387     queue = gdb_queuesig ();
388     handler = sigact_table[sig - 1]._sa_handler;
389     if (!queue && handler == TARGET_SIG_DFL) {
390         if (sig == TARGET_SIGTSTP || sig == TARGET_SIGTTIN || sig == TARGET_SIGTTOU) {
391             kill(getpid(),SIGSTOP);
392             return 0;
393         } else
394         /* default handler : ignore some signal. The other are fatal */
395         if (sig != TARGET_SIGCHLD &&
396             sig != TARGET_SIGURG &&
397             sig != TARGET_SIGWINCH &&
398             sig != TARGET_SIGCONT) {
399             force_sig(sig);
400         } else {
401             return 0; /* indicate ignored */
402         }
403     } else if (!queue && handler == TARGET_SIG_IGN) {
404         /* ignore signal */
405         return 0;
406     } else if (!queue && handler == TARGET_SIG_ERR) {
407         force_sig(sig);
408     } else {
409         pq = &k->first;
410         if (sig < TARGET_SIGRTMIN) {
411             /* if non real time signal, we queue exactly one signal */
412             if (!k->pending)
413                 q = &k->info;
414             else
415                 return 0;
416         } else {
417             if (!k->pending) {
418                 /* first signal */
419                 q = &k->info;
420             } else {
421                 q = alloc_sigqueue(env);
422                 if (!q)
423                     return -EAGAIN;
424                 while (*pq != NULL)
425                     pq = &(*pq)->next;
426             }
427         }
428         *pq = q;
429         q->info = *info;
430         q->next = NULL;
431         k->pending = 1;
432         /* signal that a new signal is pending */
433         ts->signal_pending = 1;
434         return 1; /* indicates that the signal was queued */
435     }
436 }
437 
438 static void host_signal_handler(int host_signum, siginfo_t *info,
439                                 void *puc)
440 {
441     int sig;
442     target_siginfo_t tinfo;
443 
444     /* the CPU emulator uses some host signals to detect exceptions,
445        we forward to it some signals */
446     if ((host_signum == SIGSEGV || host_signum == SIGBUS)
447         && info->si_code > 0) {
448         if (cpu_signal_handler(host_signum, info, puc))
449             return;
450     }
451 
452     /* get target signal number */
453     sig = host_to_target_signal(host_signum);
454     if (sig < 1 || sig > TARGET_NSIG)
455         return;
456 #if defined(DEBUG_SIGNAL)
457     fprintf(stderr, "qemu: got signal %d\n", sig);
458 #endif
459     host_to_target_siginfo_noswap(&tinfo, info);
460     if (queue_signal(thread_env, sig, &tinfo) == 1) {
461         /* interrupt the virtual CPU as soon as possible */
462         cpu_interrupt(thread_env, CPU_INTERRUPT_EXIT);
463     }
464 }
465 
466 /* do_sigaltstack() returns target values and errnos. */
467 /* compare linux/kernel/signal.c:do_sigaltstack() */
468 abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong uoss_addr, abi_ulong sp)
469 {
470     int ret;
471     struct target_sigaltstack oss;
472 
473     /* XXX: test errors */
474     if(uoss_addr)
475     {
476         __put_user(target_sigaltstack_used.ss_sp, &oss.ss_sp);
477         __put_user(target_sigaltstack_used.ss_size, &oss.ss_size);
478         __put_user(sas_ss_flags(sp), &oss.ss_flags);
479     }
480 
481     if(uss_addr)
482     {
483         struct target_sigaltstack *uss;
484         struct target_sigaltstack ss;
485 
486 	ret = -TARGET_EFAULT;
487         if (!lock_user_struct(VERIFY_READ, uss, uss_addr, 1)
488 	    || __get_user(ss.ss_sp, &uss->ss_sp)
489 	    || __get_user(ss.ss_size, &uss->ss_size)
490 	    || __get_user(ss.ss_flags, &uss->ss_flags))
491             goto out;
492         unlock_user_struct(uss, uss_addr, 0);
493 
494 	ret = -TARGET_EPERM;
495 	if (on_sig_stack(sp))
496             goto out;
497 
498 	ret = -TARGET_EINVAL;
499 	if (ss.ss_flags != TARGET_SS_DISABLE
500             && ss.ss_flags != TARGET_SS_ONSTACK
501             && ss.ss_flags != 0)
502             goto out;
503 
504 	if (ss.ss_flags == TARGET_SS_DISABLE) {
505             ss.ss_size = 0;
506             ss.ss_sp = 0;
507 	} else {
508             ret = -TARGET_ENOMEM;
509             if (ss.ss_size < MINSIGSTKSZ)
510                 goto out;
511 	}
512 
513         target_sigaltstack_used.ss_sp = ss.ss_sp;
514         target_sigaltstack_used.ss_size = ss.ss_size;
515     }
516 
517     if (uoss_addr) {
518         ret = -TARGET_EFAULT;
519         if (copy_to_user(uoss_addr, &oss, sizeof(oss)))
520             goto out;
521     }
522 
523     ret = 0;
524 out:
525     return ret;
526 }
527 
528 /* do_sigaction() return host values and errnos */
529 int do_sigaction(int sig, const struct target_sigaction *act,
530                  struct target_sigaction *oact)
531 {
532     struct target_sigaction *k;
533     struct sigaction act1;
534     int host_sig;
535     int ret = 0;
536 
537     if (sig < 1 || sig > TARGET_NSIG || sig == TARGET_SIGKILL || sig == TARGET_SIGSTOP)
538         return -EINVAL;
539     k = &sigact_table[sig - 1];
540 #if defined(DEBUG_SIGNAL)
541     fprintf(stderr, "sigaction sig=%d act=0x%08x, oact=0x%08x\n",
542             sig, (int)act, (int)oact);
543 #endif
544     if (oact) {
545         oact->_sa_handler = tswapl(k->_sa_handler);
546         oact->sa_flags = tswapl(k->sa_flags);
547 #if !defined(TARGET_MIPS)
548         oact->sa_restorer = tswapl(k->sa_restorer);
549 #endif
550         oact->sa_mask = k->sa_mask;
551     }
552     if (act) {
553         /* FIXME: This is not threadsafe.  */
554         k->_sa_handler = tswapl(act->_sa_handler);
555         k->sa_flags = tswapl(act->sa_flags);
556 #if !defined(TARGET_MIPS)
557         k->sa_restorer = tswapl(act->sa_restorer);
558 #endif
559         k->sa_mask = act->sa_mask;
560 
561         /* we update the host linux signal state */
562         host_sig = target_to_host_signal(sig);
563         if (host_sig != SIGSEGV && host_sig != SIGBUS) {
564             sigfillset(&act1.sa_mask);
565             act1.sa_flags = SA_SIGINFO;
566             if (k->sa_flags & TARGET_SA_RESTART)
567                 act1.sa_flags |= SA_RESTART;
568             /* NOTE: it is important to update the host kernel signal
569                ignore state to avoid getting unexpected interrupted
570                syscalls */
571             if (k->_sa_handler == TARGET_SIG_IGN) {
572                 act1.sa_sigaction = (void *)SIG_IGN;
573             } else if (k->_sa_handler == TARGET_SIG_DFL) {
574                 if (fatal_signal (sig))
575                     act1.sa_sigaction = host_signal_handler;
576                 else
577                     act1.sa_sigaction = (void *)SIG_DFL;
578             } else {
579                 act1.sa_sigaction = host_signal_handler;
580             }
581             ret = sigaction(host_sig, &act1, NULL);
582         }
583     }
584     return ret;
585 }
586 
587 static inline int copy_siginfo_to_user(target_siginfo_t *tinfo,
588                                        const target_siginfo_t *info)
589 {
590     tswap_siginfo(tinfo, info);
591     return 0;
592 }
593 
594 static inline int current_exec_domain_sig(int sig)
595 {
596     return /* current->exec_domain && current->exec_domain->signal_invmap
597 	      && sig < 32 ? current->exec_domain->signal_invmap[sig] : */ sig;
598 }
599 
600 #if defined(TARGET_I386) && TARGET_ABI_BITS == 32
601 
602 /* from the Linux kernel */
603 
604 struct target_fpreg {
605 	uint16_t significand[4];
606 	uint16_t exponent;
607 };
608 
609 struct target_fpxreg {
610 	uint16_t significand[4];
611 	uint16_t exponent;
612 	uint16_t padding[3];
613 };
614 
615 struct target_xmmreg {
616 	abi_ulong element[4];
617 };
618 
619 struct target_fpstate {
620 	/* Regular FPU environment */
621         abi_ulong       cw;
622         abi_ulong       sw;
623         abi_ulong       tag;
624         abi_ulong       ipoff;
625         abi_ulong       cssel;
626         abi_ulong       dataoff;
627         abi_ulong       datasel;
628 	struct target_fpreg	_st[8];
629 	uint16_t	status;
630 	uint16_t	magic;		/* 0xffff = regular FPU data only */
631 
632 	/* FXSR FPU environment */
633         abi_ulong       _fxsr_env[6];   /* FXSR FPU env is ignored */
634         abi_ulong       mxcsr;
635         abi_ulong       reserved;
636 	struct target_fpxreg	_fxsr_st[8];	/* FXSR FPU reg data is ignored */
637 	struct target_xmmreg	_xmm[8];
638         abi_ulong       padding[56];
639 };
640 
641 #define X86_FXSR_MAGIC		0x0000
642 
643 struct target_sigcontext {
644 	uint16_t gs, __gsh;
645 	uint16_t fs, __fsh;
646 	uint16_t es, __esh;
647 	uint16_t ds, __dsh;
648         abi_ulong edi;
649         abi_ulong esi;
650         abi_ulong ebp;
651         abi_ulong esp;
652         abi_ulong ebx;
653         abi_ulong edx;
654         abi_ulong ecx;
655         abi_ulong eax;
656         abi_ulong trapno;
657         abi_ulong err;
658         abi_ulong eip;
659 	uint16_t cs, __csh;
660         abi_ulong eflags;
661         abi_ulong esp_at_signal;
662 	uint16_t ss, __ssh;
663         abi_ulong fpstate; /* pointer */
664         abi_ulong oldmask;
665         abi_ulong cr2;
666 };
667 
668 struct target_ucontext {
669         abi_ulong         tuc_flags;
670         abi_ulong         tuc_link;
671 	target_stack_t	  tuc_stack;
672 	struct target_sigcontext tuc_mcontext;
673 	target_sigset_t	  tuc_sigmask;	/* mask last for extensibility */
674 };
675 
676 struct sigframe
677 {
678     abi_ulong pretcode;
679     int sig;
680     struct target_sigcontext sc;
681     struct target_fpstate fpstate;
682     abi_ulong extramask[TARGET_NSIG_WORDS-1];
683     char retcode[8];
684 };
685 
686 struct rt_sigframe
687 {
688     abi_ulong pretcode;
689     int sig;
690     abi_ulong pinfo;
691     abi_ulong puc;
692     struct target_siginfo info;
693     struct target_ucontext uc;
694     struct target_fpstate fpstate;
695     char retcode[8];
696 };
697 
698 /*
699  * Set up a signal frame.
700  */
701 
702 /* XXX: save x87 state */
703 static int
704 setup_sigcontext(struct target_sigcontext *sc, struct target_fpstate *fpstate,
705 		 CPUX86State *env, abi_ulong mask, abi_ulong fpstate_addr)
706 {
707 	int err = 0;
708         uint16_t magic;
709 
710 	/* already locked in setup_frame() */
711 	err |= __put_user(env->segs[R_GS].selector, (unsigned int *)&sc->gs);
712 	err |= __put_user(env->segs[R_FS].selector, (unsigned int *)&sc->fs);
713 	err |= __put_user(env->segs[R_ES].selector, (unsigned int *)&sc->es);
714 	err |= __put_user(env->segs[R_DS].selector, (unsigned int *)&sc->ds);
715 	err |= __put_user(env->regs[R_EDI], &sc->edi);
716 	err |= __put_user(env->regs[R_ESI], &sc->esi);
717 	err |= __put_user(env->regs[R_EBP], &sc->ebp);
718 	err |= __put_user(env->regs[R_ESP], &sc->esp);
719 	err |= __put_user(env->regs[R_EBX], &sc->ebx);
720 	err |= __put_user(env->regs[R_EDX], &sc->edx);
721 	err |= __put_user(env->regs[R_ECX], &sc->ecx);
722 	err |= __put_user(env->regs[R_EAX], &sc->eax);
723 	err |= __put_user(env->exception_index, &sc->trapno);
724 	err |= __put_user(env->error_code, &sc->err);
725 	err |= __put_user(env->eip, &sc->eip);
726 	err |= __put_user(env->segs[R_CS].selector, (unsigned int *)&sc->cs);
727 	err |= __put_user(env->eflags, &sc->eflags);
728 	err |= __put_user(env->regs[R_ESP], &sc->esp_at_signal);
729 	err |= __put_user(env->segs[R_SS].selector, (unsigned int *)&sc->ss);
730 
731         cpu_x86_fsave(env, fpstate_addr, 1);
732         fpstate->status = fpstate->sw;
733         magic = 0xffff;
734         err |= __put_user(magic, &fpstate->magic);
735         err |= __put_user(fpstate_addr, &sc->fpstate);
736 
737 	/* non-iBCS2 extensions.. */
738 	err |= __put_user(mask, &sc->oldmask);
739 	err |= __put_user(env->cr[2], &sc->cr2);
740 	return err;
741 }
742 
743 /*
744  * Determine which stack to use..
745  */
746 
747 static inline abi_ulong
748 get_sigframe(struct target_sigaction *ka, CPUX86State *env, size_t frame_size)
749 {
750 	unsigned long esp;
751 
752 	/* Default to using normal stack */
753 	esp = env->regs[R_ESP];
754 	/* This is the X/Open sanctioned signal stack switching.  */
755         if (ka->sa_flags & TARGET_SA_ONSTACK) {
756             if (sas_ss_flags(esp) == 0)
757                 esp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
758         }
759 
760 	/* This is the legacy signal stack switching. */
761 	else
762         if ((env->segs[R_SS].selector & 0xffff) != __USER_DS &&
763             !(ka->sa_flags & TARGET_SA_RESTORER) &&
764             ka->sa_restorer) {
765             esp = (unsigned long) ka->sa_restorer;
766 	}
767         return (esp - frame_size) & -8ul;
768 }
769 
770 /* compare linux/arch/i386/kernel/signal.c:setup_frame() */
771 static void setup_frame(int sig, struct target_sigaction *ka,
772 			target_sigset_t *set, CPUX86State *env)
773 {
774 	abi_ulong frame_addr;
775 	struct sigframe *frame;
776 	int i, err = 0;
777 
778 	frame_addr = get_sigframe(ka, env, sizeof(*frame));
779 
780 	if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
781 		goto give_sigsegv;
782 
783 	err |= __put_user(current_exec_domain_sig(sig),
784 		          &frame->sig);
785 	if (err)
786 		goto give_sigsegv;
787 
788 	setup_sigcontext(&frame->sc, &frame->fpstate, env, set->sig[0],
789                          frame_addr + offsetof(struct sigframe, fpstate));
790 	if (err)
791 		goto give_sigsegv;
792 
793         for(i = 1; i < TARGET_NSIG_WORDS; i++) {
794             if (__put_user(set->sig[i], &frame->extramask[i - 1]))
795                 goto give_sigsegv;
796         }
797 
798 	/* Set up to return from userspace.  If provided, use a stub
799 	   already in userspace.  */
800 	if (ka->sa_flags & TARGET_SA_RESTORER) {
801 		err |= __put_user(ka->sa_restorer, &frame->pretcode);
802 	} else {
803                 uint16_t val16;
804                 abi_ulong retcode_addr;
805                 retcode_addr = frame_addr + offsetof(struct sigframe, retcode);
806 		err |= __put_user(retcode_addr, &frame->pretcode);
807 		/* This is popl %eax ; movl $,%eax ; int $0x80 */
808                 val16 = 0xb858;
809 		err |= __put_user(val16, (uint16_t *)(frame->retcode+0));
810 		err |= __put_user(TARGET_NR_sigreturn, (int *)(frame->retcode+2));
811                 val16 = 0x80cd;
812 		err |= __put_user(val16, (uint16_t *)(frame->retcode+6));
813 	}
814 
815 	if (err)
816 		goto give_sigsegv;
817 
818 	/* Set up registers for signal handler */
819 	env->regs[R_ESP] = frame_addr;
820 	env->eip = ka->_sa_handler;
821 
822         cpu_x86_load_seg(env, R_DS, __USER_DS);
823         cpu_x86_load_seg(env, R_ES, __USER_DS);
824         cpu_x86_load_seg(env, R_SS, __USER_DS);
825         cpu_x86_load_seg(env, R_CS, __USER_CS);
826 	env->eflags &= ~TF_MASK;
827 
828 	unlock_user_struct(frame, frame_addr, 1);
829 
830 	return;
831 
832 give_sigsegv:
833 	unlock_user_struct(frame, frame_addr, 1);
834 	if (sig == TARGET_SIGSEGV)
835 		ka->_sa_handler = TARGET_SIG_DFL;
836 	force_sig(TARGET_SIGSEGV /* , current */);
837 }
838 
839 /* compare linux/arch/i386/kernel/signal.c:setup_rt_frame() */
840 static void setup_rt_frame(int sig, struct target_sigaction *ka,
841                            target_siginfo_t *info,
842 			   target_sigset_t *set, CPUX86State *env)
843 {
844         abi_ulong frame_addr, addr;
845 	struct rt_sigframe *frame;
846 	int i, err = 0;
847 
848 	frame_addr = get_sigframe(ka, env, sizeof(*frame));
849 
850 	if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
851 		goto give_sigsegv;
852 
853 	err |= __put_user(current_exec_domain_sig(sig),
854 			  &frame->sig);
855         addr = frame_addr + offsetof(struct rt_sigframe, info);
856 	err |= __put_user(addr, &frame->pinfo);
857         addr = frame_addr + offsetof(struct rt_sigframe, uc);
858 	err |= __put_user(addr, &frame->puc);
859 	err |= copy_siginfo_to_user(&frame->info, info);
860 	if (err)
861 		goto give_sigsegv;
862 
863 	/* Create the ucontext.  */
864 	err |= __put_user(0, &frame->uc.tuc_flags);
865 	err |= __put_user(0, &frame->uc.tuc_link);
866 	err |= __put_user(target_sigaltstack_used.ss_sp,
867 			  &frame->uc.tuc_stack.ss_sp);
868 	err |= __put_user(sas_ss_flags(get_sp_from_cpustate(env)),
869 			  &frame->uc.tuc_stack.ss_flags);
870 	err |= __put_user(target_sigaltstack_used.ss_size,
871 			  &frame->uc.tuc_stack.ss_size);
872 	err |= setup_sigcontext(&frame->uc.tuc_mcontext, &frame->fpstate,
873 			        env, set->sig[0],
874                                 frame_addr + offsetof(struct rt_sigframe, fpstate));
875         for(i = 0; i < TARGET_NSIG_WORDS; i++) {
876             if (__put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]))
877                 goto give_sigsegv;
878         }
879 
880 	/* Set up to return from userspace.  If provided, use a stub
881 	   already in userspace.  */
882 	if (ka->sa_flags & TARGET_SA_RESTORER) {
883 		err |= __put_user(ka->sa_restorer, &frame->pretcode);
884 	} else {
885                 uint16_t val16;
886                 addr = frame_addr + offsetof(struct rt_sigframe, retcode);
887 		err |= __put_user(addr, &frame->pretcode);
888 		/* This is movl $,%eax ; int $0x80 */
889                 err |= __put_user(0xb8, (char *)(frame->retcode+0));
890 		err |= __put_user(TARGET_NR_rt_sigreturn, (int *)(frame->retcode+1));
891                 val16 = 0x80cd;
892                 err |= __put_user(val16, (uint16_t *)(frame->retcode+5));
893 	}
894 
895 	if (err)
896 		goto give_sigsegv;
897 
898 	/* Set up registers for signal handler */
899 	env->regs[R_ESP] = frame_addr;
900 	env->eip = ka->_sa_handler;
901 
902         cpu_x86_load_seg(env, R_DS, __USER_DS);
903         cpu_x86_load_seg(env, R_ES, __USER_DS);
904         cpu_x86_load_seg(env, R_SS, __USER_DS);
905         cpu_x86_load_seg(env, R_CS, __USER_CS);
906 	env->eflags &= ~TF_MASK;
907 
908 	unlock_user_struct(frame, frame_addr, 1);
909 
910 	return;
911 
912 give_sigsegv:
913 	unlock_user_struct(frame, frame_addr, 1);
914 	if (sig == TARGET_SIGSEGV)
915 		ka->_sa_handler = TARGET_SIG_DFL;
916 	force_sig(TARGET_SIGSEGV /* , current */);
917 }
918 
919 static int
920 restore_sigcontext(CPUX86State *env, struct target_sigcontext *sc, int *peax)
921 {
922 	unsigned int err = 0;
923         abi_ulong fpstate_addr;
924         unsigned int tmpflags;
925 
926         cpu_x86_load_seg(env, R_GS, tswap16(sc->gs));
927         cpu_x86_load_seg(env, R_FS, tswap16(sc->fs));
928         cpu_x86_load_seg(env, R_ES, tswap16(sc->es));
929         cpu_x86_load_seg(env, R_DS, tswap16(sc->ds));
930 
931         env->regs[R_EDI] = tswapl(sc->edi);
932         env->regs[R_ESI] = tswapl(sc->esi);
933         env->regs[R_EBP] = tswapl(sc->ebp);
934         env->regs[R_ESP] = tswapl(sc->esp);
935         env->regs[R_EBX] = tswapl(sc->ebx);
936         env->regs[R_EDX] = tswapl(sc->edx);
937         env->regs[R_ECX] = tswapl(sc->ecx);
938         env->eip = tswapl(sc->eip);
939 
940         cpu_x86_load_seg(env, R_CS, lduw(&sc->cs) | 3);
941         cpu_x86_load_seg(env, R_SS, lduw(&sc->ss) | 3);
942 
943         tmpflags = tswapl(sc->eflags);
944         env->eflags = (env->eflags & ~0x40DD5) | (tmpflags & 0x40DD5);
945         //		regs->orig_eax = -1;		/* disable syscall checks */
946 
947         fpstate_addr = tswapl(sc->fpstate);
948 	if (fpstate_addr != 0) {
949                 if (!access_ok(VERIFY_READ, fpstate_addr,
950                                sizeof(struct target_fpstate)))
951                         goto badframe;
952                 cpu_x86_frstor(env, fpstate_addr, 1);
953 	}
954 
955         *peax = tswapl(sc->eax);
956 	return err;
957 badframe:
958 	return 1;
959 }
960 
961 long do_sigreturn(CPUX86State *env)
962 {
963     struct sigframe *frame;
964     abi_ulong frame_addr = env->regs[R_ESP] - 8;
965     target_sigset_t target_set;
966     sigset_t set;
967     int eax, i;
968 
969 #if defined(DEBUG_SIGNAL)
970     fprintf(stderr, "do_sigreturn\n");
971 #endif
972     if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
973         goto badframe;
974     /* set blocked signals */
975     if (__get_user(target_set.sig[0], &frame->sc.oldmask))
976         goto badframe;
977     for(i = 1; i < TARGET_NSIG_WORDS; i++) {
978         if (__get_user(target_set.sig[i], &frame->extramask[i - 1]))
979             goto badframe;
980     }
981 
982     target_to_host_sigset_internal(&set, &target_set);
983     sigprocmask(SIG_SETMASK, &set, NULL);
984 
985     /* restore registers */
986     if (restore_sigcontext(env, &frame->sc, &eax))
987         goto badframe;
988     unlock_user_struct(frame, frame_addr, 0);
989     return eax;
990 
991 badframe:
992     unlock_user_struct(frame, frame_addr, 0);
993     force_sig(TARGET_SIGSEGV);
994     return 0;
995 }
996 
997 long do_rt_sigreturn(CPUX86State *env)
998 {
999         abi_ulong frame_addr;
1000 	struct rt_sigframe *frame;
1001         sigset_t set;
1002 	int eax;
1003 
1004         frame_addr = env->regs[R_ESP] - 4;
1005         if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1006                 goto badframe;
1007         target_to_host_sigset(&set, &frame->uc.tuc_sigmask);
1008         sigprocmask(SIG_SETMASK, &set, NULL);
1009 
1010 	if (restore_sigcontext(env, &frame->uc.tuc_mcontext, &eax))
1011 		goto badframe;
1012 
1013 	if (do_sigaltstack(frame_addr + offsetof(struct rt_sigframe, uc.tuc_stack), 0,
1014                            get_sp_from_cpustate(env)) == -EFAULT)
1015 		goto badframe;
1016 
1017         unlock_user_struct(frame, frame_addr, 0);
1018 	return eax;
1019 
1020 badframe:
1021         unlock_user_struct(frame, frame_addr, 0);
1022         force_sig(TARGET_SIGSEGV);
1023 	return 0;
1024 }
1025 
1026 #elif defined(TARGET_ARM)
1027 
1028 struct target_sigcontext {
1029 	abi_ulong trap_no;
1030 	abi_ulong error_code;
1031 	abi_ulong oldmask;
1032 	abi_ulong arm_r0;
1033 	abi_ulong arm_r1;
1034 	abi_ulong arm_r2;
1035 	abi_ulong arm_r3;
1036 	abi_ulong arm_r4;
1037 	abi_ulong arm_r5;
1038 	abi_ulong arm_r6;
1039 	abi_ulong arm_r7;
1040 	abi_ulong arm_r8;
1041 	abi_ulong arm_r9;
1042 	abi_ulong arm_r10;
1043 	abi_ulong arm_fp;
1044 	abi_ulong arm_ip;
1045 	abi_ulong arm_sp;
1046 	abi_ulong arm_lr;
1047 	abi_ulong arm_pc;
1048 	abi_ulong arm_cpsr;
1049 	abi_ulong fault_address;
1050 };
1051 
1052 struct target_ucontext_v1 {
1053     abi_ulong tuc_flags;
1054     abi_ulong tuc_link;
1055     target_stack_t tuc_stack;
1056     struct target_sigcontext tuc_mcontext;
1057     target_sigset_t  tuc_sigmask;	/* mask last for extensibility */
1058 };
1059 
1060 struct target_ucontext_v2 {
1061     abi_ulong tuc_flags;
1062     abi_ulong tuc_link;
1063     target_stack_t tuc_stack;
1064     struct target_sigcontext tuc_mcontext;
1065     target_sigset_t  tuc_sigmask;	/* mask last for extensibility */
1066     char __unused[128 - sizeof(sigset_t)];
1067     abi_ulong tuc_regspace[128] __attribute__((__aligned__(8)));
1068 };
1069 
1070 struct sigframe_v1
1071 {
1072     struct target_sigcontext sc;
1073     abi_ulong extramask[TARGET_NSIG_WORDS-1];
1074     abi_ulong retcode;
1075 };
1076 
1077 struct sigframe_v2
1078 {
1079     struct target_ucontext_v2 uc;
1080     abi_ulong retcode;
1081 };
1082 
1083 struct rt_sigframe_v1
1084 {
1085     abi_ulong pinfo;
1086     abi_ulong puc;
1087     struct target_siginfo info;
1088     struct target_ucontext_v1 uc;
1089     abi_ulong retcode;
1090 };
1091 
1092 struct rt_sigframe_v2
1093 {
1094     struct target_siginfo info;
1095     struct target_ucontext_v2 uc;
1096     abi_ulong retcode;
1097 };
1098 
1099 #define TARGET_CONFIG_CPU_32 1
1100 
1101 /*
1102  * For ARM syscalls, we encode the syscall number into the instruction.
1103  */
1104 #define SWI_SYS_SIGRETURN	(0xef000000|(TARGET_NR_sigreturn + ARM_SYSCALL_BASE))
1105 #define SWI_SYS_RT_SIGRETURN	(0xef000000|(TARGET_NR_rt_sigreturn + ARM_SYSCALL_BASE))
1106 
1107 /*
1108  * For Thumb syscalls, we pass the syscall number via r7.  We therefore
1109  * need two 16-bit instructions.
1110  */
1111 #define SWI_THUMB_SIGRETURN	(0xdf00 << 16 | 0x2700 | (TARGET_NR_sigreturn))
1112 #define SWI_THUMB_RT_SIGRETURN	(0xdf00 << 16 | 0x2700 | (TARGET_NR_rt_sigreturn))
1113 
1114 static const abi_ulong retcodes[4] = {
1115 	SWI_SYS_SIGRETURN,	SWI_THUMB_SIGRETURN,
1116 	SWI_SYS_RT_SIGRETURN,	SWI_THUMB_RT_SIGRETURN
1117 };
1118 
1119 
1120 #define __get_user_error(x,p,e) __get_user(x, p)
1121 
1122 static inline int valid_user_regs(CPUState *regs)
1123 {
1124     return 1;
1125 }
1126 
1127 static void
1128 setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/
1129 		 CPUState *env, abi_ulong mask)
1130 {
1131 	__put_user(env->regs[0], &sc->arm_r0);
1132 	__put_user(env->regs[1], &sc->arm_r1);
1133 	__put_user(env->regs[2], &sc->arm_r2);
1134 	__put_user(env->regs[3], &sc->arm_r3);
1135 	__put_user(env->regs[4], &sc->arm_r4);
1136 	__put_user(env->regs[5], &sc->arm_r5);
1137 	__put_user(env->regs[6], &sc->arm_r6);
1138 	__put_user(env->regs[7], &sc->arm_r7);
1139 	__put_user(env->regs[8], &sc->arm_r8);
1140 	__put_user(env->regs[9], &sc->arm_r9);
1141 	__put_user(env->regs[10], &sc->arm_r10);
1142 	__put_user(env->regs[11], &sc->arm_fp);
1143 	__put_user(env->regs[12], &sc->arm_ip);
1144 	__put_user(env->regs[13], &sc->arm_sp);
1145 	__put_user(env->regs[14], &sc->arm_lr);
1146 	__put_user(env->regs[15], &sc->arm_pc);
1147 #ifdef TARGET_CONFIG_CPU_32
1148 	__put_user(cpsr_read(env), &sc->arm_cpsr);
1149 #endif
1150 
1151 	__put_user(/* current->thread.trap_no */ 0, &sc->trap_no);
1152 	__put_user(/* current->thread.error_code */ 0, &sc->error_code);
1153 	__put_user(/* current->thread.address */ 0, &sc->fault_address);
1154 	__put_user(mask, &sc->oldmask);
1155 }
1156 
1157 static inline abi_ulong
1158 get_sigframe(struct target_sigaction *ka, CPUState *regs, int framesize)
1159 {
1160 	unsigned long sp = regs->regs[13];
1161 
1162 	/*
1163 	 * This is the X/Open sanctioned signal stack switching.
1164 	 */
1165 	if ((ka->sa_flags & TARGET_SA_ONSTACK) && !sas_ss_flags(sp))
1166             sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
1167 	/*
1168 	 * ATPCS B01 mandates 8-byte alignment
1169 	 */
1170 	return (sp - framesize) & ~7;
1171 }
1172 
1173 static int
1174 setup_return(CPUState *env, struct target_sigaction *ka,
1175 	     abi_ulong *rc, abi_ulong frame_addr, int usig, abi_ulong rc_addr)
1176 {
1177 	abi_ulong handler = ka->_sa_handler;
1178 	abi_ulong retcode;
1179 	int thumb = handler & 1;
1180 
1181 	if (ka->sa_flags & TARGET_SA_RESTORER) {
1182 		retcode = ka->sa_restorer;
1183 	} else {
1184 		unsigned int idx = thumb;
1185 
1186 		if (ka->sa_flags & TARGET_SA_SIGINFO)
1187 			idx += 2;
1188 
1189 		if (__put_user(retcodes[idx], rc))
1190 			return 1;
1191 #if 0
1192 		flush_icache_range((abi_ulong)rc,
1193 				   (abi_ulong)(rc + 1));
1194 #endif
1195 		retcode = rc_addr + thumb;
1196 	}
1197 
1198 	env->regs[0] = usig;
1199 	env->regs[13] = frame_addr;
1200 	env->regs[14] = retcode;
1201 	env->regs[15] = handler & (thumb ? ~1 : ~3);
1202 	env->thumb = thumb;
1203 
1204 #if 0
1205 #ifdef TARGET_CONFIG_CPU_32
1206 	env->cpsr = cpsr;
1207 #endif
1208 #endif
1209 
1210 	return 0;
1211 }
1212 
1213 static void setup_sigframe_v2(struct target_ucontext_v2 *uc,
1214                               target_sigset_t *set, CPUState *env)
1215 {
1216     struct target_sigaltstack stack;
1217     int i;
1218 
1219     /* Clear all the bits of the ucontext we don't use.  */
1220     memset(uc, 0, offsetof(struct target_ucontext_v2, tuc_mcontext));
1221 
1222     memset(&stack, 0, sizeof(stack));
1223     __put_user(target_sigaltstack_used.ss_sp, &stack.ss_sp);
1224     __put_user(target_sigaltstack_used.ss_size, &stack.ss_size);
1225     __put_user(sas_ss_flags(get_sp_from_cpustate(env)), &stack.ss_flags);
1226     memcpy(&uc->tuc_stack, &stack, sizeof(stack));
1227 
1228     setup_sigcontext(&uc->tuc_mcontext, env, set->sig[0]);
1229     /* FIXME: Save coprocessor signal frame.  */
1230     for(i = 0; i < TARGET_NSIG_WORDS; i++) {
1231         __put_user(set->sig[i], &uc->tuc_sigmask.sig[i]);
1232     }
1233 }
1234 
1235 /* compare linux/arch/arm/kernel/signal.c:setup_frame() */
1236 static void setup_frame_v1(int usig, struct target_sigaction *ka,
1237 			   target_sigset_t *set, CPUState *regs)
1238 {
1239 	struct sigframe_v1 *frame;
1240 	abi_ulong frame_addr = get_sigframe(ka, regs, sizeof(*frame));
1241 	int i;
1242 
1243 	if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
1244 		return;
1245 
1246 	setup_sigcontext(&frame->sc, regs, set->sig[0]);
1247 
1248         for(i = 1; i < TARGET_NSIG_WORDS; i++) {
1249             if (__put_user(set->sig[i], &frame->extramask[i - 1]))
1250                 goto end;
1251 	}
1252 
1253         setup_return(regs, ka, &frame->retcode, frame_addr, usig,
1254                      frame_addr + offsetof(struct sigframe_v1, retcode));
1255 
1256 end:
1257 	unlock_user_struct(frame, frame_addr, 1);
1258 }
1259 
1260 static void setup_frame_v2(int usig, struct target_sigaction *ka,
1261 			   target_sigset_t *set, CPUState *regs)
1262 {
1263 	struct sigframe_v2 *frame;
1264 	abi_ulong frame_addr = get_sigframe(ka, regs, sizeof(*frame));
1265 
1266 	if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
1267 		return;
1268 
1269         setup_sigframe_v2(&frame->uc, set, regs);
1270 
1271         setup_return(regs, ka, &frame->retcode, frame_addr, usig,
1272                      frame_addr + offsetof(struct sigframe_v2, retcode));
1273 
1274 	unlock_user_struct(frame, frame_addr, 1);
1275 }
1276 
1277 static void setup_frame(int usig, struct target_sigaction *ka,
1278 			target_sigset_t *set, CPUState *regs)
1279 {
1280     if (get_osversion() >= 0x020612) {
1281         setup_frame_v2(usig, ka, set, regs);
1282     } else {
1283         setup_frame_v1(usig, ka, set, regs);
1284     }
1285 }
1286 
1287 /* compare linux/arch/arm/kernel/signal.c:setup_rt_frame() */
1288 static void setup_rt_frame_v1(int usig, struct target_sigaction *ka,
1289                               target_siginfo_t *info,
1290 			      target_sigset_t *set, CPUState *env)
1291 {
1292 	struct rt_sigframe_v1 *frame;
1293 	abi_ulong frame_addr = get_sigframe(ka, env, sizeof(*frame));
1294 	struct target_sigaltstack stack;
1295 	int i;
1296         abi_ulong info_addr, uc_addr;
1297 
1298 	if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
1299             return /* 1 */;
1300 
1301         info_addr = frame_addr + offsetof(struct rt_sigframe_v1, info);
1302 	__put_user(info_addr, &frame->pinfo);
1303         uc_addr = frame_addr + offsetof(struct rt_sigframe_v1, uc);
1304 	__put_user(uc_addr, &frame->puc);
1305 	copy_siginfo_to_user(&frame->info, info);
1306 
1307 	/* Clear all the bits of the ucontext we don't use.  */
1308 	memset(&frame->uc, 0, offsetof(struct target_ucontext_v1, tuc_mcontext));
1309 
1310         memset(&stack, 0, sizeof(stack));
1311         __put_user(target_sigaltstack_used.ss_sp, &stack.ss_sp);
1312         __put_user(target_sigaltstack_used.ss_size, &stack.ss_size);
1313         __put_user(sas_ss_flags(get_sp_from_cpustate(env)), &stack.ss_flags);
1314         memcpy(&frame->uc.tuc_stack, &stack, sizeof(stack));
1315 
1316 	setup_sigcontext(&frame->uc.tuc_mcontext, env, set->sig[0]);
1317         for(i = 0; i < TARGET_NSIG_WORDS; i++) {
1318             if (__put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]))
1319                 goto end;
1320         }
1321 
1322         setup_return(env, ka, &frame->retcode, frame_addr, usig,
1323                      frame_addr + offsetof(struct rt_sigframe_v1, retcode));
1324 
1325         env->regs[1] = info_addr;
1326         env->regs[2] = uc_addr;
1327 
1328 end:
1329 	unlock_user_struct(frame, frame_addr, 1);
1330 }
1331 
1332 static void setup_rt_frame_v2(int usig, struct target_sigaction *ka,
1333                               target_siginfo_t *info,
1334                               target_sigset_t *set, CPUState *env)
1335 {
1336 	struct rt_sigframe_v2 *frame;
1337 	abi_ulong frame_addr = get_sigframe(ka, env, sizeof(*frame));
1338         abi_ulong info_addr, uc_addr;
1339 
1340 	if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
1341             return /* 1 */;
1342 
1343         info_addr = frame_addr + offsetof(struct rt_sigframe_v2, info);
1344         uc_addr = frame_addr + offsetof(struct rt_sigframe_v2, uc);
1345 	copy_siginfo_to_user(&frame->info, info);
1346 
1347         setup_sigframe_v2(&frame->uc, set, env);
1348 
1349         setup_return(env, ka, &frame->retcode, frame_addr, usig,
1350                      frame_addr + offsetof(struct rt_sigframe_v2, retcode));
1351 
1352         env->regs[1] = info_addr;
1353         env->regs[2] = uc_addr;
1354 
1355 	unlock_user_struct(frame, frame_addr, 1);
1356 }
1357 
1358 static void setup_rt_frame(int usig, struct target_sigaction *ka,
1359                            target_siginfo_t *info,
1360 			   target_sigset_t *set, CPUState *env)
1361 {
1362     if (get_osversion() >= 0x020612) {
1363         setup_rt_frame_v2(usig, ka, info, set, env);
1364     } else {
1365         setup_rt_frame_v1(usig, ka, info, set, env);
1366     }
1367 }
1368 
1369 static int
1370 restore_sigcontext(CPUState *env, struct target_sigcontext *sc)
1371 {
1372 	int err = 0;
1373         uint32_t cpsr;
1374 
1375 	__get_user_error(env->regs[0], &sc->arm_r0, err);
1376 	__get_user_error(env->regs[1], &sc->arm_r1, err);
1377 	__get_user_error(env->regs[2], &sc->arm_r2, err);
1378 	__get_user_error(env->regs[3], &sc->arm_r3, err);
1379 	__get_user_error(env->regs[4], &sc->arm_r4, err);
1380 	__get_user_error(env->regs[5], &sc->arm_r5, err);
1381 	__get_user_error(env->regs[6], &sc->arm_r6, err);
1382 	__get_user_error(env->regs[7], &sc->arm_r7, err);
1383 	__get_user_error(env->regs[8], &sc->arm_r8, err);
1384 	__get_user_error(env->regs[9], &sc->arm_r9, err);
1385 	__get_user_error(env->regs[10], &sc->arm_r10, err);
1386 	__get_user_error(env->regs[11], &sc->arm_fp, err);
1387 	__get_user_error(env->regs[12], &sc->arm_ip, err);
1388 	__get_user_error(env->regs[13], &sc->arm_sp, err);
1389 	__get_user_error(env->regs[14], &sc->arm_lr, err);
1390 	__get_user_error(env->regs[15], &sc->arm_pc, err);
1391 #ifdef TARGET_CONFIG_CPU_32
1392 	__get_user_error(cpsr, &sc->arm_cpsr, err);
1393         cpsr_write(env, cpsr, CPSR_USER | CPSR_EXEC);
1394 #endif
1395 
1396 	err |= !valid_user_regs(env);
1397 
1398 	return err;
1399 }
1400 
1401 long do_sigreturn_v1(CPUState *env)
1402 {
1403         abi_ulong frame_addr;
1404 	struct sigframe_v1 *frame;
1405 	target_sigset_t set;
1406         sigset_t host_set;
1407         int i;
1408 
1409 	/*
1410 	 * Since we stacked the signal on a 64-bit boundary,
1411 	 * then 'sp' should be word aligned here.  If it's
1412 	 * not, then the user is trying to mess with us.
1413 	 */
1414 	if (env->regs[13] & 7)
1415 		goto badframe;
1416 
1417         frame_addr = env->regs[13];
1418 	if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1419                 goto badframe;
1420 
1421 	if (__get_user(set.sig[0], &frame->sc.oldmask))
1422             goto badframe;
1423         for(i = 1; i < TARGET_NSIG_WORDS; i++) {
1424             if (__get_user(set.sig[i], &frame->extramask[i - 1]))
1425                 goto badframe;
1426         }
1427 
1428         target_to_host_sigset_internal(&host_set, &set);
1429         sigprocmask(SIG_SETMASK, &host_set, NULL);
1430 
1431 	if (restore_sigcontext(env, &frame->sc))
1432 		goto badframe;
1433 
1434 #if 0
1435 	/* Send SIGTRAP if we're single-stepping */
1436 	if (ptrace_cancel_bpt(current))
1437 		send_sig(SIGTRAP, current, 1);
1438 #endif
1439 	unlock_user_struct(frame, frame_addr, 0);
1440         return env->regs[0];
1441 
1442 badframe:
1443 	unlock_user_struct(frame, frame_addr, 0);
1444         force_sig(SIGSEGV /* , current */);
1445 	return 0;
1446 }
1447 
1448 static int do_sigframe_return_v2(CPUState *env, target_ulong frame_addr,
1449                                  struct target_ucontext_v2 *uc)
1450 {
1451     sigset_t host_set;
1452 
1453     target_to_host_sigset(&host_set, &uc->tuc_sigmask);
1454     sigprocmask(SIG_SETMASK, &host_set, NULL);
1455 
1456     if (restore_sigcontext(env, &uc->tuc_mcontext))
1457         return 1;
1458 
1459     if (do_sigaltstack(frame_addr + offsetof(struct target_ucontext_v2, tuc_stack), 0, get_sp_from_cpustate(env)) == -EFAULT)
1460         return 1;
1461 
1462 #if 0
1463     /* Send SIGTRAP if we're single-stepping */
1464     if (ptrace_cancel_bpt(current))
1465             send_sig(SIGTRAP, current, 1);
1466 #endif
1467 
1468     return 0;
1469 }
1470 
1471 long do_sigreturn_v2(CPUState *env)
1472 {
1473         abi_ulong frame_addr;
1474 	struct sigframe_v2 *frame;
1475 
1476 	/*
1477 	 * Since we stacked the signal on a 64-bit boundary,
1478 	 * then 'sp' should be word aligned here.  If it's
1479 	 * not, then the user is trying to mess with us.
1480 	 */
1481 	if (env->regs[13] & 7)
1482 		goto badframe;
1483 
1484         frame_addr = env->regs[13];
1485 	if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1486                 goto badframe;
1487 
1488         if (do_sigframe_return_v2(env, frame_addr, &frame->uc))
1489                 goto badframe;
1490 
1491 	unlock_user_struct(frame, frame_addr, 0);
1492 	return env->regs[0];
1493 
1494 badframe:
1495 	unlock_user_struct(frame, frame_addr, 0);
1496         force_sig(SIGSEGV /* , current */);
1497 	return 0;
1498 }
1499 
1500 long do_sigreturn(CPUState *env)
1501 {
1502     if (get_osversion() >= 0x020612) {
1503         return do_sigreturn_v2(env);
1504     } else {
1505         return do_sigreturn_v1(env);
1506     }
1507 }
1508 
1509 long do_rt_sigreturn_v1(CPUState *env)
1510 {
1511         abi_ulong frame_addr;
1512 	struct rt_sigframe_v1 *frame;
1513         sigset_t host_set;
1514 
1515 	/*
1516 	 * Since we stacked the signal on a 64-bit boundary,
1517 	 * then 'sp' should be word aligned here.  If it's
1518 	 * not, then the user is trying to mess with us.
1519 	 */
1520 	if (env->regs[13] & 7)
1521 		goto badframe;
1522 
1523         frame_addr = env->regs[13];
1524 	if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1525                 goto badframe;
1526 
1527         target_to_host_sigset(&host_set, &frame->uc.tuc_sigmask);
1528         sigprocmask(SIG_SETMASK, &host_set, NULL);
1529 
1530 	if (restore_sigcontext(env, &frame->uc.tuc_mcontext))
1531 		goto badframe;
1532 
1533 	if (do_sigaltstack(frame_addr + offsetof(struct rt_sigframe_v1, uc.tuc_stack), 0, get_sp_from_cpustate(env)) == -EFAULT)
1534 		goto badframe;
1535 
1536 #if 0
1537 	/* Send SIGTRAP if we're single-stepping */
1538 	if (ptrace_cancel_bpt(current))
1539 		send_sig(SIGTRAP, current, 1);
1540 #endif
1541 	unlock_user_struct(frame, frame_addr, 0);
1542 	return env->regs[0];
1543 
1544 badframe:
1545 	unlock_user_struct(frame, frame_addr, 0);
1546         force_sig(SIGSEGV /* , current */);
1547 	return 0;
1548 }
1549 
1550 long do_rt_sigreturn_v2(CPUState *env)
1551 {
1552         abi_ulong frame_addr;
1553 	struct rt_sigframe_v2 *frame;
1554 
1555 	/*
1556 	 * Since we stacked the signal on a 64-bit boundary,
1557 	 * then 'sp' should be word aligned here.  If it's
1558 	 * not, then the user is trying to mess with us.
1559 	 */
1560 	if (env->regs[13] & 7)
1561 		goto badframe;
1562 
1563         frame_addr = env->regs[13];
1564 	if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1565                 goto badframe;
1566 
1567         if (do_sigframe_return_v2(env, frame_addr, &frame->uc))
1568                 goto badframe;
1569 
1570 	unlock_user_struct(frame, frame_addr, 0);
1571 	return env->regs[0];
1572 
1573 badframe:
1574 	unlock_user_struct(frame, frame_addr, 0);
1575         force_sig(SIGSEGV /* , current */);
1576 	return 0;
1577 }
1578 
1579 long do_rt_sigreturn(CPUState *env)
1580 {
1581     if (get_osversion() >= 0x020612) {
1582         return do_rt_sigreturn_v2(env);
1583     } else {
1584         return do_rt_sigreturn_v1(env);
1585     }
1586 }
1587 
1588 #elif defined(TARGET_SPARC)
1589 
1590 #define __SUNOS_MAXWIN   31
1591 
1592 /* This is what SunOS does, so shall I. */
1593 struct target_sigcontext {
1594         abi_ulong sigc_onstack;      /* state to restore */
1595 
1596         abi_ulong sigc_mask;         /* sigmask to restore */
1597         abi_ulong sigc_sp;           /* stack pointer */
1598         abi_ulong sigc_pc;           /* program counter */
1599         abi_ulong sigc_npc;          /* next program counter */
1600         abi_ulong sigc_psr;          /* for condition codes etc */
1601         abi_ulong sigc_g1;           /* User uses these two registers */
1602         abi_ulong sigc_o0;           /* within the trampoline code. */
1603 
1604         /* Now comes information regarding the users window set
1605          * at the time of the signal.
1606          */
1607         abi_ulong sigc_oswins;       /* outstanding windows */
1608 
1609         /* stack ptrs for each regwin buf */
1610         char *sigc_spbuf[__SUNOS_MAXWIN];
1611 
1612         /* Windows to restore after signal */
1613         struct {
1614                 abi_ulong locals[8];
1615                 abi_ulong ins[8];
1616         } sigc_wbuf[__SUNOS_MAXWIN];
1617 };
1618 /* A Sparc stack frame */
1619 struct sparc_stackf {
1620         abi_ulong locals[8];
1621         abi_ulong ins[6];
1622         struct sparc_stackf *fp;
1623         abi_ulong callers_pc;
1624         char *structptr;
1625         abi_ulong xargs[6];
1626         abi_ulong xxargs[1];
1627 };
1628 
1629 typedef struct {
1630         struct {
1631                 abi_ulong psr;
1632                 abi_ulong pc;
1633                 abi_ulong npc;
1634                 abi_ulong y;
1635                 abi_ulong u_regs[16]; /* globals and ins */
1636         }               si_regs;
1637         int             si_mask;
1638 } __siginfo_t;
1639 
1640 typedef struct {
1641         unsigned   long si_float_regs [32];
1642         unsigned   long si_fsr;
1643         unsigned   long si_fpqdepth;
1644         struct {
1645                 unsigned long *insn_addr;
1646                 unsigned long insn;
1647         } si_fpqueue [16];
1648 } qemu_siginfo_fpu_t;
1649 
1650 
1651 struct target_signal_frame {
1652 	struct sparc_stackf	ss;
1653 	__siginfo_t		info;
1654 	abi_ulong               fpu_save;
1655 	abi_ulong		insns[2] __attribute__ ((aligned (8)));
1656 	abi_ulong		extramask[TARGET_NSIG_WORDS - 1];
1657 	abi_ulong		extra_size; /* Should be 0 */
1658 	qemu_siginfo_fpu_t	fpu_state;
1659 };
1660 struct target_rt_signal_frame {
1661 	struct sparc_stackf	ss;
1662 	siginfo_t		info;
1663 	abi_ulong		regs[20];
1664 	sigset_t		mask;
1665 	abi_ulong               fpu_save;
1666 	unsigned int		insns[2];
1667 	stack_t			stack;
1668 	unsigned int		extra_size; /* Should be 0 */
1669 	qemu_siginfo_fpu_t	fpu_state;
1670 };
1671 
1672 #define UREG_O0        16
1673 #define UREG_O6        22
1674 #define UREG_I0        0
1675 #define UREG_I1        1
1676 #define UREG_I2        2
1677 #define UREG_I3        3
1678 #define UREG_I4        4
1679 #define UREG_I5        5
1680 #define UREG_I6        6
1681 #define UREG_I7        7
1682 #define UREG_L0	       8
1683 #define UREG_FP        UREG_I6
1684 #define UREG_SP        UREG_O6
1685 
1686 static inline abi_ulong get_sigframe(struct target_sigaction *sa,
1687                                      CPUState *env, unsigned long framesize)
1688 {
1689 	abi_ulong sp;
1690 
1691 	sp = env->regwptr[UREG_FP];
1692 
1693 	/* This is the X/Open sanctioned signal stack switching.  */
1694 	if (sa->sa_flags & TARGET_SA_ONSTACK) {
1695             if (!on_sig_stack(sp)
1696                 && !((target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size) & 7))
1697                 sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
1698 	}
1699 	return sp - framesize;
1700 }
1701 
1702 static int
1703 setup___siginfo(__siginfo_t *si, CPUState *env, abi_ulong mask)
1704 {
1705 	int err = 0, i;
1706 
1707 	err |= __put_user(env->psr, &si->si_regs.psr);
1708 	err |= __put_user(env->pc, &si->si_regs.pc);
1709 	err |= __put_user(env->npc, &si->si_regs.npc);
1710 	err |= __put_user(env->y, &si->si_regs.y);
1711 	for (i=0; i < 8; i++) {
1712 		err |= __put_user(env->gregs[i], &si->si_regs.u_regs[i]);
1713 	}
1714 	for (i=0; i < 8; i++) {
1715 		err |= __put_user(env->regwptr[UREG_I0 + i], &si->si_regs.u_regs[i+8]);
1716 	}
1717 	err |= __put_user(mask, &si->si_mask);
1718 	return err;
1719 }
1720 
1721 #if 0
1722 static int
1723 setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/
1724 		 CPUState *env, unsigned long mask)
1725 {
1726 	int err = 0;
1727 
1728 	err |= __put_user(mask, &sc->sigc_mask);
1729 	err |= __put_user(env->regwptr[UREG_SP], &sc->sigc_sp);
1730 	err |= __put_user(env->pc, &sc->sigc_pc);
1731 	err |= __put_user(env->npc, &sc->sigc_npc);
1732 	err |= __put_user(env->psr, &sc->sigc_psr);
1733 	err |= __put_user(env->gregs[1], &sc->sigc_g1);
1734 	err |= __put_user(env->regwptr[UREG_O0], &sc->sigc_o0);
1735 
1736 	return err;
1737 }
1738 #endif
1739 #define NF_ALIGNEDSZ  (((sizeof(struct target_signal_frame) + 7) & (~7)))
1740 
1741 static void setup_frame(int sig, struct target_sigaction *ka,
1742 			target_sigset_t *set, CPUState *env)
1743 {
1744         abi_ulong sf_addr;
1745 	struct target_signal_frame *sf;
1746 	int sigframe_size, err, i;
1747 
1748 	/* 1. Make sure everything is clean */
1749 	//synchronize_user_stack();
1750 
1751         sigframe_size = NF_ALIGNEDSZ;
1752 	sf_addr = get_sigframe(ka, env, sigframe_size);
1753 
1754         sf = lock_user(VERIFY_WRITE, sf_addr,
1755                        sizeof(struct target_signal_frame), 0);
1756         if (!sf)
1757 		goto sigsegv;
1758 
1759 	//fprintf(stderr, "sf: %x pc %x fp %x sp %x\n", sf, env->pc, env->regwptr[UREG_FP], env->regwptr[UREG_SP]);
1760 #if 0
1761 	if (invalid_frame_pointer(sf, sigframe_size))
1762 		goto sigill_and_return;
1763 #endif
1764 	/* 2. Save the current process state */
1765 	err = setup___siginfo(&sf->info, env, set->sig[0]);
1766 	err |= __put_user(0, &sf->extra_size);
1767 
1768 	//err |= save_fpu_state(regs, &sf->fpu_state);
1769 	//err |= __put_user(&sf->fpu_state, &sf->fpu_save);
1770 
1771 	err |= __put_user(set->sig[0], &sf->info.si_mask);
1772 	for (i = 0; i < TARGET_NSIG_WORDS - 1; i++) {
1773 		err |= __put_user(set->sig[i + 1], &sf->extramask[i]);
1774 	}
1775 
1776 	for (i = 0; i < 8; i++) {
1777 	  	err |= __put_user(env->regwptr[i + UREG_L0], &sf->ss.locals[i]);
1778 	}
1779 	for (i = 0; i < 8; i++) {
1780 	  	err |= __put_user(env->regwptr[i + UREG_I0], &sf->ss.ins[i]);
1781 	}
1782 	if (err)
1783 		goto sigsegv;
1784 
1785 	/* 3. signal handler back-trampoline and parameters */
1786 	env->regwptr[UREG_FP] = sf_addr;
1787 	env->regwptr[UREG_I0] = sig;
1788 	env->regwptr[UREG_I1] = sf_addr +
1789                 offsetof(struct target_signal_frame, info);
1790 	env->regwptr[UREG_I2] = sf_addr +
1791                 offsetof(struct target_signal_frame, info);
1792 
1793 	/* 4. signal handler */
1794 	env->pc = ka->_sa_handler;
1795 	env->npc = (env->pc + 4);
1796 	/* 5. return to kernel instructions */
1797 	if (ka->sa_restorer)
1798 		env->regwptr[UREG_I7] = ka->sa_restorer;
1799 	else {
1800                 uint32_t val32;
1801 
1802 		env->regwptr[UREG_I7] = sf_addr +
1803                         offsetof(struct target_signal_frame, insns) - 2 * 4;
1804 
1805 		/* mov __NR_sigreturn, %g1 */
1806                 val32 = 0x821020d8;
1807 		err |= __put_user(val32, &sf->insns[0]);
1808 
1809 		/* t 0x10 */
1810                 val32 = 0x91d02010;
1811 		err |= __put_user(val32, &sf->insns[1]);
1812 		if (err)
1813 			goto sigsegv;
1814 
1815 		/* Flush instruction space. */
1816 		//flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0]));
1817                 //		tb_flush(env);
1818 	}
1819         unlock_user(sf, sf_addr, sizeof(struct target_signal_frame));
1820 	return;
1821 #if 0
1822 sigill_and_return:
1823 	force_sig(TARGET_SIGILL);
1824 #endif
1825 sigsegv:
1826 	//fprintf(stderr, "force_sig\n");
1827         unlock_user(sf, sf_addr, sizeof(struct target_signal_frame));
1828 	force_sig(TARGET_SIGSEGV);
1829 }
1830 static inline int
1831 restore_fpu_state(CPUState *env, qemu_siginfo_fpu_t *fpu)
1832 {
1833         int err;
1834 #if 0
1835 #ifdef CONFIG_SMP
1836         if (current->flags & PF_USEDFPU)
1837                 regs->psr &= ~PSR_EF;
1838 #else
1839         if (current == last_task_used_math) {
1840                 last_task_used_math = 0;
1841                 regs->psr &= ~PSR_EF;
1842         }
1843 #endif
1844         current->used_math = 1;
1845         current->flags &= ~PF_USEDFPU;
1846 #endif
1847 #if 0
1848         if (verify_area (VERIFY_READ, fpu, sizeof(*fpu)))
1849                 return -EFAULT;
1850 #endif
1851 
1852 #if 0
1853         /* XXX: incorrect */
1854         err = __copy_from_user(&env->fpr[0], &fpu->si_float_regs[0],
1855 	                             (sizeof(unsigned long) * 32));
1856 #endif
1857         err |= __get_user(env->fsr, &fpu->si_fsr);
1858 #if 0
1859         err |= __get_user(current->thread.fpqdepth, &fpu->si_fpqdepth);
1860         if (current->thread.fpqdepth != 0)
1861                 err |= __copy_from_user(&current->thread.fpqueue[0],
1862                                         &fpu->si_fpqueue[0],
1863                                         ((sizeof(unsigned long) +
1864                                         (sizeof(unsigned long *)))*16));
1865 #endif
1866         return err;
1867 }
1868 
1869 
1870 static void setup_rt_frame(int sig, struct target_sigaction *ka,
1871                            target_siginfo_t *info,
1872 			   target_sigset_t *set, CPUState *env)
1873 {
1874     fprintf(stderr, "setup_rt_frame: not implemented\n");
1875 }
1876 
1877 long do_sigreturn(CPUState *env)
1878 {
1879         abi_ulong sf_addr;
1880         struct target_signal_frame *sf;
1881         uint32_t up_psr, pc, npc;
1882         target_sigset_t set;
1883         sigset_t host_set;
1884         abi_ulong fpu_save_addr;
1885         int err, i;
1886 
1887         sf_addr = env->regwptr[UREG_FP];
1888         if (!lock_user_struct(VERIFY_READ, sf, sf_addr, 1))
1889                 goto segv_and_exit;
1890 #if 0
1891 	fprintf(stderr, "sigreturn\n");
1892 	fprintf(stderr, "sf: %x pc %x fp %x sp %x\n", sf, env->pc, env->regwptr[UREG_FP], env->regwptr[UREG_SP]);
1893 #endif
1894 	//cpu_dump_state(env, stderr, fprintf, 0);
1895 
1896         /* 1. Make sure we are not getting garbage from the user */
1897 
1898         if (sf_addr & 3)
1899                 goto segv_and_exit;
1900 
1901         err = __get_user(pc,  &sf->info.si_regs.pc);
1902         err |= __get_user(npc, &sf->info.si_regs.npc);
1903 
1904         if ((pc | npc) & 3)
1905                 goto segv_and_exit;
1906 
1907         /* 2. Restore the state */
1908         err |= __get_user(up_psr, &sf->info.si_regs.psr);
1909 
1910         /* User can only change condition codes and FPU enabling in %psr. */
1911         env->psr = (up_psr & (PSR_ICC /* | PSR_EF */))
1912                   | (env->psr & ~(PSR_ICC /* | PSR_EF */));
1913 
1914 	env->pc = pc;
1915 	env->npc = npc;
1916         err |= __get_user(env->y, &sf->info.si_regs.y);
1917 	for (i=0; i < 8; i++) {
1918 		err |= __get_user(env->gregs[i], &sf->info.si_regs.u_regs[i]);
1919 	}
1920 	for (i=0; i < 8; i++) {
1921 		err |= __get_user(env->regwptr[i + UREG_I0], &sf->info.si_regs.u_regs[i+8]);
1922 	}
1923 
1924         err |= __get_user(fpu_save_addr, &sf->fpu_save);
1925 
1926         //if (fpu_save)
1927         //        err |= restore_fpu_state(env, fpu_save);
1928 
1929         /* This is pretty much atomic, no amount locking would prevent
1930          * the races which exist anyways.
1931          */
1932         err |= __get_user(set.sig[0], &sf->info.si_mask);
1933         for(i = 1; i < TARGET_NSIG_WORDS; i++) {
1934             err |= (__get_user(set.sig[i], &sf->extramask[i - 1]));
1935         }
1936 
1937         target_to_host_sigset_internal(&host_set, &set);
1938         sigprocmask(SIG_SETMASK, &host_set, NULL);
1939 
1940         if (err)
1941                 goto segv_and_exit;
1942         unlock_user_struct(sf, sf_addr, 0);
1943         return env->regwptr[0];
1944 
1945 segv_and_exit:
1946         unlock_user_struct(sf, sf_addr, 0);
1947 	force_sig(TARGET_SIGSEGV);
1948 }
1949 
1950 long do_rt_sigreturn(CPUState *env)
1951 {
1952     fprintf(stderr, "do_rt_sigreturn: not implemented\n");
1953     return -TARGET_ENOSYS;
1954 }
1955 
1956 #if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
1957 #define MC_TSTATE 0
1958 #define MC_PC 1
1959 #define MC_NPC 2
1960 #define MC_Y 3
1961 #define MC_G1 4
1962 #define MC_G2 5
1963 #define MC_G3 6
1964 #define MC_G4 7
1965 #define MC_G5 8
1966 #define MC_G6 9
1967 #define MC_G7 10
1968 #define MC_O0 11
1969 #define MC_O1 12
1970 #define MC_O2 13
1971 #define MC_O3 14
1972 #define MC_O4 15
1973 #define MC_O5 16
1974 #define MC_O6 17
1975 #define MC_O7 18
1976 #define MC_NGREG 19
1977 
1978 typedef abi_ulong target_mc_greg_t;
1979 typedef target_mc_greg_t target_mc_gregset_t[MC_NGREG];
1980 
1981 struct target_mc_fq {
1982     abi_ulong *mcfq_addr;
1983     uint32_t mcfq_insn;
1984 };
1985 
1986 struct target_mc_fpu {
1987     union {
1988         uint32_t sregs[32];
1989         uint64_t dregs[32];
1990         //uint128_t qregs[16];
1991     } mcfpu_fregs;
1992     abi_ulong mcfpu_fsr;
1993     abi_ulong mcfpu_fprs;
1994     abi_ulong mcfpu_gsr;
1995     struct target_mc_fq *mcfpu_fq;
1996     unsigned char mcfpu_qcnt;
1997     unsigned char mcfpu_qentsz;
1998     unsigned char mcfpu_enab;
1999 };
2000 typedef struct target_mc_fpu target_mc_fpu_t;
2001 
2002 typedef struct {
2003     target_mc_gregset_t mc_gregs;
2004     target_mc_greg_t mc_fp;
2005     target_mc_greg_t mc_i7;
2006     target_mc_fpu_t mc_fpregs;
2007 } target_mcontext_t;
2008 
2009 struct target_ucontext {
2010     struct target_ucontext *uc_link;
2011     abi_ulong uc_flags;
2012     target_sigset_t uc_sigmask;
2013     target_mcontext_t uc_mcontext;
2014 };
2015 
2016 /* A V9 register window */
2017 struct target_reg_window {
2018     abi_ulong locals[8];
2019     abi_ulong ins[8];
2020 };
2021 
2022 #define TARGET_STACK_BIAS 2047
2023 
2024 /* {set, get}context() needed for 64-bit SparcLinux userland. */
2025 void sparc64_set_context(CPUSPARCState *env)
2026 {
2027     abi_ulong ucp_addr;
2028     struct target_ucontext *ucp;
2029     target_mc_gregset_t *grp;
2030     abi_ulong pc, npc, tstate;
2031     abi_ulong fp, i7, w_addr;
2032     unsigned char fenab;
2033     int err;
2034     unsigned int i;
2035 
2036     ucp_addr = env->regwptr[UREG_I0];
2037     if (!lock_user_struct(VERIFY_READ, ucp, ucp_addr, 1))
2038         goto do_sigsegv;
2039     grp  = &ucp->uc_mcontext.mc_gregs;
2040     err  = __get_user(pc, &((*grp)[MC_PC]));
2041     err |= __get_user(npc, &((*grp)[MC_NPC]));
2042     if (err || ((pc | npc) & 3))
2043         goto do_sigsegv;
2044     if (env->regwptr[UREG_I1]) {
2045         target_sigset_t target_set;
2046         sigset_t set;
2047 
2048         if (TARGET_NSIG_WORDS == 1) {
2049             if (__get_user(target_set.sig[0], &ucp->uc_sigmask.sig[0]))
2050                 goto do_sigsegv;
2051         } else {
2052             abi_ulong *src, *dst;
2053             src = ucp->uc_sigmask.sig;
2054             dst = target_set.sig;
2055             for (i = 0; i < sizeof(target_sigset_t) / sizeof(abi_ulong);
2056                  i++, dst++, src++)
2057                 err |= __get_user(*dst, src);
2058             if (err)
2059                 goto do_sigsegv;
2060         }
2061         target_to_host_sigset_internal(&set, &target_set);
2062         sigprocmask(SIG_SETMASK, &set, NULL);
2063     }
2064     env->pc = pc;
2065     env->npc = npc;
2066     err |= __get_user(env->y, &((*grp)[MC_Y]));
2067     err |= __get_user(tstate, &((*grp)[MC_TSTATE]));
2068     env->asi = (tstate >> 24) & 0xff;
2069     PUT_CCR(env, tstate >> 32);
2070     PUT_CWP64(env, tstate & 0x1f);
2071     err |= __get_user(env->gregs[1], (&(*grp)[MC_G1]));
2072     err |= __get_user(env->gregs[2], (&(*grp)[MC_G2]));
2073     err |= __get_user(env->gregs[3], (&(*grp)[MC_G3]));
2074     err |= __get_user(env->gregs[4], (&(*grp)[MC_G4]));
2075     err |= __get_user(env->gregs[5], (&(*grp)[MC_G5]));
2076     err |= __get_user(env->gregs[6], (&(*grp)[MC_G6]));
2077     err |= __get_user(env->gregs[7], (&(*grp)[MC_G7]));
2078     err |= __get_user(env->regwptr[UREG_I0], (&(*grp)[MC_O0]));
2079     err |= __get_user(env->regwptr[UREG_I1], (&(*grp)[MC_O1]));
2080     err |= __get_user(env->regwptr[UREG_I2], (&(*grp)[MC_O2]));
2081     err |= __get_user(env->regwptr[UREG_I3], (&(*grp)[MC_O3]));
2082     err |= __get_user(env->regwptr[UREG_I4], (&(*grp)[MC_O4]));
2083     err |= __get_user(env->regwptr[UREG_I5], (&(*grp)[MC_O5]));
2084     err |= __get_user(env->regwptr[UREG_I6], (&(*grp)[MC_O6]));
2085     err |= __get_user(env->regwptr[UREG_I7], (&(*grp)[MC_O7]));
2086 
2087     err |= __get_user(fp, &(ucp->uc_mcontext.mc_fp));
2088     err |= __get_user(i7, &(ucp->uc_mcontext.mc_i7));
2089 
2090     w_addr = TARGET_STACK_BIAS+env->regwptr[UREG_I6];
2091     if (put_user(fp, w_addr + offsetof(struct target_reg_window, ins[6]),
2092                  abi_ulong) != 0)
2093         goto do_sigsegv;
2094     if (put_user(i7, w_addr + offsetof(struct target_reg_window, ins[7]),
2095                  abi_ulong) != 0)
2096         goto do_sigsegv;
2097     err |= __get_user(fenab, &(ucp->uc_mcontext.mc_fpregs.mcfpu_enab));
2098     err |= __get_user(env->fprs, &(ucp->uc_mcontext.mc_fpregs.mcfpu_fprs));
2099     {
2100         uint32_t *src, *dst;
2101         src = ucp->uc_mcontext.mc_fpregs.mcfpu_fregs.sregs;
2102         dst = env->fpr;
2103         /* XXX: check that the CPU storage is the same as user context */
2104         for (i = 0; i < 64; i++, dst++, src++)
2105             err |= __get_user(*dst, src);
2106     }
2107     err |= __get_user(env->fsr,
2108                       &(ucp->uc_mcontext.mc_fpregs.mcfpu_fsr));
2109     err |= __get_user(env->gsr,
2110                       &(ucp->uc_mcontext.mc_fpregs.mcfpu_gsr));
2111     if (err)
2112         goto do_sigsegv;
2113     unlock_user_struct(ucp, ucp_addr, 0);
2114     return;
2115  do_sigsegv:
2116     unlock_user_struct(ucp, ucp_addr, 0);
2117     force_sig(SIGSEGV);
2118 }
2119 
2120 void sparc64_get_context(CPUSPARCState *env)
2121 {
2122     abi_ulong ucp_addr;
2123     struct target_ucontext *ucp;
2124     target_mc_gregset_t *grp;
2125     target_mcontext_t *mcp;
2126     abi_ulong fp, i7, w_addr;
2127     int err;
2128     unsigned int i;
2129     target_sigset_t target_set;
2130     sigset_t set;
2131 
2132     ucp_addr = env->regwptr[UREG_I0];
2133     if (!lock_user_struct(VERIFY_WRITE, ucp, ucp_addr, 0))
2134         goto do_sigsegv;
2135 
2136     mcp = &ucp->uc_mcontext;
2137     grp = &mcp->mc_gregs;
2138 
2139     /* Skip over the trap instruction, first. */
2140     env->pc = env->npc;
2141     env->npc += 4;
2142 
2143     err = 0;
2144 
2145     sigprocmask(0, NULL, &set);
2146     host_to_target_sigset_internal(&target_set, &set);
2147     if (TARGET_NSIG_WORDS == 1) {
2148         err |= __put_user(target_set.sig[0],
2149                           (abi_ulong *)&ucp->uc_sigmask);
2150     } else {
2151         abi_ulong *src, *dst;
2152         src = target_set.sig;
2153         dst = ucp->uc_sigmask.sig;
2154         for (i = 0; i < sizeof(target_sigset_t) / sizeof(abi_ulong);
2155              i++, dst++, src++)
2156             err |= __put_user(*src, dst);
2157         if (err)
2158             goto do_sigsegv;
2159     }
2160 
2161     /* XXX: tstate must be saved properly */
2162     //    err |= __put_user(env->tstate, &((*grp)[MC_TSTATE]));
2163     err |= __put_user(env->pc, &((*grp)[MC_PC]));
2164     err |= __put_user(env->npc, &((*grp)[MC_NPC]));
2165     err |= __put_user(env->y, &((*grp)[MC_Y]));
2166     err |= __put_user(env->gregs[1], &((*grp)[MC_G1]));
2167     err |= __put_user(env->gregs[2], &((*grp)[MC_G2]));
2168     err |= __put_user(env->gregs[3], &((*grp)[MC_G3]));
2169     err |= __put_user(env->gregs[4], &((*grp)[MC_G4]));
2170     err |= __put_user(env->gregs[5], &((*grp)[MC_G5]));
2171     err |= __put_user(env->gregs[6], &((*grp)[MC_G6]));
2172     err |= __put_user(env->gregs[7], &((*grp)[MC_G7]));
2173     err |= __put_user(env->regwptr[UREG_I0], &((*grp)[MC_O0]));
2174     err |= __put_user(env->regwptr[UREG_I1], &((*grp)[MC_O1]));
2175     err |= __put_user(env->regwptr[UREG_I2], &((*grp)[MC_O2]));
2176     err |= __put_user(env->regwptr[UREG_I3], &((*grp)[MC_O3]));
2177     err |= __put_user(env->regwptr[UREG_I4], &((*grp)[MC_O4]));
2178     err |= __put_user(env->regwptr[UREG_I5], &((*grp)[MC_O5]));
2179     err |= __put_user(env->regwptr[UREG_I6], &((*grp)[MC_O6]));
2180     err |= __put_user(env->regwptr[UREG_I7], &((*grp)[MC_O7]));
2181 
2182     w_addr = TARGET_STACK_BIAS+env->regwptr[UREG_I6];
2183     fp = i7 = 0;
2184     if (get_user(fp, w_addr + offsetof(struct target_reg_window, ins[6]),
2185                  abi_ulong) != 0)
2186         goto do_sigsegv;
2187     if (get_user(i7, w_addr + offsetof(struct target_reg_window, ins[7]),
2188                  abi_ulong) != 0)
2189         goto do_sigsegv;
2190     err |= __put_user(fp, &(mcp->mc_fp));
2191     err |= __put_user(i7, &(mcp->mc_i7));
2192 
2193     {
2194         uint32_t *src, *dst;
2195         src = env->fpr;
2196         dst = ucp->uc_mcontext.mc_fpregs.mcfpu_fregs.sregs;
2197         /* XXX: check that the CPU storage is the same as user context */
2198         for (i = 0; i < 64; i++, dst++, src++)
2199             err |= __put_user(*src, dst);
2200     }
2201     err |= __put_user(env->fsr, &(mcp->mc_fpregs.mcfpu_fsr));
2202     err |= __put_user(env->gsr, &(mcp->mc_fpregs.mcfpu_gsr));
2203     err |= __put_user(env->fprs, &(mcp->mc_fpregs.mcfpu_fprs));
2204 
2205     if (err)
2206         goto do_sigsegv;
2207     unlock_user_struct(ucp, ucp_addr, 1);
2208     return;
2209  do_sigsegv:
2210     unlock_user_struct(ucp, ucp_addr, 1);
2211     force_sig(SIGSEGV);
2212 }
2213 #endif
2214 #elif defined(TARGET_ABI_MIPSN64)
2215 
2216 # warning signal handling not implemented
2217 
2218 static void setup_frame(int sig, struct target_sigaction *ka,
2219 			target_sigset_t *set, CPUState *env)
2220 {
2221     fprintf(stderr, "setup_frame: not implemented\n");
2222 }
2223 
2224 static void setup_rt_frame(int sig, struct target_sigaction *ka,
2225                            target_siginfo_t *info,
2226 			   target_sigset_t *set, CPUState *env)
2227 {
2228     fprintf(stderr, "setup_rt_frame: not implemented\n");
2229 }
2230 
2231 long do_sigreturn(CPUState *env)
2232 {
2233     fprintf(stderr, "do_sigreturn: not implemented\n");
2234     return -TARGET_ENOSYS;
2235 }
2236 
2237 long do_rt_sigreturn(CPUState *env)
2238 {
2239     fprintf(stderr, "do_rt_sigreturn: not implemented\n");
2240     return -TARGET_ENOSYS;
2241 }
2242 
2243 #elif defined(TARGET_ABI_MIPSN32)
2244 
2245 # warning signal handling not implemented
2246 
2247 static void setup_frame(int sig, struct target_sigaction *ka,
2248 			target_sigset_t *set, CPUState *env)
2249 {
2250     fprintf(stderr, "setup_frame: not implemented\n");
2251 }
2252 
2253 static void setup_rt_frame(int sig, struct target_sigaction *ka,
2254                            target_siginfo_t *info,
2255 			   target_sigset_t *set, CPUState *env)
2256 {
2257     fprintf(stderr, "setup_rt_frame: not implemented\n");
2258 }
2259 
2260 long do_sigreturn(CPUState *env)
2261 {
2262     fprintf(stderr, "do_sigreturn: not implemented\n");
2263     return -TARGET_ENOSYS;
2264 }
2265 
2266 long do_rt_sigreturn(CPUState *env)
2267 {
2268     fprintf(stderr, "do_rt_sigreturn: not implemented\n");
2269     return -TARGET_ENOSYS;
2270 }
2271 
2272 #elif defined(TARGET_ABI_MIPSO32)
2273 
2274 struct target_sigcontext {
2275     uint32_t   sc_regmask;     /* Unused */
2276     uint32_t   sc_status;
2277     uint64_t   sc_pc;
2278     uint64_t   sc_regs[32];
2279     uint64_t   sc_fpregs[32];
2280     uint32_t   sc_ownedfp;     /* Unused */
2281     uint32_t   sc_fpc_csr;
2282     uint32_t   sc_fpc_eir;     /* Unused */
2283     uint32_t   sc_used_math;
2284     uint32_t   sc_dsp;         /* dsp status, was sc_ssflags */
2285     uint64_t   sc_mdhi;
2286     uint64_t   sc_mdlo;
2287     target_ulong   sc_hi1;         /* Was sc_cause */
2288     target_ulong   sc_lo1;         /* Was sc_badvaddr */
2289     target_ulong   sc_hi2;         /* Was sc_sigset[4] */
2290     target_ulong   sc_lo2;
2291     target_ulong   sc_hi3;
2292     target_ulong   sc_lo3;
2293 };
2294 
2295 struct sigframe {
2296     uint32_t sf_ass[4];			/* argument save space for o32 */
2297     uint32_t sf_code[2];			/* signal trampoline */
2298     struct target_sigcontext sf_sc;
2299     target_sigset_t sf_mask;
2300 };
2301 
2302 /* Install trampoline to jump back from signal handler */
2303 static inline int install_sigtramp(unsigned int *tramp,   unsigned int syscall)
2304 {
2305     int err;
2306 
2307     /*
2308     * Set up the return code ...
2309     *
2310     *         li      v0, __NR__foo_sigreturn
2311     *         syscall
2312     */
2313 
2314     err = __put_user(0x24020000 + syscall, tramp + 0);
2315     err |= __put_user(0x0000000c          , tramp + 1);
2316     /* flush_cache_sigtramp((unsigned long) tramp); */
2317     return err;
2318 }
2319 
2320 static inline int
2321 setup_sigcontext(CPUState *regs, struct target_sigcontext *sc)
2322 {
2323     int err = 0;
2324 
2325     err |= __put_user(regs->active_tc.PC, &sc->sc_pc);
2326 
2327 #define save_gp_reg(i) do {   						\
2328         err |= __put_user(regs->active_tc.gpr[i], &sc->sc_regs[i]);	\
2329     } while(0)
2330     __put_user(0, &sc->sc_regs[0]); save_gp_reg(1); save_gp_reg(2);
2331     save_gp_reg(3); save_gp_reg(4); save_gp_reg(5); save_gp_reg(6);
2332     save_gp_reg(7); save_gp_reg(8); save_gp_reg(9); save_gp_reg(10);
2333     save_gp_reg(11); save_gp_reg(12); save_gp_reg(13); save_gp_reg(14);
2334     save_gp_reg(15); save_gp_reg(16); save_gp_reg(17); save_gp_reg(18);
2335     save_gp_reg(19); save_gp_reg(20); save_gp_reg(21); save_gp_reg(22);
2336     save_gp_reg(23); save_gp_reg(24); save_gp_reg(25); save_gp_reg(26);
2337     save_gp_reg(27); save_gp_reg(28); save_gp_reg(29); save_gp_reg(30);
2338     save_gp_reg(31);
2339 #undef save_gp_reg
2340 
2341     err |= __put_user(regs->active_tc.HI[0], &sc->sc_mdhi);
2342     err |= __put_user(regs->active_tc.LO[0], &sc->sc_mdlo);
2343 
2344     /* Not used yet, but might be useful if we ever have DSP suppport */
2345 #if 0
2346     if (cpu_has_dsp) {
2347 	err |= __put_user(mfhi1(), &sc->sc_hi1);
2348 	err |= __put_user(mflo1(), &sc->sc_lo1);
2349 	err |= __put_user(mfhi2(), &sc->sc_hi2);
2350 	err |= __put_user(mflo2(), &sc->sc_lo2);
2351 	err |= __put_user(mfhi3(), &sc->sc_hi3);
2352 	err |= __put_user(mflo3(), &sc->sc_lo3);
2353 	err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp);
2354     }
2355     /* same with 64 bit */
2356 #ifdef CONFIG_64BIT
2357     err |= __put_user(regs->hi, &sc->sc_hi[0]);
2358     err |= __put_user(regs->lo, &sc->sc_lo[0]);
2359     if (cpu_has_dsp) {
2360 	err |= __put_user(mfhi1(), &sc->sc_hi[1]);
2361 	err |= __put_user(mflo1(), &sc->sc_lo[1]);
2362 	err |= __put_user(mfhi2(), &sc->sc_hi[2]);
2363 	err |= __put_user(mflo2(), &sc->sc_lo[2]);
2364 	err |= __put_user(mfhi3(), &sc->sc_hi[3]);
2365 	err |= __put_user(mflo3(), &sc->sc_lo[3]);
2366 	err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp);
2367     }
2368 #endif
2369 #endif
2370 
2371 #if 0
2372     err |= __put_user(!!used_math(), &sc->sc_used_math);
2373 
2374     if (!used_math())
2375 	goto out;
2376 
2377     /*
2378     * Save FPU state to signal context.  Signal handler will "inherit"
2379     * current FPU state.
2380     */
2381     preempt_disable();
2382 
2383     if (!is_fpu_owner()) {
2384 	own_fpu();
2385 	restore_fp(current);
2386     }
2387     err |= save_fp_context(sc);
2388 
2389     preempt_enable();
2390     out:
2391 #endif
2392     return err;
2393 }
2394 
2395 static inline int
2396 restore_sigcontext(CPUState *regs, struct target_sigcontext *sc)
2397 {
2398     int err = 0;
2399 
2400     err |= __get_user(regs->CP0_EPC, &sc->sc_pc);
2401 
2402     err |= __get_user(regs->active_tc.HI[0], &sc->sc_mdhi);
2403     err |= __get_user(regs->active_tc.LO[0], &sc->sc_mdlo);
2404 
2405 #define restore_gp_reg(i) do {   							\
2406         err |= __get_user(regs->active_tc.gpr[i], &sc->sc_regs[i]);		\
2407     } while(0)
2408     restore_gp_reg( 1); restore_gp_reg( 2); restore_gp_reg( 3);
2409     restore_gp_reg( 4); restore_gp_reg( 5); restore_gp_reg( 6);
2410     restore_gp_reg( 7); restore_gp_reg( 8); restore_gp_reg( 9);
2411     restore_gp_reg(10); restore_gp_reg(11); restore_gp_reg(12);
2412     restore_gp_reg(13); restore_gp_reg(14); restore_gp_reg(15);
2413     restore_gp_reg(16); restore_gp_reg(17); restore_gp_reg(18);
2414     restore_gp_reg(19); restore_gp_reg(20); restore_gp_reg(21);
2415     restore_gp_reg(22); restore_gp_reg(23); restore_gp_reg(24);
2416     restore_gp_reg(25); restore_gp_reg(26); restore_gp_reg(27);
2417     restore_gp_reg(28); restore_gp_reg(29); restore_gp_reg(30);
2418     restore_gp_reg(31);
2419 #undef restore_gp_reg
2420 
2421 #if 0
2422     if (cpu_has_dsp) {
2423 	err |= __get_user(treg, &sc->sc_hi1); mthi1(treg);
2424 	err |= __get_user(treg, &sc->sc_lo1); mtlo1(treg);
2425 	err |= __get_user(treg, &sc->sc_hi2); mthi2(treg);
2426 	err |= __get_user(treg, &sc->sc_lo2); mtlo2(treg);
2427 	err |= __get_user(treg, &sc->sc_hi3); mthi3(treg);
2428 	err |= __get_user(treg, &sc->sc_lo3); mtlo3(treg);
2429 	err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK);
2430     }
2431 #ifdef CONFIG_64BIT
2432     err |= __get_user(regs->hi, &sc->sc_hi[0]);
2433     err |= __get_user(regs->lo, &sc->sc_lo[0]);
2434     if (cpu_has_dsp) {
2435 	err |= __get_user(treg, &sc->sc_hi[1]); mthi1(treg);
2436 	err |= __get_user(treg, &sc->sc_lo[1]); mthi1(treg);
2437 	err |= __get_user(treg, &sc->sc_hi[2]); mthi2(treg);
2438 	err |= __get_user(treg, &sc->sc_lo[2]); mthi2(treg);
2439 	err |= __get_user(treg, &sc->sc_hi[3]); mthi3(treg);
2440 	err |= __get_user(treg, &sc->sc_lo[3]); mthi3(treg);
2441 	err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK);
2442     }
2443 #endif
2444 
2445     err |= __get_user(used_math, &sc->sc_used_math);
2446     conditional_used_math(used_math);
2447 
2448     preempt_disable();
2449 
2450     if (used_math()) {
2451 	/* restore fpu context if we have used it before */
2452 	own_fpu();
2453 	err |= restore_fp_context(sc);
2454     } else {
2455 	/* signal handler may have used FPU.  Give it up. */
2456 	lose_fpu();
2457     }
2458 
2459     preempt_enable();
2460 #endif
2461     return err;
2462 }
2463 /*
2464  * Determine which stack to use..
2465  */
2466 static inline abi_ulong
2467 get_sigframe(struct target_sigaction *ka, CPUState *regs, size_t frame_size)
2468 {
2469     unsigned long sp;
2470 
2471     /* Default to using normal stack */
2472     sp = regs->active_tc.gpr[29];
2473 
2474     /*
2475      * FPU emulator may have it's own trampoline active just
2476      * above the user stack, 16-bytes before the next lowest
2477      * 16 byte boundary.  Try to avoid trashing it.
2478      */
2479     sp -= 32;
2480 
2481     /* This is the X/Open sanctioned signal stack switching.  */
2482     if ((ka->sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags (sp) == 0)) {
2483         sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
2484     }
2485 
2486     return (sp - frame_size) & ~7;
2487 }
2488 
2489 /* compare linux/arch/mips/kernel/signal.c:setup_frame() */
2490 static void setup_frame(int sig, struct target_sigaction * ka,
2491                         target_sigset_t *set, CPUState *regs)
2492 {
2493     struct sigframe *frame;
2494     abi_ulong frame_addr;
2495     int i;
2496 
2497     frame_addr = get_sigframe(ka, regs, sizeof(*frame));
2498     if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
2499 	goto give_sigsegv;
2500 
2501     install_sigtramp(frame->sf_code, TARGET_NR_sigreturn);
2502 
2503     if(setup_sigcontext(regs, &frame->sf_sc))
2504 	goto give_sigsegv;
2505 
2506     for(i = 0; i < TARGET_NSIG_WORDS; i++) {
2507 	if(__put_user(set->sig[i], &frame->sf_mask.sig[i]))
2508 	    goto give_sigsegv;
2509     }
2510 
2511     /*
2512     * Arguments to signal handler:
2513     *
2514     *   a0 = signal number
2515     *   a1 = 0 (should be cause)
2516     *   a2 = pointer to struct sigcontext
2517     *
2518     * $25 and PC point to the signal handler, $29 points to the
2519     * struct sigframe.
2520     */
2521     regs->active_tc.gpr[ 4] = sig;
2522     regs->active_tc.gpr[ 5] = 0;
2523     regs->active_tc.gpr[ 6] = frame_addr + offsetof(struct sigframe, sf_sc);
2524     regs->active_tc.gpr[29] = frame_addr;
2525     regs->active_tc.gpr[31] = frame_addr + offsetof(struct sigframe, sf_code);
2526     /* The original kernel code sets CP0_EPC to the handler
2527     * since it returns to userland using eret
2528     * we cannot do this here, and we must set PC directly */
2529     regs->active_tc.PC = regs->active_tc.gpr[25] = ka->_sa_handler;
2530     unlock_user_struct(frame, frame_addr, 1);
2531     return;
2532 
2533 give_sigsegv:
2534     unlock_user_struct(frame, frame_addr, 1);
2535     force_sig(TARGET_SIGSEGV/*, current*/);
2536     return;
2537 }
2538 
2539 long do_sigreturn(CPUState *regs)
2540 {
2541     struct sigframe *frame;
2542     abi_ulong frame_addr;
2543     sigset_t blocked;
2544     target_sigset_t target_set;
2545     int i;
2546 
2547 #if defined(DEBUG_SIGNAL)
2548     fprintf(stderr, "do_sigreturn\n");
2549 #endif
2550     frame_addr = regs->active_tc.gpr[29];
2551     if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
2552    	goto badframe;
2553 
2554     for(i = 0; i < TARGET_NSIG_WORDS; i++) {
2555    	if(__get_user(target_set.sig[i], &frame->sf_mask.sig[i]))
2556 	    goto badframe;
2557     }
2558 
2559     target_to_host_sigset_internal(&blocked, &target_set);
2560     sigprocmask(SIG_SETMASK, &blocked, NULL);
2561 
2562     if (restore_sigcontext(regs, &frame->sf_sc))
2563    	goto badframe;
2564 
2565 #if 0
2566     /*
2567      * Don't let your children do this ...
2568      */
2569     __asm__ __volatile__(
2570    	"move\t$29, %0\n\t"
2571    	"j\tsyscall_exit"
2572    	:/* no outputs */
2573    	:"r" (&regs));
2574     /* Unreached */
2575 #endif
2576 
2577     regs->active_tc.PC = regs->CP0_EPC;
2578     /* I am not sure this is right, but it seems to work
2579     * maybe a problem with nested signals ? */
2580     regs->CP0_EPC = 0;
2581     return 0;
2582 
2583 badframe:
2584     force_sig(TARGET_SIGSEGV/*, current*/);
2585     return 0;
2586 }
2587 
2588 static void setup_rt_frame(int sig, struct target_sigaction *ka,
2589                            target_siginfo_t *info,
2590 			   target_sigset_t *set, CPUState *env)
2591 {
2592     fprintf(stderr, "setup_rt_frame: not implemented\n");
2593 }
2594 
2595 long do_rt_sigreturn(CPUState *env)
2596 {
2597     fprintf(stderr, "do_rt_sigreturn: not implemented\n");
2598     return -TARGET_ENOSYS;
2599 }
2600 
2601 #elif defined(TARGET_SH4)
2602 
2603 /*
2604  * code and data structures from linux kernel:
2605  * include/asm-sh/sigcontext.h
2606  * arch/sh/kernel/signal.c
2607  */
2608 
2609 struct target_sigcontext {
2610     target_ulong  oldmask;
2611 
2612     /* CPU registers */
2613     target_ulong  sc_gregs[16];
2614     target_ulong  sc_pc;
2615     target_ulong  sc_pr;
2616     target_ulong  sc_sr;
2617     target_ulong  sc_gbr;
2618     target_ulong  sc_mach;
2619     target_ulong  sc_macl;
2620 
2621     /* FPU registers */
2622     target_ulong  sc_fpregs[16];
2623     target_ulong  sc_xfpregs[16];
2624     unsigned int sc_fpscr;
2625     unsigned int sc_fpul;
2626     unsigned int sc_ownedfp;
2627 };
2628 
2629 struct target_sigframe
2630 {
2631     struct target_sigcontext sc;
2632     target_ulong extramask[TARGET_NSIG_WORDS-1];
2633     uint16_t retcode[3];
2634 };
2635 
2636 
2637 struct target_ucontext {
2638     target_ulong uc_flags;
2639     struct target_ucontext *uc_link;
2640     target_stack_t uc_stack;
2641     struct target_sigcontext uc_mcontext;
2642     target_sigset_t uc_sigmask;	/* mask last for extensibility */
2643 };
2644 
2645 struct target_rt_sigframe
2646 {
2647     struct target_siginfo info;
2648     struct target_ucontext uc;
2649     uint16_t retcode[3];
2650 };
2651 
2652 
2653 #define MOVW(n)  (0x9300|((n)-2)) /* Move mem word at PC+n to R3 */
2654 #define TRAP_NOARG 0xc310         /* Syscall w/no args (NR in R3) SH3/4 */
2655 
2656 static abi_ulong get_sigframe(struct target_sigaction *ka,
2657                          unsigned long sp, size_t frame_size)
2658 {
2659     if ((ka->sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags(sp) == 0)) {
2660         sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
2661     }
2662 
2663     return (sp - frame_size) & -8ul;
2664 }
2665 
2666 static int setup_sigcontext(struct target_sigcontext *sc,
2667 			    CPUState *regs, unsigned long mask)
2668 {
2669     int err = 0;
2670 
2671 #define COPY(x)         err |= __put_user(regs->x, &sc->sc_##x)
2672     COPY(gregs[0]); COPY(gregs[1]);
2673     COPY(gregs[2]); COPY(gregs[3]);
2674     COPY(gregs[4]); COPY(gregs[5]);
2675     COPY(gregs[6]); COPY(gregs[7]);
2676     COPY(gregs[8]); COPY(gregs[9]);
2677     COPY(gregs[10]); COPY(gregs[11]);
2678     COPY(gregs[12]); COPY(gregs[13]);
2679     COPY(gregs[14]); COPY(gregs[15]);
2680     COPY(gbr); COPY(mach);
2681     COPY(macl); COPY(pr);
2682     COPY(sr); COPY(pc);
2683 #undef COPY
2684 
2685     /* todo: save FPU registers here */
2686 
2687     /* non-iBCS2 extensions.. */
2688     err |= __put_user(mask, &sc->oldmask);
2689 
2690     return err;
2691 }
2692 
2693 static int restore_sigcontext(struct CPUState *regs,
2694 			      struct target_sigcontext *sc)
2695 {
2696     unsigned int err = 0;
2697 
2698 #define COPY(x)         err |= __get_user(regs->x, &sc->sc_##x)
2699     COPY(gregs[1]);
2700     COPY(gregs[2]); COPY(gregs[3]);
2701     COPY(gregs[4]); COPY(gregs[5]);
2702     COPY(gregs[6]); COPY(gregs[7]);
2703     COPY(gregs[8]); COPY(gregs[9]);
2704     COPY(gregs[10]); COPY(gregs[11]);
2705     COPY(gregs[12]); COPY(gregs[13]);
2706     COPY(gregs[14]); COPY(gregs[15]);
2707     COPY(gbr); COPY(mach);
2708     COPY(macl); COPY(pr);
2709     COPY(sr); COPY(pc);
2710 #undef COPY
2711 
2712     /* todo: restore FPU registers here */
2713 
2714     regs->tra = -1;         /* disable syscall checks */
2715     return err;
2716 }
2717 
2718 static void setup_frame(int sig, struct target_sigaction *ka,
2719 			target_sigset_t *set, CPUState *regs)
2720 {
2721     struct target_sigframe *frame;
2722     abi_ulong frame_addr;
2723     int i;
2724     int err = 0;
2725     int signal;
2726 
2727     frame_addr = get_sigframe(ka, regs->gregs[15], sizeof(*frame));
2728     if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
2729 	goto give_sigsegv;
2730 
2731     signal = current_exec_domain_sig(sig);
2732 
2733     err |= setup_sigcontext(&frame->sc, regs, set->sig[0]);
2734 
2735     for (i = 0; i < TARGET_NSIG_WORDS - 1; i++) {
2736         err |= __put_user(set->sig[i + 1], &frame->extramask[i]);
2737     }
2738 
2739     /* Set up to return from userspace.  If provided, use a stub
2740        already in userspace.  */
2741     if (ka->sa_flags & TARGET_SA_RESTORER) {
2742         regs->pr = (unsigned long) ka->sa_restorer;
2743     } else {
2744         /* Generate return code (system call to sigreturn) */
2745         err |= __put_user(MOVW(2), &frame->retcode[0]);
2746         err |= __put_user(TRAP_NOARG, &frame->retcode[1]);
2747         err |= __put_user((TARGET_NR_sigreturn), &frame->retcode[2]);
2748         regs->pr = (unsigned long) frame->retcode;
2749     }
2750 
2751     if (err)
2752         goto give_sigsegv;
2753 
2754     /* Set up registers for signal handler */
2755     regs->gregs[15] = (unsigned long) frame;
2756     regs->gregs[4] = signal; /* Arg for signal handler */
2757     regs->gregs[5] = 0;
2758     regs->gregs[6] = (unsigned long) &frame->sc;
2759     regs->pc = (unsigned long) ka->_sa_handler;
2760 
2761     unlock_user_struct(frame, frame_addr, 1);
2762     return;
2763 
2764 give_sigsegv:
2765     unlock_user_struct(frame, frame_addr, 1);
2766     force_sig(SIGSEGV);
2767 }
2768 
2769 static void setup_rt_frame(int sig, struct target_sigaction *ka,
2770                            target_siginfo_t *info,
2771 			   target_sigset_t *set, CPUState *regs)
2772 {
2773     struct target_rt_sigframe *frame;
2774     abi_ulong frame_addr;
2775     int i;
2776     int err = 0;
2777     int signal;
2778 
2779     frame_addr = get_sigframe(ka, regs->gregs[15], sizeof(*frame));
2780     if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
2781 	goto give_sigsegv;
2782 
2783     signal = current_exec_domain_sig(sig);
2784 
2785     err |= copy_siginfo_to_user(&frame->info, info);
2786 
2787     /* Create the ucontext.  */
2788     err |= __put_user(0, &frame->uc.uc_flags);
2789     err |= __put_user(0, (unsigned long *)&frame->uc.uc_link);
2790     err |= __put_user((unsigned long)target_sigaltstack_used.ss_sp,
2791 		      &frame->uc.uc_stack.ss_sp);
2792     err |= __put_user(sas_ss_flags(regs->gregs[15]),
2793 		      &frame->uc.uc_stack.ss_flags);
2794     err |= __put_user(target_sigaltstack_used.ss_size,
2795 		      &frame->uc.uc_stack.ss_size);
2796     err |= setup_sigcontext(&frame->uc.uc_mcontext,
2797 			    regs, set->sig[0]);
2798     for(i = 0; i < TARGET_NSIG_WORDS; i++) {
2799         err |= __put_user(set->sig[i], &frame->uc.uc_sigmask.sig[i]);
2800     }
2801 
2802     /* Set up to return from userspace.  If provided, use a stub
2803        already in userspace.  */
2804     if (ka->sa_flags & TARGET_SA_RESTORER) {
2805         regs->pr = (unsigned long) ka->sa_restorer;
2806     } else {
2807         /* Generate return code (system call to sigreturn) */
2808         err |= __put_user(MOVW(2), &frame->retcode[0]);
2809         err |= __put_user(TRAP_NOARG, &frame->retcode[1]);
2810         err |= __put_user((TARGET_NR_rt_sigreturn), &frame->retcode[2]);
2811         regs->pr = (unsigned long) frame->retcode;
2812     }
2813 
2814     if (err)
2815         goto give_sigsegv;
2816 
2817     /* Set up registers for signal handler */
2818     regs->gregs[15] = (unsigned long) frame;
2819     regs->gregs[4] = signal; /* Arg for signal handler */
2820     regs->gregs[5] = (unsigned long) &frame->info;
2821     regs->gregs[6] = (unsigned long) &frame->uc;
2822     regs->pc = (unsigned long) ka->_sa_handler;
2823 
2824     unlock_user_struct(frame, frame_addr, 1);
2825     return;
2826 
2827 give_sigsegv:
2828     unlock_user_struct(frame, frame_addr, 1);
2829     force_sig(SIGSEGV);
2830 }
2831 
2832 long do_sigreturn(CPUState *regs)
2833 {
2834     struct target_sigframe *frame;
2835     abi_ulong frame_addr;
2836     sigset_t blocked;
2837     target_sigset_t target_set;
2838     int i;
2839     int err = 0;
2840 
2841 #if defined(DEBUG_SIGNAL)
2842     fprintf(stderr, "do_sigreturn\n");
2843 #endif
2844     frame_addr = regs->gregs[15];
2845     if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
2846    	goto badframe;
2847 
2848     err |= __get_user(target_set.sig[0], &frame->sc.oldmask);
2849     for(i = 1; i < TARGET_NSIG_WORDS; i++) {
2850         err |= (__get_user(target_set.sig[i], &frame->extramask[i - 1]));
2851     }
2852 
2853     if (err)
2854         goto badframe;
2855 
2856     target_to_host_sigset_internal(&blocked, &target_set);
2857     sigprocmask(SIG_SETMASK, &blocked, NULL);
2858 
2859     if (restore_sigcontext(regs, &frame->sc))
2860         goto badframe;
2861 
2862     unlock_user_struct(frame, frame_addr, 0);
2863     return regs->gregs[0];
2864 
2865 badframe:
2866     unlock_user_struct(frame, frame_addr, 0);
2867     force_sig(TARGET_SIGSEGV);
2868     return 0;
2869 }
2870 
2871 long do_rt_sigreturn(CPUState *regs)
2872 {
2873     struct target_rt_sigframe *frame;
2874     abi_ulong frame_addr;
2875     sigset_t blocked;
2876 
2877 #if defined(DEBUG_SIGNAL)
2878     fprintf(stderr, "do_rt_sigreturn\n");
2879 #endif
2880     frame_addr = regs->gregs[15];
2881     if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
2882    	goto badframe;
2883 
2884     target_to_host_sigset(&blocked, &frame->uc.uc_sigmask);
2885     sigprocmask(SIG_SETMASK, &blocked, NULL);
2886 
2887     if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
2888         goto badframe;
2889 
2890     if (do_sigaltstack(frame_addr +
2891 		       offsetof(struct target_rt_sigframe, uc.uc_stack),
2892 		       0, get_sp_from_cpustate(regs)) == -EFAULT)
2893         goto badframe;
2894 
2895     unlock_user_struct(frame, frame_addr, 0);
2896     return regs->gregs[0];
2897 
2898 badframe:
2899     unlock_user_struct(frame, frame_addr, 0);
2900     force_sig(TARGET_SIGSEGV);
2901     return 0;
2902 }
2903 #elif defined(TARGET_CRIS)
2904 
2905 struct target_sigcontext {
2906         struct target_pt_regs regs;  /* needs to be first */
2907         uint32_t oldmask;
2908         uint32_t usp;    /* usp before stacking this gunk on it */
2909 };
2910 
2911 /* Signal frames. */
2912 struct target_signal_frame {
2913         struct target_sigcontext sc;
2914         uint32_t extramask[TARGET_NSIG_WORDS - 1];
2915         uint8_t retcode[8];       /* Trampoline code. */
2916 };
2917 
2918 struct rt_signal_frame {
2919         struct siginfo *pinfo;
2920         void *puc;
2921         struct siginfo info;
2922         struct ucontext uc;
2923         uint8_t retcode[8];       /* Trampoline code. */
2924 };
2925 
2926 static void setup_sigcontext(struct target_sigcontext *sc, CPUState *env)
2927 {
2928 	__put_user(env->regs[0], &sc->regs.r0);
2929 	__put_user(env->regs[1], &sc->regs.r1);
2930 	__put_user(env->regs[2], &sc->regs.r2);
2931 	__put_user(env->regs[3], &sc->regs.r3);
2932 	__put_user(env->regs[4], &sc->regs.r4);
2933 	__put_user(env->regs[5], &sc->regs.r5);
2934 	__put_user(env->regs[6], &sc->regs.r6);
2935 	__put_user(env->regs[7], &sc->regs.r7);
2936 	__put_user(env->regs[8], &sc->regs.r8);
2937 	__put_user(env->regs[9], &sc->regs.r9);
2938 	__put_user(env->regs[10], &sc->regs.r10);
2939 	__put_user(env->regs[11], &sc->regs.r11);
2940 	__put_user(env->regs[12], &sc->regs.r12);
2941 	__put_user(env->regs[13], &sc->regs.r13);
2942 	__put_user(env->regs[14], &sc->usp);
2943 	__put_user(env->regs[15], &sc->regs.acr);
2944 	__put_user(env->pregs[PR_MOF], &sc->regs.mof);
2945 	__put_user(env->pregs[PR_SRP], &sc->regs.srp);
2946 	__put_user(env->pc, &sc->regs.erp);
2947 }
2948 
2949 static void restore_sigcontext(struct target_sigcontext *sc, CPUState *env)
2950 {
2951 	__get_user(env->regs[0], &sc->regs.r0);
2952 	__get_user(env->regs[1], &sc->regs.r1);
2953 	__get_user(env->regs[2], &sc->regs.r2);
2954 	__get_user(env->regs[3], &sc->regs.r3);
2955 	__get_user(env->regs[4], &sc->regs.r4);
2956 	__get_user(env->regs[5], &sc->regs.r5);
2957 	__get_user(env->regs[6], &sc->regs.r6);
2958 	__get_user(env->regs[7], &sc->regs.r7);
2959 	__get_user(env->regs[8], &sc->regs.r8);
2960 	__get_user(env->regs[9], &sc->regs.r9);
2961 	__get_user(env->regs[10], &sc->regs.r10);
2962 	__get_user(env->regs[11], &sc->regs.r11);
2963 	__get_user(env->regs[12], &sc->regs.r12);
2964 	__get_user(env->regs[13], &sc->regs.r13);
2965 	__get_user(env->regs[14], &sc->usp);
2966 	__get_user(env->regs[15], &sc->regs.acr);
2967 	__get_user(env->pregs[PR_MOF], &sc->regs.mof);
2968 	__get_user(env->pregs[PR_SRP], &sc->regs.srp);
2969 	__get_user(env->pc, &sc->regs.erp);
2970 }
2971 
2972 static abi_ulong get_sigframe(CPUState *env, int framesize)
2973 {
2974 	abi_ulong sp;
2975 	/* Align the stack downwards to 4.  */
2976 	sp = (env->regs[R_SP] & ~3);
2977 	return sp - framesize;
2978 }
2979 
2980 static void setup_frame(int sig, struct target_sigaction *ka,
2981 			target_sigset_t *set, CPUState *env)
2982 {
2983 	struct target_signal_frame *frame;
2984 	abi_ulong frame_addr;
2985 	int err = 0;
2986 	int i;
2987 
2988 	frame_addr = get_sigframe(env, sizeof *frame);
2989 	if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
2990 		goto badframe;
2991 
2992 	/*
2993 	 * The CRIS signal return trampoline. A real linux/CRIS kernel doesn't
2994 	 * use this trampoline anymore but it sets it up for GDB.
2995 	 * In QEMU, using the trampoline simplifies things a bit so we use it.
2996 	 *
2997 	 * This is movu.w __NR_sigreturn, r9; break 13;
2998 	 */
2999 	err |= __put_user(0x9c5f, frame->retcode+0);
3000 	err |= __put_user(TARGET_NR_sigreturn,
3001 			  frame->retcode+2);
3002 	err |= __put_user(0xe93d, frame->retcode+4);
3003 
3004 	/* Save the mask.  */
3005 	err |= __put_user(set->sig[0], &frame->sc.oldmask);
3006 	if (err)
3007 		goto badframe;
3008 
3009 	for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3010 		if (__put_user(set->sig[i], &frame->extramask[i - 1]))
3011 			goto badframe;
3012 	}
3013 
3014 	setup_sigcontext(&frame->sc, env);
3015 
3016 	/* Move the stack and setup the arguments for the handler.  */
3017 	env->regs[R_SP] = (uint32_t) (unsigned long) frame;
3018 	env->regs[10] = sig;
3019 	env->pc = (unsigned long) ka->_sa_handler;
3020 	/* Link SRP so the guest returns through the trampoline.  */
3021 	env->pregs[PR_SRP] = (uint32_t) (unsigned long) &frame->retcode[0];
3022 
3023 	unlock_user_struct(frame, frame_addr, 1);
3024 	return;
3025   badframe:
3026 	unlock_user_struct(frame, frame_addr, 1);
3027 	force_sig(TARGET_SIGSEGV);
3028 }
3029 
3030 static void setup_rt_frame(int sig, struct target_sigaction *ka,
3031                            target_siginfo_t *info,
3032 			   target_sigset_t *set, CPUState *env)
3033 {
3034     fprintf(stderr, "CRIS setup_rt_frame: not implemented\n");
3035 }
3036 
3037 long do_sigreturn(CPUState *env)
3038 {
3039 	struct target_signal_frame *frame;
3040 	abi_ulong frame_addr;
3041 	target_sigset_t target_set;
3042 	sigset_t set;
3043 	int i;
3044 
3045 	frame_addr = env->regs[R_SP];
3046 	/* Make sure the guest isn't playing games.  */
3047 	if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 1))
3048 		goto badframe;
3049 
3050 	/* Restore blocked signals */
3051 	if (__get_user(target_set.sig[0], &frame->sc.oldmask))
3052 		goto badframe;
3053 	for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3054 		if (__get_user(target_set.sig[i], &frame->extramask[i - 1]))
3055 			goto badframe;
3056 	}
3057 	target_to_host_sigset_internal(&set, &target_set);
3058 	sigprocmask(SIG_SETMASK, &set, NULL);
3059 
3060 	restore_sigcontext(&frame->sc, env);
3061 	unlock_user_struct(frame, frame_addr, 0);
3062 	return env->regs[10];
3063   badframe:
3064 	unlock_user_struct(frame, frame_addr, 0);
3065 	force_sig(TARGET_SIGSEGV);
3066 }
3067 
3068 long do_rt_sigreturn(CPUState *env)
3069 {
3070     fprintf(stderr, "CRIS do_rt_sigreturn: not implemented\n");
3071     return -TARGET_ENOSYS;
3072 }
3073 
3074 #else
3075 
3076 static void setup_frame(int sig, struct target_sigaction *ka,
3077 			target_sigset_t *set, CPUState *env)
3078 {
3079     fprintf(stderr, "setup_frame: not implemented\n");
3080 }
3081 
3082 static void setup_rt_frame(int sig, struct target_sigaction *ka,
3083                            target_siginfo_t *info,
3084 			   target_sigset_t *set, CPUState *env)
3085 {
3086     fprintf(stderr, "setup_rt_frame: not implemented\n");
3087 }
3088 
3089 long do_sigreturn(CPUState *env)
3090 {
3091     fprintf(stderr, "do_sigreturn: not implemented\n");
3092     return -TARGET_ENOSYS;
3093 }
3094 
3095 long do_rt_sigreturn(CPUState *env)
3096 {
3097     fprintf(stderr, "do_rt_sigreturn: not implemented\n");
3098     return -TARGET_ENOSYS;
3099 }
3100 
3101 #endif
3102 
3103 void process_pending_signals(CPUState *cpu_env)
3104 {
3105     int sig;
3106     abi_ulong handler;
3107     sigset_t set, old_set;
3108     target_sigset_t target_old_set;
3109     struct emulated_sigtable *k;
3110     struct target_sigaction *sa;
3111     struct sigqueue *q;
3112     TaskState *ts = cpu_env->opaque;
3113 
3114     if (!ts->signal_pending)
3115         return;
3116 
3117     /* FIXME: This is not threadsafe.  */
3118     k = ts->sigtab;
3119     for(sig = 1; sig <= TARGET_NSIG; sig++) {
3120         if (k->pending)
3121             goto handle_signal;
3122         k++;
3123     }
3124     /* if no signal is pending, just return */
3125     ts->signal_pending = 0;
3126     return;
3127 
3128  handle_signal:
3129 #ifdef DEBUG_SIGNAL
3130     fprintf(stderr, "qemu: process signal %d\n", sig);
3131 #endif
3132     /* dequeue signal */
3133     q = k->first;
3134     k->first = q->next;
3135     if (!k->first)
3136         k->pending = 0;
3137 
3138     sig = gdb_handlesig (cpu_env, sig);
3139     if (!sig) {
3140         sa = NULL;
3141         handler = TARGET_SIG_IGN;
3142     } else {
3143         sa = &sigact_table[sig - 1];
3144         handler = sa->_sa_handler;
3145     }
3146 
3147     if (handler == TARGET_SIG_DFL) {
3148         /* default handler : ignore some signal. The other are job control or fatal */
3149         if (sig == TARGET_SIGTSTP || sig == TARGET_SIGTTIN || sig == TARGET_SIGTTOU) {
3150             kill(getpid(),SIGSTOP);
3151         } else if (sig != TARGET_SIGCHLD &&
3152                    sig != TARGET_SIGURG &&
3153                    sig != TARGET_SIGWINCH &&
3154                    sig != TARGET_SIGCONT) {
3155             force_sig(sig);
3156         }
3157     } else if (handler == TARGET_SIG_IGN) {
3158         /* ignore sig */
3159     } else if (handler == TARGET_SIG_ERR) {
3160         force_sig(sig);
3161     } else {
3162         /* compute the blocked signals during the handler execution */
3163         target_to_host_sigset(&set, &sa->sa_mask);
3164         /* SA_NODEFER indicates that the current signal should not be
3165            blocked during the handler */
3166         if (!(sa->sa_flags & TARGET_SA_NODEFER))
3167             sigaddset(&set, target_to_host_signal(sig));
3168 
3169         /* block signals in the handler using Linux */
3170         sigprocmask(SIG_BLOCK, &set, &old_set);
3171         /* save the previous blocked signal state to restore it at the
3172            end of the signal execution (see do_sigreturn) */
3173         host_to_target_sigset_internal(&target_old_set, &old_set);
3174 
3175         /* if the CPU is in VM86 mode, we restore the 32 bit values */
3176 #if defined(TARGET_I386) && !defined(TARGET_X86_64)
3177         {
3178             CPUX86State *env = cpu_env;
3179             if (env->eflags & VM_MASK)
3180                 save_v86_state(env);
3181         }
3182 #endif
3183         /* prepare the stack frame of the virtual CPU */
3184         if (sa->sa_flags & TARGET_SA_SIGINFO)
3185             setup_rt_frame(sig, sa, &q->info, &target_old_set, cpu_env);
3186         else
3187             setup_frame(sig, sa, &target_old_set, cpu_env);
3188 	if (sa->sa_flags & TARGET_SA_RESETHAND)
3189             sa->_sa_handler = TARGET_SIG_DFL;
3190     }
3191     if (q != &k->info)
3192         free_sigqueue(cpu_env, q);
3193 }
3194