Statistics
| Branch: | Revision:

root / linux-user / signal.c @ c2764719

History | View | Annotate | Download (91.9 kB)

1
/*
2
 *  Emulation of Linux signals
3
 *
4
 *  Copyright (c) 2003 Fabrice Bellard
5
 *
6
 *  This program is free software; you can redistribute it and/or modify
7
 *  it under the terms of the GNU General Public License as published by
8
 *  the Free Software Foundation; either version 2 of the License, or
9
 *  (at your option) any later version.
10
 *
11
 *  This program is distributed in the hope that it will be useful,
12
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 *  GNU General Public License for more details.
15
 *
16
 *  You should have received a copy of the GNU General Public License
17
 *  along with this program; if not, write to the Free Software
18
 *  Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19
 *  MA 02110-1301, USA.
20
 */
21
#include <stdlib.h>
22
#include <stdio.h>
23
#include <string.h>
24
#include <stdarg.h>
25
#include <unistd.h>
26
#include <signal.h>
27
#include <errno.h>
28
#include <sys/ucontext.h>
29

    
30
#include "qemu.h"
31
#include "qemu-common.h"
32
#include "target_signal.h"
33

    
34
//#define DEBUG_SIGNAL
35

    
36
static struct target_sigaltstack target_sigaltstack_used = {
37
    .ss_sp = 0,
38
    .ss_size = 0,
39
    .ss_flags = TARGET_SS_DISABLE,
40
};
41

    
42
static struct target_sigaction sigact_table[TARGET_NSIG];
43

    
44
static void host_signal_handler(int host_signum, siginfo_t *info,
45
                                void *puc);
46

    
47
static uint8_t host_to_target_signal_table[65] = {
48
    [SIGHUP] = TARGET_SIGHUP,
49
    [SIGINT] = TARGET_SIGINT,
50
    [SIGQUIT] = TARGET_SIGQUIT,
51
    [SIGILL] = TARGET_SIGILL,
52
    [SIGTRAP] = TARGET_SIGTRAP,
53
    [SIGABRT] = TARGET_SIGABRT,
54
/*    [SIGIOT] = TARGET_SIGIOT,*/
55
    [SIGBUS] = TARGET_SIGBUS,
56
    [SIGFPE] = TARGET_SIGFPE,
57
    [SIGKILL] = TARGET_SIGKILL,
58
    [SIGUSR1] = TARGET_SIGUSR1,
59
    [SIGSEGV] = TARGET_SIGSEGV,
60
    [SIGUSR2] = TARGET_SIGUSR2,
61
    [SIGPIPE] = TARGET_SIGPIPE,
62
    [SIGALRM] = TARGET_SIGALRM,
63
    [SIGTERM] = TARGET_SIGTERM,
64
#ifdef SIGSTKFLT
65
    [SIGSTKFLT] = TARGET_SIGSTKFLT,
66
#endif
67
    [SIGCHLD] = TARGET_SIGCHLD,
68
    [SIGCONT] = TARGET_SIGCONT,
69
    [SIGSTOP] = TARGET_SIGSTOP,
70
    [SIGTSTP] = TARGET_SIGTSTP,
71
    [SIGTTIN] = TARGET_SIGTTIN,
72
    [SIGTTOU] = TARGET_SIGTTOU,
73
    [SIGURG] = TARGET_SIGURG,
74
    [SIGXCPU] = TARGET_SIGXCPU,
75
    [SIGXFSZ] = TARGET_SIGXFSZ,
76
    [SIGVTALRM] = TARGET_SIGVTALRM,
77
    [SIGPROF] = TARGET_SIGPROF,
78
    [SIGWINCH] = TARGET_SIGWINCH,
79
    [SIGIO] = TARGET_SIGIO,
80
    [SIGPWR] = TARGET_SIGPWR,
81
    [SIGSYS] = TARGET_SIGSYS,
82
    /* next signals stay the same */
83
    /* Nasty hack: Reverse SIGRTMIN and SIGRTMAX to avoid overlap with
84
       host libpthread signals.  This assumes noone actually uses SIGRTMAX :-/
85
       To fix this properly we need to do manual signal delivery multiplexed
86
       over a single host signal.  */
87
    [__SIGRTMIN] = __SIGRTMAX,
88
    [__SIGRTMAX] = __SIGRTMIN,
89
};
90
static uint8_t target_to_host_signal_table[65];
91

    
92
static inline int on_sig_stack(unsigned long sp)
93
{
94
    return (sp - target_sigaltstack_used.ss_sp
95
            < target_sigaltstack_used.ss_size);
96
}
97

    
98
static inline int sas_ss_flags(unsigned long sp)
99
{
100
    return (target_sigaltstack_used.ss_size == 0 ? SS_DISABLE
101
            : on_sig_stack(sp) ? SS_ONSTACK : 0);
102
}
103

    
104
static inline int host_to_target_signal(int sig)
105
{
106
    if (sig > 64)
107
        return sig;
108
    return host_to_target_signal_table[sig];
109
}
110

    
111
int target_to_host_signal(int sig)
112
{
113
    if (sig > 64)
114
        return sig;
115
    return target_to_host_signal_table[sig];
116
}
117

    
118
static inline void target_sigemptyset(target_sigset_t *set)
119
{
120
    memset(set, 0, sizeof(*set));
121
}
122

    
123
static inline void target_sigaddset(target_sigset_t *set, int signum)
124
{
125
    signum--;
126
    abi_ulong mask = (abi_ulong)1 << (signum % TARGET_NSIG_BPW);
127
    set->sig[signum / TARGET_NSIG_BPW] |= mask;
128
}
129

    
130
static inline int target_sigismember(const target_sigset_t *set, int signum)
131
{
132
    signum--;
133
    abi_ulong mask = (abi_ulong)1 << (signum % TARGET_NSIG_BPW);
134
    return ((set->sig[signum / TARGET_NSIG_BPW] & mask) != 0);
135
}
136

    
137
static void host_to_target_sigset_internal(target_sigset_t *d,
138
                                           const sigset_t *s)
139
{
140
    int i;
141
    target_sigemptyset(d);
142
    for (i = 1; i <= TARGET_NSIG; i++) {
143
        if (sigismember(s, i)) {
144
            target_sigaddset(d, host_to_target_signal(i));
145
        }
146
    }
147
}
148

    
149
void host_to_target_sigset(target_sigset_t *d, const sigset_t *s)
150
{
151
    target_sigset_t d1;
152
    int i;
153

    
154
    host_to_target_sigset_internal(&d1, s);
155
    for(i = 0;i < TARGET_NSIG_WORDS; i++)
156
        d->sig[i] = tswapl(d1.sig[i]);
157
}
158

    
159
static void target_to_host_sigset_internal(sigset_t *d,
160
                                           const target_sigset_t *s)
161
{
162
    int i;
163
    sigemptyset(d);
164
    for (i = 1; i <= TARGET_NSIG; i++) {
165
        if (target_sigismember(s, i)) {
166
            sigaddset(d, target_to_host_signal(i));
167
        }
168
     }
169
}
170

    
171
void target_to_host_sigset(sigset_t *d, const target_sigset_t *s)
172
{
173
    target_sigset_t s1;
174
    int i;
175

    
176
    for(i = 0;i < TARGET_NSIG_WORDS; i++)
177
        s1.sig[i] = tswapl(s->sig[i]);
178
    target_to_host_sigset_internal(d, &s1);
179
}
180

    
181
void host_to_target_old_sigset(abi_ulong *old_sigset,
182
                               const sigset_t *sigset)
183
{
184
    target_sigset_t d;
185
    host_to_target_sigset(&d, sigset);
186
    *old_sigset = d.sig[0];
187
}
188

    
189
void target_to_host_old_sigset(sigset_t *sigset,
190
                               const abi_ulong *old_sigset)
191
{
192
    target_sigset_t d;
193
    int i;
194

    
195
    d.sig[0] = *old_sigset;
196
    for(i = 1;i < TARGET_NSIG_WORDS; i++)
197
        d.sig[i] = 0;
198
    target_to_host_sigset(sigset, &d);
199
}
200

    
201
/* siginfo conversion */
202

    
203
static inline void host_to_target_siginfo_noswap(target_siginfo_t *tinfo,
204
                                                 const siginfo_t *info)
205
{
206
    int sig;
207
    sig = host_to_target_signal(info->si_signo);
208
    tinfo->si_signo = sig;
209
    tinfo->si_errno = 0;
210
    tinfo->si_code = info->si_code;
211
    if (sig == SIGILL || sig == SIGFPE || sig == SIGSEGV ||
212
        sig == SIGBUS || sig == SIGTRAP) {
213
        /* should never come here, but who knows. The information for
214
           the target is irrelevant */
215
        tinfo->_sifields._sigfault._addr = 0;
216
    } else if (sig == SIGIO) {
217
        tinfo->_sifields._sigpoll._fd = info->si_fd;
218
    } else if (sig >= TARGET_SIGRTMIN) {
219
        tinfo->_sifields._rt._pid = info->si_pid;
220
        tinfo->_sifields._rt._uid = info->si_uid;
221
        /* XXX: potential problem if 64 bit */
222
        tinfo->_sifields._rt._sigval.sival_ptr =
223
            (abi_ulong)(unsigned long)info->si_value.sival_ptr;
224
    }
225
}
226

    
227
static void tswap_siginfo(target_siginfo_t *tinfo,
228
                          const target_siginfo_t *info)
229
{
230
    int sig;
231
    sig = info->si_signo;
232
    tinfo->si_signo = tswap32(sig);
233
    tinfo->si_errno = tswap32(info->si_errno);
234
    tinfo->si_code = tswap32(info->si_code);
235
    if (sig == SIGILL || sig == SIGFPE || sig == SIGSEGV ||
236
        sig == SIGBUS || sig == SIGTRAP) {
237
        tinfo->_sifields._sigfault._addr =
238
            tswapl(info->_sifields._sigfault._addr);
239
    } else if (sig == SIGIO) {
240
        tinfo->_sifields._sigpoll._fd = tswap32(info->_sifields._sigpoll._fd);
241
    } else if (sig >= TARGET_SIGRTMIN) {
242
        tinfo->_sifields._rt._pid = tswap32(info->_sifields._rt._pid);
243
        tinfo->_sifields._rt._uid = tswap32(info->_sifields._rt._uid);
244
        tinfo->_sifields._rt._sigval.sival_ptr =
245
            tswapl(info->_sifields._rt._sigval.sival_ptr);
246
    }
247
}
248

    
249

    
250
void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info)
251
{
252
    host_to_target_siginfo_noswap(tinfo, info);
253
    tswap_siginfo(tinfo, tinfo);
254
}
255

    
256
/* XXX: we support only POSIX RT signals are used. */
257
/* XXX: find a solution for 64 bit (additional malloced data is needed) */
258
void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo)
259
{
260
    info->si_signo = tswap32(tinfo->si_signo);
261
    info->si_errno = tswap32(tinfo->si_errno);
262
    info->si_code = tswap32(tinfo->si_code);
263
    info->si_pid = tswap32(tinfo->_sifields._rt._pid);
264
    info->si_uid = tswap32(tinfo->_sifields._rt._uid);
265
    info->si_value.sival_ptr =
266
            (void *)(long)tswapl(tinfo->_sifields._rt._sigval.sival_ptr);
267
}
268

    
269
static int fatal_signal (int sig)
270
{
271
    switch (sig) {
272
    case TARGET_SIGCHLD:
273
    case TARGET_SIGURG:
274
    case TARGET_SIGWINCH:
275
        /* Ignored by default.  */
276
        return 0;
277
    case TARGET_SIGCONT:
278
    case TARGET_SIGSTOP:
279
    case TARGET_SIGTSTP:
280
    case TARGET_SIGTTIN:
281
    case TARGET_SIGTTOU:
282
        /* Job control signals.  */
283
        return 0;
284
    default:
285
        return 1;
286
    }
287
}
288

    
289
void signal_init(void)
290
{
291
    struct sigaction act;
292
    struct sigaction oact;
293
    int i, j;
294
    int host_sig;
295

    
296
    /* generate signal conversion tables */
297
    for(i = 1; i <= 64; i++) {
298
        if (host_to_target_signal_table[i] == 0)
299
            host_to_target_signal_table[i] = i;
300
    }
301
    for(i = 1; i <= 64; i++) {
302
        j = host_to_target_signal_table[i];
303
        target_to_host_signal_table[j] = i;
304
    }
305

    
306
    /* set all host signal handlers. ALL signals are blocked during
307
       the handlers to serialize them. */
308
    memset(sigact_table, 0, sizeof(sigact_table));
309

    
310
    sigfillset(&act.sa_mask);
311
    act.sa_flags = SA_SIGINFO;
312
    act.sa_sigaction = host_signal_handler;
313
    for(i = 1; i <= TARGET_NSIG; i++) {
314
        host_sig = target_to_host_signal(i);
315
        sigaction(host_sig, NULL, &oact);
316
        if (oact.sa_sigaction == (void *)SIG_IGN) {
317
            sigact_table[i - 1]._sa_handler = TARGET_SIG_IGN;
318
        } else if (oact.sa_sigaction == (void *)SIG_DFL) {
319
            sigact_table[i - 1]._sa_handler = TARGET_SIG_DFL;
320
        }
321
        /* If there's already a handler installed then something has
322
           gone horribly wrong, so don't even try to handle that case.  */
323
        /* Install some handlers for our own use.  We need at least
324
           SIGSEGV and SIGBUS, to detect exceptions.  We can not just
325
           trap all signals because it affects syscall interrupt
326
           behavior.  But do trap all default-fatal signals.  */
327
        if (fatal_signal (i))
328
            sigaction(host_sig, &act, NULL);
329
    }
330
}
331

    
332
/* signal queue handling */
333

    
334
static inline struct sigqueue *alloc_sigqueue(CPUState *env)
335
{
336
    TaskState *ts = env->opaque;
337
    struct sigqueue *q = ts->first_free;
338
    if (!q)
339
        return NULL;
340
    ts->first_free = q->next;
341
    return q;
342
}
343

    
344
static inline void free_sigqueue(CPUState *env, struct sigqueue *q)
345
{
346
    TaskState *ts = env->opaque;
347
    q->next = ts->first_free;
348
    ts->first_free = q;
349
}
350

    
351
/* abort execution with signal */
352
static void QEMU_NORETURN force_sig(int sig)
353
{
354
    int host_sig;
355
    host_sig = target_to_host_signal(sig);
356
    fprintf(stderr, "qemu: uncaught target signal %d (%s) - exiting\n",
357
            sig, strsignal(host_sig));
358
#if 1
359
    gdb_signalled(thread_env, sig);
360
    _exit(-host_sig);
361
#else
362
    {
363
        struct sigaction act;
364
        sigemptyset(&act.sa_mask);
365
        act.sa_flags = SA_SIGINFO;
366
        act.sa_sigaction = SIG_DFL;
367
        sigaction(SIGABRT, &act, NULL);
368
        abort();
369
    }
370
#endif
371
}
372

    
373
/* queue a signal so that it will be send to the virtual CPU as soon
374
   as possible */
375
int queue_signal(CPUState *env, int sig, target_siginfo_t *info)
376
{
377
    TaskState *ts = env->opaque;
378
    struct emulated_sigtable *k;
379
    struct sigqueue *q, **pq;
380
    abi_ulong handler;
381
    int queue;
382

    
383
#if defined(DEBUG_SIGNAL)
384
    fprintf(stderr, "queue_signal: sig=%d\n",
385
            sig);
386
#endif
387
    k = &ts->sigtab[sig - 1];
388
    queue = gdb_queuesig ();
389
    handler = sigact_table[sig - 1]._sa_handler;
390
    if (!queue && handler == TARGET_SIG_DFL) {
391
        if (sig == TARGET_SIGTSTP || sig == TARGET_SIGTTIN || sig == TARGET_SIGTTOU) {
392
            kill(getpid(),SIGSTOP);
393
            return 0;
394
        } else
395
        /* default handler : ignore some signal. The other are fatal */
396
        if (sig != TARGET_SIGCHLD &&
397
            sig != TARGET_SIGURG &&
398
            sig != TARGET_SIGWINCH &&
399
            sig != TARGET_SIGCONT) {
400
            force_sig(sig);
401
        } else {
402
            return 0; /* indicate ignored */
403
        }
404
    } else if (!queue && handler == TARGET_SIG_IGN) {
405
        /* ignore signal */
406
        return 0;
407
    } else if (!queue && handler == TARGET_SIG_ERR) {
408
        force_sig(sig);
409
    } else {
410
        pq = &k->first;
411
        if (sig < TARGET_SIGRTMIN) {
412
            /* if non real time signal, we queue exactly one signal */
413
            if (!k->pending)
414
                q = &k->info;
415
            else
416
                return 0;
417
        } else {
418
            if (!k->pending) {
419
                /* first signal */
420
                q = &k->info;
421
            } else {
422
                q = alloc_sigqueue(env);
423
                if (!q)
424
                    return -EAGAIN;
425
                while (*pq != NULL)
426
                    pq = &(*pq)->next;
427
            }
428
        }
429
        *pq = q;
430
        q->info = *info;
431
        q->next = NULL;
432
        k->pending = 1;
433
        /* signal that a new signal is pending */
434
        ts->signal_pending = 1;
435
        return 1; /* indicates that the signal was queued */
436
    }
437
}
438

    
439
static void host_signal_handler(int host_signum, siginfo_t *info,
440
                                void *puc)
441
{
442
    int sig;
443
    target_siginfo_t tinfo;
444

    
445
    /* the CPU emulator uses some host signals to detect exceptions,
446
       we forward to it some signals */
447
    if ((host_signum == SIGSEGV || host_signum == SIGBUS)
448
        && info->si_code > 0) {
449
        if (cpu_signal_handler(host_signum, info, puc))
450
            return;
451
    }
452

    
453
    /* get target signal number */
454
    sig = host_to_target_signal(host_signum);
455
    if (sig < 1 || sig > TARGET_NSIG)
456
        return;
457
#if defined(DEBUG_SIGNAL)
458
    fprintf(stderr, "qemu: got signal %d\n", sig);
459
#endif
460
    host_to_target_siginfo_noswap(&tinfo, info);
461
    if (queue_signal(thread_env, sig, &tinfo) == 1) {
462
        /* interrupt the virtual CPU as soon as possible */
463
        cpu_interrupt(thread_env, CPU_INTERRUPT_EXIT);
464
    }
465
}
466

    
467
/* do_sigaltstack() returns target values and errnos. */
468
/* compare linux/kernel/signal.c:do_sigaltstack() */
469
abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong uoss_addr, abi_ulong sp)
470
{
471
    int ret;
472
    struct target_sigaltstack oss;
473

    
474
    /* XXX: test errors */
475
    if(uoss_addr)
476
    {
477
        __put_user(target_sigaltstack_used.ss_sp, &oss.ss_sp);
478
        __put_user(target_sigaltstack_used.ss_size, &oss.ss_size);
479
        __put_user(sas_ss_flags(sp), &oss.ss_flags);
480
    }
481

    
482
    if(uss_addr)
483
    {
484
        struct target_sigaltstack *uss;
485
        struct target_sigaltstack ss;
486

    
487
        ret = -TARGET_EFAULT;
488
        if (!lock_user_struct(VERIFY_READ, uss, uss_addr, 1)
489
            || __get_user(ss.ss_sp, &uss->ss_sp)
490
            || __get_user(ss.ss_size, &uss->ss_size)
491
            || __get_user(ss.ss_flags, &uss->ss_flags))
492
            goto out;
493
        unlock_user_struct(uss, uss_addr, 0);
494

    
495
        ret = -TARGET_EPERM;
496
        if (on_sig_stack(sp))
497
            goto out;
498

    
499
        ret = -TARGET_EINVAL;
500
        if (ss.ss_flags != TARGET_SS_DISABLE
501
            && ss.ss_flags != TARGET_SS_ONSTACK
502
            && ss.ss_flags != 0)
503
            goto out;
504

    
505
        if (ss.ss_flags == TARGET_SS_DISABLE) {
506
            ss.ss_size = 0;
507
            ss.ss_sp = 0;
508
        } else {
509
            ret = -TARGET_ENOMEM;
510
            if (ss.ss_size < MINSIGSTKSZ)
511
                goto out;
512
        }
513

    
514
        target_sigaltstack_used.ss_sp = ss.ss_sp;
515
        target_sigaltstack_used.ss_size = ss.ss_size;
516
    }
517

    
518
    if (uoss_addr) {
519
        ret = -TARGET_EFAULT;
520
        if (copy_to_user(uoss_addr, &oss, sizeof(oss)))
521
            goto out;
522
    }
523

    
524
    ret = 0;
525
out:
526
    return ret;
527
}
528

    
529
/* do_sigaction() return host values and errnos */
530
int do_sigaction(int sig, const struct target_sigaction *act,
531
                 struct target_sigaction *oact)
532
{
533
    struct target_sigaction *k;
534
    struct sigaction act1;
535
    int host_sig;
536
    int ret = 0;
537

    
538
    if (sig < 1 || sig > TARGET_NSIG || sig == TARGET_SIGKILL || sig == TARGET_SIGSTOP)
539
        return -EINVAL;
540
    k = &sigact_table[sig - 1];
541
#if defined(DEBUG_SIGNAL)
542
    fprintf(stderr, "sigaction sig=%d act=0x%08x, oact=0x%08x\n",
543
            sig, (int)act, (int)oact);
544
#endif
545
    if (oact) {
546
        oact->_sa_handler = tswapl(k->_sa_handler);
547
        oact->sa_flags = tswapl(k->sa_flags);
548
#if !defined(TARGET_MIPS)
549
        oact->sa_restorer = tswapl(k->sa_restorer);
550
#endif
551
        oact->sa_mask = k->sa_mask;
552
    }
553
    if (act) {
554
        /* FIXME: This is not threadsafe.  */
555
        k->_sa_handler = tswapl(act->_sa_handler);
556
        k->sa_flags = tswapl(act->sa_flags);
557
#if !defined(TARGET_MIPS)
558
        k->sa_restorer = tswapl(act->sa_restorer);
559
#endif
560
        k->sa_mask = act->sa_mask;
561

    
562
        /* we update the host linux signal state */
563
        host_sig = target_to_host_signal(sig);
564
        if (host_sig != SIGSEGV && host_sig != SIGBUS) {
565
            sigfillset(&act1.sa_mask);
566
            act1.sa_flags = SA_SIGINFO;
567
            if (k->sa_flags & TARGET_SA_RESTART)
568
                act1.sa_flags |= SA_RESTART;
569
            /* NOTE: it is important to update the host kernel signal
570
               ignore state to avoid getting unexpected interrupted
571
               syscalls */
572
            if (k->_sa_handler == TARGET_SIG_IGN) {
573
                act1.sa_sigaction = (void *)SIG_IGN;
574
            } else if (k->_sa_handler == TARGET_SIG_DFL) {
575
                if (fatal_signal (sig))
576
                    act1.sa_sigaction = host_signal_handler;
577
                else
578
                    act1.sa_sigaction = (void *)SIG_DFL;
579
            } else {
580
                act1.sa_sigaction = host_signal_handler;
581
            }
582
            ret = sigaction(host_sig, &act1, NULL);
583
        }
584
    }
585
    return ret;
586
}
587

    
588
static inline int copy_siginfo_to_user(target_siginfo_t *tinfo,
589
                                       const target_siginfo_t *info)
590
{
591
    tswap_siginfo(tinfo, info);
592
    return 0;
593
}
594

    
595
static inline int current_exec_domain_sig(int sig)
596
{
597
    return /* current->exec_domain && current->exec_domain->signal_invmap
598
              && sig < 32 ? current->exec_domain->signal_invmap[sig] : */ sig;
599
}
600

    
601
#if defined(TARGET_I386) && TARGET_ABI_BITS == 32
602

    
603
/* from the Linux kernel */
604

    
605
struct target_fpreg {
606
        uint16_t significand[4];
607
        uint16_t exponent;
608
};
609

    
610
struct target_fpxreg {
611
        uint16_t significand[4];
612
        uint16_t exponent;
613
        uint16_t padding[3];
614
};
615

    
616
struct target_xmmreg {
617
        abi_ulong element[4];
618
};
619

    
620
struct target_fpstate {
621
        /* Regular FPU environment */
622
        abi_ulong       cw;
623
        abi_ulong       sw;
624
        abi_ulong       tag;
625
        abi_ulong       ipoff;
626
        abi_ulong       cssel;
627
        abi_ulong       dataoff;
628
        abi_ulong       datasel;
629
        struct target_fpreg        _st[8];
630
        uint16_t        status;
631
        uint16_t        magic;                /* 0xffff = regular FPU data only */
632

    
633
        /* FXSR FPU environment */
634
        abi_ulong       _fxsr_env[6];   /* FXSR FPU env is ignored */
635
        abi_ulong       mxcsr;
636
        abi_ulong       reserved;
637
        struct target_fpxreg        _fxsr_st[8];        /* FXSR FPU reg data is ignored */
638
        struct target_xmmreg        _xmm[8];
639
        abi_ulong       padding[56];
640
};
641

    
642
#define X86_FXSR_MAGIC                0x0000
643

    
644
struct target_sigcontext {
645
        uint16_t gs, __gsh;
646
        uint16_t fs, __fsh;
647
        uint16_t es, __esh;
648
        uint16_t ds, __dsh;
649
        abi_ulong edi;
650
        abi_ulong esi;
651
        abi_ulong ebp;
652
        abi_ulong esp;
653
        abi_ulong ebx;
654
        abi_ulong edx;
655
        abi_ulong ecx;
656
        abi_ulong eax;
657
        abi_ulong trapno;
658
        abi_ulong err;
659
        abi_ulong eip;
660
        uint16_t cs, __csh;
661
        abi_ulong eflags;
662
        abi_ulong esp_at_signal;
663
        uint16_t ss, __ssh;
664
        abi_ulong fpstate; /* pointer */
665
        abi_ulong oldmask;
666
        abi_ulong cr2;
667
};
668

    
669
struct target_ucontext {
670
        abi_ulong         tuc_flags;
671
        abi_ulong         tuc_link;
672
        target_stack_t          tuc_stack;
673
        struct target_sigcontext tuc_mcontext;
674
        target_sigset_t          tuc_sigmask;        /* mask last for extensibility */
675
};
676

    
677
struct sigframe
678
{
679
    abi_ulong pretcode;
680
    int sig;
681
    struct target_sigcontext sc;
682
    struct target_fpstate fpstate;
683
    abi_ulong extramask[TARGET_NSIG_WORDS-1];
684
    char retcode[8];
685
};
686

    
687
struct rt_sigframe
688
{
689
    abi_ulong pretcode;
690
    int sig;
691
    abi_ulong pinfo;
692
    abi_ulong puc;
693
    struct target_siginfo info;
694
    struct target_ucontext uc;
695
    struct target_fpstate fpstate;
696
    char retcode[8];
697
};
698

    
699
/*
700
 * Set up a signal frame.
701
 */
702

    
703
/* XXX: save x87 state */
704
static int
705
setup_sigcontext(struct target_sigcontext *sc, struct target_fpstate *fpstate,
706
                 CPUX86State *env, abi_ulong mask, abi_ulong fpstate_addr)
707
{
708
        int err = 0;
709
        uint16_t magic;
710

    
711
        /* already locked in setup_frame() */
712
        err |= __put_user(env->segs[R_GS].selector, (unsigned int *)&sc->gs);
713
        err |= __put_user(env->segs[R_FS].selector, (unsigned int *)&sc->fs);
714
        err |= __put_user(env->segs[R_ES].selector, (unsigned int *)&sc->es);
715
        err |= __put_user(env->segs[R_DS].selector, (unsigned int *)&sc->ds);
716
        err |= __put_user(env->regs[R_EDI], &sc->edi);
717
        err |= __put_user(env->regs[R_ESI], &sc->esi);
718
        err |= __put_user(env->regs[R_EBP], &sc->ebp);
719
        err |= __put_user(env->regs[R_ESP], &sc->esp);
720
        err |= __put_user(env->regs[R_EBX], &sc->ebx);
721
        err |= __put_user(env->regs[R_EDX], &sc->edx);
722
        err |= __put_user(env->regs[R_ECX], &sc->ecx);
723
        err |= __put_user(env->regs[R_EAX], &sc->eax);
724
        err |= __put_user(env->exception_index, &sc->trapno);
725
        err |= __put_user(env->error_code, &sc->err);
726
        err |= __put_user(env->eip, &sc->eip);
727
        err |= __put_user(env->segs[R_CS].selector, (unsigned int *)&sc->cs);
728
        err |= __put_user(env->eflags, &sc->eflags);
729
        err |= __put_user(env->regs[R_ESP], &sc->esp_at_signal);
730
        err |= __put_user(env->segs[R_SS].selector, (unsigned int *)&sc->ss);
731

    
732
        cpu_x86_fsave(env, fpstate_addr, 1);
733
        fpstate->status = fpstate->sw;
734
        magic = 0xffff;
735
        err |= __put_user(magic, &fpstate->magic);
736
        err |= __put_user(fpstate_addr, &sc->fpstate);
737

    
738
        /* non-iBCS2 extensions.. */
739
        err |= __put_user(mask, &sc->oldmask);
740
        err |= __put_user(env->cr[2], &sc->cr2);
741
        return err;
742
}
743

    
744
/*
745
 * Determine which stack to use..
746
 */
747

    
748
static inline abi_ulong
749
get_sigframe(struct target_sigaction *ka, CPUX86State *env, size_t frame_size)
750
{
751
        unsigned long esp;
752

    
753
        /* Default to using normal stack */
754
        esp = env->regs[R_ESP];
755
        /* This is the X/Open sanctioned signal stack switching.  */
756
        if (ka->sa_flags & TARGET_SA_ONSTACK) {
757
            if (sas_ss_flags(esp) == 0)
758
                esp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
759
        }
760

    
761
        /* This is the legacy signal stack switching. */
762
        else
763
        if ((env->segs[R_SS].selector & 0xffff) != __USER_DS &&
764
            !(ka->sa_flags & TARGET_SA_RESTORER) &&
765
            ka->sa_restorer) {
766
            esp = (unsigned long) ka->sa_restorer;
767
        }
768
        return (esp - frame_size) & -8ul;
769
}
770

    
771
/* compare linux/arch/i386/kernel/signal.c:setup_frame() */
772
static void setup_frame(int sig, struct target_sigaction *ka,
773
                        target_sigset_t *set, CPUX86State *env)
774
{
775
        abi_ulong frame_addr;
776
        struct sigframe *frame;
777
        int i, err = 0;
778

    
779
        frame_addr = get_sigframe(ka, env, sizeof(*frame));
780

    
781
        if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
782
                goto give_sigsegv;
783

    
784
        err |= __put_user(current_exec_domain_sig(sig),
785
                          &frame->sig);
786
        if (err)
787
                goto give_sigsegv;
788

    
789
        setup_sigcontext(&frame->sc, &frame->fpstate, env, set->sig[0],
790
                         frame_addr + offsetof(struct sigframe, fpstate));
791
        if (err)
792
                goto give_sigsegv;
793

    
794
        for(i = 1; i < TARGET_NSIG_WORDS; i++) {
795
            if (__put_user(set->sig[i], &frame->extramask[i - 1]))
796
                goto give_sigsegv;
797
        }
798

    
799
        /* Set up to return from userspace.  If provided, use a stub
800
           already in userspace.  */
801
        if (ka->sa_flags & TARGET_SA_RESTORER) {
802
                err |= __put_user(ka->sa_restorer, &frame->pretcode);
803
        } else {
804
                uint16_t val16;
805
                abi_ulong retcode_addr;
806
                retcode_addr = frame_addr + offsetof(struct sigframe, retcode);
807
                err |= __put_user(retcode_addr, &frame->pretcode);
808
                /* This is popl %eax ; movl $,%eax ; int $0x80 */
809
                val16 = 0xb858;
810
                err |= __put_user(val16, (uint16_t *)(frame->retcode+0));
811
                err |= __put_user(TARGET_NR_sigreturn, (int *)(frame->retcode+2));
812
                val16 = 0x80cd;
813
                err |= __put_user(val16, (uint16_t *)(frame->retcode+6));
814
        }
815

    
816
        if (err)
817
                goto give_sigsegv;
818

    
819
        /* Set up registers for signal handler */
820
        env->regs[R_ESP] = frame_addr;
821
        env->eip = ka->_sa_handler;
822

    
823
        cpu_x86_load_seg(env, R_DS, __USER_DS);
824
        cpu_x86_load_seg(env, R_ES, __USER_DS);
825
        cpu_x86_load_seg(env, R_SS, __USER_DS);
826
        cpu_x86_load_seg(env, R_CS, __USER_CS);
827
        env->eflags &= ~TF_MASK;
828

    
829
        unlock_user_struct(frame, frame_addr, 1);
830

    
831
        return;
832

    
833
give_sigsegv:
834
        unlock_user_struct(frame, frame_addr, 1);
835
        if (sig == TARGET_SIGSEGV)
836
                ka->_sa_handler = TARGET_SIG_DFL;
837
        force_sig(TARGET_SIGSEGV /* , current */);
838
}
839

    
840
/* compare linux/arch/i386/kernel/signal.c:setup_rt_frame() */
841
static void setup_rt_frame(int sig, struct target_sigaction *ka,
842
                           target_siginfo_t *info,
843
                           target_sigset_t *set, CPUX86State *env)
844
{
845
        abi_ulong frame_addr, addr;
846
        struct rt_sigframe *frame;
847
        int i, err = 0;
848

    
849
        frame_addr = get_sigframe(ka, env, sizeof(*frame));
850

    
851
        if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
852
                goto give_sigsegv;
853

    
854
        err |= __put_user(current_exec_domain_sig(sig),
855
                          &frame->sig);
856
        addr = frame_addr + offsetof(struct rt_sigframe, info);
857
        err |= __put_user(addr, &frame->pinfo);
858
        addr = frame_addr + offsetof(struct rt_sigframe, uc);
859
        err |= __put_user(addr, &frame->puc);
860
        err |= copy_siginfo_to_user(&frame->info, info);
861
        if (err)
862
                goto give_sigsegv;
863

    
864
        /* Create the ucontext.  */
865
        err |= __put_user(0, &frame->uc.tuc_flags);
866
        err |= __put_user(0, &frame->uc.tuc_link);
867
        err |= __put_user(target_sigaltstack_used.ss_sp,
868
                          &frame->uc.tuc_stack.ss_sp);
869
        err |= __put_user(sas_ss_flags(get_sp_from_cpustate(env)),
870
                          &frame->uc.tuc_stack.ss_flags);
871
        err |= __put_user(target_sigaltstack_used.ss_size,
872
                          &frame->uc.tuc_stack.ss_size);
873
        err |= setup_sigcontext(&frame->uc.tuc_mcontext, &frame->fpstate,
874
                                env, set->sig[0], 
875
                                frame_addr + offsetof(struct rt_sigframe, fpstate));
876
        for(i = 0; i < TARGET_NSIG_WORDS; i++) {
877
            if (__put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]))
878
                goto give_sigsegv;
879
        }
880

    
881
        /* Set up to return from userspace.  If provided, use a stub
882
           already in userspace.  */
883
        if (ka->sa_flags & TARGET_SA_RESTORER) {
884
                err |= __put_user(ka->sa_restorer, &frame->pretcode);
885
        } else {
886
                uint16_t val16;
887
                addr = frame_addr + offsetof(struct rt_sigframe, retcode);
888
                err |= __put_user(addr, &frame->pretcode);
889
                /* This is movl $,%eax ; int $0x80 */
890
                err |= __put_user(0xb8, (char *)(frame->retcode+0));
891
                err |= __put_user(TARGET_NR_rt_sigreturn, (int *)(frame->retcode+1));
892
                val16 = 0x80cd;
893
                err |= __put_user(val16, (uint16_t *)(frame->retcode+5));
894
        }
895

    
896
        if (err)
897
                goto give_sigsegv;
898

    
899
        /* Set up registers for signal handler */
900
        env->regs[R_ESP] = frame_addr;
901
        env->eip = ka->_sa_handler;
902

    
903
        cpu_x86_load_seg(env, R_DS, __USER_DS);
904
        cpu_x86_load_seg(env, R_ES, __USER_DS);
905
        cpu_x86_load_seg(env, R_SS, __USER_DS);
906
        cpu_x86_load_seg(env, R_CS, __USER_CS);
907
        env->eflags &= ~TF_MASK;
908

    
909
        unlock_user_struct(frame, frame_addr, 1);
910

    
911
        return;
912

    
913
give_sigsegv:
914
        unlock_user_struct(frame, frame_addr, 1);
915
        if (sig == TARGET_SIGSEGV)
916
                ka->_sa_handler = TARGET_SIG_DFL;
917
        force_sig(TARGET_SIGSEGV /* , current */);
918
}
919

    
920
static int
921
restore_sigcontext(CPUX86State *env, struct target_sigcontext *sc, int *peax)
922
{
923
        unsigned int err = 0;
924
        abi_ulong fpstate_addr;
925
        unsigned int tmpflags;
926

    
927
        cpu_x86_load_seg(env, R_GS, tswap16(sc->gs));
928
        cpu_x86_load_seg(env, R_FS, tswap16(sc->fs));
929
        cpu_x86_load_seg(env, R_ES, tswap16(sc->es));
930
        cpu_x86_load_seg(env, R_DS, tswap16(sc->ds));
931

    
932
        env->regs[R_EDI] = tswapl(sc->edi);
933
        env->regs[R_ESI] = tswapl(sc->esi);
934
        env->regs[R_EBP] = tswapl(sc->ebp);
935
        env->regs[R_ESP] = tswapl(sc->esp);
936
        env->regs[R_EBX] = tswapl(sc->ebx);
937
        env->regs[R_EDX] = tswapl(sc->edx);
938
        env->regs[R_ECX] = tswapl(sc->ecx);
939
        env->eip = tswapl(sc->eip);
940

    
941
        cpu_x86_load_seg(env, R_CS, lduw(&sc->cs) | 3);
942
        cpu_x86_load_seg(env, R_SS, lduw(&sc->ss) | 3);
943

    
944
        tmpflags = tswapl(sc->eflags);
945
        env->eflags = (env->eflags & ~0x40DD5) | (tmpflags & 0x40DD5);
946
        //                regs->orig_eax = -1;                /* disable syscall checks */
947

    
948
        fpstate_addr = tswapl(sc->fpstate);
949
        if (fpstate_addr != 0) {
950
                if (!access_ok(VERIFY_READ, fpstate_addr, 
951
                               sizeof(struct target_fpstate)))
952
                        goto badframe;
953
                cpu_x86_frstor(env, fpstate_addr, 1);
954
        }
955

    
956
        *peax = tswapl(sc->eax);
957
        return err;
958
badframe:
959
        return 1;
960
}
961

    
962
long do_sigreturn(CPUX86State *env)
963
{
964
    struct sigframe *frame;
965
    abi_ulong frame_addr = env->regs[R_ESP] - 8;
966
    target_sigset_t target_set;
967
    sigset_t set;
968
    int eax, i;
969

    
970
#if defined(DEBUG_SIGNAL)
971
    fprintf(stderr, "do_sigreturn\n");
972
#endif
973
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
974
        goto badframe;
975
    /* set blocked signals */
976
    if (__get_user(target_set.sig[0], &frame->sc.oldmask))
977
        goto badframe;
978
    for(i = 1; i < TARGET_NSIG_WORDS; i++) {
979
        if (__get_user(target_set.sig[i], &frame->extramask[i - 1]))
980
            goto badframe;
981
    }
982

    
983
    target_to_host_sigset_internal(&set, &target_set);
984
    sigprocmask(SIG_SETMASK, &set, NULL);
985

    
986
    /* restore registers */
987
    if (restore_sigcontext(env, &frame->sc, &eax))
988
        goto badframe;
989
    unlock_user_struct(frame, frame_addr, 0);
990
    return eax;
991

    
992
badframe:
993
    unlock_user_struct(frame, frame_addr, 0);
994
    force_sig(TARGET_SIGSEGV);
995
    return 0;
996
}
997

    
998
long do_rt_sigreturn(CPUX86State *env)
999
{
1000
        abi_ulong frame_addr;
1001
        struct rt_sigframe *frame;
1002
        sigset_t set;
1003
        int eax;
1004

    
1005
        frame_addr = env->regs[R_ESP] - 4;
1006
        if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1007
                goto badframe;
1008
        target_to_host_sigset(&set, &frame->uc.tuc_sigmask);
1009
        sigprocmask(SIG_SETMASK, &set, NULL);
1010

    
1011
        if (restore_sigcontext(env, &frame->uc.tuc_mcontext, &eax))
1012
                goto badframe;
1013

    
1014
        if (do_sigaltstack(frame_addr + offsetof(struct rt_sigframe, uc.tuc_stack), 0, 
1015
                           get_sp_from_cpustate(env)) == -EFAULT)
1016
                goto badframe;
1017

    
1018
        unlock_user_struct(frame, frame_addr, 0);
1019
        return eax;
1020

    
1021
badframe:
1022
        unlock_user_struct(frame, frame_addr, 0);
1023
        force_sig(TARGET_SIGSEGV);
1024
        return 0;
1025
}
1026

    
1027
#elif defined(TARGET_ARM)
1028

    
1029
struct target_sigcontext {
1030
        abi_ulong trap_no;
1031
        abi_ulong error_code;
1032
        abi_ulong oldmask;
1033
        abi_ulong arm_r0;
1034
        abi_ulong arm_r1;
1035
        abi_ulong arm_r2;
1036
        abi_ulong arm_r3;
1037
        abi_ulong arm_r4;
1038
        abi_ulong arm_r5;
1039
        abi_ulong arm_r6;
1040
        abi_ulong arm_r7;
1041
        abi_ulong arm_r8;
1042
        abi_ulong arm_r9;
1043
        abi_ulong arm_r10;
1044
        abi_ulong arm_fp;
1045
        abi_ulong arm_ip;
1046
        abi_ulong arm_sp;
1047
        abi_ulong arm_lr;
1048
        abi_ulong arm_pc;
1049
        abi_ulong arm_cpsr;
1050
        abi_ulong fault_address;
1051
};
1052

    
1053
struct target_ucontext_v1 {
1054
    abi_ulong tuc_flags;
1055
    abi_ulong tuc_link;
1056
    target_stack_t tuc_stack;
1057
    struct target_sigcontext tuc_mcontext;
1058
    target_sigset_t  tuc_sigmask;        /* mask last for extensibility */
1059
};
1060

    
1061
struct target_ucontext_v2 {
1062
    abi_ulong tuc_flags;
1063
    abi_ulong tuc_link;
1064
    target_stack_t tuc_stack;
1065
    struct target_sigcontext tuc_mcontext;
1066
    target_sigset_t  tuc_sigmask;        /* mask last for extensibility */
1067
    char __unused[128 - sizeof(sigset_t)];
1068
    abi_ulong tuc_regspace[128] __attribute__((__aligned__(8)));
1069
};
1070

    
1071
struct sigframe_v1
1072
{
1073
    struct target_sigcontext sc;
1074
    abi_ulong extramask[TARGET_NSIG_WORDS-1];
1075
    abi_ulong retcode;
1076
};
1077

    
1078
struct sigframe_v2
1079
{
1080
    struct target_ucontext_v2 uc;
1081
    abi_ulong retcode;
1082
};
1083

    
1084
struct rt_sigframe_v1
1085
{
1086
    abi_ulong pinfo;
1087
    abi_ulong puc;
1088
    struct target_siginfo info;
1089
    struct target_ucontext_v1 uc;
1090
    abi_ulong retcode;
1091
};
1092

    
1093
struct rt_sigframe_v2
1094
{
1095
    struct target_siginfo info;
1096
    struct target_ucontext_v2 uc;
1097
    abi_ulong retcode;
1098
};
1099

    
1100
#define TARGET_CONFIG_CPU_32 1
1101

    
1102
/*
1103
 * For ARM syscalls, we encode the syscall number into the instruction.
1104
 */
1105
#define SWI_SYS_SIGRETURN        (0xef000000|(TARGET_NR_sigreturn + ARM_SYSCALL_BASE))
1106
#define SWI_SYS_RT_SIGRETURN        (0xef000000|(TARGET_NR_rt_sigreturn + ARM_SYSCALL_BASE))
1107

    
1108
/*
1109
 * For Thumb syscalls, we pass the syscall number via r7.  We therefore
1110
 * need two 16-bit instructions.
1111
 */
1112
#define SWI_THUMB_SIGRETURN        (0xdf00 << 16 | 0x2700 | (TARGET_NR_sigreturn))
1113
#define SWI_THUMB_RT_SIGRETURN        (0xdf00 << 16 | 0x2700 | (TARGET_NR_rt_sigreturn))
1114

    
1115
static const abi_ulong retcodes[4] = {
1116
        SWI_SYS_SIGRETURN,        SWI_THUMB_SIGRETURN,
1117
        SWI_SYS_RT_SIGRETURN,        SWI_THUMB_RT_SIGRETURN
1118
};
1119

    
1120

    
1121
#define __get_user_error(x,p,e) __get_user(x, p)
1122

    
1123
static inline int valid_user_regs(CPUState *regs)
1124
{
1125
    return 1;
1126
}
1127

    
1128
static void
1129
setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/
1130
                 CPUState *env, abi_ulong mask)
1131
{
1132
        __put_user(env->regs[0], &sc->arm_r0);
1133
        __put_user(env->regs[1], &sc->arm_r1);
1134
        __put_user(env->regs[2], &sc->arm_r2);
1135
        __put_user(env->regs[3], &sc->arm_r3);
1136
        __put_user(env->regs[4], &sc->arm_r4);
1137
        __put_user(env->regs[5], &sc->arm_r5);
1138
        __put_user(env->regs[6], &sc->arm_r6);
1139
        __put_user(env->regs[7], &sc->arm_r7);
1140
        __put_user(env->regs[8], &sc->arm_r8);
1141
        __put_user(env->regs[9], &sc->arm_r9);
1142
        __put_user(env->regs[10], &sc->arm_r10);
1143
        __put_user(env->regs[11], &sc->arm_fp);
1144
        __put_user(env->regs[12], &sc->arm_ip);
1145
        __put_user(env->regs[13], &sc->arm_sp);
1146
        __put_user(env->regs[14], &sc->arm_lr);
1147
        __put_user(env->regs[15], &sc->arm_pc);
1148
#ifdef TARGET_CONFIG_CPU_32
1149
        __put_user(cpsr_read(env), &sc->arm_cpsr);
1150
#endif
1151

    
1152
        __put_user(/* current->thread.trap_no */ 0, &sc->trap_no);
1153
        __put_user(/* current->thread.error_code */ 0, &sc->error_code);
1154
        __put_user(/* current->thread.address */ 0, &sc->fault_address);
1155
        __put_user(mask, &sc->oldmask);
1156
}
1157

    
1158
static inline abi_ulong
1159
get_sigframe(struct target_sigaction *ka, CPUState *regs, int framesize)
1160
{
1161
        unsigned long sp = regs->regs[13];
1162

    
1163
        /*
1164
         * This is the X/Open sanctioned signal stack switching.
1165
         */
1166
        if ((ka->sa_flags & TARGET_SA_ONSTACK) && !sas_ss_flags(sp))
1167
            sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
1168
        /*
1169
         * ATPCS B01 mandates 8-byte alignment
1170
         */
1171
        return (sp - framesize) & ~7;
1172
}
1173

    
1174
static int
1175
setup_return(CPUState *env, struct target_sigaction *ka,
1176
             abi_ulong *rc, abi_ulong frame_addr, int usig, abi_ulong rc_addr)
1177
{
1178
        abi_ulong handler = ka->_sa_handler;
1179
        abi_ulong retcode;
1180
        int thumb = handler & 1;
1181

    
1182
        if (ka->sa_flags & TARGET_SA_RESTORER) {
1183
                retcode = ka->sa_restorer;
1184
        } else {
1185
                unsigned int idx = thumb;
1186

    
1187
                if (ka->sa_flags & TARGET_SA_SIGINFO)
1188
                        idx += 2;
1189

    
1190
                if (__put_user(retcodes[idx], rc))
1191
                        return 1;
1192
#if 0
1193
                flush_icache_range((abi_ulong)rc,
1194
                                   (abi_ulong)(rc + 1));
1195
#endif
1196
                retcode = rc_addr + thumb;
1197
        }
1198

    
1199
        env->regs[0] = usig;
1200
        env->regs[13] = frame_addr;
1201
        env->regs[14] = retcode;
1202
        env->regs[15] = handler & (thumb ? ~1 : ~3);
1203
        env->thumb = thumb;
1204

    
1205
#if 0
1206
#ifdef TARGET_CONFIG_CPU_32
1207
        env->cpsr = cpsr;
1208
#endif
1209
#endif
1210

    
1211
        return 0;
1212
}
1213

    
1214
static void setup_sigframe_v2(struct target_ucontext_v2 *uc,
1215
                              target_sigset_t *set, CPUState *env)
1216
{
1217
    struct target_sigaltstack stack;
1218
    int i;
1219

    
1220
    /* Clear all the bits of the ucontext we don't use.  */
1221
    memset(uc, 0, offsetof(struct target_ucontext_v2, tuc_mcontext));
1222

    
1223
    memset(&stack, 0, sizeof(stack));
1224
    __put_user(target_sigaltstack_used.ss_sp, &stack.ss_sp);
1225
    __put_user(target_sigaltstack_used.ss_size, &stack.ss_size);
1226
    __put_user(sas_ss_flags(get_sp_from_cpustate(env)), &stack.ss_flags);
1227
    memcpy(&uc->tuc_stack, &stack, sizeof(stack));
1228

    
1229
    setup_sigcontext(&uc->tuc_mcontext, env, set->sig[0]);
1230
    /* FIXME: Save coprocessor signal frame.  */
1231
    for(i = 0; i < TARGET_NSIG_WORDS; i++) {
1232
        __put_user(set->sig[i], &uc->tuc_sigmask.sig[i]);
1233
    }
1234
}
1235

    
1236
/* compare linux/arch/arm/kernel/signal.c:setup_frame() */
1237
static void setup_frame_v1(int usig, struct target_sigaction *ka,
1238
                           target_sigset_t *set, CPUState *regs)
1239
{
1240
        struct sigframe_v1 *frame;
1241
        abi_ulong frame_addr = get_sigframe(ka, regs, sizeof(*frame));
1242
        int i;
1243

    
1244
        if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
1245
                return;
1246

    
1247
        setup_sigcontext(&frame->sc, regs, set->sig[0]);
1248

    
1249
        for(i = 1; i < TARGET_NSIG_WORDS; i++) {
1250
            if (__put_user(set->sig[i], &frame->extramask[i - 1]))
1251
                goto end;
1252
        }
1253

    
1254
        setup_return(regs, ka, &frame->retcode, frame_addr, usig,
1255
                     frame_addr + offsetof(struct sigframe_v1, retcode));
1256

    
1257
end:
1258
        unlock_user_struct(frame, frame_addr, 1);
1259
}
1260

    
1261
static void setup_frame_v2(int usig, struct target_sigaction *ka,
1262
                           target_sigset_t *set, CPUState *regs)
1263
{
1264
        struct sigframe_v2 *frame;
1265
        abi_ulong frame_addr = get_sigframe(ka, regs, sizeof(*frame));
1266

    
1267
        if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
1268
                return;
1269

    
1270
        setup_sigframe_v2(&frame->uc, set, regs);
1271

    
1272
        setup_return(regs, ka, &frame->retcode, frame_addr, usig,
1273
                     frame_addr + offsetof(struct sigframe_v2, retcode));
1274

    
1275
        unlock_user_struct(frame, frame_addr, 1);
1276
}
1277

    
1278
static void setup_frame(int usig, struct target_sigaction *ka,
1279
                        target_sigset_t *set, CPUState *regs)
1280
{
1281
    if (get_osversion() >= 0x020612) {
1282
        setup_frame_v2(usig, ka, set, regs);
1283
    } else {
1284
        setup_frame_v1(usig, ka, set, regs);
1285
    }
1286
}
1287

    
1288
/* compare linux/arch/arm/kernel/signal.c:setup_rt_frame() */
1289
static void setup_rt_frame_v1(int usig, struct target_sigaction *ka,
1290
                              target_siginfo_t *info,
1291
                              target_sigset_t *set, CPUState *env)
1292
{
1293
        struct rt_sigframe_v1 *frame;
1294
        abi_ulong frame_addr = get_sigframe(ka, env, sizeof(*frame));
1295
        struct target_sigaltstack stack;
1296
        int i;
1297
        abi_ulong info_addr, uc_addr;
1298

    
1299
        if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
1300
            return /* 1 */;
1301

    
1302
        info_addr = frame_addr + offsetof(struct rt_sigframe_v1, info);
1303
        __put_user(info_addr, &frame->pinfo);
1304
        uc_addr = frame_addr + offsetof(struct rt_sigframe_v1, uc);
1305
        __put_user(uc_addr, &frame->puc);
1306
        copy_siginfo_to_user(&frame->info, info);
1307

    
1308
        /* Clear all the bits of the ucontext we don't use.  */
1309
        memset(&frame->uc, 0, offsetof(struct target_ucontext_v1, tuc_mcontext));
1310

    
1311
        memset(&stack, 0, sizeof(stack));
1312
        __put_user(target_sigaltstack_used.ss_sp, &stack.ss_sp);
1313
        __put_user(target_sigaltstack_used.ss_size, &stack.ss_size);
1314
        __put_user(sas_ss_flags(get_sp_from_cpustate(env)), &stack.ss_flags);
1315
        memcpy(&frame->uc.tuc_stack, &stack, sizeof(stack));
1316

    
1317
        setup_sigcontext(&frame->uc.tuc_mcontext, env, set->sig[0]);
1318
        for(i = 0; i < TARGET_NSIG_WORDS; i++) {
1319
            if (__put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]))
1320
                goto end;
1321
        }
1322

    
1323
        setup_return(env, ka, &frame->retcode, frame_addr, usig,
1324
                     frame_addr + offsetof(struct rt_sigframe_v1, retcode));
1325

    
1326
        env->regs[1] = info_addr;
1327
        env->regs[2] = uc_addr;
1328

    
1329
end:
1330
        unlock_user_struct(frame, frame_addr, 1);
1331
}
1332

    
1333
static void setup_rt_frame_v2(int usig, struct target_sigaction *ka,
1334
                              target_siginfo_t *info,
1335
                              target_sigset_t *set, CPUState *env)
1336
{
1337
        struct rt_sigframe_v2 *frame;
1338
        abi_ulong frame_addr = get_sigframe(ka, env, sizeof(*frame));
1339
        abi_ulong info_addr, uc_addr;
1340

    
1341
        if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
1342
            return /* 1 */;
1343

    
1344
        info_addr = frame_addr + offsetof(struct rt_sigframe_v2, info);
1345
        uc_addr = frame_addr + offsetof(struct rt_sigframe_v2, uc);
1346
        copy_siginfo_to_user(&frame->info, info);
1347

    
1348
        setup_sigframe_v2(&frame->uc, set, env);
1349

    
1350
        setup_return(env, ka, &frame->retcode, frame_addr, usig,
1351
                     frame_addr + offsetof(struct rt_sigframe_v2, retcode));
1352

    
1353
        env->regs[1] = info_addr;
1354
        env->regs[2] = uc_addr;
1355

    
1356
        unlock_user_struct(frame, frame_addr, 1);
1357
}
1358

    
1359
static void setup_rt_frame(int usig, struct target_sigaction *ka,
1360
                           target_siginfo_t *info,
1361
                           target_sigset_t *set, CPUState *env)
1362
{
1363
    if (get_osversion() >= 0x020612) {
1364
        setup_rt_frame_v2(usig, ka, info, set, env);
1365
    } else {
1366
        setup_rt_frame_v1(usig, ka, info, set, env);
1367
    }
1368
}
1369

    
1370
static int
1371
restore_sigcontext(CPUState *env, struct target_sigcontext *sc)
1372
{
1373
        int err = 0;
1374
        uint32_t cpsr;
1375

    
1376
        __get_user_error(env->regs[0], &sc->arm_r0, err);
1377
        __get_user_error(env->regs[1], &sc->arm_r1, err);
1378
        __get_user_error(env->regs[2], &sc->arm_r2, err);
1379
        __get_user_error(env->regs[3], &sc->arm_r3, err);
1380
        __get_user_error(env->regs[4], &sc->arm_r4, err);
1381
        __get_user_error(env->regs[5], &sc->arm_r5, err);
1382
        __get_user_error(env->regs[6], &sc->arm_r6, err);
1383
        __get_user_error(env->regs[7], &sc->arm_r7, err);
1384
        __get_user_error(env->regs[8], &sc->arm_r8, err);
1385
        __get_user_error(env->regs[9], &sc->arm_r9, err);
1386
        __get_user_error(env->regs[10], &sc->arm_r10, err);
1387
        __get_user_error(env->regs[11], &sc->arm_fp, err);
1388
        __get_user_error(env->regs[12], &sc->arm_ip, err);
1389
        __get_user_error(env->regs[13], &sc->arm_sp, err);
1390
        __get_user_error(env->regs[14], &sc->arm_lr, err);
1391
        __get_user_error(env->regs[15], &sc->arm_pc, err);
1392
#ifdef TARGET_CONFIG_CPU_32
1393
        __get_user_error(cpsr, &sc->arm_cpsr, err);
1394
        cpsr_write(env, cpsr, CPSR_USER | CPSR_EXEC);
1395
#endif
1396

    
1397
        err |= !valid_user_regs(env);
1398

    
1399
        return err;
1400
}
1401

    
1402
static long do_sigreturn_v1(CPUState *env)
1403
{
1404
        abi_ulong frame_addr;
1405
        struct sigframe_v1 *frame;
1406
        target_sigset_t set;
1407
        sigset_t host_set;
1408
        int i;
1409

    
1410
        /*
1411
         * Since we stacked the signal on a 64-bit boundary,
1412
         * then 'sp' should be word aligned here.  If it's
1413
         * not, then the user is trying to mess with us.
1414
         */
1415
        if (env->regs[13] & 7)
1416
                goto badframe;
1417

    
1418
        frame_addr = env->regs[13];
1419
        if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1420
                goto badframe;
1421

    
1422
        if (__get_user(set.sig[0], &frame->sc.oldmask))
1423
            goto badframe;
1424
        for(i = 1; i < TARGET_NSIG_WORDS; i++) {
1425
            if (__get_user(set.sig[i], &frame->extramask[i - 1]))
1426
                goto badframe;
1427
        }
1428

    
1429
        target_to_host_sigset_internal(&host_set, &set);
1430
        sigprocmask(SIG_SETMASK, &host_set, NULL);
1431

    
1432
        if (restore_sigcontext(env, &frame->sc))
1433
                goto badframe;
1434

    
1435
#if 0
1436
        /* Send SIGTRAP if we're single-stepping */
1437
        if (ptrace_cancel_bpt(current))
1438
                send_sig(SIGTRAP, current, 1);
1439
#endif
1440
        unlock_user_struct(frame, frame_addr, 0);
1441
        return env->regs[0];
1442

    
1443
badframe:
1444
        unlock_user_struct(frame, frame_addr, 0);
1445
        force_sig(SIGSEGV /* , current */);
1446
        return 0;
1447
}
1448

    
1449
static int do_sigframe_return_v2(CPUState *env, target_ulong frame_addr,
1450
                                 struct target_ucontext_v2 *uc)
1451
{
1452
    sigset_t host_set;
1453

    
1454
    target_to_host_sigset(&host_set, &uc->tuc_sigmask);
1455
    sigprocmask(SIG_SETMASK, &host_set, NULL);
1456

    
1457
    if (restore_sigcontext(env, &uc->tuc_mcontext))
1458
        return 1;
1459

    
1460
    if (do_sigaltstack(frame_addr + offsetof(struct target_ucontext_v2, tuc_stack), 0, get_sp_from_cpustate(env)) == -EFAULT)
1461
        return 1;
1462

    
1463
#if 0
1464
    /* Send SIGTRAP if we're single-stepping */
1465
    if (ptrace_cancel_bpt(current))
1466
            send_sig(SIGTRAP, current, 1);
1467
#endif
1468

    
1469
    return 0;
1470
}
1471

    
1472
static long do_sigreturn_v2(CPUState *env)
1473
{
1474
        abi_ulong frame_addr;
1475
        struct sigframe_v2 *frame;
1476

    
1477
        /*
1478
         * Since we stacked the signal on a 64-bit boundary,
1479
         * then 'sp' should be word aligned here.  If it's
1480
         * not, then the user is trying to mess with us.
1481
         */
1482
        if (env->regs[13] & 7)
1483
                goto badframe;
1484

    
1485
        frame_addr = env->regs[13];
1486
        if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1487
                goto badframe;
1488

    
1489
        if (do_sigframe_return_v2(env, frame_addr, &frame->uc))
1490
                goto badframe;
1491

    
1492
        unlock_user_struct(frame, frame_addr, 0);
1493
        return env->regs[0];
1494

    
1495
badframe:
1496
        unlock_user_struct(frame, frame_addr, 0);
1497
        force_sig(SIGSEGV /* , current */);
1498
        return 0;
1499
}
1500

    
1501
long do_sigreturn(CPUState *env)
1502
{
1503
    if (get_osversion() >= 0x020612) {
1504
        return do_sigreturn_v2(env);
1505
    } else {
1506
        return do_sigreturn_v1(env);
1507
    }
1508
}
1509

    
1510
static long do_rt_sigreturn_v1(CPUState *env)
1511
{
1512
        abi_ulong frame_addr;
1513
        struct rt_sigframe_v1 *frame;
1514
        sigset_t host_set;
1515

    
1516
        /*
1517
         * Since we stacked the signal on a 64-bit boundary,
1518
         * then 'sp' should be word aligned here.  If it's
1519
         * not, then the user is trying to mess with us.
1520
         */
1521
        if (env->regs[13] & 7)
1522
                goto badframe;
1523

    
1524
        frame_addr = env->regs[13];
1525
        if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1526
                goto badframe;
1527

    
1528
        target_to_host_sigset(&host_set, &frame->uc.tuc_sigmask);
1529
        sigprocmask(SIG_SETMASK, &host_set, NULL);
1530

    
1531
        if (restore_sigcontext(env, &frame->uc.tuc_mcontext))
1532
                goto badframe;
1533

    
1534
        if (do_sigaltstack(frame_addr + offsetof(struct rt_sigframe_v1, uc.tuc_stack), 0, get_sp_from_cpustate(env)) == -EFAULT)
1535
                goto badframe;
1536

    
1537
#if 0
1538
        /* Send SIGTRAP if we're single-stepping */
1539
        if (ptrace_cancel_bpt(current))
1540
                send_sig(SIGTRAP, current, 1);
1541
#endif
1542
        unlock_user_struct(frame, frame_addr, 0);
1543
        return env->regs[0];
1544

    
1545
badframe:
1546
        unlock_user_struct(frame, frame_addr, 0);
1547
        force_sig(SIGSEGV /* , current */);
1548
        return 0;
1549
}
1550

    
1551
static long do_rt_sigreturn_v2(CPUState *env)
1552
{
1553
        abi_ulong frame_addr;
1554
        struct rt_sigframe_v2 *frame;
1555

    
1556
        /*
1557
         * Since we stacked the signal on a 64-bit boundary,
1558
         * then 'sp' should be word aligned here.  If it's
1559
         * not, then the user is trying to mess with us.
1560
         */
1561
        if (env->regs[13] & 7)
1562
                goto badframe;
1563

    
1564
        frame_addr = env->regs[13];
1565
        if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1566
                goto badframe;
1567

    
1568
        if (do_sigframe_return_v2(env, frame_addr, &frame->uc))
1569
                goto badframe;
1570

    
1571
        unlock_user_struct(frame, frame_addr, 0);
1572
        return env->regs[0];
1573

    
1574
badframe:
1575
        unlock_user_struct(frame, frame_addr, 0);
1576
        force_sig(SIGSEGV /* , current */);
1577
        return 0;
1578
}
1579

    
1580
long do_rt_sigreturn(CPUState *env)
1581
{
1582
    if (get_osversion() >= 0x020612) {
1583
        return do_rt_sigreturn_v2(env);
1584
    } else {
1585
        return do_rt_sigreturn_v1(env);
1586
    }
1587
}
1588

    
1589
#elif defined(TARGET_SPARC)
1590

    
1591
#define __SUNOS_MAXWIN   31
1592

    
1593
/* This is what SunOS does, so shall I. */
1594
struct target_sigcontext {
1595
        abi_ulong sigc_onstack;      /* state to restore */
1596

    
1597
        abi_ulong sigc_mask;         /* sigmask to restore */
1598
        abi_ulong sigc_sp;           /* stack pointer */
1599
        abi_ulong sigc_pc;           /* program counter */
1600
        abi_ulong sigc_npc;          /* next program counter */
1601
        abi_ulong sigc_psr;          /* for condition codes etc */
1602
        abi_ulong sigc_g1;           /* User uses these two registers */
1603
        abi_ulong sigc_o0;           /* within the trampoline code. */
1604

    
1605
        /* Now comes information regarding the users window set
1606
         * at the time of the signal.
1607
         */
1608
        abi_ulong sigc_oswins;       /* outstanding windows */
1609

    
1610
        /* stack ptrs for each regwin buf */
1611
        char *sigc_spbuf[__SUNOS_MAXWIN];
1612

    
1613
        /* Windows to restore after signal */
1614
        struct {
1615
                abi_ulong locals[8];
1616
                abi_ulong ins[8];
1617
        } sigc_wbuf[__SUNOS_MAXWIN];
1618
};
1619
/* A Sparc stack frame */
1620
struct sparc_stackf {
1621
        abi_ulong locals[8];
1622
        abi_ulong ins[6];
1623
        struct sparc_stackf *fp;
1624
        abi_ulong callers_pc;
1625
        char *structptr;
1626
        abi_ulong xargs[6];
1627
        abi_ulong xxargs[1];
1628
};
1629

    
1630
typedef struct {
1631
        struct {
1632
                abi_ulong psr;
1633
                abi_ulong pc;
1634
                abi_ulong npc;
1635
                abi_ulong y;
1636
                abi_ulong u_regs[16]; /* globals and ins */
1637
        }               si_regs;
1638
        int             si_mask;
1639
} __siginfo_t;
1640

    
1641
typedef struct {
1642
        unsigned   long si_float_regs [32];
1643
        unsigned   long si_fsr;
1644
        unsigned   long si_fpqdepth;
1645
        struct {
1646
                unsigned long *insn_addr;
1647
                unsigned long insn;
1648
        } si_fpqueue [16];
1649
} qemu_siginfo_fpu_t;
1650

    
1651

    
1652
struct target_signal_frame {
1653
        struct sparc_stackf        ss;
1654
        __siginfo_t                info;
1655
        abi_ulong               fpu_save;
1656
        abi_ulong                insns[2] __attribute__ ((aligned (8)));
1657
        abi_ulong                extramask[TARGET_NSIG_WORDS - 1];
1658
        abi_ulong                extra_size; /* Should be 0 */
1659
        qemu_siginfo_fpu_t        fpu_state;
1660
};
1661
struct target_rt_signal_frame {
1662
        struct sparc_stackf        ss;
1663
        siginfo_t                info;
1664
        abi_ulong                regs[20];
1665
        sigset_t                mask;
1666
        abi_ulong               fpu_save;
1667
        unsigned int                insns[2];
1668
        stack_t                        stack;
1669
        unsigned int                extra_size; /* Should be 0 */
1670
        qemu_siginfo_fpu_t        fpu_state;
1671
};
1672

    
1673
#define UREG_O0        16
1674
#define UREG_O6        22
1675
#define UREG_I0        0
1676
#define UREG_I1        1
1677
#define UREG_I2        2
1678
#define UREG_I3        3
1679
#define UREG_I4        4
1680
#define UREG_I5        5
1681
#define UREG_I6        6
1682
#define UREG_I7        7
1683
#define UREG_L0               8
1684
#define UREG_FP        UREG_I6
1685
#define UREG_SP        UREG_O6
1686

    
1687
static inline abi_ulong get_sigframe(struct target_sigaction *sa, 
1688
                                     CPUState *env, unsigned long framesize)
1689
{
1690
        abi_ulong sp;
1691

    
1692
        sp = env->regwptr[UREG_FP];
1693

    
1694
        /* This is the X/Open sanctioned signal stack switching.  */
1695
        if (sa->sa_flags & TARGET_SA_ONSTACK) {
1696
            if (!on_sig_stack(sp)
1697
                && !((target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size) & 7))
1698
                sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
1699
        }
1700
        return sp - framesize;
1701
}
1702

    
1703
static int
1704
setup___siginfo(__siginfo_t *si, CPUState *env, abi_ulong mask)
1705
{
1706
        int err = 0, i;
1707

    
1708
        err |= __put_user(env->psr, &si->si_regs.psr);
1709
        err |= __put_user(env->pc, &si->si_regs.pc);
1710
        err |= __put_user(env->npc, &si->si_regs.npc);
1711
        err |= __put_user(env->y, &si->si_regs.y);
1712
        for (i=0; i < 8; i++) {
1713
                err |= __put_user(env->gregs[i], &si->si_regs.u_regs[i]);
1714
        }
1715
        for (i=0; i < 8; i++) {
1716
                err |= __put_user(env->regwptr[UREG_I0 + i], &si->si_regs.u_regs[i+8]);
1717
        }
1718
        err |= __put_user(mask, &si->si_mask);
1719
        return err;
1720
}
1721

    
1722
#if 0
1723
static int
1724
setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/
1725
                 CPUState *env, unsigned long mask)
1726
{
1727
        int err = 0;
1728

1729
        err |= __put_user(mask, &sc->sigc_mask);
1730
        err |= __put_user(env->regwptr[UREG_SP], &sc->sigc_sp);
1731
        err |= __put_user(env->pc, &sc->sigc_pc);
1732
        err |= __put_user(env->npc, &sc->sigc_npc);
1733
        err |= __put_user(env->psr, &sc->sigc_psr);
1734
        err |= __put_user(env->gregs[1], &sc->sigc_g1);
1735
        err |= __put_user(env->regwptr[UREG_O0], &sc->sigc_o0);
1736

1737
        return err;
1738
}
1739
#endif
1740
#define NF_ALIGNEDSZ  (((sizeof(struct target_signal_frame) + 7) & (~7)))
1741

    
1742
static void setup_frame(int sig, struct target_sigaction *ka,
1743
                        target_sigset_t *set, CPUState *env)
1744
{
1745
        abi_ulong sf_addr;
1746
        struct target_signal_frame *sf;
1747
        int sigframe_size, err, i;
1748

    
1749
        /* 1. Make sure everything is clean */
1750
        //synchronize_user_stack();
1751

    
1752
        sigframe_size = NF_ALIGNEDSZ;
1753
        sf_addr = get_sigframe(ka, env, sigframe_size);
1754

    
1755
        sf = lock_user(VERIFY_WRITE, sf_addr, 
1756
                       sizeof(struct target_signal_frame), 0);
1757
        if (!sf)
1758
                goto sigsegv;
1759
                
1760
        //fprintf(stderr, "sf: %x pc %x fp %x sp %x\n", sf, env->pc, env->regwptr[UREG_FP], env->regwptr[UREG_SP]);
1761
#if 0
1762
        if (invalid_frame_pointer(sf, sigframe_size))
1763
                goto sigill_and_return;
1764
#endif
1765
        /* 2. Save the current process state */
1766
        err = setup___siginfo(&sf->info, env, set->sig[0]);
1767
        err |= __put_user(0, &sf->extra_size);
1768

    
1769
        //err |= save_fpu_state(regs, &sf->fpu_state);
1770
        //err |= __put_user(&sf->fpu_state, &sf->fpu_save);
1771

    
1772
        err |= __put_user(set->sig[0], &sf->info.si_mask);
1773
        for (i = 0; i < TARGET_NSIG_WORDS - 1; i++) {
1774
                err |= __put_user(set->sig[i + 1], &sf->extramask[i]);
1775
        }
1776

    
1777
        for (i = 0; i < 8; i++) {
1778
                  err |= __put_user(env->regwptr[i + UREG_L0], &sf->ss.locals[i]);
1779
        }
1780
        for (i = 0; i < 8; i++) {
1781
                  err |= __put_user(env->regwptr[i + UREG_I0], &sf->ss.ins[i]);
1782
        }
1783
        if (err)
1784
                goto sigsegv;
1785

    
1786
        /* 3. signal handler back-trampoline and parameters */
1787
        env->regwptr[UREG_FP] = sf_addr;
1788
        env->regwptr[UREG_I0] = sig;
1789
        env->regwptr[UREG_I1] = sf_addr + 
1790
                offsetof(struct target_signal_frame, info);
1791
        env->regwptr[UREG_I2] = sf_addr + 
1792
                offsetof(struct target_signal_frame, info);
1793

    
1794
        /* 4. signal handler */
1795
        env->pc = ka->_sa_handler;
1796
        env->npc = (env->pc + 4);
1797
        /* 5. return to kernel instructions */
1798
        if (ka->sa_restorer)
1799
                env->regwptr[UREG_I7] = ka->sa_restorer;
1800
        else {
1801
                uint32_t val32;
1802

    
1803
                env->regwptr[UREG_I7] = sf_addr + 
1804
                        offsetof(struct target_signal_frame, insns) - 2 * 4;
1805

    
1806
                /* mov __NR_sigreturn, %g1 */
1807
                val32 = 0x821020d8;
1808
                err |= __put_user(val32, &sf->insns[0]);
1809

    
1810
                /* t 0x10 */
1811
                val32 = 0x91d02010;
1812
                err |= __put_user(val32, &sf->insns[1]);
1813
                if (err)
1814
                        goto sigsegv;
1815

    
1816
                /* Flush instruction space. */
1817
                //flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0]));
1818
                //                tb_flush(env);
1819
        }
1820
        unlock_user(sf, sf_addr, sizeof(struct target_signal_frame));
1821
        return;
1822
#if 0
1823
sigill_and_return:
1824
        force_sig(TARGET_SIGILL);
1825
#endif
1826
sigsegv:
1827
        //fprintf(stderr, "force_sig\n");
1828
        unlock_user(sf, sf_addr, sizeof(struct target_signal_frame));
1829
        force_sig(TARGET_SIGSEGV);
1830
}
1831
static inline int
1832
restore_fpu_state(CPUState *env, qemu_siginfo_fpu_t *fpu)
1833
{
1834
        int err;
1835
#if 0
1836
#ifdef CONFIG_SMP
1837
        if (current->flags & PF_USEDFPU)
1838
                regs->psr &= ~PSR_EF;
1839
#else
1840
        if (current == last_task_used_math) {
1841
                last_task_used_math = 0;
1842
                regs->psr &= ~PSR_EF;
1843
        }
1844
#endif
1845
        current->used_math = 1;
1846
        current->flags &= ~PF_USEDFPU;
1847
#endif
1848
#if 0
1849
        if (verify_area (VERIFY_READ, fpu, sizeof(*fpu)))
1850
                return -EFAULT;
1851
#endif
1852

    
1853
#if 0
1854
        /* XXX: incorrect */
1855
        err = __copy_from_user(&env->fpr[0], &fpu->si_float_regs[0],
1856
                                     (sizeof(unsigned long) * 32));
1857
#endif
1858
        err |= __get_user(env->fsr, &fpu->si_fsr);
1859
#if 0
1860
        err |= __get_user(current->thread.fpqdepth, &fpu->si_fpqdepth);
1861
        if (current->thread.fpqdepth != 0)
1862
                err |= __copy_from_user(&current->thread.fpqueue[0],
1863
                                        &fpu->si_fpqueue[0],
1864
                                        ((sizeof(unsigned long) +
1865
                                        (sizeof(unsigned long *)))*16));
1866
#endif
1867
        return err;
1868
}
1869

    
1870

    
1871
static void setup_rt_frame(int sig, struct target_sigaction *ka,
1872
                           target_siginfo_t *info,
1873
                           target_sigset_t *set, CPUState *env)
1874
{
1875
    fprintf(stderr, "setup_rt_frame: not implemented\n");
1876
}
1877

    
1878
long do_sigreturn(CPUState *env)
1879
{
1880
        abi_ulong sf_addr;
1881
        struct target_signal_frame *sf;
1882
        uint32_t up_psr, pc, npc;
1883
        target_sigset_t set;
1884
        sigset_t host_set;
1885
        abi_ulong fpu_save_addr;
1886
        int err, i;
1887

    
1888
        sf_addr = env->regwptr[UREG_FP];
1889
        if (!lock_user_struct(VERIFY_READ, sf, sf_addr, 1))
1890
                goto segv_and_exit;
1891
#if 0
1892
        fprintf(stderr, "sigreturn\n");
1893
        fprintf(stderr, "sf: %x pc %x fp %x sp %x\n", sf, env->pc, env->regwptr[UREG_FP], env->regwptr[UREG_SP]);
1894
#endif
1895
        //cpu_dump_state(env, stderr, fprintf, 0);
1896

    
1897
        /* 1. Make sure we are not getting garbage from the user */
1898

    
1899
        if (sf_addr & 3)
1900
                goto segv_and_exit;
1901

    
1902
        err = __get_user(pc,  &sf->info.si_regs.pc);
1903
        err |= __get_user(npc, &sf->info.si_regs.npc);
1904

    
1905
        if ((pc | npc) & 3)
1906
                goto segv_and_exit;
1907

    
1908
        /* 2. Restore the state */
1909
        err |= __get_user(up_psr, &sf->info.si_regs.psr);
1910

    
1911
        /* User can only change condition codes and FPU enabling in %psr. */
1912
        env->psr = (up_psr & (PSR_ICC /* | PSR_EF */))
1913
                  | (env->psr & ~(PSR_ICC /* | PSR_EF */));
1914

    
1915
        env->pc = pc;
1916
        env->npc = npc;
1917
        err |= __get_user(env->y, &sf->info.si_regs.y);
1918
        for (i=0; i < 8; i++) {
1919
                err |= __get_user(env->gregs[i], &sf->info.si_regs.u_regs[i]);
1920
        }
1921
        for (i=0; i < 8; i++) {
1922
                err |= __get_user(env->regwptr[i + UREG_I0], &sf->info.si_regs.u_regs[i+8]);
1923
        }
1924

    
1925
        err |= __get_user(fpu_save_addr, &sf->fpu_save);
1926

    
1927
        //if (fpu_save)
1928
        //        err |= restore_fpu_state(env, fpu_save);
1929

    
1930
        /* This is pretty much atomic, no amount locking would prevent
1931
         * the races which exist anyways.
1932
         */
1933
        err |= __get_user(set.sig[0], &sf->info.si_mask);
1934
        for(i = 1; i < TARGET_NSIG_WORDS; i++) {
1935
            err |= (__get_user(set.sig[i], &sf->extramask[i - 1]));
1936
        }
1937

    
1938
        target_to_host_sigset_internal(&host_set, &set);
1939
        sigprocmask(SIG_SETMASK, &host_set, NULL);
1940

    
1941
        if (err)
1942
                goto segv_and_exit;
1943
        unlock_user_struct(sf, sf_addr, 0);
1944
        return env->regwptr[0];
1945

    
1946
segv_and_exit:
1947
        unlock_user_struct(sf, sf_addr, 0);
1948
        force_sig(TARGET_SIGSEGV);
1949
}
1950

    
1951
long do_rt_sigreturn(CPUState *env)
1952
{
1953
    fprintf(stderr, "do_rt_sigreturn: not implemented\n");
1954
    return -TARGET_ENOSYS;
1955
}
1956

    
1957
#if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
1958
#define MC_TSTATE 0
1959
#define MC_PC 1
1960
#define MC_NPC 2
1961
#define MC_Y 3
1962
#define MC_G1 4
1963
#define MC_G2 5
1964
#define MC_G3 6
1965
#define MC_G4 7
1966
#define MC_G5 8
1967
#define MC_G6 9
1968
#define MC_G7 10
1969
#define MC_O0 11
1970
#define MC_O1 12
1971
#define MC_O2 13
1972
#define MC_O3 14
1973
#define MC_O4 15
1974
#define MC_O5 16
1975
#define MC_O6 17
1976
#define MC_O7 18
1977
#define MC_NGREG 19
1978

    
1979
typedef abi_ulong target_mc_greg_t;
1980
typedef target_mc_greg_t target_mc_gregset_t[MC_NGREG];
1981

    
1982
struct target_mc_fq {
1983
    abi_ulong *mcfq_addr;
1984
    uint32_t mcfq_insn;
1985
};
1986

    
1987
struct target_mc_fpu {
1988
    union {
1989
        uint32_t sregs[32];
1990
        uint64_t dregs[32];
1991
        //uint128_t qregs[16];
1992
    } mcfpu_fregs;
1993
    abi_ulong mcfpu_fsr;
1994
    abi_ulong mcfpu_fprs;
1995
    abi_ulong mcfpu_gsr;
1996
    struct target_mc_fq *mcfpu_fq;
1997
    unsigned char mcfpu_qcnt;
1998
    unsigned char mcfpu_qentsz;
1999
    unsigned char mcfpu_enab;
2000
};
2001
typedef struct target_mc_fpu target_mc_fpu_t;
2002

    
2003
typedef struct {
2004
    target_mc_gregset_t mc_gregs;
2005
    target_mc_greg_t mc_fp;
2006
    target_mc_greg_t mc_i7;
2007
    target_mc_fpu_t mc_fpregs;
2008
} target_mcontext_t;
2009

    
2010
struct target_ucontext {
2011
    struct target_ucontext *uc_link;
2012
    abi_ulong uc_flags;
2013
    target_sigset_t uc_sigmask;
2014
    target_mcontext_t uc_mcontext;
2015
};
2016

    
2017
/* A V9 register window */
2018
struct target_reg_window {
2019
    abi_ulong locals[8];
2020
    abi_ulong ins[8];
2021
};
2022

    
2023
#define TARGET_STACK_BIAS 2047
2024

    
2025
/* {set, get}context() needed for 64-bit SparcLinux userland. */
2026
void sparc64_set_context(CPUSPARCState *env)
2027
{
2028
    abi_ulong ucp_addr;
2029
    struct target_ucontext *ucp;
2030
    target_mc_gregset_t *grp;
2031
    abi_ulong pc, npc, tstate;
2032
    abi_ulong fp, i7, w_addr;
2033
    unsigned char fenab;
2034
    int err;
2035
    unsigned int i;
2036

    
2037
    ucp_addr = env->regwptr[UREG_I0];
2038
    if (!lock_user_struct(VERIFY_READ, ucp, ucp_addr, 1))
2039
        goto do_sigsegv;
2040
    grp  = &ucp->uc_mcontext.mc_gregs;
2041
    err  = __get_user(pc, &((*grp)[MC_PC]));
2042
    err |= __get_user(npc, &((*grp)[MC_NPC]));
2043
    if (err || ((pc | npc) & 3))
2044
        goto do_sigsegv;
2045
    if (env->regwptr[UREG_I1]) {
2046
        target_sigset_t target_set;
2047
        sigset_t set;
2048

    
2049
        if (TARGET_NSIG_WORDS == 1) {
2050
            if (__get_user(target_set.sig[0], &ucp->uc_sigmask.sig[0]))
2051
                goto do_sigsegv;
2052
        } else {
2053
            abi_ulong *src, *dst;
2054
            src = ucp->uc_sigmask.sig;
2055
            dst = target_set.sig;
2056
            for (i = 0; i < sizeof(target_sigset_t) / sizeof(abi_ulong);
2057
                 i++, dst++, src++)
2058
                err |= __get_user(*dst, src);
2059
            if (err)
2060
                goto do_sigsegv;
2061
        }
2062
        target_to_host_sigset_internal(&set, &target_set);
2063
        sigprocmask(SIG_SETMASK, &set, NULL);
2064
    }
2065
    env->pc = pc;
2066
    env->npc = npc;
2067
    err |= __get_user(env->y, &((*grp)[MC_Y]));
2068
    err |= __get_user(tstate, &((*grp)[MC_TSTATE]));
2069
    env->asi = (tstate >> 24) & 0xff;
2070
    PUT_CCR(env, tstate >> 32);
2071
    PUT_CWP64(env, tstate & 0x1f);
2072
    err |= __get_user(env->gregs[1], (&(*grp)[MC_G1]));
2073
    err |= __get_user(env->gregs[2], (&(*grp)[MC_G2]));
2074
    err |= __get_user(env->gregs[3], (&(*grp)[MC_G3]));
2075
    err |= __get_user(env->gregs[4], (&(*grp)[MC_G4]));
2076
    err |= __get_user(env->gregs[5], (&(*grp)[MC_G5]));
2077
    err |= __get_user(env->gregs[6], (&(*grp)[MC_G6]));
2078
    err |= __get_user(env->gregs[7], (&(*grp)[MC_G7]));
2079
    err |= __get_user(env->regwptr[UREG_I0], (&(*grp)[MC_O0]));
2080
    err |= __get_user(env->regwptr[UREG_I1], (&(*grp)[MC_O1]));
2081
    err |= __get_user(env->regwptr[UREG_I2], (&(*grp)[MC_O2]));
2082
    err |= __get_user(env->regwptr[UREG_I3], (&(*grp)[MC_O3]));
2083
    err |= __get_user(env->regwptr[UREG_I4], (&(*grp)[MC_O4]));
2084
    err |= __get_user(env->regwptr[UREG_I5], (&(*grp)[MC_O5]));
2085
    err |= __get_user(env->regwptr[UREG_I6], (&(*grp)[MC_O6]));
2086
    err |= __get_user(env->regwptr[UREG_I7], (&(*grp)[MC_O7]));
2087

    
2088
    err |= __get_user(fp, &(ucp->uc_mcontext.mc_fp));
2089
    err |= __get_user(i7, &(ucp->uc_mcontext.mc_i7));
2090

    
2091
    w_addr = TARGET_STACK_BIAS+env->regwptr[UREG_I6];
2092
    if (put_user(fp, w_addr + offsetof(struct target_reg_window, ins[6]), 
2093
                 abi_ulong) != 0)
2094
        goto do_sigsegv;
2095
    if (put_user(i7, w_addr + offsetof(struct target_reg_window, ins[7]), 
2096
                 abi_ulong) != 0)
2097
        goto do_sigsegv;
2098
    err |= __get_user(fenab, &(ucp->uc_mcontext.mc_fpregs.mcfpu_enab));
2099
    err |= __get_user(env->fprs, &(ucp->uc_mcontext.mc_fpregs.mcfpu_fprs));
2100
    {
2101
        uint32_t *src, *dst;
2102
        src = ucp->uc_mcontext.mc_fpregs.mcfpu_fregs.sregs;
2103
        dst = env->fpr;
2104
        /* XXX: check that the CPU storage is the same as user context */
2105
        for (i = 0; i < 64; i++, dst++, src++)
2106
            err |= __get_user(*dst, src);
2107
    }
2108
    err |= __get_user(env->fsr,
2109
                      &(ucp->uc_mcontext.mc_fpregs.mcfpu_fsr));
2110
    err |= __get_user(env->gsr,
2111
                      &(ucp->uc_mcontext.mc_fpregs.mcfpu_gsr));
2112
    if (err)
2113
        goto do_sigsegv;
2114
    unlock_user_struct(ucp, ucp_addr, 0);
2115
    return;
2116
 do_sigsegv:
2117
    unlock_user_struct(ucp, ucp_addr, 0);
2118
    force_sig(SIGSEGV);
2119
}
2120

    
2121
void sparc64_get_context(CPUSPARCState *env)
2122
{
2123
    abi_ulong ucp_addr;
2124
    struct target_ucontext *ucp;
2125
    target_mc_gregset_t *grp;
2126
    target_mcontext_t *mcp;
2127
    abi_ulong fp, i7, w_addr;
2128
    int err;
2129
    unsigned int i;
2130
    target_sigset_t target_set;
2131
    sigset_t set;
2132

    
2133
    ucp_addr = env->regwptr[UREG_I0];
2134
    if (!lock_user_struct(VERIFY_WRITE, ucp, ucp_addr, 0))
2135
        goto do_sigsegv;
2136
    
2137
    mcp = &ucp->uc_mcontext;
2138
    grp = &mcp->mc_gregs;
2139

    
2140
    /* Skip over the trap instruction, first. */
2141
    env->pc = env->npc;
2142
    env->npc += 4;
2143

    
2144
    err = 0;
2145

    
2146
    sigprocmask(0, NULL, &set);
2147
    host_to_target_sigset_internal(&target_set, &set);
2148
    if (TARGET_NSIG_WORDS == 1) {
2149
        err |= __put_user(target_set.sig[0],
2150
                          (abi_ulong *)&ucp->uc_sigmask);
2151
    } else {
2152
        abi_ulong *src, *dst;
2153
        src = target_set.sig;
2154
        dst = ucp->uc_sigmask.sig;
2155
        for (i = 0; i < sizeof(target_sigset_t) / sizeof(abi_ulong);
2156
             i++, dst++, src++)
2157
            err |= __put_user(*src, dst);
2158
        if (err)
2159
            goto do_sigsegv;
2160
    }
2161

    
2162
    /* XXX: tstate must be saved properly */
2163
    //    err |= __put_user(env->tstate, &((*grp)[MC_TSTATE]));
2164
    err |= __put_user(env->pc, &((*grp)[MC_PC]));
2165
    err |= __put_user(env->npc, &((*grp)[MC_NPC]));
2166
    err |= __put_user(env->y, &((*grp)[MC_Y]));
2167
    err |= __put_user(env->gregs[1], &((*grp)[MC_G1]));
2168
    err |= __put_user(env->gregs[2], &((*grp)[MC_G2]));
2169
    err |= __put_user(env->gregs[3], &((*grp)[MC_G3]));
2170
    err |= __put_user(env->gregs[4], &((*grp)[MC_G4]));
2171
    err |= __put_user(env->gregs[5], &((*grp)[MC_G5]));
2172
    err |= __put_user(env->gregs[6], &((*grp)[MC_G6]));
2173
    err |= __put_user(env->gregs[7], &((*grp)[MC_G7]));
2174
    err |= __put_user(env->regwptr[UREG_I0], &((*grp)[MC_O0]));
2175
    err |= __put_user(env->regwptr[UREG_I1], &((*grp)[MC_O1]));
2176
    err |= __put_user(env->regwptr[UREG_I2], &((*grp)[MC_O2]));
2177
    err |= __put_user(env->regwptr[UREG_I3], &((*grp)[MC_O3]));
2178
    err |= __put_user(env->regwptr[UREG_I4], &((*grp)[MC_O4]));
2179
    err |= __put_user(env->regwptr[UREG_I5], &((*grp)[MC_O5]));
2180
    err |= __put_user(env->regwptr[UREG_I6], &((*grp)[MC_O6]));
2181
    err |= __put_user(env->regwptr[UREG_I7], &((*grp)[MC_O7]));
2182

    
2183
    w_addr = TARGET_STACK_BIAS+env->regwptr[UREG_I6];
2184
    fp = i7 = 0;
2185
    if (get_user(fp, w_addr + offsetof(struct target_reg_window, ins[6]), 
2186
                 abi_ulong) != 0)
2187
        goto do_sigsegv;
2188
    if (get_user(i7, w_addr + offsetof(struct target_reg_window, ins[7]), 
2189
                 abi_ulong) != 0)
2190
        goto do_sigsegv;
2191
    err |= __put_user(fp, &(mcp->mc_fp));
2192
    err |= __put_user(i7, &(mcp->mc_i7));
2193

    
2194
    {
2195
        uint32_t *src, *dst;
2196
        src = env->fpr;
2197
        dst = ucp->uc_mcontext.mc_fpregs.mcfpu_fregs.sregs;
2198
        /* XXX: check that the CPU storage is the same as user context */
2199
        for (i = 0; i < 64; i++, dst++, src++)
2200
            err |= __put_user(*src, dst);
2201
    }
2202
    err |= __put_user(env->fsr, &(mcp->mc_fpregs.mcfpu_fsr));
2203
    err |= __put_user(env->gsr, &(mcp->mc_fpregs.mcfpu_gsr));
2204
    err |= __put_user(env->fprs, &(mcp->mc_fpregs.mcfpu_fprs));
2205

    
2206
    if (err)
2207
        goto do_sigsegv;
2208
    unlock_user_struct(ucp, ucp_addr, 1);
2209
    return;
2210
 do_sigsegv:
2211
    unlock_user_struct(ucp, ucp_addr, 1);
2212
    force_sig(SIGSEGV);
2213
}
2214
#endif
2215
#elif defined(TARGET_ABI_MIPSN64)
2216

    
2217
# warning signal handling not implemented
2218

    
2219
static void setup_frame(int sig, struct target_sigaction *ka,
2220
                        target_sigset_t *set, CPUState *env)
2221
{
2222
    fprintf(stderr, "setup_frame: not implemented\n");
2223
}
2224

    
2225
static void setup_rt_frame(int sig, struct target_sigaction *ka,
2226
                           target_siginfo_t *info,
2227
                           target_sigset_t *set, CPUState *env)
2228
{
2229
    fprintf(stderr, "setup_rt_frame: not implemented\n");
2230
}
2231

    
2232
long do_sigreturn(CPUState *env)
2233
{
2234
    fprintf(stderr, "do_sigreturn: not implemented\n");
2235
    return -TARGET_ENOSYS;
2236
}
2237

    
2238
long do_rt_sigreturn(CPUState *env)
2239
{
2240
    fprintf(stderr, "do_rt_sigreturn: not implemented\n");
2241
    return -TARGET_ENOSYS;
2242
}
2243

    
2244
#elif defined(TARGET_ABI_MIPSN32)
2245

    
2246
# warning signal handling not implemented
2247

    
2248
static void setup_frame(int sig, struct target_sigaction *ka,
2249
                        target_sigset_t *set, CPUState *env)
2250
{
2251
    fprintf(stderr, "setup_frame: not implemented\n");
2252
}
2253

    
2254
static void setup_rt_frame(int sig, struct target_sigaction *ka,
2255
                           target_siginfo_t *info,
2256
                           target_sigset_t *set, CPUState *env)
2257
{
2258
    fprintf(stderr, "setup_rt_frame: not implemented\n");
2259
}
2260

    
2261
long do_sigreturn(CPUState *env)
2262
{
2263
    fprintf(stderr, "do_sigreturn: not implemented\n");
2264
    return -TARGET_ENOSYS;
2265
}
2266

    
2267
long do_rt_sigreturn(CPUState *env)
2268
{
2269
    fprintf(stderr, "do_rt_sigreturn: not implemented\n");
2270
    return -TARGET_ENOSYS;
2271
}
2272

    
2273
#elif defined(TARGET_ABI_MIPSO32)
2274

    
2275
struct target_sigcontext {
2276
    uint32_t   sc_regmask;     /* Unused */
2277
    uint32_t   sc_status;
2278
    uint64_t   sc_pc;
2279
    uint64_t   sc_regs[32];
2280
    uint64_t   sc_fpregs[32];
2281
    uint32_t   sc_ownedfp;     /* Unused */
2282
    uint32_t   sc_fpc_csr;
2283
    uint32_t   sc_fpc_eir;     /* Unused */
2284
    uint32_t   sc_used_math;
2285
    uint32_t   sc_dsp;         /* dsp status, was sc_ssflags */
2286
    uint64_t   sc_mdhi;
2287
    uint64_t   sc_mdlo;
2288
    target_ulong   sc_hi1;         /* Was sc_cause */
2289
    target_ulong   sc_lo1;         /* Was sc_badvaddr */
2290
    target_ulong   sc_hi2;         /* Was sc_sigset[4] */
2291
    target_ulong   sc_lo2;
2292
    target_ulong   sc_hi3;
2293
    target_ulong   sc_lo3;
2294
};
2295

    
2296
struct sigframe {
2297
    uint32_t sf_ass[4];                        /* argument save space for o32 */
2298
    uint32_t sf_code[2];                        /* signal trampoline */
2299
    struct target_sigcontext sf_sc;
2300
    target_sigset_t sf_mask;
2301
};
2302

    
2303
/* Install trampoline to jump back from signal handler */
2304
static inline int install_sigtramp(unsigned int *tramp,   unsigned int syscall)
2305
{
2306
    int err;
2307

    
2308
    /*
2309
    * Set up the return code ...
2310
    *
2311
    *         li      v0, __NR__foo_sigreturn
2312
    *         syscall
2313
    */
2314

    
2315
    err = __put_user(0x24020000 + syscall, tramp + 0);
2316
    err |= __put_user(0x0000000c          , tramp + 1);
2317
    /* flush_cache_sigtramp((unsigned long) tramp); */
2318
    return err;
2319
}
2320

    
2321
static inline int
2322
setup_sigcontext(CPUState *regs, struct target_sigcontext *sc)
2323
{
2324
    int err = 0;
2325

    
2326
    err |= __put_user(regs->active_tc.PC, &sc->sc_pc);
2327

    
2328
#define save_gp_reg(i) do {                                                   \
2329
        err |= __put_user(regs->active_tc.gpr[i], &sc->sc_regs[i]);        \
2330
    } while(0)
2331
    __put_user(0, &sc->sc_regs[0]); save_gp_reg(1); save_gp_reg(2);
2332
    save_gp_reg(3); save_gp_reg(4); save_gp_reg(5); save_gp_reg(6);
2333
    save_gp_reg(7); save_gp_reg(8); save_gp_reg(9); save_gp_reg(10);
2334
    save_gp_reg(11); save_gp_reg(12); save_gp_reg(13); save_gp_reg(14);
2335
    save_gp_reg(15); save_gp_reg(16); save_gp_reg(17); save_gp_reg(18);
2336
    save_gp_reg(19); save_gp_reg(20); save_gp_reg(21); save_gp_reg(22);
2337
    save_gp_reg(23); save_gp_reg(24); save_gp_reg(25); save_gp_reg(26);
2338
    save_gp_reg(27); save_gp_reg(28); save_gp_reg(29); save_gp_reg(30);
2339
    save_gp_reg(31);
2340
#undef save_gp_reg
2341

    
2342
    err |= __put_user(regs->active_tc.HI[0], &sc->sc_mdhi);
2343
    err |= __put_user(regs->active_tc.LO[0], &sc->sc_mdlo);
2344

    
2345
    /* Not used yet, but might be useful if we ever have DSP suppport */
2346
#if 0
2347
    if (cpu_has_dsp) {
2348
        err |= __put_user(mfhi1(), &sc->sc_hi1);
2349
        err |= __put_user(mflo1(), &sc->sc_lo1);
2350
        err |= __put_user(mfhi2(), &sc->sc_hi2);
2351
        err |= __put_user(mflo2(), &sc->sc_lo2);
2352
        err |= __put_user(mfhi3(), &sc->sc_hi3);
2353
        err |= __put_user(mflo3(), &sc->sc_lo3);
2354
        err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp);
2355
    }
2356
    /* same with 64 bit */
2357
#ifdef CONFIG_64BIT
2358
    err |= __put_user(regs->hi, &sc->sc_hi[0]);
2359
    err |= __put_user(regs->lo, &sc->sc_lo[0]);
2360
    if (cpu_has_dsp) {
2361
        err |= __put_user(mfhi1(), &sc->sc_hi[1]);
2362
        err |= __put_user(mflo1(), &sc->sc_lo[1]);
2363
        err |= __put_user(mfhi2(), &sc->sc_hi[2]);
2364
        err |= __put_user(mflo2(), &sc->sc_lo[2]);
2365
        err |= __put_user(mfhi3(), &sc->sc_hi[3]);
2366
        err |= __put_user(mflo3(), &sc->sc_lo[3]);
2367
        err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp);
2368
    }
2369
#endif
2370
#endif
2371

    
2372
#if 0
2373
    err |= __put_user(!!used_math(), &sc->sc_used_math);
2374

2375
    if (!used_math())
2376
        goto out;
2377

2378
    /*
2379
    * Save FPU state to signal context.  Signal handler will "inherit"
2380
    * current FPU state.
2381
    */
2382
    preempt_disable();
2383

2384
    if (!is_fpu_owner()) {
2385
        own_fpu();
2386
        restore_fp(current);
2387
    }
2388
    err |= save_fp_context(sc);
2389

2390
    preempt_enable();
2391
    out:
2392
#endif
2393
    return err;
2394
}
2395

    
2396
static inline int
2397
restore_sigcontext(CPUState *regs, struct target_sigcontext *sc)
2398
{
2399
    int err = 0;
2400

    
2401
    err |= __get_user(regs->CP0_EPC, &sc->sc_pc);
2402

    
2403
    err |= __get_user(regs->active_tc.HI[0], &sc->sc_mdhi);
2404
    err |= __get_user(regs->active_tc.LO[0], &sc->sc_mdlo);
2405

    
2406
#define restore_gp_reg(i) do {                                                           \
2407
        err |= __get_user(regs->active_tc.gpr[i], &sc->sc_regs[i]);                \
2408
    } while(0)
2409
    restore_gp_reg( 1); restore_gp_reg( 2); restore_gp_reg( 3);
2410
    restore_gp_reg( 4); restore_gp_reg( 5); restore_gp_reg( 6);
2411
    restore_gp_reg( 7); restore_gp_reg( 8); restore_gp_reg( 9);
2412
    restore_gp_reg(10); restore_gp_reg(11); restore_gp_reg(12);
2413
    restore_gp_reg(13); restore_gp_reg(14); restore_gp_reg(15);
2414
    restore_gp_reg(16); restore_gp_reg(17); restore_gp_reg(18);
2415
    restore_gp_reg(19); restore_gp_reg(20); restore_gp_reg(21);
2416
    restore_gp_reg(22); restore_gp_reg(23); restore_gp_reg(24);
2417
    restore_gp_reg(25); restore_gp_reg(26); restore_gp_reg(27);
2418
    restore_gp_reg(28); restore_gp_reg(29); restore_gp_reg(30);
2419
    restore_gp_reg(31);
2420
#undef restore_gp_reg
2421

    
2422
#if 0
2423
    if (cpu_has_dsp) {
2424
        err |= __get_user(treg, &sc->sc_hi1); mthi1(treg);
2425
        err |= __get_user(treg, &sc->sc_lo1); mtlo1(treg);
2426
        err |= __get_user(treg, &sc->sc_hi2); mthi2(treg);
2427
        err |= __get_user(treg, &sc->sc_lo2); mtlo2(treg);
2428
        err |= __get_user(treg, &sc->sc_hi3); mthi3(treg);
2429
        err |= __get_user(treg, &sc->sc_lo3); mtlo3(treg);
2430
        err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK);
2431
    }
2432
#ifdef CONFIG_64BIT
2433
    err |= __get_user(regs->hi, &sc->sc_hi[0]);
2434
    err |= __get_user(regs->lo, &sc->sc_lo[0]);
2435
    if (cpu_has_dsp) {
2436
        err |= __get_user(treg, &sc->sc_hi[1]); mthi1(treg);
2437
        err |= __get_user(treg, &sc->sc_lo[1]); mthi1(treg);
2438
        err |= __get_user(treg, &sc->sc_hi[2]); mthi2(treg);
2439
        err |= __get_user(treg, &sc->sc_lo[2]); mthi2(treg);
2440
        err |= __get_user(treg, &sc->sc_hi[3]); mthi3(treg);
2441
        err |= __get_user(treg, &sc->sc_lo[3]); mthi3(treg);
2442
        err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK);
2443
    }
2444
#endif
2445

    
2446
    err |= __get_user(used_math, &sc->sc_used_math);
2447
    conditional_used_math(used_math);
2448

    
2449
    preempt_disable();
2450

    
2451
    if (used_math()) {
2452
        /* restore fpu context if we have used it before */
2453
        own_fpu();
2454
        err |= restore_fp_context(sc);
2455
    } else {
2456
        /* signal handler may have used FPU.  Give it up. */
2457
        lose_fpu();
2458
    }
2459

    
2460
    preempt_enable();
2461
#endif
2462
    return err;
2463
}
2464
/*
2465
 * Determine which stack to use..
2466
 */
2467
static inline abi_ulong
2468
get_sigframe(struct target_sigaction *ka, CPUState *regs, size_t frame_size)
2469
{
2470
    unsigned long sp;
2471

    
2472
    /* Default to using normal stack */
2473
    sp = regs->active_tc.gpr[29];
2474

    
2475
    /*
2476
     * FPU emulator may have it's own trampoline active just
2477
     * above the user stack, 16-bytes before the next lowest
2478
     * 16 byte boundary.  Try to avoid trashing it.
2479
     */
2480
    sp -= 32;
2481

    
2482
    /* This is the X/Open sanctioned signal stack switching.  */
2483
    if ((ka->sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags (sp) == 0)) {
2484
        sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
2485
    }
2486

    
2487
    return (sp - frame_size) & ~7;
2488
}
2489

    
2490
/* compare linux/arch/mips/kernel/signal.c:setup_frame() */
2491
static void setup_frame(int sig, struct target_sigaction * ka,
2492
                        target_sigset_t *set, CPUState *regs)
2493
{
2494
    struct sigframe *frame;
2495
    abi_ulong frame_addr;
2496
    int i;
2497

    
2498
    frame_addr = get_sigframe(ka, regs, sizeof(*frame));
2499
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
2500
        goto give_sigsegv;
2501

    
2502
    install_sigtramp(frame->sf_code, TARGET_NR_sigreturn);
2503

    
2504
    if(setup_sigcontext(regs, &frame->sf_sc))
2505
        goto give_sigsegv;
2506

    
2507
    for(i = 0; i < TARGET_NSIG_WORDS; i++) {
2508
        if(__put_user(set->sig[i], &frame->sf_mask.sig[i]))
2509
            goto give_sigsegv;
2510
    }
2511

    
2512
    /*
2513
    * Arguments to signal handler:
2514
    *
2515
    *   a0 = signal number
2516
    *   a1 = 0 (should be cause)
2517
    *   a2 = pointer to struct sigcontext
2518
    *
2519
    * $25 and PC point to the signal handler, $29 points to the
2520
    * struct sigframe.
2521
    */
2522
    regs->active_tc.gpr[ 4] = sig;
2523
    regs->active_tc.gpr[ 5] = 0;
2524
    regs->active_tc.gpr[ 6] = frame_addr + offsetof(struct sigframe, sf_sc);
2525
    regs->active_tc.gpr[29] = frame_addr;
2526
    regs->active_tc.gpr[31] = frame_addr + offsetof(struct sigframe, sf_code);
2527
    /* The original kernel code sets CP0_EPC to the handler
2528
    * since it returns to userland using eret
2529
    * we cannot do this here, and we must set PC directly */
2530
    regs->active_tc.PC = regs->active_tc.gpr[25] = ka->_sa_handler;
2531
    unlock_user_struct(frame, frame_addr, 1);
2532
    return;
2533

    
2534
give_sigsegv:
2535
    unlock_user_struct(frame, frame_addr, 1);
2536
    force_sig(TARGET_SIGSEGV/*, current*/);
2537
    return;
2538
}
2539

    
2540
long do_sigreturn(CPUState *regs)
2541
{
2542
    struct sigframe *frame;
2543
    abi_ulong frame_addr;
2544
    sigset_t blocked;
2545
    target_sigset_t target_set;
2546
    int i;
2547

    
2548
#if defined(DEBUG_SIGNAL)
2549
    fprintf(stderr, "do_sigreturn\n");
2550
#endif
2551
    frame_addr = regs->active_tc.gpr[29];
2552
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
2553
           goto badframe;
2554

    
2555
    for(i = 0; i < TARGET_NSIG_WORDS; i++) {
2556
           if(__get_user(target_set.sig[i], &frame->sf_mask.sig[i]))
2557
            goto badframe;
2558
    }
2559

    
2560
    target_to_host_sigset_internal(&blocked, &target_set);
2561
    sigprocmask(SIG_SETMASK, &blocked, NULL);
2562

    
2563
    if (restore_sigcontext(regs, &frame->sf_sc))
2564
           goto badframe;
2565

    
2566
#if 0
2567
    /*
2568
     * Don't let your children do this ...
2569
     */
2570
    __asm__ __volatile__(
2571
           "move\t$29, %0\n\t"
2572
           "j\tsyscall_exit"
2573
           :/* no outputs */
2574
           :"r" (&regs));
2575
    /* Unreached */
2576
#endif
2577

    
2578
    regs->active_tc.PC = regs->CP0_EPC;
2579
    /* I am not sure this is right, but it seems to work
2580
    * maybe a problem with nested signals ? */
2581
    regs->CP0_EPC = 0;
2582
    return 0;
2583

    
2584
badframe:
2585
    force_sig(TARGET_SIGSEGV/*, current*/);
2586
    return 0;
2587
}
2588

    
2589
static void setup_rt_frame(int sig, struct target_sigaction *ka,
2590
                           target_siginfo_t *info,
2591
                           target_sigset_t *set, CPUState *env)
2592
{
2593
    fprintf(stderr, "setup_rt_frame: not implemented\n");
2594
}
2595

    
2596
long do_rt_sigreturn(CPUState *env)
2597
{
2598
    fprintf(stderr, "do_rt_sigreturn: not implemented\n");
2599
    return -TARGET_ENOSYS;
2600
}
2601

    
2602
#elif defined(TARGET_SH4)
2603

    
2604
/*
2605
 * code and data structures from linux kernel:
2606
 * include/asm-sh/sigcontext.h
2607
 * arch/sh/kernel/signal.c
2608
 */
2609

    
2610
struct target_sigcontext {
2611
    target_ulong  oldmask;
2612

    
2613
    /* CPU registers */
2614
    target_ulong  sc_gregs[16];
2615
    target_ulong  sc_pc;
2616
    target_ulong  sc_pr;
2617
    target_ulong  sc_sr;
2618
    target_ulong  sc_gbr;
2619
    target_ulong  sc_mach;
2620
    target_ulong  sc_macl;
2621

    
2622
    /* FPU registers */
2623
    target_ulong  sc_fpregs[16];
2624
    target_ulong  sc_xfpregs[16];
2625
    unsigned int sc_fpscr;
2626
    unsigned int sc_fpul;
2627
    unsigned int sc_ownedfp;
2628
};
2629

    
2630
struct target_sigframe
2631
{
2632
    struct target_sigcontext sc;
2633
    target_ulong extramask[TARGET_NSIG_WORDS-1];
2634
    uint16_t retcode[3];
2635
};
2636

    
2637

    
2638
struct target_ucontext {
2639
    target_ulong uc_flags;
2640
    struct target_ucontext *uc_link;
2641
    target_stack_t uc_stack;
2642
    struct target_sigcontext uc_mcontext;
2643
    target_sigset_t uc_sigmask;        /* mask last for extensibility */
2644
};
2645

    
2646
struct target_rt_sigframe
2647
{
2648
    struct target_siginfo info;
2649
    struct target_ucontext uc;
2650
    uint16_t retcode[3];
2651
};
2652

    
2653

    
2654
#define MOVW(n)  (0x9300|((n)-2)) /* Move mem word at PC+n to R3 */
2655
#define TRAP_NOARG 0xc310         /* Syscall w/no args (NR in R3) SH3/4 */
2656

    
2657
static abi_ulong get_sigframe(struct target_sigaction *ka,
2658
                         unsigned long sp, size_t frame_size)
2659
{
2660
    if ((ka->sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags(sp) == 0)) {
2661
        sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
2662
    }
2663

    
2664
    return (sp - frame_size) & -8ul;
2665
}
2666

    
2667
static int setup_sigcontext(struct target_sigcontext *sc,
2668
                            CPUState *regs, unsigned long mask)
2669
{
2670
    int err = 0;
2671

    
2672
#define COPY(x)         err |= __put_user(regs->x, &sc->sc_##x)
2673
    COPY(gregs[0]); COPY(gregs[1]);
2674
    COPY(gregs[2]); COPY(gregs[3]);
2675
    COPY(gregs[4]); COPY(gregs[5]);
2676
    COPY(gregs[6]); COPY(gregs[7]);
2677
    COPY(gregs[8]); COPY(gregs[9]);
2678
    COPY(gregs[10]); COPY(gregs[11]);
2679
    COPY(gregs[12]); COPY(gregs[13]);
2680
    COPY(gregs[14]); COPY(gregs[15]);
2681
    COPY(gbr); COPY(mach);
2682
    COPY(macl); COPY(pr);
2683
    COPY(sr); COPY(pc);
2684
#undef COPY
2685

    
2686
    /* todo: save FPU registers here */
2687

    
2688
    /* non-iBCS2 extensions.. */
2689
    err |= __put_user(mask, &sc->oldmask);
2690

    
2691
    return err;
2692
}
2693

    
2694
static int restore_sigcontext(CPUState *regs,
2695
                              struct target_sigcontext *sc)
2696
{
2697
    unsigned int err = 0;
2698

    
2699
#define COPY(x)         err |= __get_user(regs->x, &sc->sc_##x)
2700
    COPY(gregs[1]);
2701
    COPY(gregs[2]); COPY(gregs[3]);
2702
    COPY(gregs[4]); COPY(gregs[5]);
2703
    COPY(gregs[6]); COPY(gregs[7]);
2704
    COPY(gregs[8]); COPY(gregs[9]);
2705
    COPY(gregs[10]); COPY(gregs[11]);
2706
    COPY(gregs[12]); COPY(gregs[13]);
2707
    COPY(gregs[14]); COPY(gregs[15]);
2708
    COPY(gbr); COPY(mach);
2709
    COPY(macl); COPY(pr);
2710
    COPY(sr); COPY(pc);
2711
#undef COPY
2712

    
2713
    /* todo: restore FPU registers here */
2714

    
2715
    regs->tra = -1;         /* disable syscall checks */
2716
    return err;
2717
}
2718

    
2719
static void setup_frame(int sig, struct target_sigaction *ka,
2720
                        target_sigset_t *set, CPUState *regs)
2721
{
2722
    struct target_sigframe *frame;
2723
    abi_ulong frame_addr;
2724
    int i;
2725
    int err = 0;
2726
    int signal;
2727

    
2728
    frame_addr = get_sigframe(ka, regs->gregs[15], sizeof(*frame));
2729
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
2730
        goto give_sigsegv;
2731

    
2732
    signal = current_exec_domain_sig(sig);
2733

    
2734
    err |= setup_sigcontext(&frame->sc, regs, set->sig[0]);
2735

    
2736
    for (i = 0; i < TARGET_NSIG_WORDS - 1; i++) {
2737
        err |= __put_user(set->sig[i + 1], &frame->extramask[i]);
2738
    }
2739

    
2740
    /* Set up to return from userspace.  If provided, use a stub
2741
       already in userspace.  */
2742
    if (ka->sa_flags & TARGET_SA_RESTORER) {
2743
        regs->pr = (unsigned long) ka->sa_restorer;
2744
    } else {
2745
        /* Generate return code (system call to sigreturn) */
2746
        err |= __put_user(MOVW(2), &frame->retcode[0]);
2747
        err |= __put_user(TRAP_NOARG, &frame->retcode[1]);
2748
        err |= __put_user((TARGET_NR_sigreturn), &frame->retcode[2]);
2749
        regs->pr = (unsigned long) frame->retcode;
2750
    }
2751

    
2752
    if (err)
2753
        goto give_sigsegv;
2754

    
2755
    /* Set up registers for signal handler */
2756
    regs->gregs[15] = (unsigned long) frame;
2757
    regs->gregs[4] = signal; /* Arg for signal handler */
2758
    regs->gregs[5] = 0;
2759
    regs->gregs[6] = (unsigned long) &frame->sc;
2760
    regs->pc = (unsigned long) ka->_sa_handler;
2761

    
2762
    unlock_user_struct(frame, frame_addr, 1);
2763
    return;
2764

    
2765
give_sigsegv:
2766
    unlock_user_struct(frame, frame_addr, 1);
2767
    force_sig(SIGSEGV);
2768
}
2769

    
2770
static void setup_rt_frame(int sig, struct target_sigaction *ka,
2771
                           target_siginfo_t *info,
2772
                           target_sigset_t *set, CPUState *regs)
2773
{
2774
    struct target_rt_sigframe *frame;
2775
    abi_ulong frame_addr;
2776
    int i;
2777
    int err = 0;
2778
    int signal;
2779

    
2780
    frame_addr = get_sigframe(ka, regs->gregs[15], sizeof(*frame));
2781
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
2782
        goto give_sigsegv;
2783

    
2784
    signal = current_exec_domain_sig(sig);
2785

    
2786
    err |= copy_siginfo_to_user(&frame->info, info);
2787

    
2788
    /* Create the ucontext.  */
2789
    err |= __put_user(0, &frame->uc.uc_flags);
2790
    err |= __put_user(0, (unsigned long *)&frame->uc.uc_link);
2791
    err |= __put_user((unsigned long)target_sigaltstack_used.ss_sp,
2792
                      &frame->uc.uc_stack.ss_sp);
2793
    err |= __put_user(sas_ss_flags(regs->gregs[15]),
2794
                      &frame->uc.uc_stack.ss_flags);
2795
    err |= __put_user(target_sigaltstack_used.ss_size,
2796
                      &frame->uc.uc_stack.ss_size);
2797
    err |= setup_sigcontext(&frame->uc.uc_mcontext,
2798
                            regs, set->sig[0]);
2799
    for(i = 0; i < TARGET_NSIG_WORDS; i++) {
2800
        err |= __put_user(set->sig[i], &frame->uc.uc_sigmask.sig[i]);
2801
    }
2802

    
2803
    /* Set up to return from userspace.  If provided, use a stub
2804
       already in userspace.  */
2805
    if (ka->sa_flags & TARGET_SA_RESTORER) {
2806
        regs->pr = (unsigned long) ka->sa_restorer;
2807
    } else {
2808
        /* Generate return code (system call to sigreturn) */
2809
        err |= __put_user(MOVW(2), &frame->retcode[0]);
2810
        err |= __put_user(TRAP_NOARG, &frame->retcode[1]);
2811
        err |= __put_user((TARGET_NR_rt_sigreturn), &frame->retcode[2]);
2812
        regs->pr = (unsigned long) frame->retcode;
2813
    }
2814

    
2815
    if (err)
2816
        goto give_sigsegv;
2817

    
2818
    /* Set up registers for signal handler */
2819
    regs->gregs[15] = (unsigned long) frame;
2820
    regs->gregs[4] = signal; /* Arg for signal handler */
2821
    regs->gregs[5] = (unsigned long) &frame->info;
2822
    regs->gregs[6] = (unsigned long) &frame->uc;
2823
    regs->pc = (unsigned long) ka->_sa_handler;
2824

    
2825
    unlock_user_struct(frame, frame_addr, 1);
2826
    return;
2827

    
2828
give_sigsegv:
2829
    unlock_user_struct(frame, frame_addr, 1);
2830
    force_sig(SIGSEGV);
2831
}
2832

    
2833
long do_sigreturn(CPUState *regs)
2834
{
2835
    struct target_sigframe *frame;
2836
    abi_ulong frame_addr;
2837
    sigset_t blocked;
2838
    target_sigset_t target_set;
2839
    int i;
2840
    int err = 0;
2841

    
2842
#if defined(DEBUG_SIGNAL)
2843
    fprintf(stderr, "do_sigreturn\n");
2844
#endif
2845
    frame_addr = regs->gregs[15];
2846
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
2847
           goto badframe;
2848

    
2849
    err |= __get_user(target_set.sig[0], &frame->sc.oldmask);
2850
    for(i = 1; i < TARGET_NSIG_WORDS; i++) {
2851
        err |= (__get_user(target_set.sig[i], &frame->extramask[i - 1]));
2852
    }
2853

    
2854
    if (err)
2855
        goto badframe;
2856

    
2857
    target_to_host_sigset_internal(&blocked, &target_set);
2858
    sigprocmask(SIG_SETMASK, &blocked, NULL);
2859

    
2860
    if (restore_sigcontext(regs, &frame->sc))
2861
        goto badframe;
2862

    
2863
    unlock_user_struct(frame, frame_addr, 0);
2864
    return regs->gregs[0];
2865

    
2866
badframe:
2867
    unlock_user_struct(frame, frame_addr, 0);
2868
    force_sig(TARGET_SIGSEGV);
2869
    return 0;
2870
}
2871

    
2872
long do_rt_sigreturn(CPUState *regs)
2873
{
2874
    struct target_rt_sigframe *frame;
2875
    abi_ulong frame_addr;
2876
    sigset_t blocked;
2877

    
2878
#if defined(DEBUG_SIGNAL)
2879
    fprintf(stderr, "do_rt_sigreturn\n");
2880
#endif
2881
    frame_addr = regs->gregs[15];
2882
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
2883
           goto badframe;
2884

    
2885
    target_to_host_sigset(&blocked, &frame->uc.uc_sigmask);
2886
    sigprocmask(SIG_SETMASK, &blocked, NULL);
2887

    
2888
    if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
2889
        goto badframe;
2890

    
2891
    if (do_sigaltstack(frame_addr +
2892
                       offsetof(struct target_rt_sigframe, uc.uc_stack),
2893
                       0, get_sp_from_cpustate(regs)) == -EFAULT)
2894
        goto badframe;
2895

    
2896
    unlock_user_struct(frame, frame_addr, 0);
2897
    return regs->gregs[0];
2898

    
2899
badframe:
2900
    unlock_user_struct(frame, frame_addr, 0);
2901
    force_sig(TARGET_SIGSEGV);
2902
    return 0;
2903
}
2904
#elif defined(TARGET_CRIS)
2905

    
2906
struct target_sigcontext {
2907
        struct target_pt_regs regs;  /* needs to be first */
2908
        uint32_t oldmask;
2909
        uint32_t usp;    /* usp before stacking this gunk on it */
2910
};
2911

    
2912
/* Signal frames. */
2913
struct target_signal_frame {
2914
        struct target_sigcontext sc;
2915
        uint32_t extramask[TARGET_NSIG_WORDS - 1];
2916
        uint8_t retcode[8];       /* Trampoline code. */
2917
};
2918

    
2919
struct rt_signal_frame {
2920
        struct siginfo *pinfo;
2921
        void *puc;
2922
        struct siginfo info;
2923
        struct ucontext uc;
2924
        uint8_t retcode[8];       /* Trampoline code. */
2925
};
2926

    
2927
static void setup_sigcontext(struct target_sigcontext *sc, CPUState *env)
2928
{
2929
        __put_user(env->regs[0], &sc->regs.r0);
2930
        __put_user(env->regs[1], &sc->regs.r1);
2931
        __put_user(env->regs[2], &sc->regs.r2);
2932
        __put_user(env->regs[3], &sc->regs.r3);
2933
        __put_user(env->regs[4], &sc->regs.r4);
2934
        __put_user(env->regs[5], &sc->regs.r5);
2935
        __put_user(env->regs[6], &sc->regs.r6);
2936
        __put_user(env->regs[7], &sc->regs.r7);
2937
        __put_user(env->regs[8], &sc->regs.r8);
2938
        __put_user(env->regs[9], &sc->regs.r9);
2939
        __put_user(env->regs[10], &sc->regs.r10);
2940
        __put_user(env->regs[11], &sc->regs.r11);
2941
        __put_user(env->regs[12], &sc->regs.r12);
2942
        __put_user(env->regs[13], &sc->regs.r13);
2943
        __put_user(env->regs[14], &sc->usp);
2944
        __put_user(env->regs[15], &sc->regs.acr);
2945
        __put_user(env->pregs[PR_MOF], &sc->regs.mof);
2946
        __put_user(env->pregs[PR_SRP], &sc->regs.srp);
2947
        __put_user(env->pc, &sc->regs.erp);
2948
}
2949

    
2950
static void restore_sigcontext(struct target_sigcontext *sc, CPUState *env)
2951
{
2952
        __get_user(env->regs[0], &sc->regs.r0);
2953
        __get_user(env->regs[1], &sc->regs.r1);
2954
        __get_user(env->regs[2], &sc->regs.r2);
2955
        __get_user(env->regs[3], &sc->regs.r3);
2956
        __get_user(env->regs[4], &sc->regs.r4);
2957
        __get_user(env->regs[5], &sc->regs.r5);
2958
        __get_user(env->regs[6], &sc->regs.r6);
2959
        __get_user(env->regs[7], &sc->regs.r7);
2960
        __get_user(env->regs[8], &sc->regs.r8);
2961
        __get_user(env->regs[9], &sc->regs.r9);
2962
        __get_user(env->regs[10], &sc->regs.r10);
2963
        __get_user(env->regs[11], &sc->regs.r11);
2964
        __get_user(env->regs[12], &sc->regs.r12);
2965
        __get_user(env->regs[13], &sc->regs.r13);
2966
        __get_user(env->regs[14], &sc->usp);
2967
        __get_user(env->regs[15], &sc->regs.acr);
2968
        __get_user(env->pregs[PR_MOF], &sc->regs.mof);
2969
        __get_user(env->pregs[PR_SRP], &sc->regs.srp);
2970
        __get_user(env->pc, &sc->regs.erp);
2971
}
2972

    
2973
static abi_ulong get_sigframe(CPUState *env, int framesize)
2974
{
2975
        abi_ulong sp;
2976
        /* Align the stack downwards to 4.  */
2977
        sp = (env->regs[R_SP] & ~3);
2978
        return sp - framesize;
2979
}
2980

    
2981
static void setup_frame(int sig, struct target_sigaction *ka,
2982
                        target_sigset_t *set, CPUState *env)
2983
{
2984
        struct target_signal_frame *frame;
2985
        abi_ulong frame_addr;
2986
        int err = 0;
2987
        int i;
2988

    
2989
        frame_addr = get_sigframe(env, sizeof *frame);
2990
        if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
2991
                goto badframe;
2992

    
2993
        /*
2994
         * The CRIS signal return trampoline. A real linux/CRIS kernel doesn't
2995
         * use this trampoline anymore but it sets it up for GDB.
2996
         * In QEMU, using the trampoline simplifies things a bit so we use it.
2997
         *
2998
         * This is movu.w __NR_sigreturn, r9; break 13;
2999
         */
3000
        err |= __put_user(0x9c5f, frame->retcode+0);
3001
        err |= __put_user(TARGET_NR_sigreturn, 
3002
                          frame->retcode+2);
3003
        err |= __put_user(0xe93d, frame->retcode+4);
3004

    
3005
        /* Save the mask.  */
3006
        err |= __put_user(set->sig[0], &frame->sc.oldmask);
3007
        if (err)
3008
                goto badframe;
3009

    
3010
        for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3011
                if (__put_user(set->sig[i], &frame->extramask[i - 1]))
3012
                        goto badframe;
3013
        }
3014

    
3015
        setup_sigcontext(&frame->sc, env);
3016

    
3017
        /* Move the stack and setup the arguments for the handler.  */
3018
        env->regs[R_SP] = (uint32_t) (unsigned long) frame;
3019
        env->regs[10] = sig;
3020
        env->pc = (unsigned long) ka->_sa_handler;
3021
        /* Link SRP so the guest returns through the trampoline.  */
3022
        env->pregs[PR_SRP] = (uint32_t) (unsigned long) &frame->retcode[0];
3023

    
3024
        unlock_user_struct(frame, frame_addr, 1);
3025
        return;
3026
  badframe:
3027
        unlock_user_struct(frame, frame_addr, 1);
3028
        force_sig(TARGET_SIGSEGV);
3029
}
3030

    
3031
static void setup_rt_frame(int sig, struct target_sigaction *ka,
3032
                           target_siginfo_t *info,
3033
                           target_sigset_t *set, CPUState *env)
3034
{
3035
    fprintf(stderr, "CRIS setup_rt_frame: not implemented\n");
3036
}
3037

    
3038
long do_sigreturn(CPUState *env)
3039
{
3040
        struct target_signal_frame *frame;
3041
        abi_ulong frame_addr;
3042
        target_sigset_t target_set;
3043
        sigset_t set;
3044
        int i;
3045

    
3046
        frame_addr = env->regs[R_SP];
3047
        /* Make sure the guest isn't playing games.  */
3048
        if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 1))
3049
                goto badframe;
3050

    
3051
        /* Restore blocked signals */
3052
        if (__get_user(target_set.sig[0], &frame->sc.oldmask))
3053
                goto badframe;
3054
        for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3055
                if (__get_user(target_set.sig[i], &frame->extramask[i - 1]))
3056
                        goto badframe;
3057
        }
3058
        target_to_host_sigset_internal(&set, &target_set);
3059
        sigprocmask(SIG_SETMASK, &set, NULL);
3060

    
3061
        restore_sigcontext(&frame->sc, env);
3062
        unlock_user_struct(frame, frame_addr, 0);
3063
        return env->regs[10];
3064
  badframe:
3065
        unlock_user_struct(frame, frame_addr, 0);
3066
        force_sig(TARGET_SIGSEGV);
3067
}
3068

    
3069
long do_rt_sigreturn(CPUState *env)
3070
{
3071
    fprintf(stderr, "CRIS do_rt_sigreturn: not implemented\n");
3072
    return -TARGET_ENOSYS;
3073
}
3074

    
3075
#else
3076

    
3077
static void setup_frame(int sig, struct target_sigaction *ka,
3078
                        target_sigset_t *set, CPUState *env)
3079
{
3080
    fprintf(stderr, "setup_frame: not implemented\n");
3081
}
3082

    
3083
static void setup_rt_frame(int sig, struct target_sigaction *ka,
3084
                           target_siginfo_t *info,
3085
                           target_sigset_t *set, CPUState *env)
3086
{
3087
    fprintf(stderr, "setup_rt_frame: not implemented\n");
3088
}
3089

    
3090
long do_sigreturn(CPUState *env)
3091
{
3092
    fprintf(stderr, "do_sigreturn: not implemented\n");
3093
    return -TARGET_ENOSYS;
3094
}
3095

    
3096
long do_rt_sigreturn(CPUState *env)
3097
{
3098
    fprintf(stderr, "do_rt_sigreturn: not implemented\n");
3099
    return -TARGET_ENOSYS;
3100
}
3101

    
3102
#endif
3103

    
3104
void process_pending_signals(CPUState *cpu_env)
3105
{
3106
    int sig;
3107
    abi_ulong handler;
3108
    sigset_t set, old_set;
3109
    target_sigset_t target_old_set;
3110
    struct emulated_sigtable *k;
3111
    struct target_sigaction *sa;
3112
    struct sigqueue *q;
3113
    TaskState *ts = cpu_env->opaque;
3114

    
3115
    if (!ts->signal_pending)
3116
        return;
3117

    
3118
    /* FIXME: This is not threadsafe.  */
3119
    k = ts->sigtab;
3120
    for(sig = 1; sig <= TARGET_NSIG; sig++) {
3121
        if (k->pending)
3122
            goto handle_signal;
3123
        k++;
3124
    }
3125
    /* if no signal is pending, just return */
3126
    ts->signal_pending = 0;
3127
    return;
3128

    
3129
 handle_signal:
3130
#ifdef DEBUG_SIGNAL
3131
    fprintf(stderr, "qemu: process signal %d\n", sig);
3132
#endif
3133
    /* dequeue signal */
3134
    q = k->first;
3135
    k->first = q->next;
3136
    if (!k->first)
3137
        k->pending = 0;
3138

    
3139
    sig = gdb_handlesig (cpu_env, sig);
3140
    if (!sig) {
3141
        sa = NULL;
3142
        handler = TARGET_SIG_IGN;
3143
    } else {
3144
        sa = &sigact_table[sig - 1];
3145
        handler = sa->_sa_handler;
3146
    }
3147

    
3148
    if (handler == TARGET_SIG_DFL) {
3149
        /* default handler : ignore some signal. The other are job control or fatal */
3150
        if (sig == TARGET_SIGTSTP || sig == TARGET_SIGTTIN || sig == TARGET_SIGTTOU) {
3151
            kill(getpid(),SIGSTOP);
3152
        } else if (sig != TARGET_SIGCHLD &&
3153
                   sig != TARGET_SIGURG &&
3154
                   sig != TARGET_SIGWINCH &&
3155
                   sig != TARGET_SIGCONT) {
3156
            force_sig(sig);
3157
        }
3158
    } else if (handler == TARGET_SIG_IGN) {
3159
        /* ignore sig */
3160
    } else if (handler == TARGET_SIG_ERR) {
3161
        force_sig(sig);
3162
    } else {
3163
        /* compute the blocked signals during the handler execution */
3164
        target_to_host_sigset(&set, &sa->sa_mask);
3165
        /* SA_NODEFER indicates that the current signal should not be
3166
           blocked during the handler */
3167
        if (!(sa->sa_flags & TARGET_SA_NODEFER))
3168
            sigaddset(&set, target_to_host_signal(sig));
3169

    
3170
        /* block signals in the handler using Linux */
3171
        sigprocmask(SIG_BLOCK, &set, &old_set);
3172
        /* save the previous blocked signal state to restore it at the
3173
           end of the signal execution (see do_sigreturn) */
3174
        host_to_target_sigset_internal(&target_old_set, &old_set);
3175

    
3176
        /* if the CPU is in VM86 mode, we restore the 32 bit values */
3177
#if defined(TARGET_I386) && !defined(TARGET_X86_64)
3178
        {
3179
            CPUX86State *env = cpu_env;
3180
            if (env->eflags & VM_MASK)
3181
                save_v86_state(env);
3182
        }
3183
#endif
3184
        /* prepare the stack frame of the virtual CPU */
3185
        if (sa->sa_flags & TARGET_SA_SIGINFO)
3186
            setup_rt_frame(sig, sa, &q->info, &target_old_set, cpu_env);
3187
        else
3188
            setup_frame(sig, sa, &target_old_set, cpu_env);
3189
        if (sa->sa_flags & TARGET_SA_RESETHAND)
3190
            sa->_sa_handler = TARGET_SIG_DFL;
3191
    }
3192
    if (q != &k->info)
3193
        free_sigqueue(cpu_env, q);
3194
}