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