Statistics
| Branch: | Revision:

root / linux-user / signal.c @ a6c6f76c

History | View | Annotate | Download (139.5 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, see <http://www.gnu.org/licenses/>.
18
 */
19
#include <stdlib.h>
20
#include <stdio.h>
21
#include <string.h>
22
#include <stdarg.h>
23
#include <unistd.h>
24
#include <signal.h>
25
#include <errno.h>
26
#include <assert.h>
27
#include <sys/ucontext.h>
28
#include <sys/resource.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[_NSIG] = {
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[_NSIG];
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
int host_to_target_signal(int sig)
105
{
106
    if (sig >= _NSIG)
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 >= _NSIG)
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
/* returns 1 if given signal should dump core if not handled */
290
static int core_dump_signal(int sig)
291
{
292
    switch (sig) {
293
    case TARGET_SIGABRT:
294
    case TARGET_SIGFPE:
295
    case TARGET_SIGILL:
296
    case TARGET_SIGQUIT:
297
    case TARGET_SIGSEGV:
298
    case TARGET_SIGTRAP:
299
    case TARGET_SIGBUS:
300
        return (1);
301
    default:
302
        return (0);
303
    }
304
}
305

    
306
void signal_init(void)
307
{
308
    struct sigaction act;
309
    struct sigaction oact;
310
    int i, j;
311
    int host_sig;
312

    
313
    /* generate signal conversion tables */
314
    for(i = 1; i < _NSIG; i++) {
315
        if (host_to_target_signal_table[i] == 0)
316
            host_to_target_signal_table[i] = i;
317
    }
318
    for(i = 1; i < _NSIG; i++) {
319
        j = host_to_target_signal_table[i];
320
        target_to_host_signal_table[j] = i;
321
    }
322

    
323
    /* set all host signal handlers. ALL signals are blocked during
324
       the handlers to serialize them. */
325
    memset(sigact_table, 0, sizeof(sigact_table));
326

    
327
    sigfillset(&act.sa_mask);
328
    act.sa_flags = SA_SIGINFO;
329
    act.sa_sigaction = host_signal_handler;
330
    for(i = 1; i <= TARGET_NSIG; i++) {
331
        host_sig = target_to_host_signal(i);
332
        sigaction(host_sig, NULL, &oact);
333
        if (oact.sa_sigaction == (void *)SIG_IGN) {
334
            sigact_table[i - 1]._sa_handler = TARGET_SIG_IGN;
335
        } else if (oact.sa_sigaction == (void *)SIG_DFL) {
336
            sigact_table[i - 1]._sa_handler = TARGET_SIG_DFL;
337
        }
338
        /* If there's already a handler installed then something has
339
           gone horribly wrong, so don't even try to handle that case.  */
340
        /* Install some handlers for our own use.  We need at least
341
           SIGSEGV and SIGBUS, to detect exceptions.  We can not just
342
           trap all signals because it affects syscall interrupt
343
           behavior.  But do trap all default-fatal signals.  */
344
        if (fatal_signal (i))
345
            sigaction(host_sig, &act, NULL);
346
    }
347
}
348

    
349
/* signal queue handling */
350

    
351
static inline struct sigqueue *alloc_sigqueue(CPUState *env)
352
{
353
    TaskState *ts = env->opaque;
354
    struct sigqueue *q = ts->first_free;
355
    if (!q)
356
        return NULL;
357
    ts->first_free = q->next;
358
    return q;
359
}
360

    
361
static inline void free_sigqueue(CPUState *env, struct sigqueue *q)
362
{
363
    TaskState *ts = env->opaque;
364
    q->next = ts->first_free;
365
    ts->first_free = q;
366
}
367

    
368
/* abort execution with signal */
369
static void QEMU_NORETURN force_sig(int target_sig)
370
{
371
    TaskState *ts = (TaskState *)thread_env->opaque;
372
    int host_sig, core_dumped = 0;
373
    struct sigaction act;
374
    host_sig = target_to_host_signal(target_sig);
375
    gdb_signalled(thread_env, target_sig);
376

    
377
    /* dump core if supported by target binary format */
378
    if (core_dump_signal(target_sig) && (ts->bprm->core_dump != NULL)) {
379
        stop_all_tasks();
380
        core_dumped =
381
            ((*ts->bprm->core_dump)(target_sig, thread_env) == 0);
382
    }
383
    if (core_dumped) {
384
        /* we already dumped the core of target process, we don't want
385
         * a coredump of qemu itself */
386
        struct rlimit nodump;
387
        getrlimit(RLIMIT_CORE, &nodump);
388
        nodump.rlim_cur=0;
389
        setrlimit(RLIMIT_CORE, &nodump);
390
        (void) fprintf(stderr, "qemu: uncaught target signal %d (%s) - %s\n",
391
            target_sig, strsignal(host_sig), "core dumped" );
392
    }
393

    
394
    /* The proper exit code for dieing from an uncaught signal is
395
     * -<signal>.  The kernel doesn't allow exit() or _exit() to pass
396
     * a negative value.  To get the proper exit code we need to
397
     * actually die from an uncaught signal.  Here the default signal
398
     * handler is installed, we send ourself a signal and we wait for
399
     * it to arrive. */
400
    sigfillset(&act.sa_mask);
401
    act.sa_handler = SIG_DFL;
402
    sigaction(host_sig, &act, NULL);
403

    
404
    /* For some reason raise(host_sig) doesn't send the signal when
405
     * statically linked on x86-64. */
406
    kill(getpid(), host_sig);
407

    
408
    /* Make sure the signal isn't masked (just reuse the mask inside
409
    of act) */
410
    sigdelset(&act.sa_mask, host_sig);
411
    sigsuspend(&act.sa_mask);
412

    
413
    /* unreachable */
414
    assert(0);
415
    abort();
416
}
417

    
418
/* queue a signal so that it will be send to the virtual CPU as soon
419
   as possible */
420
int queue_signal(CPUState *env, int sig, target_siginfo_t *info)
421
{
422
    TaskState *ts = env->opaque;
423
    struct emulated_sigtable *k;
424
    struct sigqueue *q, **pq;
425
    abi_ulong handler;
426
    int queue;
427

    
428
#if defined(DEBUG_SIGNAL)
429
    fprintf(stderr, "queue_signal: sig=%d\n",
430
            sig);
431
#endif
432
    k = &ts->sigtab[sig - 1];
433
    queue = gdb_queuesig ();
434
    handler = sigact_table[sig - 1]._sa_handler;
435
    if (!queue && handler == TARGET_SIG_DFL) {
436
        if (sig == TARGET_SIGTSTP || sig == TARGET_SIGTTIN || sig == TARGET_SIGTTOU) {
437
            kill(getpid(),SIGSTOP);
438
            return 0;
439
        } else
440
        /* default handler : ignore some signal. The other are fatal */
441
        if (sig != TARGET_SIGCHLD &&
442
            sig != TARGET_SIGURG &&
443
            sig != TARGET_SIGWINCH &&
444
            sig != TARGET_SIGCONT) {
445
            force_sig(sig);
446
        } else {
447
            return 0; /* indicate ignored */
448
        }
449
    } else if (!queue && handler == TARGET_SIG_IGN) {
450
        /* ignore signal */
451
        return 0;
452
    } else if (!queue && handler == TARGET_SIG_ERR) {
453
        force_sig(sig);
454
    } else {
455
        pq = &k->first;
456
        if (sig < TARGET_SIGRTMIN) {
457
            /* if non real time signal, we queue exactly one signal */
458
            if (!k->pending)
459
                q = &k->info;
460
            else
461
                return 0;
462
        } else {
463
            if (!k->pending) {
464
                /* first signal */
465
                q = &k->info;
466
            } else {
467
                q = alloc_sigqueue(env);
468
                if (!q)
469
                    return -EAGAIN;
470
                while (*pq != NULL)
471
                    pq = &(*pq)->next;
472
            }
473
        }
474
        *pq = q;
475
        q->info = *info;
476
        q->next = NULL;
477
        k->pending = 1;
478
        /* signal that a new signal is pending */
479
        ts->signal_pending = 1;
480
        return 1; /* indicates that the signal was queued */
481
    }
482
}
483

    
484
static void host_signal_handler(int host_signum, siginfo_t *info,
485
                                void *puc)
486
{
487
    int sig;
488
    target_siginfo_t tinfo;
489

    
490
    /* the CPU emulator uses some host signals to detect exceptions,
491
       we forward to it some signals */
492
    if ((host_signum == SIGSEGV || host_signum == SIGBUS)
493
        && info->si_code > 0) {
494
        if (cpu_signal_handler(host_signum, info, puc))
495
            return;
496
    }
497

    
498
    /* get target signal number */
499
    sig = host_to_target_signal(host_signum);
500
    if (sig < 1 || sig > TARGET_NSIG)
501
        return;
502
#if defined(DEBUG_SIGNAL)
503
    fprintf(stderr, "qemu: got signal %d\n", sig);
504
#endif
505
    host_to_target_siginfo_noswap(&tinfo, info);
506
    if (queue_signal(thread_env, sig, &tinfo) == 1) {
507
        /* interrupt the virtual CPU as soon as possible */
508
        cpu_exit(thread_env);
509
    }
510
}
511

    
512
/* do_sigaltstack() returns target values and errnos. */
513
/* compare linux/kernel/signal.c:do_sigaltstack() */
514
abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong uoss_addr, abi_ulong sp)
515
{
516
    int ret;
517
    struct target_sigaltstack oss;
518

    
519
    /* XXX: test errors */
520
    if(uoss_addr)
521
    {
522
        __put_user(target_sigaltstack_used.ss_sp, &oss.ss_sp);
523
        __put_user(target_sigaltstack_used.ss_size, &oss.ss_size);
524
        __put_user(sas_ss_flags(sp), &oss.ss_flags);
525
    }
526

    
527
    if(uss_addr)
528
    {
529
        struct target_sigaltstack *uss;
530
        struct target_sigaltstack ss;
531

    
532
        ret = -TARGET_EFAULT;
533
        if (!lock_user_struct(VERIFY_READ, uss, uss_addr, 1)
534
            || __get_user(ss.ss_sp, &uss->ss_sp)
535
            || __get_user(ss.ss_size, &uss->ss_size)
536
            || __get_user(ss.ss_flags, &uss->ss_flags))
537
            goto out;
538
        unlock_user_struct(uss, uss_addr, 0);
539

    
540
        ret = -TARGET_EPERM;
541
        if (on_sig_stack(sp))
542
            goto out;
543

    
544
        ret = -TARGET_EINVAL;
545
        if (ss.ss_flags != TARGET_SS_DISABLE
546
            && ss.ss_flags != TARGET_SS_ONSTACK
547
            && ss.ss_flags != 0)
548
            goto out;
549

    
550
        if (ss.ss_flags == TARGET_SS_DISABLE) {
551
            ss.ss_size = 0;
552
            ss.ss_sp = 0;
553
        } else {
554
            ret = -TARGET_ENOMEM;
555
            if (ss.ss_size < MINSIGSTKSZ)
556
                goto out;
557
        }
558

    
559
        target_sigaltstack_used.ss_sp = ss.ss_sp;
560
        target_sigaltstack_used.ss_size = ss.ss_size;
561
    }
562

    
563
    if (uoss_addr) {
564
        ret = -TARGET_EFAULT;
565
        if (copy_to_user(uoss_addr, &oss, sizeof(oss)))
566
            goto out;
567
    }
568

    
569
    ret = 0;
570
out:
571
    return ret;
572
}
573

    
574
/* do_sigaction() return host values and errnos */
575
int do_sigaction(int sig, const struct target_sigaction *act,
576
                 struct target_sigaction *oact)
577
{
578
    struct target_sigaction *k;
579
    struct sigaction act1;
580
    int host_sig;
581
    int ret = 0;
582

    
583
    if (sig < 1 || sig > TARGET_NSIG || sig == TARGET_SIGKILL || sig == TARGET_SIGSTOP)
584
        return -EINVAL;
585
    k = &sigact_table[sig - 1];
586
#if defined(DEBUG_SIGNAL)
587
    fprintf(stderr, "sigaction sig=%d act=0x%p, oact=0x%p\n",
588
            sig, act, oact);
589
#endif
590
    if (oact) {
591
        oact->_sa_handler = tswapl(k->_sa_handler);
592
        oact->sa_flags = tswapl(k->sa_flags);
593
#if !defined(TARGET_MIPS)
594
        oact->sa_restorer = tswapl(k->sa_restorer);
595
#endif
596
        oact->sa_mask = k->sa_mask;
597
    }
598
    if (act) {
599
        /* FIXME: This is not threadsafe.  */
600
        k->_sa_handler = tswapl(act->_sa_handler);
601
        k->sa_flags = tswapl(act->sa_flags);
602
#if !defined(TARGET_MIPS)
603
        k->sa_restorer = tswapl(act->sa_restorer);
604
#endif
605
        k->sa_mask = act->sa_mask;
606

    
607
        /* we update the host linux signal state */
608
        host_sig = target_to_host_signal(sig);
609
        if (host_sig != SIGSEGV && host_sig != SIGBUS) {
610
            sigfillset(&act1.sa_mask);
611
            act1.sa_flags = SA_SIGINFO;
612
            if (k->sa_flags & TARGET_SA_RESTART)
613
                act1.sa_flags |= SA_RESTART;
614
            /* NOTE: it is important to update the host kernel signal
615
               ignore state to avoid getting unexpected interrupted
616
               syscalls */
617
            if (k->_sa_handler == TARGET_SIG_IGN) {
618
                act1.sa_sigaction = (void *)SIG_IGN;
619
            } else if (k->_sa_handler == TARGET_SIG_DFL) {
620
                if (fatal_signal (sig))
621
                    act1.sa_sigaction = host_signal_handler;
622
                else
623
                    act1.sa_sigaction = (void *)SIG_DFL;
624
            } else {
625
                act1.sa_sigaction = host_signal_handler;
626
            }
627
            ret = sigaction(host_sig, &act1, NULL);
628
        }
629
    }
630
    return ret;
631
}
632

    
633
static inline int copy_siginfo_to_user(target_siginfo_t *tinfo,
634
                                       const target_siginfo_t *info)
635
{
636
    tswap_siginfo(tinfo, info);
637
    return 0;
638
}
639

    
640
static inline int current_exec_domain_sig(int sig)
641
{
642
    return /* current->exec_domain && current->exec_domain->signal_invmap
643
              && sig < 32 ? current->exec_domain->signal_invmap[sig] : */ sig;
644
}
645

    
646
#if defined(TARGET_I386) && TARGET_ABI_BITS == 32
647

    
648
/* from the Linux kernel */
649

    
650
struct target_fpreg {
651
        uint16_t significand[4];
652
        uint16_t exponent;
653
};
654

    
655
struct target_fpxreg {
656
        uint16_t significand[4];
657
        uint16_t exponent;
658
        uint16_t padding[3];
659
};
660

    
661
struct target_xmmreg {
662
        abi_ulong element[4];
663
};
664

    
665
struct target_fpstate {
666
        /* Regular FPU environment */
667
        abi_ulong       cw;
668
        abi_ulong       sw;
669
        abi_ulong       tag;
670
        abi_ulong       ipoff;
671
        abi_ulong       cssel;
672
        abi_ulong       dataoff;
673
        abi_ulong       datasel;
674
        struct target_fpreg        _st[8];
675
        uint16_t        status;
676
        uint16_t        magic;                /* 0xffff = regular FPU data only */
677

    
678
        /* FXSR FPU environment */
679
        abi_ulong       _fxsr_env[6];   /* FXSR FPU env is ignored */
680
        abi_ulong       mxcsr;
681
        abi_ulong       reserved;
682
        struct target_fpxreg        _fxsr_st[8];        /* FXSR FPU reg data is ignored */
683
        struct target_xmmreg        _xmm[8];
684
        abi_ulong       padding[56];
685
};
686

    
687
#define X86_FXSR_MAGIC                0x0000
688

    
689
struct target_sigcontext {
690
        uint16_t gs, __gsh;
691
        uint16_t fs, __fsh;
692
        uint16_t es, __esh;
693
        uint16_t ds, __dsh;
694
        abi_ulong edi;
695
        abi_ulong esi;
696
        abi_ulong ebp;
697
        abi_ulong esp;
698
        abi_ulong ebx;
699
        abi_ulong edx;
700
        abi_ulong ecx;
701
        abi_ulong eax;
702
        abi_ulong trapno;
703
        abi_ulong err;
704
        abi_ulong eip;
705
        uint16_t cs, __csh;
706
        abi_ulong eflags;
707
        abi_ulong esp_at_signal;
708
        uint16_t ss, __ssh;
709
        abi_ulong fpstate; /* pointer */
710
        abi_ulong oldmask;
711
        abi_ulong cr2;
712
};
713

    
714
struct target_ucontext {
715
        abi_ulong         tuc_flags;
716
        abi_ulong         tuc_link;
717
        target_stack_t          tuc_stack;
718
        struct target_sigcontext tuc_mcontext;
719
        target_sigset_t          tuc_sigmask;        /* mask last for extensibility */
720
};
721

    
722
struct sigframe
723
{
724
    abi_ulong pretcode;
725
    int sig;
726
    struct target_sigcontext sc;
727
    struct target_fpstate fpstate;
728
    abi_ulong extramask[TARGET_NSIG_WORDS-1];
729
    char retcode[8];
730
};
731

    
732
struct rt_sigframe
733
{
734
    abi_ulong pretcode;
735
    int sig;
736
    abi_ulong pinfo;
737
    abi_ulong puc;
738
    struct target_siginfo info;
739
    struct target_ucontext uc;
740
    struct target_fpstate fpstate;
741
    char retcode[8];
742
};
743

    
744
/*
745
 * Set up a signal frame.
746
 */
747

    
748
/* XXX: save x87 state */
749
static int
750
setup_sigcontext(struct target_sigcontext *sc, struct target_fpstate *fpstate,
751
                 CPUX86State *env, abi_ulong mask, abi_ulong fpstate_addr)
752
{
753
        int err = 0;
754
        uint16_t magic;
755

    
756
        /* already locked in setup_frame() */
757
        err |= __put_user(env->segs[R_GS].selector, (unsigned int *)&sc->gs);
758
        err |= __put_user(env->segs[R_FS].selector, (unsigned int *)&sc->fs);
759
        err |= __put_user(env->segs[R_ES].selector, (unsigned int *)&sc->es);
760
        err |= __put_user(env->segs[R_DS].selector, (unsigned int *)&sc->ds);
761
        err |= __put_user(env->regs[R_EDI], &sc->edi);
762
        err |= __put_user(env->regs[R_ESI], &sc->esi);
763
        err |= __put_user(env->regs[R_EBP], &sc->ebp);
764
        err |= __put_user(env->regs[R_ESP], &sc->esp);
765
        err |= __put_user(env->regs[R_EBX], &sc->ebx);
766
        err |= __put_user(env->regs[R_EDX], &sc->edx);
767
        err |= __put_user(env->regs[R_ECX], &sc->ecx);
768
        err |= __put_user(env->regs[R_EAX], &sc->eax);
769
        err |= __put_user(env->exception_index, &sc->trapno);
770
        err |= __put_user(env->error_code, &sc->err);
771
        err |= __put_user(env->eip, &sc->eip);
772
        err |= __put_user(env->segs[R_CS].selector, (unsigned int *)&sc->cs);
773
        err |= __put_user(env->eflags, &sc->eflags);
774
        err |= __put_user(env->regs[R_ESP], &sc->esp_at_signal);
775
        err |= __put_user(env->segs[R_SS].selector, (unsigned int *)&sc->ss);
776

    
777
        cpu_x86_fsave(env, fpstate_addr, 1);
778
        fpstate->status = fpstate->sw;
779
        magic = 0xffff;
780
        err |= __put_user(magic, &fpstate->magic);
781
        err |= __put_user(fpstate_addr, &sc->fpstate);
782

    
783
        /* non-iBCS2 extensions.. */
784
        err |= __put_user(mask, &sc->oldmask);
785
        err |= __put_user(env->cr[2], &sc->cr2);
786
        return err;
787
}
788

    
789
/*
790
 * Determine which stack to use..
791
 */
792

    
793
static inline abi_ulong
794
get_sigframe(struct target_sigaction *ka, CPUX86State *env, size_t frame_size)
795
{
796
        unsigned long esp;
797

    
798
        /* Default to using normal stack */
799
        esp = env->regs[R_ESP];
800
        /* This is the X/Open sanctioned signal stack switching.  */
801
        if (ka->sa_flags & TARGET_SA_ONSTACK) {
802
            if (sas_ss_flags(esp) == 0)
803
                esp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
804
        }
805

    
806
        /* This is the legacy signal stack switching. */
807
        else
808
        if ((env->segs[R_SS].selector & 0xffff) != __USER_DS &&
809
            !(ka->sa_flags & TARGET_SA_RESTORER) &&
810
            ka->sa_restorer) {
811
            esp = (unsigned long) ka->sa_restorer;
812
        }
813
        return (esp - frame_size) & -8ul;
814
}
815

    
816
/* compare linux/arch/i386/kernel/signal.c:setup_frame() */
817
static void setup_frame(int sig, struct target_sigaction *ka,
818
                        target_sigset_t *set, CPUX86State *env)
819
{
820
        abi_ulong frame_addr;
821
        struct sigframe *frame;
822
        int i, err = 0;
823

    
824
        frame_addr = get_sigframe(ka, env, sizeof(*frame));
825

    
826
        if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
827
                goto give_sigsegv;
828

    
829
        err |= __put_user(current_exec_domain_sig(sig),
830
                          &frame->sig);
831
        if (err)
832
                goto give_sigsegv;
833

    
834
        setup_sigcontext(&frame->sc, &frame->fpstate, env, set->sig[0],
835
                         frame_addr + offsetof(struct sigframe, fpstate));
836
        if (err)
837
                goto give_sigsegv;
838

    
839
        for(i = 1; i < TARGET_NSIG_WORDS; i++) {
840
            if (__put_user(set->sig[i], &frame->extramask[i - 1]))
841
                goto give_sigsegv;
842
        }
843

    
844
        /* Set up to return from userspace.  If provided, use a stub
845
           already in userspace.  */
846
        if (ka->sa_flags & TARGET_SA_RESTORER) {
847
                err |= __put_user(ka->sa_restorer, &frame->pretcode);
848
        } else {
849
                uint16_t val16;
850
                abi_ulong retcode_addr;
851
                retcode_addr = frame_addr + offsetof(struct sigframe, retcode);
852
                err |= __put_user(retcode_addr, &frame->pretcode);
853
                /* This is popl %eax ; movl $,%eax ; int $0x80 */
854
                val16 = 0xb858;
855
                err |= __put_user(val16, (uint16_t *)(frame->retcode+0));
856
                err |= __put_user(TARGET_NR_sigreturn, (int *)(frame->retcode+2));
857
                val16 = 0x80cd;
858
                err |= __put_user(val16, (uint16_t *)(frame->retcode+6));
859
        }
860

    
861
        if (err)
862
                goto give_sigsegv;
863

    
864
        /* Set up registers for signal handler */
865
        env->regs[R_ESP] = frame_addr;
866
        env->eip = ka->_sa_handler;
867

    
868
        cpu_x86_load_seg(env, R_DS, __USER_DS);
869
        cpu_x86_load_seg(env, R_ES, __USER_DS);
870
        cpu_x86_load_seg(env, R_SS, __USER_DS);
871
        cpu_x86_load_seg(env, R_CS, __USER_CS);
872
        env->eflags &= ~TF_MASK;
873

    
874
        unlock_user_struct(frame, frame_addr, 1);
875

    
876
        return;
877

    
878
give_sigsegv:
879
        unlock_user_struct(frame, frame_addr, 1);
880
        if (sig == TARGET_SIGSEGV)
881
                ka->_sa_handler = TARGET_SIG_DFL;
882
        force_sig(TARGET_SIGSEGV /* , current */);
883
}
884

    
885
/* compare linux/arch/i386/kernel/signal.c:setup_rt_frame() */
886
static void setup_rt_frame(int sig, struct target_sigaction *ka,
887
                           target_siginfo_t *info,
888
                           target_sigset_t *set, CPUX86State *env)
889
{
890
        abi_ulong frame_addr, addr;
891
        struct rt_sigframe *frame;
892
        int i, err = 0;
893

    
894
        frame_addr = get_sigframe(ka, env, sizeof(*frame));
895

    
896
        if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
897
                goto give_sigsegv;
898

    
899
        err |= __put_user(current_exec_domain_sig(sig),
900
                          &frame->sig);
901
        addr = frame_addr + offsetof(struct rt_sigframe, info);
902
        err |= __put_user(addr, &frame->pinfo);
903
        addr = frame_addr + offsetof(struct rt_sigframe, uc);
904
        err |= __put_user(addr, &frame->puc);
905
        err |= copy_siginfo_to_user(&frame->info, info);
906
        if (err)
907
                goto give_sigsegv;
908

    
909
        /* Create the ucontext.  */
910
        err |= __put_user(0, &frame->uc.tuc_flags);
911
        err |= __put_user(0, &frame->uc.tuc_link);
912
        err |= __put_user(target_sigaltstack_used.ss_sp,
913
                          &frame->uc.tuc_stack.ss_sp);
914
        err |= __put_user(sas_ss_flags(get_sp_from_cpustate(env)),
915
                          &frame->uc.tuc_stack.ss_flags);
916
        err |= __put_user(target_sigaltstack_used.ss_size,
917
                          &frame->uc.tuc_stack.ss_size);
918
        err |= setup_sigcontext(&frame->uc.tuc_mcontext, &frame->fpstate,
919
                                env, set->sig[0], 
920
                                frame_addr + offsetof(struct rt_sigframe, fpstate));
921
        for(i = 0; i < TARGET_NSIG_WORDS; i++) {
922
            if (__put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]))
923
                goto give_sigsegv;
924
        }
925

    
926
        /* Set up to return from userspace.  If provided, use a stub
927
           already in userspace.  */
928
        if (ka->sa_flags & TARGET_SA_RESTORER) {
929
                err |= __put_user(ka->sa_restorer, &frame->pretcode);
930
        } else {
931
                uint16_t val16;
932
                addr = frame_addr + offsetof(struct rt_sigframe, retcode);
933
                err |= __put_user(addr, &frame->pretcode);
934
                /* This is movl $,%eax ; int $0x80 */
935
                err |= __put_user(0xb8, (char *)(frame->retcode+0));
936
                err |= __put_user(TARGET_NR_rt_sigreturn, (int *)(frame->retcode+1));
937
                val16 = 0x80cd;
938
                err |= __put_user(val16, (uint16_t *)(frame->retcode+5));
939
        }
940

    
941
        if (err)
942
                goto give_sigsegv;
943

    
944
        /* Set up registers for signal handler */
945
        env->regs[R_ESP] = frame_addr;
946
        env->eip = ka->_sa_handler;
947

    
948
        cpu_x86_load_seg(env, R_DS, __USER_DS);
949
        cpu_x86_load_seg(env, R_ES, __USER_DS);
950
        cpu_x86_load_seg(env, R_SS, __USER_DS);
951
        cpu_x86_load_seg(env, R_CS, __USER_CS);
952
        env->eflags &= ~TF_MASK;
953

    
954
        unlock_user_struct(frame, frame_addr, 1);
955

    
956
        return;
957

    
958
give_sigsegv:
959
        unlock_user_struct(frame, frame_addr, 1);
960
        if (sig == TARGET_SIGSEGV)
961
                ka->_sa_handler = TARGET_SIG_DFL;
962
        force_sig(TARGET_SIGSEGV /* , current */);
963
}
964

    
965
static int
966
restore_sigcontext(CPUX86State *env, struct target_sigcontext *sc, int *peax)
967
{
968
        unsigned int err = 0;
969
        abi_ulong fpstate_addr;
970
        unsigned int tmpflags;
971

    
972
        cpu_x86_load_seg(env, R_GS, tswap16(sc->gs));
973
        cpu_x86_load_seg(env, R_FS, tswap16(sc->fs));
974
        cpu_x86_load_seg(env, R_ES, tswap16(sc->es));
975
        cpu_x86_load_seg(env, R_DS, tswap16(sc->ds));
976

    
977
        env->regs[R_EDI] = tswapl(sc->edi);
978
        env->regs[R_ESI] = tswapl(sc->esi);
979
        env->regs[R_EBP] = tswapl(sc->ebp);
980
        env->regs[R_ESP] = tswapl(sc->esp);
981
        env->regs[R_EBX] = tswapl(sc->ebx);
982
        env->regs[R_EDX] = tswapl(sc->edx);
983
        env->regs[R_ECX] = tswapl(sc->ecx);
984
        env->eip = tswapl(sc->eip);
985

    
986
        cpu_x86_load_seg(env, R_CS, lduw(&sc->cs) | 3);
987
        cpu_x86_load_seg(env, R_SS, lduw(&sc->ss) | 3);
988

    
989
        tmpflags = tswapl(sc->eflags);
990
        env->eflags = (env->eflags & ~0x40DD5) | (tmpflags & 0x40DD5);
991
        //                regs->orig_eax = -1;                /* disable syscall checks */
992

    
993
        fpstate_addr = tswapl(sc->fpstate);
994
        if (fpstate_addr != 0) {
995
                if (!access_ok(VERIFY_READ, fpstate_addr, 
996
                               sizeof(struct target_fpstate)))
997
                        goto badframe;
998
                cpu_x86_frstor(env, fpstate_addr, 1);
999
        }
1000

    
1001
        *peax = tswapl(sc->eax);
1002
        return err;
1003
badframe:
1004
        return 1;
1005
}
1006

    
1007
long do_sigreturn(CPUX86State *env)
1008
{
1009
    struct sigframe *frame;
1010
    abi_ulong frame_addr = env->regs[R_ESP] - 8;
1011
    target_sigset_t target_set;
1012
    sigset_t set;
1013
    int eax, i;
1014

    
1015
#if defined(DEBUG_SIGNAL)
1016
    fprintf(stderr, "do_sigreturn\n");
1017
#endif
1018
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1019
        goto badframe;
1020
    /* set blocked signals */
1021
    if (__get_user(target_set.sig[0], &frame->sc.oldmask))
1022
        goto badframe;
1023
    for(i = 1; i < TARGET_NSIG_WORDS; i++) {
1024
        if (__get_user(target_set.sig[i], &frame->extramask[i - 1]))
1025
            goto badframe;
1026
    }
1027

    
1028
    target_to_host_sigset_internal(&set, &target_set);
1029
    sigprocmask(SIG_SETMASK, &set, NULL);
1030

    
1031
    /* restore registers */
1032
    if (restore_sigcontext(env, &frame->sc, &eax))
1033
        goto badframe;
1034
    unlock_user_struct(frame, frame_addr, 0);
1035
    return eax;
1036

    
1037
badframe:
1038
    unlock_user_struct(frame, frame_addr, 0);
1039
    force_sig(TARGET_SIGSEGV);
1040
    return 0;
1041
}
1042

    
1043
long do_rt_sigreturn(CPUX86State *env)
1044
{
1045
        abi_ulong frame_addr;
1046
        struct rt_sigframe *frame;
1047
        sigset_t set;
1048
        int eax;
1049

    
1050
        frame_addr = env->regs[R_ESP] - 4;
1051
        if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1052
                goto badframe;
1053
        target_to_host_sigset(&set, &frame->uc.tuc_sigmask);
1054
        sigprocmask(SIG_SETMASK, &set, NULL);
1055

    
1056
        if (restore_sigcontext(env, &frame->uc.tuc_mcontext, &eax))
1057
                goto badframe;
1058

    
1059
        if (do_sigaltstack(frame_addr + offsetof(struct rt_sigframe, uc.tuc_stack), 0, 
1060
                           get_sp_from_cpustate(env)) == -EFAULT)
1061
                goto badframe;
1062

    
1063
        unlock_user_struct(frame, frame_addr, 0);
1064
        return eax;
1065

    
1066
badframe:
1067
        unlock_user_struct(frame, frame_addr, 0);
1068
        force_sig(TARGET_SIGSEGV);
1069
        return 0;
1070
}
1071

    
1072
#elif defined(TARGET_ARM)
1073

    
1074
struct target_sigcontext {
1075
        abi_ulong trap_no;
1076
        abi_ulong error_code;
1077
        abi_ulong oldmask;
1078
        abi_ulong arm_r0;
1079
        abi_ulong arm_r1;
1080
        abi_ulong arm_r2;
1081
        abi_ulong arm_r3;
1082
        abi_ulong arm_r4;
1083
        abi_ulong arm_r5;
1084
        abi_ulong arm_r6;
1085
        abi_ulong arm_r7;
1086
        abi_ulong arm_r8;
1087
        abi_ulong arm_r9;
1088
        abi_ulong arm_r10;
1089
        abi_ulong arm_fp;
1090
        abi_ulong arm_ip;
1091
        abi_ulong arm_sp;
1092
        abi_ulong arm_lr;
1093
        abi_ulong arm_pc;
1094
        abi_ulong arm_cpsr;
1095
        abi_ulong fault_address;
1096
};
1097

    
1098
struct target_ucontext_v1 {
1099
    abi_ulong tuc_flags;
1100
    abi_ulong tuc_link;
1101
    target_stack_t tuc_stack;
1102
    struct target_sigcontext tuc_mcontext;
1103
    target_sigset_t  tuc_sigmask;        /* mask last for extensibility */
1104
};
1105

    
1106
struct target_ucontext_v2 {
1107
    abi_ulong tuc_flags;
1108
    abi_ulong tuc_link;
1109
    target_stack_t tuc_stack;
1110
    struct target_sigcontext tuc_mcontext;
1111
    target_sigset_t  tuc_sigmask;        /* mask last for extensibility */
1112
    char __unused[128 - sizeof(sigset_t)];
1113
    abi_ulong tuc_regspace[128] __attribute__((__aligned__(8)));
1114
};
1115

    
1116
struct sigframe_v1
1117
{
1118
    struct target_sigcontext sc;
1119
    abi_ulong extramask[TARGET_NSIG_WORDS-1];
1120
    abi_ulong retcode;
1121
};
1122

    
1123
struct sigframe_v2
1124
{
1125
    struct target_ucontext_v2 uc;
1126
    abi_ulong retcode;
1127
};
1128

    
1129
struct rt_sigframe_v1
1130
{
1131
    abi_ulong pinfo;
1132
    abi_ulong puc;
1133
    struct target_siginfo info;
1134
    struct target_ucontext_v1 uc;
1135
    abi_ulong retcode;
1136
};
1137

    
1138
struct rt_sigframe_v2
1139
{
1140
    struct target_siginfo info;
1141
    struct target_ucontext_v2 uc;
1142
    abi_ulong retcode;
1143
};
1144

    
1145
#define TARGET_CONFIG_CPU_32 1
1146

    
1147
/*
1148
 * For ARM syscalls, we encode the syscall number into the instruction.
1149
 */
1150
#define SWI_SYS_SIGRETURN        (0xef000000|(TARGET_NR_sigreturn + ARM_SYSCALL_BASE))
1151
#define SWI_SYS_RT_SIGRETURN        (0xef000000|(TARGET_NR_rt_sigreturn + ARM_SYSCALL_BASE))
1152

    
1153
/*
1154
 * For Thumb syscalls, we pass the syscall number via r7.  We therefore
1155
 * need two 16-bit instructions.
1156
 */
1157
#define SWI_THUMB_SIGRETURN        (0xdf00 << 16 | 0x2700 | (TARGET_NR_sigreturn))
1158
#define SWI_THUMB_RT_SIGRETURN        (0xdf00 << 16 | 0x2700 | (TARGET_NR_rt_sigreturn))
1159

    
1160
static const abi_ulong retcodes[4] = {
1161
        SWI_SYS_SIGRETURN,        SWI_THUMB_SIGRETURN,
1162
        SWI_SYS_RT_SIGRETURN,        SWI_THUMB_RT_SIGRETURN
1163
};
1164

    
1165

    
1166
#define __get_user_error(x,p,e) __get_user(x, p)
1167

    
1168
static inline int valid_user_regs(CPUState *regs)
1169
{
1170
    return 1;
1171
}
1172

    
1173
static void
1174
setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/
1175
                 CPUState *env, abi_ulong mask)
1176
{
1177
        __put_user(env->regs[0], &sc->arm_r0);
1178
        __put_user(env->regs[1], &sc->arm_r1);
1179
        __put_user(env->regs[2], &sc->arm_r2);
1180
        __put_user(env->regs[3], &sc->arm_r3);
1181
        __put_user(env->regs[4], &sc->arm_r4);
1182
        __put_user(env->regs[5], &sc->arm_r5);
1183
        __put_user(env->regs[6], &sc->arm_r6);
1184
        __put_user(env->regs[7], &sc->arm_r7);
1185
        __put_user(env->regs[8], &sc->arm_r8);
1186
        __put_user(env->regs[9], &sc->arm_r9);
1187
        __put_user(env->regs[10], &sc->arm_r10);
1188
        __put_user(env->regs[11], &sc->arm_fp);
1189
        __put_user(env->regs[12], &sc->arm_ip);
1190
        __put_user(env->regs[13], &sc->arm_sp);
1191
        __put_user(env->regs[14], &sc->arm_lr);
1192
        __put_user(env->regs[15], &sc->arm_pc);
1193
#ifdef TARGET_CONFIG_CPU_32
1194
        __put_user(cpsr_read(env), &sc->arm_cpsr);
1195
#endif
1196

    
1197
        __put_user(/* current->thread.trap_no */ 0, &sc->trap_no);
1198
        __put_user(/* current->thread.error_code */ 0, &sc->error_code);
1199
        __put_user(/* current->thread.address */ 0, &sc->fault_address);
1200
        __put_user(mask, &sc->oldmask);
1201
}
1202

    
1203
static inline abi_ulong
1204
get_sigframe(struct target_sigaction *ka, CPUState *regs, int framesize)
1205
{
1206
        unsigned long sp = regs->regs[13];
1207

    
1208
        /*
1209
         * This is the X/Open sanctioned signal stack switching.
1210
         */
1211
        if ((ka->sa_flags & TARGET_SA_ONSTACK) && !sas_ss_flags(sp))
1212
            sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
1213
        /*
1214
         * ATPCS B01 mandates 8-byte alignment
1215
         */
1216
        return (sp - framesize) & ~7;
1217
}
1218

    
1219
static int
1220
setup_return(CPUState *env, struct target_sigaction *ka,
1221
             abi_ulong *rc, abi_ulong frame_addr, int usig, abi_ulong rc_addr)
1222
{
1223
        abi_ulong handler = ka->_sa_handler;
1224
        abi_ulong retcode;
1225
        int thumb = handler & 1;
1226

    
1227
        if (ka->sa_flags & TARGET_SA_RESTORER) {
1228
                retcode = ka->sa_restorer;
1229
        } else {
1230
                unsigned int idx = thumb;
1231

    
1232
                if (ka->sa_flags & TARGET_SA_SIGINFO)
1233
                        idx += 2;
1234

    
1235
                if (__put_user(retcodes[idx], rc))
1236
                        return 1;
1237
#if 0
1238
                flush_icache_range((abi_ulong)rc,
1239
                                   (abi_ulong)(rc + 1));
1240
#endif
1241
                retcode = rc_addr + thumb;
1242
        }
1243

    
1244
        env->regs[0] = usig;
1245
        env->regs[13] = frame_addr;
1246
        env->regs[14] = retcode;
1247
        env->regs[15] = handler & (thumb ? ~1 : ~3);
1248
        env->thumb = thumb;
1249

    
1250
#if 0
1251
#ifdef TARGET_CONFIG_CPU_32
1252
        env->cpsr = cpsr;
1253
#endif
1254
#endif
1255

    
1256
        return 0;
1257
}
1258

    
1259
static void setup_sigframe_v2(struct target_ucontext_v2 *uc,
1260
                              target_sigset_t *set, CPUState *env)
1261
{
1262
    struct target_sigaltstack stack;
1263
    int i;
1264

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

    
1268
    memset(&stack, 0, sizeof(stack));
1269
    __put_user(target_sigaltstack_used.ss_sp, &stack.ss_sp);
1270
    __put_user(target_sigaltstack_used.ss_size, &stack.ss_size);
1271
    __put_user(sas_ss_flags(get_sp_from_cpustate(env)), &stack.ss_flags);
1272
    memcpy(&uc->tuc_stack, &stack, sizeof(stack));
1273

    
1274
    setup_sigcontext(&uc->tuc_mcontext, env, set->sig[0]);
1275
    /* FIXME: Save coprocessor signal frame.  */
1276
    for(i = 0; i < TARGET_NSIG_WORDS; i++) {
1277
        __put_user(set->sig[i], &uc->tuc_sigmask.sig[i]);
1278
    }
1279
}
1280

    
1281
/* compare linux/arch/arm/kernel/signal.c:setup_frame() */
1282
static void setup_frame_v1(int usig, struct target_sigaction *ka,
1283
                           target_sigset_t *set, CPUState *regs)
1284
{
1285
        struct sigframe_v1 *frame;
1286
        abi_ulong frame_addr = get_sigframe(ka, regs, sizeof(*frame));
1287
        int i;
1288

    
1289
        if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
1290
                return;
1291

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

    
1294
        for(i = 1; i < TARGET_NSIG_WORDS; i++) {
1295
            if (__put_user(set->sig[i], &frame->extramask[i - 1]))
1296
                goto end;
1297
        }
1298

    
1299
        setup_return(regs, ka, &frame->retcode, frame_addr, usig,
1300
                     frame_addr + offsetof(struct sigframe_v1, retcode));
1301

    
1302
end:
1303
        unlock_user_struct(frame, frame_addr, 1);
1304
}
1305

    
1306
static void setup_frame_v2(int usig, struct target_sigaction *ka,
1307
                           target_sigset_t *set, CPUState *regs)
1308
{
1309
        struct sigframe_v2 *frame;
1310
        abi_ulong frame_addr = get_sigframe(ka, regs, sizeof(*frame));
1311

    
1312
        if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
1313
                return;
1314

    
1315
        setup_sigframe_v2(&frame->uc, set, regs);
1316

    
1317
        setup_return(regs, ka, &frame->retcode, frame_addr, usig,
1318
                     frame_addr + offsetof(struct sigframe_v2, retcode));
1319

    
1320
        unlock_user_struct(frame, frame_addr, 1);
1321
}
1322

    
1323
static void setup_frame(int usig, struct target_sigaction *ka,
1324
                        target_sigset_t *set, CPUState *regs)
1325
{
1326
    if (get_osversion() >= 0x020612) {
1327
        setup_frame_v2(usig, ka, set, regs);
1328
    } else {
1329
        setup_frame_v1(usig, ka, set, regs);
1330
    }
1331
}
1332

    
1333
/* compare linux/arch/arm/kernel/signal.c:setup_rt_frame() */
1334
static void setup_rt_frame_v1(int usig, struct target_sigaction *ka,
1335
                              target_siginfo_t *info,
1336
                              target_sigset_t *set, CPUState *env)
1337
{
1338
        struct rt_sigframe_v1 *frame;
1339
        abi_ulong frame_addr = get_sigframe(ka, env, sizeof(*frame));
1340
        struct target_sigaltstack stack;
1341
        int i;
1342
        abi_ulong info_addr, uc_addr;
1343

    
1344
        if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
1345
            return /* 1 */;
1346

    
1347
        info_addr = frame_addr + offsetof(struct rt_sigframe_v1, info);
1348
        __put_user(info_addr, &frame->pinfo);
1349
        uc_addr = frame_addr + offsetof(struct rt_sigframe_v1, uc);
1350
        __put_user(uc_addr, &frame->puc);
1351
        copy_siginfo_to_user(&frame->info, info);
1352

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

    
1356
        memset(&stack, 0, sizeof(stack));
1357
        __put_user(target_sigaltstack_used.ss_sp, &stack.ss_sp);
1358
        __put_user(target_sigaltstack_used.ss_size, &stack.ss_size);
1359
        __put_user(sas_ss_flags(get_sp_from_cpustate(env)), &stack.ss_flags);
1360
        memcpy(&frame->uc.tuc_stack, &stack, sizeof(stack));
1361

    
1362
        setup_sigcontext(&frame->uc.tuc_mcontext, env, set->sig[0]);
1363
        for(i = 0; i < TARGET_NSIG_WORDS; i++) {
1364
            if (__put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]))
1365
                goto end;
1366
        }
1367

    
1368
        setup_return(env, ka, &frame->retcode, frame_addr, usig,
1369
                     frame_addr + offsetof(struct rt_sigframe_v1, retcode));
1370

    
1371
        env->regs[1] = info_addr;
1372
        env->regs[2] = uc_addr;
1373

    
1374
end:
1375
        unlock_user_struct(frame, frame_addr, 1);
1376
}
1377

    
1378
static void setup_rt_frame_v2(int usig, struct target_sigaction *ka,
1379
                              target_siginfo_t *info,
1380
                              target_sigset_t *set, CPUState *env)
1381
{
1382
        struct rt_sigframe_v2 *frame;
1383
        abi_ulong frame_addr = get_sigframe(ka, env, sizeof(*frame));
1384
        abi_ulong info_addr, uc_addr;
1385

    
1386
        if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
1387
            return /* 1 */;
1388

    
1389
        info_addr = frame_addr + offsetof(struct rt_sigframe_v2, info);
1390
        uc_addr = frame_addr + offsetof(struct rt_sigframe_v2, uc);
1391
        copy_siginfo_to_user(&frame->info, info);
1392

    
1393
        setup_sigframe_v2(&frame->uc, set, env);
1394

    
1395
        setup_return(env, ka, &frame->retcode, frame_addr, usig,
1396
                     frame_addr + offsetof(struct rt_sigframe_v2, retcode));
1397

    
1398
        env->regs[1] = info_addr;
1399
        env->regs[2] = uc_addr;
1400

    
1401
        unlock_user_struct(frame, frame_addr, 1);
1402
}
1403

    
1404
static void setup_rt_frame(int usig, struct target_sigaction *ka,
1405
                           target_siginfo_t *info,
1406
                           target_sigset_t *set, CPUState *env)
1407
{
1408
    if (get_osversion() >= 0x020612) {
1409
        setup_rt_frame_v2(usig, ka, info, set, env);
1410
    } else {
1411
        setup_rt_frame_v1(usig, ka, info, set, env);
1412
    }
1413
}
1414

    
1415
static int
1416
restore_sigcontext(CPUState *env, struct target_sigcontext *sc)
1417
{
1418
        int err = 0;
1419
        uint32_t cpsr;
1420

    
1421
        __get_user_error(env->regs[0], &sc->arm_r0, err);
1422
        __get_user_error(env->regs[1], &sc->arm_r1, err);
1423
        __get_user_error(env->regs[2], &sc->arm_r2, err);
1424
        __get_user_error(env->regs[3], &sc->arm_r3, err);
1425
        __get_user_error(env->regs[4], &sc->arm_r4, err);
1426
        __get_user_error(env->regs[5], &sc->arm_r5, err);
1427
        __get_user_error(env->regs[6], &sc->arm_r6, err);
1428
        __get_user_error(env->regs[7], &sc->arm_r7, err);
1429
        __get_user_error(env->regs[8], &sc->arm_r8, err);
1430
        __get_user_error(env->regs[9], &sc->arm_r9, err);
1431
        __get_user_error(env->regs[10], &sc->arm_r10, err);
1432
        __get_user_error(env->regs[11], &sc->arm_fp, err);
1433
        __get_user_error(env->regs[12], &sc->arm_ip, err);
1434
        __get_user_error(env->regs[13], &sc->arm_sp, err);
1435
        __get_user_error(env->regs[14], &sc->arm_lr, err);
1436
        __get_user_error(env->regs[15], &sc->arm_pc, err);
1437
#ifdef TARGET_CONFIG_CPU_32
1438
        __get_user_error(cpsr, &sc->arm_cpsr, err);
1439
        cpsr_write(env, cpsr, CPSR_USER | CPSR_EXEC);
1440
#endif
1441

    
1442
        err |= !valid_user_regs(env);
1443

    
1444
        return err;
1445
}
1446

    
1447
static long do_sigreturn_v1(CPUState *env)
1448
{
1449
        abi_ulong frame_addr;
1450
        struct sigframe_v1 *frame;
1451
        target_sigset_t set;
1452
        sigset_t host_set;
1453
        int i;
1454

    
1455
        /*
1456
         * Since we stacked the signal on a 64-bit boundary,
1457
         * then 'sp' should be word aligned here.  If it's
1458
         * not, then the user is trying to mess with us.
1459
         */
1460
        if (env->regs[13] & 7)
1461
                goto badframe;
1462

    
1463
        frame_addr = env->regs[13];
1464
        if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1465
                goto badframe;
1466

    
1467
        if (__get_user(set.sig[0], &frame->sc.oldmask))
1468
            goto badframe;
1469
        for(i = 1; i < TARGET_NSIG_WORDS; i++) {
1470
            if (__get_user(set.sig[i], &frame->extramask[i - 1]))
1471
                goto badframe;
1472
        }
1473

    
1474
        target_to_host_sigset_internal(&host_set, &set);
1475
        sigprocmask(SIG_SETMASK, &host_set, NULL);
1476

    
1477
        if (restore_sigcontext(env, &frame->sc))
1478
                goto badframe;
1479

    
1480
#if 0
1481
        /* Send SIGTRAP if we're single-stepping */
1482
        if (ptrace_cancel_bpt(current))
1483
                send_sig(SIGTRAP, current, 1);
1484
#endif
1485
        unlock_user_struct(frame, frame_addr, 0);
1486
        return env->regs[0];
1487

    
1488
badframe:
1489
        unlock_user_struct(frame, frame_addr, 0);
1490
        force_sig(TARGET_SIGSEGV /* , current */);
1491
        return 0;
1492
}
1493

    
1494
static int do_sigframe_return_v2(CPUState *env, target_ulong frame_addr,
1495
                                 struct target_ucontext_v2 *uc)
1496
{
1497
    sigset_t host_set;
1498

    
1499
    target_to_host_sigset(&host_set, &uc->tuc_sigmask);
1500
    sigprocmask(SIG_SETMASK, &host_set, NULL);
1501

    
1502
    if (restore_sigcontext(env, &uc->tuc_mcontext))
1503
        return 1;
1504

    
1505
    if (do_sigaltstack(frame_addr + offsetof(struct target_ucontext_v2, tuc_stack), 0, get_sp_from_cpustate(env)) == -EFAULT)
1506
        return 1;
1507

    
1508
#if 0
1509
    /* Send SIGTRAP if we're single-stepping */
1510
    if (ptrace_cancel_bpt(current))
1511
            send_sig(SIGTRAP, current, 1);
1512
#endif
1513

    
1514
    return 0;
1515
}
1516

    
1517
static long do_sigreturn_v2(CPUState *env)
1518
{
1519
        abi_ulong frame_addr;
1520
        struct sigframe_v2 *frame;
1521

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

    
1530
        frame_addr = env->regs[13];
1531
        if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1532
                goto badframe;
1533

    
1534
        if (do_sigframe_return_v2(env, frame_addr, &frame->uc))
1535
                goto badframe;
1536

    
1537
        unlock_user_struct(frame, frame_addr, 0);
1538
        return env->regs[0];
1539

    
1540
badframe:
1541
        unlock_user_struct(frame, frame_addr, 0);
1542
        force_sig(TARGET_SIGSEGV /* , current */);
1543
        return 0;
1544
}
1545

    
1546
long do_sigreturn(CPUState *env)
1547
{
1548
    if (get_osversion() >= 0x020612) {
1549
        return do_sigreturn_v2(env);
1550
    } else {
1551
        return do_sigreturn_v1(env);
1552
    }
1553
}
1554

    
1555
static long do_rt_sigreturn_v1(CPUState *env)
1556
{
1557
        abi_ulong frame_addr;
1558
        struct rt_sigframe_v1 *frame;
1559
        sigset_t host_set;
1560

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

    
1569
        frame_addr = env->regs[13];
1570
        if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1571
                goto badframe;
1572

    
1573
        target_to_host_sigset(&host_set, &frame->uc.tuc_sigmask);
1574
        sigprocmask(SIG_SETMASK, &host_set, NULL);
1575

    
1576
        if (restore_sigcontext(env, &frame->uc.tuc_mcontext))
1577
                goto badframe;
1578

    
1579
        if (do_sigaltstack(frame_addr + offsetof(struct rt_sigframe_v1, uc.tuc_stack), 0, get_sp_from_cpustate(env)) == -EFAULT)
1580
                goto badframe;
1581

    
1582
#if 0
1583
        /* Send SIGTRAP if we're single-stepping */
1584
        if (ptrace_cancel_bpt(current))
1585
                send_sig(SIGTRAP, current, 1);
1586
#endif
1587
        unlock_user_struct(frame, frame_addr, 0);
1588
        return env->regs[0];
1589

    
1590
badframe:
1591
        unlock_user_struct(frame, frame_addr, 0);
1592
        force_sig(TARGET_SIGSEGV /* , current */);
1593
        return 0;
1594
}
1595

    
1596
static long do_rt_sigreturn_v2(CPUState *env)
1597
{
1598
        abi_ulong frame_addr;
1599
        struct rt_sigframe_v2 *frame;
1600

    
1601
        /*
1602
         * Since we stacked the signal on a 64-bit boundary,
1603
         * then 'sp' should be word aligned here.  If it's
1604
         * not, then the user is trying to mess with us.
1605
         */
1606
        if (env->regs[13] & 7)
1607
                goto badframe;
1608

    
1609
        frame_addr = env->regs[13];
1610
        if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1611
                goto badframe;
1612

    
1613
        if (do_sigframe_return_v2(env, frame_addr, &frame->uc))
1614
                goto badframe;
1615

    
1616
        unlock_user_struct(frame, frame_addr, 0);
1617
        return env->regs[0];
1618

    
1619
badframe:
1620
        unlock_user_struct(frame, frame_addr, 0);
1621
        force_sig(TARGET_SIGSEGV /* , current */);
1622
        return 0;
1623
}
1624

    
1625
long do_rt_sigreturn(CPUState *env)
1626
{
1627
    if (get_osversion() >= 0x020612) {
1628
        return do_rt_sigreturn_v2(env);
1629
    } else {
1630
        return do_rt_sigreturn_v1(env);
1631
    }
1632
}
1633

    
1634
#elif defined(TARGET_SPARC)
1635

    
1636
#define __SUNOS_MAXWIN   31
1637

    
1638
/* This is what SunOS does, so shall I. */
1639
struct target_sigcontext {
1640
        abi_ulong sigc_onstack;      /* state to restore */
1641

    
1642
        abi_ulong sigc_mask;         /* sigmask to restore */
1643
        abi_ulong sigc_sp;           /* stack pointer */
1644
        abi_ulong sigc_pc;           /* program counter */
1645
        abi_ulong sigc_npc;          /* next program counter */
1646
        abi_ulong sigc_psr;          /* for condition codes etc */
1647
        abi_ulong sigc_g1;           /* User uses these two registers */
1648
        abi_ulong sigc_o0;           /* within the trampoline code. */
1649

    
1650
        /* Now comes information regarding the users window set
1651
         * at the time of the signal.
1652
         */
1653
        abi_ulong sigc_oswins;       /* outstanding windows */
1654

    
1655
        /* stack ptrs for each regwin buf */
1656
        char *sigc_spbuf[__SUNOS_MAXWIN];
1657

    
1658
        /* Windows to restore after signal */
1659
        struct {
1660
                abi_ulong locals[8];
1661
                abi_ulong ins[8];
1662
        } sigc_wbuf[__SUNOS_MAXWIN];
1663
};
1664
/* A Sparc stack frame */
1665
struct sparc_stackf {
1666
        abi_ulong locals[8];
1667
        abi_ulong ins[6];
1668
        struct sparc_stackf *fp;
1669
        abi_ulong callers_pc;
1670
        char *structptr;
1671
        abi_ulong xargs[6];
1672
        abi_ulong xxargs[1];
1673
};
1674

    
1675
typedef struct {
1676
        struct {
1677
                abi_ulong psr;
1678
                abi_ulong pc;
1679
                abi_ulong npc;
1680
                abi_ulong y;
1681
                abi_ulong u_regs[16]; /* globals and ins */
1682
        }               si_regs;
1683
        int             si_mask;
1684
} __siginfo_t;
1685

    
1686
typedef struct {
1687
        unsigned   long si_float_regs [32];
1688
        unsigned   long si_fsr;
1689
        unsigned   long si_fpqdepth;
1690
        struct {
1691
                unsigned long *insn_addr;
1692
                unsigned long insn;
1693
        } si_fpqueue [16];
1694
} qemu_siginfo_fpu_t;
1695

    
1696

    
1697
struct target_signal_frame {
1698
        struct sparc_stackf        ss;
1699
        __siginfo_t                info;
1700
        abi_ulong               fpu_save;
1701
        abi_ulong                insns[2] __attribute__ ((aligned (8)));
1702
        abi_ulong                extramask[TARGET_NSIG_WORDS - 1];
1703
        abi_ulong                extra_size; /* Should be 0 */
1704
        qemu_siginfo_fpu_t        fpu_state;
1705
};
1706
struct target_rt_signal_frame {
1707
        struct sparc_stackf        ss;
1708
        siginfo_t                info;
1709
        abi_ulong                regs[20];
1710
        sigset_t                mask;
1711
        abi_ulong               fpu_save;
1712
        unsigned int                insns[2];
1713
        stack_t                        stack;
1714
        unsigned int                extra_size; /* Should be 0 */
1715
        qemu_siginfo_fpu_t        fpu_state;
1716
};
1717

    
1718
#define UREG_O0        16
1719
#define UREG_O6        22
1720
#define UREG_I0        0
1721
#define UREG_I1        1
1722
#define UREG_I2        2
1723
#define UREG_I3        3
1724
#define UREG_I4        4
1725
#define UREG_I5        5
1726
#define UREG_I6        6
1727
#define UREG_I7        7
1728
#define UREG_L0               8
1729
#define UREG_FP        UREG_I6
1730
#define UREG_SP        UREG_O6
1731

    
1732
static inline abi_ulong get_sigframe(struct target_sigaction *sa, 
1733
                                     CPUState *env, unsigned long framesize)
1734
{
1735
        abi_ulong sp;
1736

    
1737
        sp = env->regwptr[UREG_FP];
1738

    
1739
        /* This is the X/Open sanctioned signal stack switching.  */
1740
        if (sa->sa_flags & TARGET_SA_ONSTACK) {
1741
            if (!on_sig_stack(sp)
1742
                && !((target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size) & 7))
1743
                sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
1744
        }
1745
        return sp - framesize;
1746
}
1747

    
1748
static int
1749
setup___siginfo(__siginfo_t *si, CPUState *env, abi_ulong mask)
1750
{
1751
        int err = 0, i;
1752

    
1753
        err |= __put_user(env->psr, &si->si_regs.psr);
1754
        err |= __put_user(env->pc, &si->si_regs.pc);
1755
        err |= __put_user(env->npc, &si->si_regs.npc);
1756
        err |= __put_user(env->y, &si->si_regs.y);
1757
        for (i=0; i < 8; i++) {
1758
                err |= __put_user(env->gregs[i], &si->si_regs.u_regs[i]);
1759
        }
1760
        for (i=0; i < 8; i++) {
1761
                err |= __put_user(env->regwptr[UREG_I0 + i], &si->si_regs.u_regs[i+8]);
1762
        }
1763
        err |= __put_user(mask, &si->si_mask);
1764
        return err;
1765
}
1766

    
1767
#if 0
1768
static int
1769
setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/
1770
                 CPUState *env, unsigned long mask)
1771
{
1772
        int err = 0;
1773

1774
        err |= __put_user(mask, &sc->sigc_mask);
1775
        err |= __put_user(env->regwptr[UREG_SP], &sc->sigc_sp);
1776
        err |= __put_user(env->pc, &sc->sigc_pc);
1777
        err |= __put_user(env->npc, &sc->sigc_npc);
1778
        err |= __put_user(env->psr, &sc->sigc_psr);
1779
        err |= __put_user(env->gregs[1], &sc->sigc_g1);
1780
        err |= __put_user(env->regwptr[UREG_O0], &sc->sigc_o0);
1781

1782
        return err;
1783
}
1784
#endif
1785
#define NF_ALIGNEDSZ  (((sizeof(struct target_signal_frame) + 7) & (~7)))
1786

    
1787
static void setup_frame(int sig, struct target_sigaction *ka,
1788
                        target_sigset_t *set, CPUState *env)
1789
{
1790
        abi_ulong sf_addr;
1791
        struct target_signal_frame *sf;
1792
        int sigframe_size, err, i;
1793

    
1794
        /* 1. Make sure everything is clean */
1795
        //synchronize_user_stack();
1796

    
1797
        sigframe_size = NF_ALIGNEDSZ;
1798
        sf_addr = get_sigframe(ka, env, sigframe_size);
1799

    
1800
        sf = lock_user(VERIFY_WRITE, sf_addr, 
1801
                       sizeof(struct target_signal_frame), 0);
1802
        if (!sf)
1803
                goto sigsegv;
1804
                
1805
        //fprintf(stderr, "sf: %x pc %x fp %x sp %x\n", sf, env->pc, env->regwptr[UREG_FP], env->regwptr[UREG_SP]);
1806
#if 0
1807
        if (invalid_frame_pointer(sf, sigframe_size))
1808
                goto sigill_and_return;
1809
#endif
1810
        /* 2. Save the current process state */
1811
        err = setup___siginfo(&sf->info, env, set->sig[0]);
1812
        err |= __put_user(0, &sf->extra_size);
1813

    
1814
        //err |= save_fpu_state(regs, &sf->fpu_state);
1815
        //err |= __put_user(&sf->fpu_state, &sf->fpu_save);
1816

    
1817
        err |= __put_user(set->sig[0], &sf->info.si_mask);
1818
        for (i = 0; i < TARGET_NSIG_WORDS - 1; i++) {
1819
                err |= __put_user(set->sig[i + 1], &sf->extramask[i]);
1820
        }
1821

    
1822
        for (i = 0; i < 8; i++) {
1823
                  err |= __put_user(env->regwptr[i + UREG_L0], &sf->ss.locals[i]);
1824
        }
1825
        for (i = 0; i < 8; i++) {
1826
                  err |= __put_user(env->regwptr[i + UREG_I0], &sf->ss.ins[i]);
1827
        }
1828
        if (err)
1829
                goto sigsegv;
1830

    
1831
        /* 3. signal handler back-trampoline and parameters */
1832
        env->regwptr[UREG_FP] = sf_addr;
1833
        env->regwptr[UREG_I0] = sig;
1834
        env->regwptr[UREG_I1] = sf_addr + 
1835
                offsetof(struct target_signal_frame, info);
1836
        env->regwptr[UREG_I2] = sf_addr + 
1837
                offsetof(struct target_signal_frame, info);
1838

    
1839
        /* 4. signal handler */
1840
        env->pc = ka->_sa_handler;
1841
        env->npc = (env->pc + 4);
1842
        /* 5. return to kernel instructions */
1843
        if (ka->sa_restorer)
1844
                env->regwptr[UREG_I7] = ka->sa_restorer;
1845
        else {
1846
                uint32_t val32;
1847

    
1848
                env->regwptr[UREG_I7] = sf_addr + 
1849
                        offsetof(struct target_signal_frame, insns) - 2 * 4;
1850

    
1851
                /* mov __NR_sigreturn, %g1 */
1852
                val32 = 0x821020d8;
1853
                err |= __put_user(val32, &sf->insns[0]);
1854

    
1855
                /* t 0x10 */
1856
                val32 = 0x91d02010;
1857
                err |= __put_user(val32, &sf->insns[1]);
1858
                if (err)
1859
                        goto sigsegv;
1860

    
1861
                /* Flush instruction space. */
1862
                //flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0]));
1863
                //                tb_flush(env);
1864
        }
1865
        unlock_user(sf, sf_addr, sizeof(struct target_signal_frame));
1866
        return;
1867
#if 0
1868
sigill_and_return:
1869
        force_sig(TARGET_SIGILL);
1870
#endif
1871
sigsegv:
1872
        //fprintf(stderr, "force_sig\n");
1873
        unlock_user(sf, sf_addr, sizeof(struct target_signal_frame));
1874
        force_sig(TARGET_SIGSEGV);
1875
}
1876
static inline int
1877
restore_fpu_state(CPUState *env, qemu_siginfo_fpu_t *fpu)
1878
{
1879
        int err;
1880
#if 0
1881
#ifdef CONFIG_SMP
1882
        if (current->flags & PF_USEDFPU)
1883
                regs->psr &= ~PSR_EF;
1884
#else
1885
        if (current == last_task_used_math) {
1886
                last_task_used_math = 0;
1887
                regs->psr &= ~PSR_EF;
1888
        }
1889
#endif
1890
        current->used_math = 1;
1891
        current->flags &= ~PF_USEDFPU;
1892
#endif
1893
#if 0
1894
        if (verify_area (VERIFY_READ, fpu, sizeof(*fpu)))
1895
                return -EFAULT;
1896
#endif
1897

    
1898
#if 0
1899
        /* XXX: incorrect */
1900
        err = __copy_from_user(&env->fpr[0], &fpu->si_float_regs[0],
1901
                                     (sizeof(unsigned long) * 32));
1902
#endif
1903
        err |= __get_user(env->fsr, &fpu->si_fsr);
1904
#if 0
1905
        err |= __get_user(current->thread.fpqdepth, &fpu->si_fpqdepth);
1906
        if (current->thread.fpqdepth != 0)
1907
                err |= __copy_from_user(&current->thread.fpqueue[0],
1908
                                        &fpu->si_fpqueue[0],
1909
                                        ((sizeof(unsigned long) +
1910
                                        (sizeof(unsigned long *)))*16));
1911
#endif
1912
        return err;
1913
}
1914

    
1915

    
1916
static void setup_rt_frame(int sig, struct target_sigaction *ka,
1917
                           target_siginfo_t *info,
1918
                           target_sigset_t *set, CPUState *env)
1919
{
1920
    fprintf(stderr, "setup_rt_frame: not implemented\n");
1921
}
1922

    
1923
long do_sigreturn(CPUState *env)
1924
{
1925
        abi_ulong sf_addr;
1926
        struct target_signal_frame *sf;
1927
        uint32_t up_psr, pc, npc;
1928
        target_sigset_t set;
1929
        sigset_t host_set;
1930
        abi_ulong fpu_save_addr;
1931
        int err, i;
1932

    
1933
        sf_addr = env->regwptr[UREG_FP];
1934
        if (!lock_user_struct(VERIFY_READ, sf, sf_addr, 1))
1935
                goto segv_and_exit;
1936
#if 0
1937
        fprintf(stderr, "sigreturn\n");
1938
        fprintf(stderr, "sf: %x pc %x fp %x sp %x\n", sf, env->pc, env->regwptr[UREG_FP], env->regwptr[UREG_SP]);
1939
#endif
1940
        //cpu_dump_state(env, stderr, fprintf, 0);
1941

    
1942
        /* 1. Make sure we are not getting garbage from the user */
1943

    
1944
        if (sf_addr & 3)
1945
                goto segv_and_exit;
1946

    
1947
        err = __get_user(pc,  &sf->info.si_regs.pc);
1948
        err |= __get_user(npc, &sf->info.si_regs.npc);
1949

    
1950
        if ((pc | npc) & 3)
1951
                goto segv_and_exit;
1952

    
1953
        /* 2. Restore the state */
1954
        err |= __get_user(up_psr, &sf->info.si_regs.psr);
1955

    
1956
        /* User can only change condition codes and FPU enabling in %psr. */
1957
        env->psr = (up_psr & (PSR_ICC /* | PSR_EF */))
1958
                  | (env->psr & ~(PSR_ICC /* | PSR_EF */));
1959

    
1960
        env->pc = pc;
1961
        env->npc = npc;
1962
        err |= __get_user(env->y, &sf->info.si_regs.y);
1963
        for (i=0; i < 8; i++) {
1964
                err |= __get_user(env->gregs[i], &sf->info.si_regs.u_regs[i]);
1965
        }
1966
        for (i=0; i < 8; i++) {
1967
                err |= __get_user(env->regwptr[i + UREG_I0], &sf->info.si_regs.u_regs[i+8]);
1968
        }
1969

    
1970
        err |= __get_user(fpu_save_addr, &sf->fpu_save);
1971

    
1972
        //if (fpu_save)
1973
        //        err |= restore_fpu_state(env, fpu_save);
1974

    
1975
        /* This is pretty much atomic, no amount locking would prevent
1976
         * the races which exist anyways.
1977
         */
1978
        err |= __get_user(set.sig[0], &sf->info.si_mask);
1979
        for(i = 1; i < TARGET_NSIG_WORDS; i++) {
1980
            err |= (__get_user(set.sig[i], &sf->extramask[i - 1]));
1981
        }
1982

    
1983
        target_to_host_sigset_internal(&host_set, &set);
1984
        sigprocmask(SIG_SETMASK, &host_set, NULL);
1985

    
1986
        if (err)
1987
                goto segv_and_exit;
1988
        unlock_user_struct(sf, sf_addr, 0);
1989
        return env->regwptr[0];
1990

    
1991
segv_and_exit:
1992
        unlock_user_struct(sf, sf_addr, 0);
1993
        force_sig(TARGET_SIGSEGV);
1994
}
1995

    
1996
long do_rt_sigreturn(CPUState *env)
1997
{
1998
    fprintf(stderr, "do_rt_sigreturn: not implemented\n");
1999
    return -TARGET_ENOSYS;
2000
}
2001

    
2002
#if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
2003
#define MC_TSTATE 0
2004
#define MC_PC 1
2005
#define MC_NPC 2
2006
#define MC_Y 3
2007
#define MC_G1 4
2008
#define MC_G2 5
2009
#define MC_G3 6
2010
#define MC_G4 7
2011
#define MC_G5 8
2012
#define MC_G6 9
2013
#define MC_G7 10
2014
#define MC_O0 11
2015
#define MC_O1 12
2016
#define MC_O2 13
2017
#define MC_O3 14
2018
#define MC_O4 15
2019
#define MC_O5 16
2020
#define MC_O6 17
2021
#define MC_O7 18
2022
#define MC_NGREG 19
2023

    
2024
typedef abi_ulong target_mc_greg_t;
2025
typedef target_mc_greg_t target_mc_gregset_t[MC_NGREG];
2026

    
2027
struct target_mc_fq {
2028
    abi_ulong *mcfq_addr;
2029
    uint32_t mcfq_insn;
2030
};
2031

    
2032
struct target_mc_fpu {
2033
    union {
2034
        uint32_t sregs[32];
2035
        uint64_t dregs[32];
2036
        //uint128_t qregs[16];
2037
    } mcfpu_fregs;
2038
    abi_ulong mcfpu_fsr;
2039
    abi_ulong mcfpu_fprs;
2040
    abi_ulong mcfpu_gsr;
2041
    struct target_mc_fq *mcfpu_fq;
2042
    unsigned char mcfpu_qcnt;
2043
    unsigned char mcfpu_qentsz;
2044
    unsigned char mcfpu_enab;
2045
};
2046
typedef struct target_mc_fpu target_mc_fpu_t;
2047

    
2048
typedef struct {
2049
    target_mc_gregset_t mc_gregs;
2050
    target_mc_greg_t mc_fp;
2051
    target_mc_greg_t mc_i7;
2052
    target_mc_fpu_t mc_fpregs;
2053
} target_mcontext_t;
2054

    
2055
struct target_ucontext {
2056
    struct target_ucontext *uc_link;
2057
    abi_ulong uc_flags;
2058
    target_sigset_t uc_sigmask;
2059
    target_mcontext_t uc_mcontext;
2060
};
2061

    
2062
/* A V9 register window */
2063
struct target_reg_window {
2064
    abi_ulong locals[8];
2065
    abi_ulong ins[8];
2066
};
2067

    
2068
#define TARGET_STACK_BIAS 2047
2069

    
2070
/* {set, get}context() needed for 64-bit SparcLinux userland. */
2071
void sparc64_set_context(CPUSPARCState *env)
2072
{
2073
    abi_ulong ucp_addr;
2074
    struct target_ucontext *ucp;
2075
    target_mc_gregset_t *grp;
2076
    abi_ulong pc, npc, tstate;
2077
    abi_ulong fp, i7, w_addr;
2078
    unsigned char fenab;
2079
    int err;
2080
    unsigned int i;
2081

    
2082
    ucp_addr = env->regwptr[UREG_I0];
2083
    if (!lock_user_struct(VERIFY_READ, ucp, ucp_addr, 1))
2084
        goto do_sigsegv;
2085
    grp  = &ucp->uc_mcontext.mc_gregs;
2086
    err  = __get_user(pc, &((*grp)[MC_PC]));
2087
    err |= __get_user(npc, &((*grp)[MC_NPC]));
2088
    if (err || ((pc | npc) & 3))
2089
        goto do_sigsegv;
2090
    if (env->regwptr[UREG_I1]) {
2091
        target_sigset_t target_set;
2092
        sigset_t set;
2093

    
2094
        if (TARGET_NSIG_WORDS == 1) {
2095
            if (__get_user(target_set.sig[0], &ucp->uc_sigmask.sig[0]))
2096
                goto do_sigsegv;
2097
        } else {
2098
            abi_ulong *src, *dst;
2099
            src = ucp->uc_sigmask.sig;
2100
            dst = target_set.sig;
2101
            for (i = 0; i < sizeof(target_sigset_t) / sizeof(abi_ulong);
2102
                 i++, dst++, src++)
2103
                err |= __get_user(*dst, src);
2104
            if (err)
2105
                goto do_sigsegv;
2106
        }
2107
        target_to_host_sigset_internal(&set, &target_set);
2108
        sigprocmask(SIG_SETMASK, &set, NULL);
2109
    }
2110
    env->pc = pc;
2111
    env->npc = npc;
2112
    err |= __get_user(env->y, &((*grp)[MC_Y]));
2113
    err |= __get_user(tstate, &((*grp)[MC_TSTATE]));
2114
    env->asi = (tstate >> 24) & 0xff;
2115
    PUT_CCR(env, tstate >> 32);
2116
    PUT_CWP64(env, tstate & 0x1f);
2117
    err |= __get_user(env->gregs[1], (&(*grp)[MC_G1]));
2118
    err |= __get_user(env->gregs[2], (&(*grp)[MC_G2]));
2119
    err |= __get_user(env->gregs[3], (&(*grp)[MC_G3]));
2120
    err |= __get_user(env->gregs[4], (&(*grp)[MC_G4]));
2121
    err |= __get_user(env->gregs[5], (&(*grp)[MC_G5]));
2122
    err |= __get_user(env->gregs[6], (&(*grp)[MC_G6]));
2123
    err |= __get_user(env->gregs[7], (&(*grp)[MC_G7]));
2124
    err |= __get_user(env->regwptr[UREG_I0], (&(*grp)[MC_O0]));
2125
    err |= __get_user(env->regwptr[UREG_I1], (&(*grp)[MC_O1]));
2126
    err |= __get_user(env->regwptr[UREG_I2], (&(*grp)[MC_O2]));
2127
    err |= __get_user(env->regwptr[UREG_I3], (&(*grp)[MC_O3]));
2128
    err |= __get_user(env->regwptr[UREG_I4], (&(*grp)[MC_O4]));
2129
    err |= __get_user(env->regwptr[UREG_I5], (&(*grp)[MC_O5]));
2130
    err |= __get_user(env->regwptr[UREG_I6], (&(*grp)[MC_O6]));
2131
    err |= __get_user(env->regwptr[UREG_I7], (&(*grp)[MC_O7]));
2132

    
2133
    err |= __get_user(fp, &(ucp->uc_mcontext.mc_fp));
2134
    err |= __get_user(i7, &(ucp->uc_mcontext.mc_i7));
2135

    
2136
    w_addr = TARGET_STACK_BIAS+env->regwptr[UREG_I6];
2137
    if (put_user(fp, w_addr + offsetof(struct target_reg_window, ins[6]), 
2138
                 abi_ulong) != 0)
2139
        goto do_sigsegv;
2140
    if (put_user(i7, w_addr + offsetof(struct target_reg_window, ins[7]), 
2141
                 abi_ulong) != 0)
2142
        goto do_sigsegv;
2143
    err |= __get_user(fenab, &(ucp->uc_mcontext.mc_fpregs.mcfpu_enab));
2144
    err |= __get_user(env->fprs, &(ucp->uc_mcontext.mc_fpregs.mcfpu_fprs));
2145
    {
2146
        uint32_t *src, *dst;
2147
        src = ucp->uc_mcontext.mc_fpregs.mcfpu_fregs.sregs;
2148
        dst = env->fpr;
2149
        /* XXX: check that the CPU storage is the same as user context */
2150
        for (i = 0; i < 64; i++, dst++, src++)
2151
            err |= __get_user(*dst, src);
2152
    }
2153
    err |= __get_user(env->fsr,
2154
                      &(ucp->uc_mcontext.mc_fpregs.mcfpu_fsr));
2155
    err |= __get_user(env->gsr,
2156
                      &(ucp->uc_mcontext.mc_fpregs.mcfpu_gsr));
2157
    if (err)
2158
        goto do_sigsegv;
2159
    unlock_user_struct(ucp, ucp_addr, 0);
2160
    return;
2161
 do_sigsegv:
2162
    unlock_user_struct(ucp, ucp_addr, 0);
2163
    force_sig(TARGET_SIGSEGV);
2164
}
2165

    
2166
void sparc64_get_context(CPUSPARCState *env)
2167
{
2168
    abi_ulong ucp_addr;
2169
    struct target_ucontext *ucp;
2170
    target_mc_gregset_t *grp;
2171
    target_mcontext_t *mcp;
2172
    abi_ulong fp, i7, w_addr;
2173
    int err;
2174
    unsigned int i;
2175
    target_sigset_t target_set;
2176
    sigset_t set;
2177

    
2178
    ucp_addr = env->regwptr[UREG_I0];
2179
    if (!lock_user_struct(VERIFY_WRITE, ucp, ucp_addr, 0))
2180
        goto do_sigsegv;
2181
    
2182
    mcp = &ucp->uc_mcontext;
2183
    grp = &mcp->mc_gregs;
2184

    
2185
    /* Skip over the trap instruction, first. */
2186
    env->pc = env->npc;
2187
    env->npc += 4;
2188

    
2189
    err = 0;
2190

    
2191
    sigprocmask(0, NULL, &set);
2192
    host_to_target_sigset_internal(&target_set, &set);
2193
    if (TARGET_NSIG_WORDS == 1) {
2194
        err |= __put_user(target_set.sig[0],
2195
                          (abi_ulong *)&ucp->uc_sigmask);
2196
    } else {
2197
        abi_ulong *src, *dst;
2198
        src = target_set.sig;
2199
        dst = ucp->uc_sigmask.sig;
2200
        for (i = 0; i < sizeof(target_sigset_t) / sizeof(abi_ulong);
2201
             i++, dst++, src++)
2202
            err |= __put_user(*src, dst);
2203
        if (err)
2204
            goto do_sigsegv;
2205
    }
2206

    
2207
    /* XXX: tstate must be saved properly */
2208
    //    err |= __put_user(env->tstate, &((*grp)[MC_TSTATE]));
2209
    err |= __put_user(env->pc, &((*grp)[MC_PC]));
2210
    err |= __put_user(env->npc, &((*grp)[MC_NPC]));
2211
    err |= __put_user(env->y, &((*grp)[MC_Y]));
2212
    err |= __put_user(env->gregs[1], &((*grp)[MC_G1]));
2213
    err |= __put_user(env->gregs[2], &((*grp)[MC_G2]));
2214
    err |= __put_user(env->gregs[3], &((*grp)[MC_G3]));
2215
    err |= __put_user(env->gregs[4], &((*grp)[MC_G4]));
2216
    err |= __put_user(env->gregs[5], &((*grp)[MC_G5]));
2217
    err |= __put_user(env->gregs[6], &((*grp)[MC_G6]));
2218
    err |= __put_user(env->gregs[7], &((*grp)[MC_G7]));
2219
    err |= __put_user(env->regwptr[UREG_I0], &((*grp)[MC_O0]));
2220
    err |= __put_user(env->regwptr[UREG_I1], &((*grp)[MC_O1]));
2221
    err |= __put_user(env->regwptr[UREG_I2], &((*grp)[MC_O2]));
2222
    err |= __put_user(env->regwptr[UREG_I3], &((*grp)[MC_O3]));
2223
    err |= __put_user(env->regwptr[UREG_I4], &((*grp)[MC_O4]));
2224
    err |= __put_user(env->regwptr[UREG_I5], &((*grp)[MC_O5]));
2225
    err |= __put_user(env->regwptr[UREG_I6], &((*grp)[MC_O6]));
2226
    err |= __put_user(env->regwptr[UREG_I7], &((*grp)[MC_O7]));
2227

    
2228
    w_addr = TARGET_STACK_BIAS+env->regwptr[UREG_I6];
2229
    fp = i7 = 0;
2230
    if (get_user(fp, w_addr + offsetof(struct target_reg_window, ins[6]), 
2231
                 abi_ulong) != 0)
2232
        goto do_sigsegv;
2233
    if (get_user(i7, w_addr + offsetof(struct target_reg_window, ins[7]), 
2234
                 abi_ulong) != 0)
2235
        goto do_sigsegv;
2236
    err |= __put_user(fp, &(mcp->mc_fp));
2237
    err |= __put_user(i7, &(mcp->mc_i7));
2238

    
2239
    {
2240
        uint32_t *src, *dst;
2241
        src = env->fpr;
2242
        dst = ucp->uc_mcontext.mc_fpregs.mcfpu_fregs.sregs;
2243
        /* XXX: check that the CPU storage is the same as user context */
2244
        for (i = 0; i < 64; i++, dst++, src++)
2245
            err |= __put_user(*src, dst);
2246
    }
2247
    err |= __put_user(env->fsr, &(mcp->mc_fpregs.mcfpu_fsr));
2248
    err |= __put_user(env->gsr, &(mcp->mc_fpregs.mcfpu_gsr));
2249
    err |= __put_user(env->fprs, &(mcp->mc_fpregs.mcfpu_fprs));
2250

    
2251
    if (err)
2252
        goto do_sigsegv;
2253
    unlock_user_struct(ucp, ucp_addr, 1);
2254
    return;
2255
 do_sigsegv:
2256
    unlock_user_struct(ucp, ucp_addr, 1);
2257
    force_sig(TARGET_SIGSEGV);
2258
}
2259
#endif
2260
#elif defined(TARGET_ABI_MIPSN64)
2261

    
2262
# warning signal handling not implemented
2263

    
2264
static void setup_frame(int sig, struct target_sigaction *ka,
2265
                        target_sigset_t *set, CPUState *env)
2266
{
2267
    fprintf(stderr, "setup_frame: not implemented\n");
2268
}
2269

    
2270
static void setup_rt_frame(int sig, struct target_sigaction *ka,
2271
                           target_siginfo_t *info,
2272
                           target_sigset_t *set, CPUState *env)
2273
{
2274
    fprintf(stderr, "setup_rt_frame: not implemented\n");
2275
}
2276

    
2277
long do_sigreturn(CPUState *env)
2278
{
2279
    fprintf(stderr, "do_sigreturn: not implemented\n");
2280
    return -TARGET_ENOSYS;
2281
}
2282

    
2283
long do_rt_sigreturn(CPUState *env)
2284
{
2285
    fprintf(stderr, "do_rt_sigreturn: not implemented\n");
2286
    return -TARGET_ENOSYS;
2287
}
2288

    
2289
#elif defined(TARGET_ABI_MIPSN32)
2290

    
2291
# warning signal handling not implemented
2292

    
2293
static void setup_frame(int sig, struct target_sigaction *ka,
2294
                        target_sigset_t *set, CPUState *env)
2295
{
2296
    fprintf(stderr, "setup_frame: not implemented\n");
2297
}
2298

    
2299
static void setup_rt_frame(int sig, struct target_sigaction *ka,
2300
                           target_siginfo_t *info,
2301
                           target_sigset_t *set, CPUState *env)
2302
{
2303
    fprintf(stderr, "setup_rt_frame: not implemented\n");
2304
}
2305

    
2306
long do_sigreturn(CPUState *env)
2307
{
2308
    fprintf(stderr, "do_sigreturn: not implemented\n");
2309
    return -TARGET_ENOSYS;
2310
}
2311

    
2312
long do_rt_sigreturn(CPUState *env)
2313
{
2314
    fprintf(stderr, "do_rt_sigreturn: not implemented\n");
2315
    return -TARGET_ENOSYS;
2316
}
2317

    
2318
#elif defined(TARGET_ABI_MIPSO32)
2319

    
2320
struct target_sigcontext {
2321
    uint32_t   sc_regmask;     /* Unused */
2322
    uint32_t   sc_status;
2323
    uint64_t   sc_pc;
2324
    uint64_t   sc_regs[32];
2325
    uint64_t   sc_fpregs[32];
2326
    uint32_t   sc_ownedfp;     /* Unused */
2327
    uint32_t   sc_fpc_csr;
2328
    uint32_t   sc_fpc_eir;     /* Unused */
2329
    uint32_t   sc_used_math;
2330
    uint32_t   sc_dsp;         /* dsp status, was sc_ssflags */
2331
    uint32_t   pad0;
2332
    uint64_t   sc_mdhi;
2333
    uint64_t   sc_mdlo;
2334
    target_ulong   sc_hi1;         /* Was sc_cause */
2335
    target_ulong   sc_lo1;         /* Was sc_badvaddr */
2336
    target_ulong   sc_hi2;         /* Was sc_sigset[4] */
2337
    target_ulong   sc_lo2;
2338
    target_ulong   sc_hi3;
2339
    target_ulong   sc_lo3;
2340
};
2341

    
2342
struct sigframe {
2343
    uint32_t sf_ass[4];                        /* argument save space for o32 */
2344
    uint32_t sf_code[2];                        /* signal trampoline */
2345
    struct target_sigcontext sf_sc;
2346
    target_sigset_t sf_mask;
2347
};
2348

    
2349
struct target_ucontext {
2350
    target_ulong uc_flags;
2351
    target_ulong uc_link;
2352
    target_stack_t uc_stack;
2353
    target_ulong pad0;
2354
    struct target_sigcontext uc_mcontext;
2355
    target_sigset_t uc_sigmask;
2356
};
2357

    
2358
struct target_rt_sigframe {
2359
    uint32_t rs_ass[4];               /* argument save space for o32 */
2360
    uint32_t rs_code[2];              /* signal trampoline */
2361
    struct target_siginfo rs_info;
2362
    struct target_ucontext rs_uc;
2363
};
2364

    
2365
/* Install trampoline to jump back from signal handler */
2366
static inline int install_sigtramp(unsigned int *tramp,   unsigned int syscall)
2367
{
2368
    int err;
2369

    
2370
    /*
2371
    * Set up the return code ...
2372
    *
2373
    *         li      v0, __NR__foo_sigreturn
2374
    *         syscall
2375
    */
2376

    
2377
    err = __put_user(0x24020000 + syscall, tramp + 0);
2378
    err |= __put_user(0x0000000c          , tramp + 1);
2379
    /* flush_cache_sigtramp((unsigned long) tramp); */
2380
    return err;
2381
}
2382

    
2383
static inline int
2384
setup_sigcontext(CPUState *regs, struct target_sigcontext *sc)
2385
{
2386
    int err = 0;
2387

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

    
2390
#define save_gp_reg(i) do {                                                   \
2391
        err |= __put_user(regs->active_tc.gpr[i], &sc->sc_regs[i]);        \
2392
    } while(0)
2393
    __put_user(0, &sc->sc_regs[0]); save_gp_reg(1); save_gp_reg(2);
2394
    save_gp_reg(3); save_gp_reg(4); save_gp_reg(5); save_gp_reg(6);
2395
    save_gp_reg(7); save_gp_reg(8); save_gp_reg(9); save_gp_reg(10);
2396
    save_gp_reg(11); save_gp_reg(12); save_gp_reg(13); save_gp_reg(14);
2397
    save_gp_reg(15); save_gp_reg(16); save_gp_reg(17); save_gp_reg(18);
2398
    save_gp_reg(19); save_gp_reg(20); save_gp_reg(21); save_gp_reg(22);
2399
    save_gp_reg(23); save_gp_reg(24); save_gp_reg(25); save_gp_reg(26);
2400
    save_gp_reg(27); save_gp_reg(28); save_gp_reg(29); save_gp_reg(30);
2401
    save_gp_reg(31);
2402
#undef save_gp_reg
2403

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

    
2407
    /* Not used yet, but might be useful if we ever have DSP suppport */
2408
#if 0
2409
    if (cpu_has_dsp) {
2410
        err |= __put_user(mfhi1(), &sc->sc_hi1);
2411
        err |= __put_user(mflo1(), &sc->sc_lo1);
2412
        err |= __put_user(mfhi2(), &sc->sc_hi2);
2413
        err |= __put_user(mflo2(), &sc->sc_lo2);
2414
        err |= __put_user(mfhi3(), &sc->sc_hi3);
2415
        err |= __put_user(mflo3(), &sc->sc_lo3);
2416
        err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp);
2417
    }
2418
    /* same with 64 bit */
2419
#ifdef CONFIG_64BIT
2420
    err |= __put_user(regs->hi, &sc->sc_hi[0]);
2421
    err |= __put_user(regs->lo, &sc->sc_lo[0]);
2422
    if (cpu_has_dsp) {
2423
        err |= __put_user(mfhi1(), &sc->sc_hi[1]);
2424
        err |= __put_user(mflo1(), &sc->sc_lo[1]);
2425
        err |= __put_user(mfhi2(), &sc->sc_hi[2]);
2426
        err |= __put_user(mflo2(), &sc->sc_lo[2]);
2427
        err |= __put_user(mfhi3(), &sc->sc_hi[3]);
2428
        err |= __put_user(mflo3(), &sc->sc_lo[3]);
2429
        err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp);
2430
    }
2431
#endif
2432
#endif
2433

    
2434
#if 0
2435
    err |= __put_user(!!used_math(), &sc->sc_used_math);
2436

2437
    if (!used_math())
2438
        goto out;
2439

2440
    /*
2441
    * Save FPU state to signal context.  Signal handler will "inherit"
2442
    * current FPU state.
2443
    */
2444
    preempt_disable();
2445

2446
    if (!is_fpu_owner()) {
2447
        own_fpu();
2448
        restore_fp(current);
2449
    }
2450
    err |= save_fp_context(sc);
2451

2452
    preempt_enable();
2453
    out:
2454
#endif
2455
    return err;
2456
}
2457

    
2458
static inline int
2459
restore_sigcontext(CPUState *regs, struct target_sigcontext *sc)
2460
{
2461
    int err = 0;
2462

    
2463
    err |= __get_user(regs->CP0_EPC, &sc->sc_pc);
2464

    
2465
    err |= __get_user(regs->active_tc.HI[0], &sc->sc_mdhi);
2466
    err |= __get_user(regs->active_tc.LO[0], &sc->sc_mdlo);
2467

    
2468
#define restore_gp_reg(i) do {                                                           \
2469
        err |= __get_user(regs->active_tc.gpr[i], &sc->sc_regs[i]);                \
2470
    } while(0)
2471
    restore_gp_reg( 1); restore_gp_reg( 2); restore_gp_reg( 3);
2472
    restore_gp_reg( 4); restore_gp_reg( 5); restore_gp_reg( 6);
2473
    restore_gp_reg( 7); restore_gp_reg( 8); restore_gp_reg( 9);
2474
    restore_gp_reg(10); restore_gp_reg(11); restore_gp_reg(12);
2475
    restore_gp_reg(13); restore_gp_reg(14); restore_gp_reg(15);
2476
    restore_gp_reg(16); restore_gp_reg(17); restore_gp_reg(18);
2477
    restore_gp_reg(19); restore_gp_reg(20); restore_gp_reg(21);
2478
    restore_gp_reg(22); restore_gp_reg(23); restore_gp_reg(24);
2479
    restore_gp_reg(25); restore_gp_reg(26); restore_gp_reg(27);
2480
    restore_gp_reg(28); restore_gp_reg(29); restore_gp_reg(30);
2481
    restore_gp_reg(31);
2482
#undef restore_gp_reg
2483

    
2484
#if 0
2485
    if (cpu_has_dsp) {
2486
        err |= __get_user(treg, &sc->sc_hi1); mthi1(treg);
2487
        err |= __get_user(treg, &sc->sc_lo1); mtlo1(treg);
2488
        err |= __get_user(treg, &sc->sc_hi2); mthi2(treg);
2489
        err |= __get_user(treg, &sc->sc_lo2); mtlo2(treg);
2490
        err |= __get_user(treg, &sc->sc_hi3); mthi3(treg);
2491
        err |= __get_user(treg, &sc->sc_lo3); mtlo3(treg);
2492
        err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK);
2493
    }
2494
#ifdef CONFIG_64BIT
2495
    err |= __get_user(regs->hi, &sc->sc_hi[0]);
2496
    err |= __get_user(regs->lo, &sc->sc_lo[0]);
2497
    if (cpu_has_dsp) {
2498
        err |= __get_user(treg, &sc->sc_hi[1]); mthi1(treg);
2499
        err |= __get_user(treg, &sc->sc_lo[1]); mthi1(treg);
2500
        err |= __get_user(treg, &sc->sc_hi[2]); mthi2(treg);
2501
        err |= __get_user(treg, &sc->sc_lo[2]); mthi2(treg);
2502
        err |= __get_user(treg, &sc->sc_hi[3]); mthi3(treg);
2503
        err |= __get_user(treg, &sc->sc_lo[3]); mthi3(treg);
2504
        err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK);
2505
    }
2506
#endif
2507

    
2508
    err |= __get_user(used_math, &sc->sc_used_math);
2509
    conditional_used_math(used_math);
2510

    
2511
    preempt_disable();
2512

    
2513
    if (used_math()) {
2514
        /* restore fpu context if we have used it before */
2515
        own_fpu();
2516
        err |= restore_fp_context(sc);
2517
    } else {
2518
        /* signal handler may have used FPU.  Give it up. */
2519
        lose_fpu();
2520
    }
2521

    
2522
    preempt_enable();
2523
#endif
2524
    return err;
2525
}
2526
/*
2527
 * Determine which stack to use..
2528
 */
2529
static inline abi_ulong
2530
get_sigframe(struct target_sigaction *ka, CPUState *regs, size_t frame_size)
2531
{
2532
    unsigned long sp;
2533

    
2534
    /* Default to using normal stack */
2535
    sp = regs->active_tc.gpr[29];
2536

    
2537
    /*
2538
     * FPU emulator may have it's own trampoline active just
2539
     * above the user stack, 16-bytes before the next lowest
2540
     * 16 byte boundary.  Try to avoid trashing it.
2541
     */
2542
    sp -= 32;
2543

    
2544
    /* This is the X/Open sanctioned signal stack switching.  */
2545
    if ((ka->sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags (sp) == 0)) {
2546
        sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
2547
    }
2548

    
2549
    return (sp - frame_size) & ~7;
2550
}
2551

    
2552
/* compare linux/arch/mips/kernel/signal.c:setup_frame() */
2553
static void setup_frame(int sig, struct target_sigaction * ka,
2554
                        target_sigset_t *set, CPUState *regs)
2555
{
2556
    struct sigframe *frame;
2557
    abi_ulong frame_addr;
2558
    int i;
2559

    
2560
    frame_addr = get_sigframe(ka, regs, sizeof(*frame));
2561
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
2562
        goto give_sigsegv;
2563

    
2564
    install_sigtramp(frame->sf_code, TARGET_NR_sigreturn);
2565

    
2566
    if(setup_sigcontext(regs, &frame->sf_sc))
2567
        goto give_sigsegv;
2568

    
2569
    for(i = 0; i < TARGET_NSIG_WORDS; i++) {
2570
        if(__put_user(set->sig[i], &frame->sf_mask.sig[i]))
2571
            goto give_sigsegv;
2572
    }
2573

    
2574
    /*
2575
    * Arguments to signal handler:
2576
    *
2577
    *   a0 = signal number
2578
    *   a1 = 0 (should be cause)
2579
    *   a2 = pointer to struct sigcontext
2580
    *
2581
    * $25 and PC point to the signal handler, $29 points to the
2582
    * struct sigframe.
2583
    */
2584
    regs->active_tc.gpr[ 4] = sig;
2585
    regs->active_tc.gpr[ 5] = 0;
2586
    regs->active_tc.gpr[ 6] = frame_addr + offsetof(struct sigframe, sf_sc);
2587
    regs->active_tc.gpr[29] = frame_addr;
2588
    regs->active_tc.gpr[31] = frame_addr + offsetof(struct sigframe, sf_code);
2589
    /* The original kernel code sets CP0_EPC to the handler
2590
    * since it returns to userland using eret
2591
    * we cannot do this here, and we must set PC directly */
2592
    regs->active_tc.PC = regs->active_tc.gpr[25] = ka->_sa_handler;
2593
    unlock_user_struct(frame, frame_addr, 1);
2594
    return;
2595

    
2596
give_sigsegv:
2597
    unlock_user_struct(frame, frame_addr, 1);
2598
    force_sig(TARGET_SIGSEGV/*, current*/);
2599
    return;
2600
}
2601

    
2602
long do_sigreturn(CPUState *regs)
2603
{
2604
    struct sigframe *frame;
2605
    abi_ulong frame_addr;
2606
    sigset_t blocked;
2607
    target_sigset_t target_set;
2608
    int i;
2609

    
2610
#if defined(DEBUG_SIGNAL)
2611
    fprintf(stderr, "do_sigreturn\n");
2612
#endif
2613
    frame_addr = regs->active_tc.gpr[29];
2614
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
2615
           goto badframe;
2616

    
2617
    for(i = 0; i < TARGET_NSIG_WORDS; i++) {
2618
           if(__get_user(target_set.sig[i], &frame->sf_mask.sig[i]))
2619
            goto badframe;
2620
    }
2621

    
2622
    target_to_host_sigset_internal(&blocked, &target_set);
2623
    sigprocmask(SIG_SETMASK, &blocked, NULL);
2624

    
2625
    if (restore_sigcontext(regs, &frame->sf_sc))
2626
           goto badframe;
2627

    
2628
#if 0
2629
    /*
2630
     * Don't let your children do this ...
2631
     */
2632
    __asm__ __volatile__(
2633
           "move\t$29, %0\n\t"
2634
           "j\tsyscall_exit"
2635
           :/* no outputs */
2636
           :"r" (&regs));
2637
    /* Unreached */
2638
#endif
2639

    
2640
    regs->active_tc.PC = regs->CP0_EPC;
2641
    /* I am not sure this is right, but it seems to work
2642
    * maybe a problem with nested signals ? */
2643
    regs->CP0_EPC = 0;
2644
    return -TARGET_QEMU_ESIGRETURN;
2645

    
2646
badframe:
2647
    force_sig(TARGET_SIGSEGV/*, current*/);
2648
    return 0;
2649
}
2650

    
2651
static void setup_rt_frame(int sig, struct target_sigaction *ka,
2652
                           target_siginfo_t *info,
2653
                           target_sigset_t *set, CPUState *env)
2654
{
2655
    struct target_rt_sigframe *frame;
2656
    abi_ulong frame_addr;
2657
    int i;
2658

    
2659
    frame_addr = get_sigframe(ka, env, sizeof(*frame));
2660
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
2661
        goto give_sigsegv;
2662

    
2663
    install_sigtramp(frame->rs_code, TARGET_NR_rt_sigreturn);
2664

    
2665
    copy_siginfo_to_user(&frame->rs_info, info);
2666

    
2667
    __put_user(0, &frame->rs_uc.uc_flags);
2668
    __put_user(0, &frame->rs_uc.uc_link);
2669
    __put_user(target_sigaltstack_used.ss_sp, &frame->rs_uc.uc_stack.ss_sp);
2670
    __put_user(target_sigaltstack_used.ss_size, &frame->rs_uc.uc_stack.ss_size);
2671
    __put_user(sas_ss_flags(get_sp_from_cpustate(env)),
2672
               &frame->rs_uc.uc_stack.ss_flags);
2673

    
2674
    setup_sigcontext(env, &frame->rs_uc.uc_mcontext);
2675

    
2676
    for(i = 0; i < TARGET_NSIG_WORDS; i++) {
2677
        __put_user(set->sig[i], &frame->rs_uc.uc_sigmask.sig[i]);
2678
    }
2679

    
2680
    /*
2681
    * Arguments to signal handler:
2682
    *
2683
    *   a0 = signal number
2684
    *   a1 = pointer to struct siginfo
2685
    *   a2 = pointer to struct ucontext
2686
    *
2687
    * $25 and PC point to the signal handler, $29 points to the
2688
    * struct sigframe.
2689
    */
2690
    env->active_tc.gpr[ 4] = sig;
2691
    env->active_tc.gpr[ 5] = frame_addr
2692
                             + offsetof(struct target_rt_sigframe, rs_info);
2693
    env->active_tc.gpr[ 6] = frame_addr
2694
                             + offsetof(struct target_rt_sigframe, rs_uc);
2695
    env->active_tc.gpr[29] = frame_addr;
2696
    env->active_tc.gpr[31] = frame_addr
2697
                             + offsetof(struct target_rt_sigframe, rs_code);
2698
    /* The original kernel code sets CP0_EPC to the handler
2699
    * since it returns to userland using eret
2700
    * we cannot do this here, and we must set PC directly */
2701
    env->active_tc.PC = env->active_tc.gpr[25] = ka->_sa_handler;
2702
    unlock_user_struct(frame, frame_addr, 1);
2703
    return;
2704

    
2705
give_sigsegv:
2706
    unlock_user_struct(frame, frame_addr, 1);
2707
    force_sig(TARGET_SIGSEGV/*, current*/);
2708
    return;
2709
}
2710

    
2711
long do_rt_sigreturn(CPUState *env)
2712
{
2713
    struct target_rt_sigframe *frame;
2714
    abi_ulong frame_addr;
2715
    sigset_t blocked;
2716

    
2717
#if defined(DEBUG_SIGNAL)
2718
    fprintf(stderr, "do_rt_sigreturn\n");
2719
#endif
2720
    frame_addr = env->active_tc.gpr[29];
2721
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
2722
           goto badframe;
2723

    
2724
    target_to_host_sigset(&blocked, &frame->rs_uc.uc_sigmask);
2725
    sigprocmask(SIG_SETMASK, &blocked, NULL);
2726

    
2727
    if (restore_sigcontext(env, &frame->rs_uc.uc_mcontext))
2728
        goto badframe;
2729

    
2730
    if (do_sigaltstack(frame_addr +
2731
                       offsetof(struct target_rt_sigframe, rs_uc.uc_stack),
2732
                       0, get_sp_from_cpustate(env)) == -EFAULT)
2733
        goto badframe;
2734

    
2735
    env->active_tc.PC = env->CP0_EPC;
2736
    /* I am not sure this is right, but it seems to work
2737
    * maybe a problem with nested signals ? */
2738
    env->CP0_EPC = 0;
2739
    return -TARGET_QEMU_ESIGRETURN;
2740

    
2741
badframe:
2742
    force_sig(TARGET_SIGSEGV/*, current*/);
2743
    return 0;
2744
}
2745

    
2746
#elif defined(TARGET_SH4)
2747

    
2748
/*
2749
 * code and data structures from linux kernel:
2750
 * include/asm-sh/sigcontext.h
2751
 * arch/sh/kernel/signal.c
2752
 */
2753

    
2754
struct target_sigcontext {
2755
    target_ulong  oldmask;
2756

    
2757
    /* CPU registers */
2758
    target_ulong  sc_gregs[16];
2759
    target_ulong  sc_pc;
2760
    target_ulong  sc_pr;
2761
    target_ulong  sc_sr;
2762
    target_ulong  sc_gbr;
2763
    target_ulong  sc_mach;
2764
    target_ulong  sc_macl;
2765

    
2766
    /* FPU registers */
2767
    target_ulong  sc_fpregs[16];
2768
    target_ulong  sc_xfpregs[16];
2769
    unsigned int sc_fpscr;
2770
    unsigned int sc_fpul;
2771
    unsigned int sc_ownedfp;
2772
};
2773

    
2774
struct target_sigframe
2775
{
2776
    struct target_sigcontext sc;
2777
    target_ulong extramask[TARGET_NSIG_WORDS-1];
2778
    uint16_t retcode[3];
2779
};
2780

    
2781

    
2782
struct target_ucontext {
2783
    target_ulong uc_flags;
2784
    struct target_ucontext *uc_link;
2785
    target_stack_t uc_stack;
2786
    struct target_sigcontext uc_mcontext;
2787
    target_sigset_t uc_sigmask;        /* mask last for extensibility */
2788
};
2789

    
2790
struct target_rt_sigframe
2791
{
2792
    struct target_siginfo info;
2793
    struct target_ucontext uc;
2794
    uint16_t retcode[3];
2795
};
2796

    
2797

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

    
2801
static abi_ulong get_sigframe(struct target_sigaction *ka,
2802
                         unsigned long sp, size_t frame_size)
2803
{
2804
    if ((ka->sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags(sp) == 0)) {
2805
        sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
2806
    }
2807

    
2808
    return (sp - frame_size) & -8ul;
2809
}
2810

    
2811
static int setup_sigcontext(struct target_sigcontext *sc,
2812
                            CPUState *regs, unsigned long mask)
2813
{
2814
    int err = 0;
2815
    int i;
2816

    
2817
#define COPY(x)         err |= __put_user(regs->x, &sc->sc_##x)
2818
    COPY(gregs[0]); COPY(gregs[1]);
2819
    COPY(gregs[2]); COPY(gregs[3]);
2820
    COPY(gregs[4]); COPY(gregs[5]);
2821
    COPY(gregs[6]); COPY(gregs[7]);
2822
    COPY(gregs[8]); COPY(gregs[9]);
2823
    COPY(gregs[10]); COPY(gregs[11]);
2824
    COPY(gregs[12]); COPY(gregs[13]);
2825
    COPY(gregs[14]); COPY(gregs[15]);
2826
    COPY(gbr); COPY(mach);
2827
    COPY(macl); COPY(pr);
2828
    COPY(sr); COPY(pc);
2829
#undef COPY
2830

    
2831
    for (i=0; i<16; i++) {
2832
        err |= __put_user(regs->fregs[i], &sc->sc_fpregs[i]);
2833
    }
2834
    err |= __put_user(regs->fpscr, &sc->sc_fpscr);
2835
    err |= __put_user(regs->fpul, &sc->sc_fpul);
2836

    
2837
    /* non-iBCS2 extensions.. */
2838
    err |= __put_user(mask, &sc->oldmask);
2839

    
2840
    return err;
2841
}
2842

    
2843
static int restore_sigcontext(CPUState *regs, struct target_sigcontext *sc,
2844
                              target_ulong *r0_p)
2845
{
2846
    unsigned int err = 0;
2847
    int i;
2848

    
2849
#define COPY(x)         err |= __get_user(regs->x, &sc->sc_##x)
2850
    COPY(gregs[1]);
2851
    COPY(gregs[2]); COPY(gregs[3]);
2852
    COPY(gregs[4]); COPY(gregs[5]);
2853
    COPY(gregs[6]); COPY(gregs[7]);
2854
    COPY(gregs[8]); COPY(gregs[9]);
2855
    COPY(gregs[10]); COPY(gregs[11]);
2856
    COPY(gregs[12]); COPY(gregs[13]);
2857
    COPY(gregs[14]); COPY(gregs[15]);
2858
    COPY(gbr); COPY(mach);
2859
    COPY(macl); COPY(pr);
2860
    COPY(sr); COPY(pc);
2861
#undef COPY
2862

    
2863
    for (i=0; i<16; i++) {
2864
        err |= __get_user(regs->fregs[i], &sc->sc_fpregs[i]);
2865
    }
2866
    err |= __get_user(regs->fpscr, &sc->sc_fpscr);
2867
    err |= __get_user(regs->fpul, &sc->sc_fpul);
2868

    
2869
    regs->tra = -1;         /* disable syscall checks */
2870
    err |= __get_user(*r0_p, &sc->sc_gregs[0]);
2871
    return err;
2872
}
2873

    
2874
static void setup_frame(int sig, struct target_sigaction *ka,
2875
                        target_sigset_t *set, CPUState *regs)
2876
{
2877
    struct target_sigframe *frame;
2878
    abi_ulong frame_addr;
2879
    int i;
2880
    int err = 0;
2881
    int signal;
2882

    
2883
    frame_addr = get_sigframe(ka, regs->gregs[15], sizeof(*frame));
2884
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
2885
        goto give_sigsegv;
2886

    
2887
    signal = current_exec_domain_sig(sig);
2888

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

    
2891
    for (i = 0; i < TARGET_NSIG_WORDS - 1; i++) {
2892
        err |= __put_user(set->sig[i + 1], &frame->extramask[i]);
2893
    }
2894

    
2895
    /* Set up to return from userspace.  If provided, use a stub
2896
       already in userspace.  */
2897
    if (ka->sa_flags & TARGET_SA_RESTORER) {
2898
        regs->pr = (unsigned long) ka->sa_restorer;
2899
    } else {
2900
        /* Generate return code (system call to sigreturn) */
2901
        err |= __put_user(MOVW(2), &frame->retcode[0]);
2902
        err |= __put_user(TRAP_NOARG, &frame->retcode[1]);
2903
        err |= __put_user((TARGET_NR_sigreturn), &frame->retcode[2]);
2904
        regs->pr = (unsigned long) frame->retcode;
2905
    }
2906

    
2907
    if (err)
2908
        goto give_sigsegv;
2909

    
2910
    /* Set up registers for signal handler */
2911
    regs->gregs[15] = (unsigned long) frame;
2912
    regs->gregs[4] = signal; /* Arg for signal handler */
2913
    regs->gregs[5] = 0;
2914
    regs->gregs[6] = (unsigned long) &frame->sc;
2915
    regs->pc = (unsigned long) ka->_sa_handler;
2916

    
2917
    unlock_user_struct(frame, frame_addr, 1);
2918
    return;
2919

    
2920
give_sigsegv:
2921
    unlock_user_struct(frame, frame_addr, 1);
2922
    force_sig(TARGET_SIGSEGV);
2923
}
2924

    
2925
static void setup_rt_frame(int sig, struct target_sigaction *ka,
2926
                           target_siginfo_t *info,
2927
                           target_sigset_t *set, CPUState *regs)
2928
{
2929
    struct target_rt_sigframe *frame;
2930
    abi_ulong frame_addr;
2931
    int i;
2932
    int err = 0;
2933
    int signal;
2934

    
2935
    frame_addr = get_sigframe(ka, regs->gregs[15], sizeof(*frame));
2936
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
2937
        goto give_sigsegv;
2938

    
2939
    signal = current_exec_domain_sig(sig);
2940

    
2941
    err |= copy_siginfo_to_user(&frame->info, info);
2942

    
2943
    /* Create the ucontext.  */
2944
    err |= __put_user(0, &frame->uc.uc_flags);
2945
    err |= __put_user(0, (unsigned long *)&frame->uc.uc_link);
2946
    err |= __put_user((unsigned long)target_sigaltstack_used.ss_sp,
2947
                      &frame->uc.uc_stack.ss_sp);
2948
    err |= __put_user(sas_ss_flags(regs->gregs[15]),
2949
                      &frame->uc.uc_stack.ss_flags);
2950
    err |= __put_user(target_sigaltstack_used.ss_size,
2951
                      &frame->uc.uc_stack.ss_size);
2952
    err |= setup_sigcontext(&frame->uc.uc_mcontext,
2953
                            regs, set->sig[0]);
2954
    for(i = 0; i < TARGET_NSIG_WORDS; i++) {
2955
        err |= __put_user(set->sig[i], &frame->uc.uc_sigmask.sig[i]);
2956
    }
2957

    
2958
    /* Set up to return from userspace.  If provided, use a stub
2959
       already in userspace.  */
2960
    if (ka->sa_flags & TARGET_SA_RESTORER) {
2961
        regs->pr = (unsigned long) ka->sa_restorer;
2962
    } else {
2963
        /* Generate return code (system call to sigreturn) */
2964
        err |= __put_user(MOVW(2), &frame->retcode[0]);
2965
        err |= __put_user(TRAP_NOARG, &frame->retcode[1]);
2966
        err |= __put_user((TARGET_NR_rt_sigreturn), &frame->retcode[2]);
2967
        regs->pr = (unsigned long) frame->retcode;
2968
    }
2969

    
2970
    if (err)
2971
        goto give_sigsegv;
2972

    
2973
    /* Set up registers for signal handler */
2974
    regs->gregs[15] = (unsigned long) frame;
2975
    regs->gregs[4] = signal; /* Arg for signal handler */
2976
    regs->gregs[5] = (unsigned long) &frame->info;
2977
    regs->gregs[6] = (unsigned long) &frame->uc;
2978
    regs->pc = (unsigned long) ka->_sa_handler;
2979

    
2980
    unlock_user_struct(frame, frame_addr, 1);
2981
    return;
2982

    
2983
give_sigsegv:
2984
    unlock_user_struct(frame, frame_addr, 1);
2985
    force_sig(TARGET_SIGSEGV);
2986
}
2987

    
2988
long do_sigreturn(CPUState *regs)
2989
{
2990
    struct target_sigframe *frame;
2991
    abi_ulong frame_addr;
2992
    sigset_t blocked;
2993
    target_sigset_t target_set;
2994
    target_ulong r0;
2995
    int i;
2996
    int err = 0;
2997

    
2998
#if defined(DEBUG_SIGNAL)
2999
    fprintf(stderr, "do_sigreturn\n");
3000
#endif
3001
    frame_addr = regs->gregs[15];
3002
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
3003
           goto badframe;
3004

    
3005
    err |= __get_user(target_set.sig[0], &frame->sc.oldmask);
3006
    for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3007
        err |= (__get_user(target_set.sig[i], &frame->extramask[i - 1]));
3008
    }
3009

    
3010
    if (err)
3011
        goto badframe;
3012

    
3013
    target_to_host_sigset_internal(&blocked, &target_set);
3014
    sigprocmask(SIG_SETMASK, &blocked, NULL);
3015

    
3016
    if (restore_sigcontext(regs, &frame->sc, &r0))
3017
        goto badframe;
3018

    
3019
    unlock_user_struct(frame, frame_addr, 0);
3020
    return r0;
3021

    
3022
badframe:
3023
    unlock_user_struct(frame, frame_addr, 0);
3024
    force_sig(TARGET_SIGSEGV);
3025
    return 0;
3026
}
3027

    
3028
long do_rt_sigreturn(CPUState *regs)
3029
{
3030
    struct target_rt_sigframe *frame;
3031
    abi_ulong frame_addr;
3032
    sigset_t blocked;
3033
    target_ulong r0;
3034

    
3035
#if defined(DEBUG_SIGNAL)
3036
    fprintf(stderr, "do_rt_sigreturn\n");
3037
#endif
3038
    frame_addr = regs->gregs[15];
3039
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
3040
           goto badframe;
3041

    
3042
    target_to_host_sigset(&blocked, &frame->uc.uc_sigmask);
3043
    sigprocmask(SIG_SETMASK, &blocked, NULL);
3044

    
3045
    if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &r0))
3046
        goto badframe;
3047

    
3048
    if (do_sigaltstack(frame_addr +
3049
                       offsetof(struct target_rt_sigframe, uc.uc_stack),
3050
                       0, get_sp_from_cpustate(regs)) == -EFAULT)
3051
        goto badframe;
3052

    
3053
    unlock_user_struct(frame, frame_addr, 0);
3054
    return r0;
3055

    
3056
badframe:
3057
    unlock_user_struct(frame, frame_addr, 0);
3058
    force_sig(TARGET_SIGSEGV);
3059
    return 0;
3060
}
3061
#elif defined(TARGET_MICROBLAZE)
3062

    
3063
struct target_sigcontext {
3064
    struct target_pt_regs regs;  /* needs to be first */
3065
    uint32_t oldmask;
3066
};
3067

    
3068
/* Signal frames. */
3069
struct target_signal_frame {
3070
    struct target_sigcontext sc;
3071
    uint32_t extramask[TARGET_NSIG_WORDS - 1];
3072
    uint32_t tramp[2];
3073
};
3074

    
3075
struct rt_signal_frame {
3076
    struct siginfo info;
3077
    struct ucontext uc;
3078
    uint32_t tramp[2];
3079
};
3080

    
3081
static void setup_sigcontext(struct target_sigcontext *sc, CPUState *env)
3082
{
3083
    __put_user(env->regs[0], &sc->regs.r0);
3084
    __put_user(env->regs[1], &sc->regs.r1);
3085
    __put_user(env->regs[2], &sc->regs.r2);
3086
    __put_user(env->regs[3], &sc->regs.r3);
3087
    __put_user(env->regs[4], &sc->regs.r4);
3088
    __put_user(env->regs[5], &sc->regs.r5);
3089
    __put_user(env->regs[6], &sc->regs.r6);
3090
    __put_user(env->regs[7], &sc->regs.r7);
3091
    __put_user(env->regs[8], &sc->regs.r8);
3092
    __put_user(env->regs[9], &sc->regs.r9);
3093
    __put_user(env->regs[10], &sc->regs.r10);
3094
    __put_user(env->regs[11], &sc->regs.r11);
3095
    __put_user(env->regs[12], &sc->regs.r12);
3096
    __put_user(env->regs[13], &sc->regs.r13);
3097
    __put_user(env->regs[14], &sc->regs.r14);
3098
    __put_user(env->regs[15], &sc->regs.r15);
3099
    __put_user(env->regs[16], &sc->regs.r16);
3100
    __put_user(env->regs[17], &sc->regs.r17);
3101
    __put_user(env->regs[18], &sc->regs.r18);
3102
    __put_user(env->regs[19], &sc->regs.r19);
3103
    __put_user(env->regs[20], &sc->regs.r20);
3104
    __put_user(env->regs[21], &sc->regs.r21);
3105
    __put_user(env->regs[22], &sc->regs.r22);
3106
    __put_user(env->regs[23], &sc->regs.r23);
3107
    __put_user(env->regs[24], &sc->regs.r24);
3108
    __put_user(env->regs[25], &sc->regs.r25);
3109
    __put_user(env->regs[26], &sc->regs.r26);
3110
    __put_user(env->regs[27], &sc->regs.r27);
3111
    __put_user(env->regs[28], &sc->regs.r28);
3112
    __put_user(env->regs[29], &sc->regs.r29);
3113
    __put_user(env->regs[30], &sc->regs.r30);
3114
    __put_user(env->regs[31], &sc->regs.r31);
3115
    __put_user(env->sregs[SR_PC], &sc->regs.pc);
3116
}
3117

    
3118
static void restore_sigcontext(struct target_sigcontext *sc, CPUState *env)
3119
{
3120
    __get_user(env->regs[0], &sc->regs.r0);
3121
    __get_user(env->regs[1], &sc->regs.r1);
3122
    __get_user(env->regs[2], &sc->regs.r2);
3123
    __get_user(env->regs[3], &sc->regs.r3);
3124
    __get_user(env->regs[4], &sc->regs.r4);
3125
    __get_user(env->regs[5], &sc->regs.r5);
3126
    __get_user(env->regs[6], &sc->regs.r6);
3127
    __get_user(env->regs[7], &sc->regs.r7);
3128
    __get_user(env->regs[8], &sc->regs.r8);
3129
    __get_user(env->regs[9], &sc->regs.r9);
3130
    __get_user(env->regs[10], &sc->regs.r10);
3131
    __get_user(env->regs[11], &sc->regs.r11);
3132
    __get_user(env->regs[12], &sc->regs.r12);
3133
    __get_user(env->regs[13], &sc->regs.r13);
3134
    __get_user(env->regs[14], &sc->regs.r14);
3135
    __get_user(env->regs[15], &sc->regs.r15);
3136
    __get_user(env->regs[16], &sc->regs.r16);
3137
    __get_user(env->regs[17], &sc->regs.r17);
3138
    __get_user(env->regs[18], &sc->regs.r18);
3139
    __get_user(env->regs[19], &sc->regs.r19);
3140
    __get_user(env->regs[20], &sc->regs.r20);
3141
    __get_user(env->regs[21], &sc->regs.r21);
3142
    __get_user(env->regs[22], &sc->regs.r22);
3143
    __get_user(env->regs[23], &sc->regs.r23);
3144
    __get_user(env->regs[24], &sc->regs.r24);
3145
    __get_user(env->regs[25], &sc->regs.r25);
3146
    __get_user(env->regs[26], &sc->regs.r26);
3147
    __get_user(env->regs[27], &sc->regs.r27);
3148
    __get_user(env->regs[28], &sc->regs.r28);
3149
    __get_user(env->regs[29], &sc->regs.r29);
3150
    __get_user(env->regs[30], &sc->regs.r30);
3151
    __get_user(env->regs[31], &sc->regs.r31);
3152
    __get_user(env->sregs[SR_PC], &sc->regs.pc);
3153
}
3154

    
3155
static abi_ulong get_sigframe(struct target_sigaction *ka,
3156
                              CPUState *env, int frame_size)
3157
{
3158
    abi_ulong sp = env->regs[1];
3159

    
3160
    if ((ka->sa_flags & SA_ONSTACK) != 0 && !on_sig_stack(sp))
3161
        sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
3162

    
3163
    return ((sp - frame_size) & -8UL);
3164
}
3165

    
3166
static void setup_frame(int sig, struct target_sigaction *ka,
3167
                        target_sigset_t *set, CPUState *env)
3168
{
3169
    struct target_signal_frame *frame;
3170
    abi_ulong frame_addr;
3171
    int err = 0;
3172
    int i;
3173

    
3174
    frame_addr = get_sigframe(ka, env, sizeof *frame);
3175
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
3176
        goto badframe;
3177

    
3178
    /* Save the mask.  */
3179
    err |= __put_user(set->sig[0], &frame->sc.oldmask);
3180
    if (err)
3181
        goto badframe;
3182

    
3183
    for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3184
        if (__put_user(set->sig[i], &frame->extramask[i - 1]))
3185
            goto badframe;
3186
    }
3187

    
3188
    setup_sigcontext(&frame->sc, env);
3189

    
3190
    /* Set up to return from userspace. If provided, use a stub
3191
       already in userspace. */
3192
    /* minus 8 is offset to cater for "rtsd r15,8" offset */
3193
    if (ka->sa_flags & TARGET_SA_RESTORER) {
3194
        env->regs[15] = ((unsigned long)ka->sa_restorer)-8;
3195
    } else {
3196
        uint32_t t;
3197
        /* Note, these encodings are _big endian_! */
3198
        /* addi r12, r0, __NR_sigreturn */
3199
        t = 0x31800000UL | TARGET_NR_sigreturn;
3200
        err |= __put_user(t, frame->tramp + 0);
3201
        /* brki r14, 0x8 */
3202
        t = 0xb9cc0008UL;
3203
        err |= __put_user(t, frame->tramp + 1);
3204

    
3205
        /* Return from sighandler will jump to the tramp.
3206
           Negative 8 offset because return is rtsd r15, 8 */
3207
        env->regs[15] = ((unsigned long)frame->tramp) - 8;
3208
    }
3209

    
3210
    if (err)
3211
        goto badframe;
3212

    
3213
    /* Set up registers for signal handler */
3214
    env->regs[1] = (unsigned long) frame;
3215
    /* Signal handler args: */
3216
    env->regs[5] = sig; /* Arg 0: signum */
3217
    env->regs[6] = (unsigned long) &frame->sc; /* arg 1: sigcontext */
3218

    
3219
    /* Offset of 4 to handle microblaze rtid r14, 0 */
3220
    env->sregs[SR_PC] = (unsigned long)ka->_sa_handler;
3221

    
3222
    unlock_user_struct(frame, frame_addr, 1);
3223
    return;
3224
  badframe:
3225
    unlock_user_struct(frame, frame_addr, 1);
3226
    force_sig(TARGET_SIGSEGV);
3227
}
3228

    
3229
static void setup_rt_frame(int sig, struct target_sigaction *ka,
3230
                           target_siginfo_t *info,
3231
                           target_sigset_t *set, CPUState *env)
3232
{
3233
    fprintf(stderr, "Microblaze setup_rt_frame: not implemented\n");
3234
}
3235

    
3236
long do_sigreturn(CPUState *env)
3237
{
3238
    struct target_signal_frame *frame;
3239
    abi_ulong frame_addr;
3240
    target_sigset_t target_set;
3241
    sigset_t set;
3242
    int i;
3243

    
3244
    frame_addr = env->regs[R_SP];
3245
    /* Make sure the guest isn't playing games.  */
3246
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 1))
3247
        goto badframe;
3248

    
3249
    /* Restore blocked signals */
3250
    if (__get_user(target_set.sig[0], &frame->sc.oldmask))
3251
        goto badframe;
3252
    for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3253
        if (__get_user(target_set.sig[i], &frame->extramask[i - 1]))
3254
            goto badframe;
3255
    }
3256
    target_to_host_sigset_internal(&set, &target_set);
3257
    sigprocmask(SIG_SETMASK, &set, NULL);
3258

    
3259
    restore_sigcontext(&frame->sc, env);
3260
    /* We got here through a sigreturn syscall, our path back is via an
3261
       rtb insn so setup r14 for that.  */
3262
    env->regs[14] = env->sregs[SR_PC];
3263
 
3264
    unlock_user_struct(frame, frame_addr, 0);
3265
    return env->regs[10];
3266
  badframe:
3267
    unlock_user_struct(frame, frame_addr, 0);
3268
    force_sig(TARGET_SIGSEGV);
3269
}
3270

    
3271
long do_rt_sigreturn(CPUState *env)
3272
{
3273
    fprintf(stderr, "Microblaze do_rt_sigreturn: not implemented\n");
3274
    return -TARGET_ENOSYS;
3275
}
3276

    
3277
#elif defined(TARGET_CRIS)
3278

    
3279
struct target_sigcontext {
3280
        struct target_pt_regs regs;  /* needs to be first */
3281
        uint32_t oldmask;
3282
        uint32_t usp;    /* usp before stacking this gunk on it */
3283
};
3284

    
3285
/* Signal frames. */
3286
struct target_signal_frame {
3287
        struct target_sigcontext sc;
3288
        uint32_t extramask[TARGET_NSIG_WORDS - 1];
3289
        uint8_t retcode[8];       /* Trampoline code. */
3290
};
3291

    
3292
struct rt_signal_frame {
3293
        struct siginfo *pinfo;
3294
        void *puc;
3295
        struct siginfo info;
3296
        struct ucontext uc;
3297
        uint8_t retcode[8];       /* Trampoline code. */
3298
};
3299

    
3300
static void setup_sigcontext(struct target_sigcontext *sc, CPUState *env)
3301
{
3302
        __put_user(env->regs[0], &sc->regs.r0);
3303
        __put_user(env->regs[1], &sc->regs.r1);
3304
        __put_user(env->regs[2], &sc->regs.r2);
3305
        __put_user(env->regs[3], &sc->regs.r3);
3306
        __put_user(env->regs[4], &sc->regs.r4);
3307
        __put_user(env->regs[5], &sc->regs.r5);
3308
        __put_user(env->regs[6], &sc->regs.r6);
3309
        __put_user(env->regs[7], &sc->regs.r7);
3310
        __put_user(env->regs[8], &sc->regs.r8);
3311
        __put_user(env->regs[9], &sc->regs.r9);
3312
        __put_user(env->regs[10], &sc->regs.r10);
3313
        __put_user(env->regs[11], &sc->regs.r11);
3314
        __put_user(env->regs[12], &sc->regs.r12);
3315
        __put_user(env->regs[13], &sc->regs.r13);
3316
        __put_user(env->regs[14], &sc->usp);
3317
        __put_user(env->regs[15], &sc->regs.acr);
3318
        __put_user(env->pregs[PR_MOF], &sc->regs.mof);
3319
        __put_user(env->pregs[PR_SRP], &sc->regs.srp);
3320
        __put_user(env->pc, &sc->regs.erp);
3321
}
3322

    
3323
static void restore_sigcontext(struct target_sigcontext *sc, CPUState *env)
3324
{
3325
        __get_user(env->regs[0], &sc->regs.r0);
3326
        __get_user(env->regs[1], &sc->regs.r1);
3327
        __get_user(env->regs[2], &sc->regs.r2);
3328
        __get_user(env->regs[3], &sc->regs.r3);
3329
        __get_user(env->regs[4], &sc->regs.r4);
3330
        __get_user(env->regs[5], &sc->regs.r5);
3331
        __get_user(env->regs[6], &sc->regs.r6);
3332
        __get_user(env->regs[7], &sc->regs.r7);
3333
        __get_user(env->regs[8], &sc->regs.r8);
3334
        __get_user(env->regs[9], &sc->regs.r9);
3335
        __get_user(env->regs[10], &sc->regs.r10);
3336
        __get_user(env->regs[11], &sc->regs.r11);
3337
        __get_user(env->regs[12], &sc->regs.r12);
3338
        __get_user(env->regs[13], &sc->regs.r13);
3339
        __get_user(env->regs[14], &sc->usp);
3340
        __get_user(env->regs[15], &sc->regs.acr);
3341
        __get_user(env->pregs[PR_MOF], &sc->regs.mof);
3342
        __get_user(env->pregs[PR_SRP], &sc->regs.srp);
3343
        __get_user(env->pc, &sc->regs.erp);
3344
}
3345

    
3346
static abi_ulong get_sigframe(CPUState *env, int framesize)
3347
{
3348
        abi_ulong sp;
3349
        /* Align the stack downwards to 4.  */
3350
        sp = (env->regs[R_SP] & ~3);
3351
        return sp - framesize;
3352
}
3353

    
3354
static void setup_frame(int sig, struct target_sigaction *ka,
3355
                        target_sigset_t *set, CPUState *env)
3356
{
3357
        struct target_signal_frame *frame;
3358
        abi_ulong frame_addr;
3359
        int err = 0;
3360
        int i;
3361

    
3362
        frame_addr = get_sigframe(env, sizeof *frame);
3363
        if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
3364
                goto badframe;
3365

    
3366
        /*
3367
         * The CRIS signal return trampoline. A real linux/CRIS kernel doesn't
3368
         * use this trampoline anymore but it sets it up for GDB.
3369
         * In QEMU, using the trampoline simplifies things a bit so we use it.
3370
         *
3371
         * This is movu.w __NR_sigreturn, r9; break 13;
3372
         */
3373
        err |= __put_user(0x9c5f, frame->retcode+0);
3374
        err |= __put_user(TARGET_NR_sigreturn, 
3375
                          frame->retcode+2);
3376
        err |= __put_user(0xe93d, frame->retcode+4);
3377

    
3378
        /* Save the mask.  */
3379
        err |= __put_user(set->sig[0], &frame->sc.oldmask);
3380
        if (err)
3381
                goto badframe;
3382

    
3383
        for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3384
                if (__put_user(set->sig[i], &frame->extramask[i - 1]))
3385
                        goto badframe;
3386
        }
3387

    
3388
        setup_sigcontext(&frame->sc, env);
3389

    
3390
        /* Move the stack and setup the arguments for the handler.  */
3391
        env->regs[R_SP] = (uint32_t) (unsigned long) frame;
3392
        env->regs[10] = sig;
3393
        env->pc = (unsigned long) ka->_sa_handler;
3394
        /* Link SRP so the guest returns through the trampoline.  */
3395
        env->pregs[PR_SRP] = (uint32_t) (unsigned long) &frame->retcode[0];
3396

    
3397
        unlock_user_struct(frame, frame_addr, 1);
3398
        return;
3399
  badframe:
3400
        unlock_user_struct(frame, frame_addr, 1);
3401
        force_sig(TARGET_SIGSEGV);
3402
}
3403

    
3404
static void setup_rt_frame(int sig, struct target_sigaction *ka,
3405
                           target_siginfo_t *info,
3406
                           target_sigset_t *set, CPUState *env)
3407
{
3408
    fprintf(stderr, "CRIS setup_rt_frame: not implemented\n");
3409
}
3410

    
3411
long do_sigreturn(CPUState *env)
3412
{
3413
        struct target_signal_frame *frame;
3414
        abi_ulong frame_addr;
3415
        target_sigset_t target_set;
3416
        sigset_t set;
3417
        int i;
3418

    
3419
        frame_addr = env->regs[R_SP];
3420
        /* Make sure the guest isn't playing games.  */
3421
        if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 1))
3422
                goto badframe;
3423

    
3424
        /* Restore blocked signals */
3425
        if (__get_user(target_set.sig[0], &frame->sc.oldmask))
3426
                goto badframe;
3427
        for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3428
                if (__get_user(target_set.sig[i], &frame->extramask[i - 1]))
3429
                        goto badframe;
3430
        }
3431
        target_to_host_sigset_internal(&set, &target_set);
3432
        sigprocmask(SIG_SETMASK, &set, NULL);
3433

    
3434
        restore_sigcontext(&frame->sc, env);
3435
        unlock_user_struct(frame, frame_addr, 0);
3436
        return env->regs[10];
3437
  badframe:
3438
        unlock_user_struct(frame, frame_addr, 0);
3439
        force_sig(TARGET_SIGSEGV);
3440
}
3441

    
3442
long do_rt_sigreturn(CPUState *env)
3443
{
3444
    fprintf(stderr, "CRIS do_rt_sigreturn: not implemented\n");
3445
    return -TARGET_ENOSYS;
3446
}
3447

    
3448
#elif defined(TARGET_PPC) && !defined(TARGET_PPC64)
3449

    
3450
/* FIXME: Many of the structures are defined for both PPC and PPC64, but
3451
   the signal handling is different enough that we haven't implemented
3452
   support for PPC64 yet.  Hence the restriction above.
3453

3454
   There are various #if'd blocks for code for TARGET_PPC64.  These
3455
   blocks should go away so that we can successfully run 32-bit and
3456
   64-bit binaries on a QEMU configured for PPC64.  */
3457

    
3458
/* Size of dummy stack frame allocated when calling signal handler.
3459
   See arch/powerpc/include/asm/ptrace.h.  */
3460
#if defined(TARGET_PPC64)
3461
#define SIGNAL_FRAMESIZE 128
3462
#else
3463
#define SIGNAL_FRAMESIZE 64
3464
#endif
3465

    
3466
/* See arch/powerpc/include/asm/sigcontext.h.  */
3467
struct target_sigcontext {
3468
    target_ulong _unused[4];
3469
    int32_t signal;
3470
#if defined(TARGET_PPC64)
3471
    int32_t pad0;
3472
#endif
3473
    target_ulong handler;
3474
    target_ulong oldmask;
3475
    target_ulong regs;      /* struct pt_regs __user * */
3476
    /* TODO: PPC64 includes extra bits here.  */
3477
};
3478

    
3479
/* Indices for target_mcontext.mc_gregs, below.
3480
   See arch/powerpc/include/asm/ptrace.h for details.  */
3481
enum {
3482
    TARGET_PT_R0 = 0,
3483
    TARGET_PT_R1 = 1,
3484
    TARGET_PT_R2 = 2,
3485
    TARGET_PT_R3 = 3,
3486
    TARGET_PT_R4 = 4,
3487
    TARGET_PT_R5 = 5,
3488
    TARGET_PT_R6 = 6,
3489
    TARGET_PT_R7 = 7,
3490
    TARGET_PT_R8 = 8,
3491
    TARGET_PT_R9 = 9,
3492
    TARGET_PT_R10 = 10,
3493
    TARGET_PT_R11 = 11,
3494
    TARGET_PT_R12 = 12,
3495
    TARGET_PT_R13 = 13,
3496
    TARGET_PT_R14 = 14,
3497
    TARGET_PT_R15 = 15,
3498
    TARGET_PT_R16 = 16,
3499
    TARGET_PT_R17 = 17,
3500
    TARGET_PT_R18 = 18,
3501
    TARGET_PT_R19 = 19,
3502
    TARGET_PT_R20 = 20,
3503
    TARGET_PT_R21 = 21,
3504
    TARGET_PT_R22 = 22,
3505
    TARGET_PT_R23 = 23,
3506
    TARGET_PT_R24 = 24,
3507
    TARGET_PT_R25 = 25,
3508
    TARGET_PT_R26 = 26,
3509
    TARGET_PT_R27 = 27,
3510
    TARGET_PT_R28 = 28,
3511
    TARGET_PT_R29 = 29,
3512
    TARGET_PT_R30 = 30,
3513
    TARGET_PT_R31 = 31,
3514
    TARGET_PT_NIP = 32,
3515
    TARGET_PT_MSR = 33,
3516
    TARGET_PT_ORIG_R3 = 34,
3517
    TARGET_PT_CTR = 35,
3518
    TARGET_PT_LNK = 36,
3519
    TARGET_PT_XER = 37,
3520
    TARGET_PT_CCR = 38,
3521
    /* Yes, there are two registers with #39.  One is 64-bit only.  */
3522
    TARGET_PT_MQ = 39,
3523
    TARGET_PT_SOFTE = 39,
3524
    TARGET_PT_TRAP = 40,
3525
    TARGET_PT_DAR = 41,
3526
    TARGET_PT_DSISR = 42,
3527
    TARGET_PT_RESULT = 43,
3528
    TARGET_PT_REGS_COUNT = 44
3529
};
3530

    
3531
/* See arch/powerpc/include/asm/ucontext.h.  Only used for 32-bit PPC;
3532
   on 64-bit PPC, sigcontext and mcontext are one and the same.  */
3533
struct target_mcontext {
3534
    target_ulong mc_gregs[48];
3535
    /* Includes fpscr.  */
3536
    uint64_t mc_fregs[33];
3537
    target_ulong mc_pad[2];
3538
    /* We need to handle Altivec and SPE at the same time, which no
3539
       kernel needs to do.  Fortunately, the kernel defines this bit to
3540
       be Altivec-register-large all the time, rather than trying to
3541
       twiddle it based on the specific platform.  */
3542
    union {
3543
        /* SPE vector registers.  One extra for SPEFSCR.  */
3544
        uint32_t spe[33];
3545
        /* Altivec vector registers.  The packing of VSCR and VRSAVE
3546
           varies depending on whether we're PPC64 or not: PPC64 splits
3547
           them apart; PPC32 stuffs them together.  */
3548
#if defined(TARGET_PPC64)
3549
#define QEMU_NVRREG 34
3550
#else
3551
#define QEMU_NVRREG 33
3552
#endif
3553
        ppc_avr_t altivec[QEMU_NVRREG];
3554
#undef QEMU_NVRREG
3555
    } mc_vregs __attribute__((__aligned__(16)));
3556
};
3557

    
3558
struct target_ucontext {
3559
    target_ulong uc_flags;
3560
    target_ulong uc_link;    /* struct ucontext __user * */
3561
    struct target_sigaltstack uc_stack;
3562
#if !defined(TARGET_PPC64)
3563
    int32_t uc_pad[7];
3564
    target_ulong uc_regs;    /* struct mcontext __user *
3565
                                points to uc_mcontext field */
3566
#endif
3567
    target_sigset_t uc_sigmask;
3568
#if defined(TARGET_PPC64)
3569
    target_sigset_t unused[15]; /* Allow for uc_sigmask growth */
3570
    struct target_sigcontext uc_mcontext;
3571
#else
3572
    int32_t uc_maskext[30];
3573
    int32_t uc_pad2[3];
3574
    struct target_mcontext uc_mcontext;
3575
#endif
3576
};
3577

    
3578
/* See arch/powerpc/kernel/signal_32.c.  */
3579
struct target_sigframe {
3580
    struct target_sigcontext sctx;
3581
    struct target_mcontext mctx;
3582
    int32_t abigap[56];
3583
};
3584

    
3585
struct target_rt_sigframe {
3586
    struct target_siginfo info;
3587
    struct target_ucontext uc;
3588
    int32_t abigap[56];
3589
};
3590

    
3591
/* We use the mc_pad field for the signal return trampoline.  */
3592
#define tramp mc_pad
3593

    
3594
/* See arch/powerpc/kernel/signal.c.  */
3595
static target_ulong get_sigframe(struct target_sigaction *ka,
3596
                                 CPUState *env,
3597
                                 int frame_size)
3598
{
3599
    target_ulong oldsp, newsp;
3600

    
3601
    oldsp = env->gpr[1];
3602

    
3603
    if ((ka->sa_flags & TARGET_SA_ONSTACK) &&
3604
        (sas_ss_flags(oldsp))) {
3605
        oldsp = (target_sigaltstack_used.ss_sp
3606
                 + target_sigaltstack_used.ss_size);
3607
    }
3608

    
3609
    newsp = (oldsp - frame_size) & ~0xFUL;
3610

    
3611
    return newsp;
3612
}
3613

    
3614
static int save_user_regs(CPUState *env, struct target_mcontext *frame,
3615
                          int sigret)
3616
{
3617
    target_ulong msr = env->msr;
3618
    int i;
3619
    target_ulong ccr = 0;
3620

    
3621
    /* In general, the kernel attempts to be intelligent about what it
3622
       needs to save for Altivec/FP/SPE registers.  We don't care that
3623
       much, so we just go ahead and save everything.  */
3624

    
3625
    /* Save general registers.  */
3626
    for (i = 0; i < ARRAY_SIZE(env->gpr); i++) {
3627
        if (__put_user(env->gpr[i], &frame->mc_gregs[i])) {
3628
            return 1;
3629
        }
3630
    }
3631
    if (__put_user(env->nip, &frame->mc_gregs[TARGET_PT_NIP])
3632
        || __put_user(env->ctr, &frame->mc_gregs[TARGET_PT_CTR])
3633
        || __put_user(env->lr, &frame->mc_gregs[TARGET_PT_LNK])
3634
        || __put_user(env->xer, &frame->mc_gregs[TARGET_PT_XER]))
3635
        return 1;
3636

    
3637
    for (i = 0; i < ARRAY_SIZE(env->crf); i++) {
3638
        ccr |= env->crf[i] << (32 - ((i + 1) * 4));
3639
    }
3640
    if (__put_user(ccr, &frame->mc_gregs[TARGET_PT_CCR]))
3641
        return 1;
3642

    
3643
    /* Save Altivec registers if necessary.  */
3644
    if (env->insns_flags & PPC_ALTIVEC) {
3645
        for (i = 0; i < ARRAY_SIZE(env->avr); i++) {
3646
            ppc_avr_t *avr = &env->avr[i];
3647
            ppc_avr_t *vreg = &frame->mc_vregs.altivec[i];
3648

    
3649
            if (__put_user(avr->u64[0], &vreg->u64[0]) ||
3650
                __put_user(avr->u64[1], &vreg->u64[1])) {
3651
                return 1;
3652
            }
3653
        }
3654
        /* Set MSR_VR in the saved MSR value to indicate that
3655
           frame->mc_vregs contains valid data.  */
3656
        msr |= MSR_VR;
3657
        if (__put_user((uint32_t)env->spr[SPR_VRSAVE],
3658
                       &frame->mc_vregs.altivec[32].u32[3]))
3659
            return 1;
3660
    }
3661

    
3662
    /* Save floating point registers.  */
3663
    if (env->insns_flags & PPC_FLOAT) {
3664
        for (i = 0; i < ARRAY_SIZE(env->fpr); i++) {
3665
            if (__put_user(env->fpr[i], &frame->mc_fregs[i])) {
3666
                return 1;
3667
            }
3668
        }
3669
        if (__put_user((uint64_t) env->fpscr, &frame->mc_fregs[32]))
3670
            return 1;
3671
    }
3672

    
3673
    /* Save SPE registers.  The kernel only saves the high half.  */
3674
    if (env->insns_flags & PPC_SPE) {
3675
#if defined(TARGET_PPC64)
3676
        for (i = 0; i < ARRAY_SIZE(env->gpr); i++) {
3677
            if (__put_user(env->gpr[i] >> 32, &frame->mc_vregs.spe[i])) {
3678
                return 1;
3679
            }
3680
        }
3681
#else
3682
        for (i = 0; i < ARRAY_SIZE(env->gprh); i++) {
3683
            if (__put_user(env->gprh[i], &frame->mc_vregs.spe[i])) {
3684
                return 1;
3685
            }
3686
        }
3687
#endif
3688
        /* Set MSR_SPE in the saved MSR value to indicate that
3689
           frame->mc_vregs contains valid data.  */
3690
        msr |= MSR_SPE;
3691
        if (__put_user(env->spe_fscr, &frame->mc_vregs.spe[32]))
3692
            return 1;
3693
    }
3694

    
3695
    /* Store MSR.  */
3696
    if (__put_user(msr, &frame->mc_gregs[TARGET_PT_MSR]))
3697
        return 1;
3698

    
3699
    /* Set up the sigreturn trampoline: li r0,sigret; sc.  */
3700
    if (sigret) {
3701
        if (__put_user(0x38000000UL | sigret, &frame->tramp[0]) ||
3702
            __put_user(0x44000002UL, &frame->tramp[1])) {
3703
            return 1;
3704
        }
3705
    }
3706

    
3707
    return 0;
3708
}
3709

    
3710
static int restore_user_regs(CPUState *env,
3711
                             struct target_mcontext *frame, int sig)
3712
{
3713
    target_ulong save_r2 = 0;
3714
    target_ulong msr;
3715
    target_ulong ccr;
3716

    
3717
    int i;
3718

    
3719
    if (!sig) {
3720
        save_r2 = env->gpr[2];
3721
    }
3722

    
3723
    /* Restore general registers.  */
3724
    for (i = 0; i < ARRAY_SIZE(env->gpr); i++) {
3725
        if (__get_user(env->gpr[i], &frame->mc_gregs[i])) {
3726
            return 1;
3727
        }
3728
    }
3729
    if (__get_user(env->nip, &frame->mc_gregs[TARGET_PT_NIP])
3730
        || __get_user(env->ctr, &frame->mc_gregs[TARGET_PT_CTR])
3731
        || __get_user(env->lr, &frame->mc_gregs[TARGET_PT_LNK])
3732
        || __get_user(env->xer, &frame->mc_gregs[TARGET_PT_XER]))
3733
        return 1;
3734
    if (__get_user(ccr, &frame->mc_gregs[TARGET_PT_CCR]))
3735
        return 1;
3736

    
3737
    for (i = 0; i < ARRAY_SIZE(env->crf); i++) {
3738
        env->crf[i] = (ccr >> (32 - ((i + 1) * 4))) & 0xf;
3739
    }
3740

    
3741
    if (!sig) {
3742
        env->gpr[2] = save_r2;
3743
    }
3744
    /* Restore MSR.  */
3745
    if (__get_user(msr, &frame->mc_gregs[TARGET_PT_MSR]))
3746
        return 1;
3747

    
3748
    /* If doing signal return, restore the previous little-endian mode.  */
3749
    if (sig)
3750
        env->msr = (env->msr & ~MSR_LE) | (msr & MSR_LE);
3751

    
3752
    /* Restore Altivec registers if necessary.  */
3753
    if (env->insns_flags & PPC_ALTIVEC) {
3754
        for (i = 0; i < ARRAY_SIZE(env->avr); i++) {
3755
            ppc_avr_t *avr = &env->avr[i];
3756
            ppc_avr_t *vreg = &frame->mc_vregs.altivec[i];
3757

    
3758
            if (__get_user(avr->u64[0], &vreg->u64[0]) ||
3759
                __get_user(avr->u64[1], &vreg->u64[1])) {
3760
                return 1;
3761
            }
3762
        }
3763
        /* Set MSR_VEC in the saved MSR value to indicate that
3764
           frame->mc_vregs contains valid data.  */
3765
        if (__get_user(env->spr[SPR_VRSAVE],
3766
                       (target_ulong *)(&frame->mc_vregs.altivec[32].u32[3])))
3767
            return 1;
3768
    }
3769

    
3770
    /* Restore floating point registers.  */
3771
    if (env->insns_flags & PPC_FLOAT) {
3772
        uint64_t fpscr;
3773
        for (i = 0; i < ARRAY_SIZE(env->fpr); i++) {
3774
            if (__get_user(env->fpr[i], &frame->mc_fregs[i])) {
3775
                return 1;
3776
            }
3777
        }
3778
        if (__get_user(fpscr, &frame->mc_fregs[32]))
3779
            return 1;
3780
        env->fpscr = (uint32_t) fpscr;
3781
    }
3782

    
3783
    /* Save SPE registers.  The kernel only saves the high half.  */
3784
    if (env->insns_flags & PPC_SPE) {
3785
#if defined(TARGET_PPC64)
3786
        for (i = 0; i < ARRAY_SIZE(env->gpr); i++) {
3787
            uint32_t hi;
3788

    
3789
            if (__get_user(hi, &frame->mc_vregs.spe[i])) {
3790
                return 1;
3791
            }
3792
            env->gpr[i] = ((uint64_t)hi << 32) | ((uint32_t) env->gpr[i]);
3793
        }
3794
#else
3795
        for (i = 0; i < ARRAY_SIZE(env->gprh); i++) {
3796
            if (__get_user(env->gprh[i], &frame->mc_vregs.spe[i])) {
3797
                return 1;
3798
            }
3799
        }
3800
#endif
3801
        if (__get_user(env->spe_fscr, &frame->mc_vregs.spe[32]))
3802
            return 1;
3803
    }
3804

    
3805
    return 0;
3806
}
3807

    
3808
static void setup_frame(int sig, struct target_sigaction *ka,
3809
                        target_sigset_t *set, CPUState *env)
3810
{
3811
    struct target_sigframe *frame;
3812
    struct target_sigcontext *sc;
3813
    target_ulong frame_addr, newsp;
3814
    int err = 0;
3815
    int signal;
3816

    
3817
    frame_addr = get_sigframe(ka, env, sizeof(*frame));
3818
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 1))
3819
        goto sigsegv;
3820
    sc = &frame->sctx;
3821

    
3822
    signal = current_exec_domain_sig(sig);
3823

    
3824
    err |= __put_user(h2g(ka->_sa_handler), &sc->handler);
3825
    err |= __put_user(set->sig[0], &sc->oldmask);
3826
#if defined(TARGET_PPC64)
3827
    err |= __put_user(set->sig[0] >> 32, &sc->_unused[3]);
3828
#else
3829
    err |= __put_user(set->sig[1], &sc->_unused[3]);
3830
#endif
3831
    err |= __put_user(h2g(&frame->mctx), &sc->regs);
3832
    err |= __put_user(sig, &sc->signal);
3833

    
3834
    /* Save user regs.  */
3835
    err |= save_user_regs(env, &frame->mctx, TARGET_NR_sigreturn);
3836

    
3837
    /* The kernel checks for the presence of a VDSO here.  We don't
3838
       emulate a vdso, so use a sigreturn system call.  */
3839
    env->lr = (target_ulong) h2g(frame->mctx.tramp);
3840

    
3841
    /* Turn off all fp exceptions.  */
3842
    env->fpscr = 0;
3843

    
3844
    /* Create a stack frame for the caller of the handler.  */
3845
    newsp = frame_addr - SIGNAL_FRAMESIZE;
3846
    err |= __put_user(env->gpr[1], (target_ulong *)(uintptr_t) newsp);
3847

    
3848
    if (err)
3849
        goto sigsegv;
3850

    
3851
    /* Set up registers for signal handler.  */
3852
    env->gpr[1] = newsp;
3853
    env->gpr[3] = signal;
3854
    env->gpr[4] = (target_ulong) h2g(sc);
3855
    env->nip = (target_ulong) ka->_sa_handler;
3856
    /* Signal handlers are entered in big-endian mode.  */
3857
    env->msr &= ~MSR_LE;
3858

    
3859
    unlock_user_struct(frame, frame_addr, 1);
3860
    return;
3861

    
3862
sigsegv:
3863
    unlock_user_struct(frame, frame_addr, 1);
3864
    if (logfile)
3865
        fprintf (logfile, "segfaulting from setup_frame\n");
3866
    force_sig(TARGET_SIGSEGV);
3867
}
3868

    
3869
static void setup_rt_frame(int sig, struct target_sigaction *ka,
3870
                           target_siginfo_t *info,
3871
                           target_sigset_t *set, CPUState *env)
3872
{
3873
    struct target_rt_sigframe *rt_sf;
3874
    struct target_mcontext *frame;
3875
    target_ulong rt_sf_addr, newsp = 0;
3876
    int i, err = 0;
3877
    int signal;
3878

    
3879
    rt_sf_addr = get_sigframe(ka, env, sizeof(*rt_sf));
3880
    if (!lock_user_struct(VERIFY_WRITE, rt_sf, rt_sf_addr, 1))
3881
        goto sigsegv;
3882

    
3883
    signal = current_exec_domain_sig(sig);
3884

    
3885
    err |= copy_siginfo_to_user(&rt_sf->info, info);
3886

    
3887
    err |= __put_user(0, &rt_sf->uc.uc_flags);
3888
    err |= __put_user(0, &rt_sf->uc.uc_link);
3889
    err |= __put_user((target_ulong)target_sigaltstack_used.ss_sp,
3890
                      &rt_sf->uc.uc_stack.ss_sp);
3891
    err |= __put_user(sas_ss_flags(env->gpr[1]),
3892
                      &rt_sf->uc.uc_stack.ss_flags);
3893
    err |= __put_user(target_sigaltstack_used.ss_size,
3894
                      &rt_sf->uc.uc_stack.ss_size);
3895
    err |= __put_user(h2g (&rt_sf->uc.uc_mcontext),
3896
                      &rt_sf->uc.uc_regs);
3897
    for(i = 0; i < TARGET_NSIG_WORDS; i++) {
3898
        err |= __put_user(set->sig[i], &rt_sf->uc.uc_sigmask.sig[i]);
3899
    }
3900

    
3901
    frame = &rt_sf->uc.uc_mcontext;
3902
    err |= save_user_regs(env, frame, TARGET_NR_rt_sigreturn);
3903

    
3904
    /* The kernel checks for the presence of a VDSO here.  We don't
3905
       emulate a vdso, so use a sigreturn system call.  */
3906
    env->lr = (target_ulong) h2g(frame->tramp);
3907

    
3908
    /* Turn off all fp exceptions.  */
3909
    env->fpscr = 0;
3910

    
3911
    /* Create a stack frame for the caller of the handler.  */
3912
    newsp = rt_sf_addr - (SIGNAL_FRAMESIZE + 16);
3913
    err |= __put_user(env->gpr[1], (target_ulong *)(uintptr_t) newsp);
3914

    
3915
    if (err)
3916
        goto sigsegv;
3917

    
3918
    /* Set up registers for signal handler.  */
3919
    env->gpr[1] = newsp;
3920
    env->gpr[3] = (target_ulong) signal;
3921
    env->gpr[4] = (target_ulong) h2g(&rt_sf->info);
3922
    env->gpr[5] = (target_ulong) h2g(&rt_sf->uc);
3923
    env->gpr[6] = (target_ulong) h2g(rt_sf);
3924
    env->nip = (target_ulong) ka->_sa_handler;
3925
    /* Signal handlers are entered in big-endian mode.  */
3926
    env->msr &= ~MSR_LE;
3927

    
3928
    unlock_user_struct(rt_sf, rt_sf_addr, 1);
3929
    return;
3930

    
3931
sigsegv:
3932
    unlock_user_struct(rt_sf, rt_sf_addr, 1);
3933
    if (logfile)
3934
        fprintf (logfile, "segfaulting from setup_rt_frame\n");
3935
    force_sig(TARGET_SIGSEGV);
3936

    
3937
}
3938

    
3939
long do_sigreturn(CPUState *env)
3940
{
3941
    struct target_sigcontext *sc = NULL;
3942
    struct target_mcontext *sr = NULL;
3943
    target_ulong sr_addr, sc_addr;
3944
    sigset_t blocked;
3945
    target_sigset_t set;
3946

    
3947
    sc_addr = env->gpr[1] + SIGNAL_FRAMESIZE;
3948
    if (!lock_user_struct(VERIFY_READ, sc, sc_addr, 1))
3949
        goto sigsegv;
3950

    
3951
#if defined(TARGET_PPC64)
3952
    set.sig[0] = sc->oldmask + ((long)(sc->_unused[3]) << 32);
3953
#else
3954
    if(__get_user(set.sig[0], &sc->oldmask) ||
3955
       __get_user(set.sig[1], &sc->_unused[3]))
3956
       goto sigsegv;
3957
#endif
3958
    target_to_host_sigset_internal(&blocked, &set);
3959
    sigprocmask(SIG_SETMASK, &blocked, NULL);
3960

    
3961
    if (__get_user(sr_addr, &sc->regs))
3962
        goto sigsegv;
3963
    if (!lock_user_struct(VERIFY_READ, sr, sr_addr, 1))
3964
        goto sigsegv;
3965
    if (restore_user_regs(env, sr, 1))
3966
        goto sigsegv;
3967

    
3968
    unlock_user_struct(sr, sr_addr, 1);
3969
    unlock_user_struct(sc, sc_addr, 1);
3970
    return -TARGET_QEMU_ESIGRETURN;
3971

    
3972
sigsegv:
3973
    unlock_user_struct(sr, sr_addr, 1);
3974
    unlock_user_struct(sc, sc_addr, 1);
3975
    if (logfile)
3976
        fprintf (logfile, "segfaulting from do_sigreturn\n");
3977
    force_sig(TARGET_SIGSEGV);
3978
    return 0;
3979
}
3980

    
3981
/* See arch/powerpc/kernel/signal_32.c.  */
3982
static int do_setcontext(struct target_ucontext *ucp, CPUState *env, int sig)
3983
{
3984
    struct target_mcontext *mcp;
3985
    target_ulong mcp_addr;
3986
    sigset_t blocked;
3987
    target_sigset_t set;
3988

    
3989
    if (copy_from_user(&set, h2g(ucp) + offsetof(struct target_ucontext, uc_sigmask),
3990
                       sizeof (set)))
3991
        return 1;
3992

    
3993
#if defined(TARGET_PPC64)
3994
    fprintf (stderr, "do_setcontext: not implemented\n");
3995
    return 0;
3996
#else
3997
    if (__get_user(mcp_addr, &ucp->uc_regs))
3998
        return 1;
3999

    
4000
    if (!lock_user_struct(VERIFY_READ, mcp, mcp_addr, 1))
4001
        return 1;
4002

    
4003
    target_to_host_sigset_internal(&blocked, &set);
4004
    sigprocmask(SIG_SETMASK, &blocked, NULL);
4005
    if (restore_user_regs(env, mcp, sig))
4006
        goto sigsegv;
4007

    
4008
    unlock_user_struct(mcp, mcp_addr, 1);
4009
    return 0;
4010

    
4011
sigsegv:
4012
    unlock_user_struct(mcp, mcp_addr, 1);
4013
    return 1;
4014
#endif
4015
}
4016

    
4017
long do_rt_sigreturn(CPUState *env)
4018
{
4019
    struct target_rt_sigframe *rt_sf = NULL;
4020
    target_ulong rt_sf_addr;
4021

    
4022
    rt_sf_addr = env->gpr[1] + SIGNAL_FRAMESIZE + 16;
4023
    if (!lock_user_struct(VERIFY_READ, rt_sf, rt_sf_addr, 1))
4024
        goto sigsegv;
4025

    
4026
    if (do_setcontext(&rt_sf->uc, env, 1))
4027
        goto sigsegv;
4028

    
4029
    do_sigaltstack(rt_sf_addr
4030
                   + offsetof(struct target_rt_sigframe, uc.uc_stack),
4031
                   0, env->gpr[1]);
4032

    
4033
    unlock_user_struct(rt_sf, rt_sf_addr, 1);
4034
    return -TARGET_QEMU_ESIGRETURN;
4035

    
4036
sigsegv:
4037
    unlock_user_struct(rt_sf, rt_sf_addr, 1);
4038
    if (logfile)
4039
        fprintf (logfile, "segfaulting from do_rt_sigreturn\n");
4040
    force_sig(TARGET_SIGSEGV);
4041
    return 0;
4042
}
4043

    
4044
#elif defined(TARGET_M68K)
4045

    
4046
struct target_sigcontext {
4047
    abi_ulong  sc_mask;
4048
    abi_ulong  sc_usp;
4049
    abi_ulong  sc_d0;
4050
    abi_ulong  sc_d1;
4051
    abi_ulong  sc_a0;
4052
    abi_ulong  sc_a1;
4053
    unsigned short sc_sr;
4054
    abi_ulong  sc_pc;
4055
};
4056

    
4057
struct target_sigframe
4058
{
4059
    abi_ulong pretcode;
4060
    int sig;
4061
    int code;
4062
    abi_ulong psc;
4063
    char retcode[8];
4064
    abi_ulong extramask[TARGET_NSIG_WORDS-1];
4065
    struct target_sigcontext sc;
4066
};
4067
 
4068
typedef int target_greg_t;
4069
#define TARGET_NGREG 18
4070
typedef target_greg_t target_gregset_t[TARGET_NGREG];
4071

    
4072
typedef struct target_fpregset {
4073
    int f_fpcntl[3];
4074
    int f_fpregs[8*3];
4075
} target_fpregset_t;
4076

    
4077
struct target_mcontext {
4078
    int version;
4079
    target_gregset_t gregs;
4080
    target_fpregset_t fpregs;
4081
};
4082

    
4083
#define TARGET_MCONTEXT_VERSION 2
4084

    
4085
struct target_ucontext {
4086
    abi_ulong uc_flags;
4087
    abi_ulong uc_link;
4088
    target_stack_t uc_stack;
4089
    struct target_mcontext uc_mcontext;
4090
    abi_long uc_filler[80];
4091
    target_sigset_t uc_sigmask;
4092
};
4093

    
4094
struct target_rt_sigframe
4095
{
4096
    abi_ulong pretcode;
4097
    int sig;
4098
    abi_ulong pinfo;
4099
    abi_ulong puc;
4100
    char retcode[8];
4101
    struct target_siginfo info;
4102
    struct target_ucontext uc;
4103
};
4104

    
4105
static int
4106
setup_sigcontext(struct target_sigcontext *sc, CPUState *env, abi_ulong mask)
4107
{
4108
    int err = 0;
4109

    
4110
    err |= __put_user(mask, &sc->sc_mask);
4111
    err |= __put_user(env->aregs[7], &sc->sc_usp);
4112
    err |= __put_user(env->dregs[0], &sc->sc_d0);
4113
    err |= __put_user(env->dregs[1], &sc->sc_d1);
4114
    err |= __put_user(env->aregs[0], &sc->sc_a0);
4115
    err |= __put_user(env->aregs[1], &sc->sc_a1);
4116
    err |= __put_user(env->sr, &sc->sc_sr);
4117
    err |= __put_user(env->pc, &sc->sc_pc);
4118

    
4119
    return err;
4120
}
4121

    
4122
static int
4123
restore_sigcontext(CPUState *env, struct target_sigcontext *sc, int *pd0)
4124
{
4125
    int err = 0;
4126
    int temp;
4127

    
4128
    err |= __get_user(env->aregs[7], &sc->sc_usp);
4129
    err |= __get_user(env->dregs[1], &sc->sc_d1);
4130
    err |= __get_user(env->aregs[0], &sc->sc_a0);
4131
    err |= __get_user(env->aregs[1], &sc->sc_a1);
4132
    err |= __get_user(env->pc, &sc->sc_pc);
4133
    err |= __get_user(temp, &sc->sc_sr);
4134
    env->sr = (env->sr & 0xff00) | (temp & 0xff);
4135

    
4136
    *pd0 = tswapl(sc->sc_d0);
4137

    
4138
    return err;
4139
}
4140

    
4141
/*
4142
 * Determine which stack to use..
4143
 */
4144
static inline abi_ulong
4145
get_sigframe(struct target_sigaction *ka, CPUState *regs, size_t frame_size)
4146
{
4147
    unsigned long sp;
4148

    
4149
    sp = regs->aregs[7];
4150

    
4151
    /* This is the X/Open sanctioned signal stack switching.  */
4152
    if ((ka->sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags (sp) == 0)) {
4153
        sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
4154
    }
4155

    
4156
    return ((sp - frame_size) & -8UL);
4157
}
4158

    
4159
static void setup_frame(int sig, struct target_sigaction *ka,
4160
                        target_sigset_t *set, CPUState *env)
4161
{
4162
    struct target_sigframe *frame;
4163
    abi_ulong frame_addr;
4164
    abi_ulong retcode_addr;
4165
    abi_ulong sc_addr;
4166
    int err = 0;
4167
    int i;
4168

    
4169
    frame_addr = get_sigframe(ka, env, sizeof *frame);
4170
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
4171
        goto give_sigsegv;
4172

    
4173
    err |= __put_user(sig, &frame->sig);
4174

    
4175
    sc_addr = frame_addr + offsetof(struct target_sigframe, sc);
4176
    err |= __put_user(sc_addr, &frame->psc);
4177

    
4178
    err |= setup_sigcontext(&frame->sc, env, set->sig[0]);
4179
    if (err)
4180
        goto give_sigsegv;
4181

    
4182
    for(i = 1; i < TARGET_NSIG_WORDS; i++) {
4183
        if (__put_user(set->sig[i], &frame->extramask[i - 1]))
4184
            goto give_sigsegv;
4185
    }
4186

    
4187
    /* Set up to return from userspace.  */
4188

    
4189
    retcode_addr = frame_addr + offsetof(struct target_sigframe, retcode);
4190
    err |= __put_user(retcode_addr, &frame->pretcode);
4191

    
4192
    /* moveq #,d0; trap #0 */
4193

    
4194
    err |= __put_user(0x70004e40 + (TARGET_NR_sigreturn << 16),
4195
                      (long *)(frame->retcode));
4196

    
4197
    if (err)
4198
        goto give_sigsegv;
4199

    
4200
    /* Set up to return from userspace */
4201

    
4202
    env->aregs[7] = frame_addr;
4203
    env->pc = ka->_sa_handler;
4204

    
4205
    unlock_user_struct(frame, frame_addr, 1);
4206
    return;
4207

    
4208
give_sigsegv:
4209
    unlock_user_struct(frame, frame_addr, 1);
4210
    force_sig(TARGET_SIGSEGV);
4211
}
4212

    
4213
static inline int target_rt_setup_ucontext(struct target_ucontext *uc,
4214
                                           CPUState *env)
4215
{
4216
    target_greg_t *gregs = uc->uc_mcontext.gregs;
4217
    int err;
4218

    
4219
    err = __put_user(TARGET_MCONTEXT_VERSION, &uc->uc_mcontext.version);
4220
    err |= __put_user(env->dregs[0], &gregs[0]);
4221
    err |= __put_user(env->dregs[1], &gregs[1]);
4222
    err |= __put_user(env->dregs[2], &gregs[2]);
4223
    err |= __put_user(env->dregs[3], &gregs[3]);
4224
    err |= __put_user(env->dregs[4], &gregs[4]);
4225
    err |= __put_user(env->dregs[5], &gregs[5]);
4226
    err |= __put_user(env->dregs[6], &gregs[6]);
4227
    err |= __put_user(env->dregs[7], &gregs[7]);
4228
    err |= __put_user(env->aregs[0], &gregs[8]);
4229
    err |= __put_user(env->aregs[1], &gregs[9]);
4230
    err |= __put_user(env->aregs[2], &gregs[10]);
4231
    err |= __put_user(env->aregs[3], &gregs[11]);
4232
    err |= __put_user(env->aregs[4], &gregs[12]);
4233
    err |= __put_user(env->aregs[5], &gregs[13]);
4234
    err |= __put_user(env->aregs[6], &gregs[14]);
4235
    err |= __put_user(env->aregs[7], &gregs[15]);
4236
    err |= __put_user(env->pc, &gregs[16]);
4237
    err |= __put_user(env->sr, &gregs[17]);
4238

    
4239
    return err;
4240
}
4241
 
4242
static inline int target_rt_restore_ucontext(CPUState *env,
4243
                                             struct target_ucontext *uc,
4244
                                             int *pd0)
4245
{
4246
    int temp;
4247
    int err;
4248
    target_greg_t *gregs = uc->uc_mcontext.gregs;
4249
    
4250
    err = __get_user(temp, &uc->uc_mcontext.version);
4251
    if (temp != TARGET_MCONTEXT_VERSION)
4252
        goto badframe;
4253

    
4254
    /* restore passed registers */
4255
    err |= __get_user(env->dregs[0], &gregs[0]);
4256
    err |= __get_user(env->dregs[1], &gregs[1]);
4257
    err |= __get_user(env->dregs[2], &gregs[2]);
4258
    err |= __get_user(env->dregs[3], &gregs[3]);
4259
    err |= __get_user(env->dregs[4], &gregs[4]);
4260
    err |= __get_user(env->dregs[5], &gregs[5]);
4261
    err |= __get_user(env->dregs[6], &gregs[6]);
4262
    err |= __get_user(env->dregs[7], &gregs[7]);
4263
    err |= __get_user(env->aregs[0], &gregs[8]);
4264
    err |= __get_user(env->aregs[1], &gregs[9]);
4265
    err |= __get_user(env->aregs[2], &gregs[10]);
4266
    err |= __get_user(env->aregs[3], &gregs[11]);
4267
    err |= __get_user(env->aregs[4], &gregs[12]);
4268
    err |= __get_user(env->aregs[5], &gregs[13]);
4269
    err |= __get_user(env->aregs[6], &gregs[14]);
4270
    err |= __get_user(env->aregs[7], &gregs[15]);
4271
    err |= __get_user(env->pc, &gregs[16]);
4272
    err |= __get_user(temp, &gregs[17]);
4273
    env->sr = (env->sr & 0xff00) | (temp & 0xff);
4274

    
4275
    *pd0 = env->dregs[0];
4276
    return err;
4277

    
4278
badframe:
4279
    return 1;
4280
}
4281

    
4282
static void setup_rt_frame(int sig, struct target_sigaction *ka,
4283
                           target_siginfo_t *info,
4284
                           target_sigset_t *set, CPUState *env)
4285
{
4286
    struct target_rt_sigframe *frame;
4287
    abi_ulong frame_addr;
4288
    abi_ulong retcode_addr;
4289
    abi_ulong info_addr;
4290
    abi_ulong uc_addr;
4291
    int err = 0;
4292
    int i;
4293

    
4294
    frame_addr = get_sigframe(ka, env, sizeof *frame);
4295
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
4296
        goto give_sigsegv;
4297

    
4298
    err |= __put_user(sig, &frame->sig);
4299

    
4300
    info_addr = frame_addr + offsetof(struct target_rt_sigframe, info);
4301
    err |= __put_user(info_addr, &frame->pinfo);
4302

    
4303
    uc_addr = frame_addr + offsetof(struct target_rt_sigframe, uc);
4304
    err |= __put_user(uc_addr, &frame->puc);
4305

    
4306
    err |= copy_siginfo_to_user(&frame->info, info);
4307

    
4308
    /* Create the ucontext */
4309

    
4310
    err |= __put_user(0, &frame->uc.uc_flags);
4311
    err |= __put_user(0, &frame->uc.uc_link);
4312
    err |= __put_user(target_sigaltstack_used.ss_sp,
4313
                      &frame->uc.uc_stack.ss_sp);
4314
    err |= __put_user(sas_ss_flags(env->aregs[7]),
4315
                      &frame->uc.uc_stack.ss_flags);
4316
    err |= __put_user(target_sigaltstack_used.ss_size,
4317
                      &frame->uc.uc_stack.ss_size);
4318
    err |= target_rt_setup_ucontext(&frame->uc, env);
4319

    
4320
    if (err)
4321
            goto give_sigsegv;
4322

    
4323
    for(i = 0; i < TARGET_NSIG_WORDS; i++) {
4324
        if (__put_user(set->sig[i], &frame->uc.uc_sigmask.sig[i]))
4325
            goto give_sigsegv;
4326
    }
4327

    
4328
    /* Set up to return from userspace.  */
4329

    
4330
    retcode_addr = frame_addr + offsetof(struct target_sigframe, retcode);
4331
    err |= __put_user(retcode_addr, &frame->pretcode);
4332

    
4333
    /* moveq #,d0; notb d0; trap #0 */
4334

    
4335
    err |= __put_user(0x70004600 + ((TARGET_NR_rt_sigreturn ^ 0xff) << 16),
4336
                      (long *)(frame->retcode + 0));
4337
    err |= __put_user(0x4e40, (short *)(frame->retcode + 4));
4338

    
4339
    if (err)
4340
        goto give_sigsegv;
4341

    
4342
    /* Set up to return from userspace */
4343

    
4344
    env->aregs[7] = frame_addr;
4345
    env->pc = ka->_sa_handler;
4346

    
4347
    unlock_user_struct(frame, frame_addr, 1);
4348
    return;
4349

    
4350
give_sigsegv:
4351
    unlock_user_struct(frame, frame_addr, 1);
4352
    force_sig(TARGET_SIGSEGV);
4353
}
4354

    
4355
long do_sigreturn(CPUState *env)
4356
{
4357
    struct target_sigframe *frame;
4358
    abi_ulong frame_addr = env->aregs[7] - 4;
4359
    target_sigset_t target_set;
4360
    sigset_t set;
4361
    int d0, i;
4362

    
4363
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
4364
        goto badframe;
4365

    
4366
    /* set blocked signals */
4367

    
4368
    if (__get_user(target_set.sig[0], &frame->sc.sc_mask))
4369
        goto badframe;
4370

    
4371
    for(i = 1; i < TARGET_NSIG_WORDS; i++) {
4372
        if (__get_user(target_set.sig[i], &frame->extramask[i - 1]))
4373
            goto badframe;
4374
    }
4375

    
4376
    target_to_host_sigset_internal(&set, &target_set);
4377
    sigprocmask(SIG_SETMASK, &set, NULL);
4378

    
4379
    /* restore registers */
4380

    
4381
    if (restore_sigcontext(env, &frame->sc, &d0))
4382
        goto badframe;
4383

    
4384
    unlock_user_struct(frame, frame_addr, 0);
4385
    return d0;
4386

    
4387
badframe:
4388
    unlock_user_struct(frame, frame_addr, 0);
4389
    force_sig(TARGET_SIGSEGV);
4390
    return 0;
4391
}
4392

    
4393
long do_rt_sigreturn(CPUState *env)
4394
{
4395
    struct target_rt_sigframe *frame;
4396
    abi_ulong frame_addr = env->aregs[7] - 4;
4397
    target_sigset_t target_set;
4398
    sigset_t set;
4399
    int d0;
4400

    
4401
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
4402
        goto badframe;
4403

    
4404
    target_to_host_sigset_internal(&set, &target_set);
4405
    sigprocmask(SIG_SETMASK, &set, NULL);
4406

    
4407
    /* restore registers */
4408

    
4409
    if (target_rt_restore_ucontext(env, &frame->uc, &d0))
4410
        goto badframe;
4411

    
4412
    if (do_sigaltstack(frame_addr +
4413
                       offsetof(struct target_rt_sigframe, uc.uc_stack),
4414
                       0, get_sp_from_cpustate(env)) == -EFAULT)
4415
        goto badframe;
4416

    
4417
    unlock_user_struct(frame, frame_addr, 0);
4418
    return d0;
4419

    
4420
badframe:
4421
    unlock_user_struct(frame, frame_addr, 0);
4422
    force_sig(TARGET_SIGSEGV);
4423
    return 0;
4424
}
4425

    
4426
#elif defined(TARGET_ALPHA)
4427

    
4428
struct target_sigcontext {
4429
    abi_long sc_onstack;
4430
    abi_long sc_mask;
4431
    abi_long sc_pc;
4432
    abi_long sc_ps;
4433
    abi_long sc_regs[32];
4434
    abi_long sc_ownedfp;
4435
    abi_long sc_fpregs[32];
4436
    abi_ulong sc_fpcr;
4437
    abi_ulong sc_fp_control;
4438
    abi_ulong sc_reserved1;
4439
    abi_ulong sc_reserved2;
4440
    abi_ulong sc_ssize;
4441
    abi_ulong sc_sbase;
4442
    abi_ulong sc_traparg_a0;
4443
    abi_ulong sc_traparg_a1;
4444
    abi_ulong sc_traparg_a2;
4445
    abi_ulong sc_fp_trap_pc;
4446
    abi_ulong sc_fp_trigger_sum;
4447
    abi_ulong sc_fp_trigger_inst;
4448
};
4449

    
4450
struct target_ucontext {
4451
    abi_ulong uc_flags;
4452
    abi_ulong uc_link;
4453
    abi_ulong uc_osf_sigmask;
4454
    target_stack_t uc_stack;
4455
    struct target_sigcontext uc_mcontext;
4456
    target_sigset_t uc_sigmask;
4457
};
4458

    
4459
struct target_sigframe {
4460
    struct target_sigcontext sc;
4461
    unsigned int retcode[3];
4462
};
4463

    
4464
struct target_rt_sigframe {
4465
    target_siginfo_t info;
4466
    struct target_ucontext uc;
4467
    unsigned int retcode[3];
4468
};
4469

    
4470
#define INSN_MOV_R30_R16        0x47fe0410
4471
#define INSN_LDI_R0             0x201f0000
4472
#define INSN_CALLSYS            0x00000083
4473

    
4474
static int setup_sigcontext(struct target_sigcontext *sc, CPUState *env,
4475
                            abi_ulong frame_addr, target_sigset_t *set)
4476
{
4477
    int i, err = 0;
4478

    
4479
    err |= __put_user(on_sig_stack(frame_addr), &sc->sc_onstack);
4480
    err |= __put_user(set->sig[0], &sc->sc_mask);
4481
    err |= __put_user(env->pc, &sc->sc_pc);
4482
    err |= __put_user(8, &sc->sc_ps);
4483

    
4484
    for (i = 0; i < 31; ++i) {
4485
        err |= __put_user(env->ir[i], &sc->sc_regs[i]);
4486
    }
4487
    err |= __put_user(0, &sc->sc_regs[31]);
4488

    
4489
    for (i = 0; i < 31; ++i) {
4490
        err |= __put_user(env->fir[i], &sc->sc_fpregs[i]);
4491
    }
4492
    err |= __put_user(0, &sc->sc_fpregs[31]);
4493
    err |= __put_user(cpu_alpha_load_fpcr(env), &sc->sc_fpcr);
4494

    
4495
    err |= __put_user(0, &sc->sc_traparg_a0); /* FIXME */
4496
    err |= __put_user(0, &sc->sc_traparg_a1); /* FIXME */
4497
    err |= __put_user(0, &sc->sc_traparg_a2); /* FIXME */
4498

    
4499
    return err;
4500
}
4501

    
4502
static int restore_sigcontext(CPUState *env, struct target_sigcontext *sc)
4503
{
4504
    uint64_t fpcr;
4505
    int i, err = 0;
4506

    
4507
    err |= __get_user(env->pc, &sc->sc_pc);
4508

    
4509
    for (i = 0; i < 31; ++i) {
4510
        err |= __get_user(env->ir[i], &sc->sc_regs[i]);
4511
    }
4512
    for (i = 0; i < 31; ++i) {
4513
        err |= __get_user(env->fir[i], &sc->sc_fpregs[i]);
4514
    }
4515

    
4516
    err |= __get_user(fpcr, &sc->sc_fpcr);
4517
    cpu_alpha_store_fpcr(env, fpcr);
4518

    
4519
    return err;
4520
}
4521

    
4522
static inline abi_ulong get_sigframe(struct target_sigaction *sa,
4523
                                     CPUState *env, unsigned long framesize)
4524
{
4525
    abi_ulong sp = env->ir[IR_SP];
4526

    
4527
    /* This is the X/Open sanctioned signal stack switching.  */
4528
    if ((sa->sa_flags & TARGET_SA_ONSTACK) != 0 && !sas_ss_flags(sp)) {
4529
        sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
4530
    }
4531
    return (sp - framesize) & -32;
4532
}
4533

    
4534
static void setup_frame(int sig, struct target_sigaction *ka,
4535
                        target_sigset_t *set, CPUState *env)
4536
{
4537
    abi_ulong frame_addr, r26;
4538
    struct target_sigframe *frame;
4539
    int err = 0;
4540

    
4541
    frame_addr = get_sigframe(ka, env, sizeof(*frame));
4542
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) {
4543
        goto give_sigsegv;
4544
    }
4545

    
4546
    err |= setup_sigcontext(&frame->sc, env, frame_addr, set);
4547

    
4548
    if (ka->sa_restorer) {
4549
        r26 = ka->sa_restorer;
4550
    } else {
4551
        err |= __put_user(INSN_MOV_R30_R16, &frame->retcode[0]);
4552
        err |= __put_user(INSN_LDI_R0 + TARGET_NR_sigreturn,
4553
                          &frame->retcode[1]);
4554
        err |= __put_user(INSN_CALLSYS, &frame->retcode[2]);
4555
        /* imb() */
4556
        r26 = frame_addr;
4557
    }
4558

    
4559
    unlock_user_struct(frame, frame_addr, 1);
4560

    
4561
    if (err) {
4562
    give_sigsegv:
4563
        if (sig == TARGET_SIGSEGV) {
4564
            ka->_sa_handler = TARGET_SIG_DFL;
4565
        }
4566
        force_sig(TARGET_SIGSEGV);
4567
    }
4568

    
4569
    env->ir[IR_RA] = r26;
4570
    env->ir[IR_PV] = env->pc = ka->_sa_handler;
4571
    env->ir[IR_A0] = sig;
4572
    env->ir[IR_A1] = 0;
4573
    env->ir[IR_A2] = frame_addr + offsetof(struct target_sigframe, sc);
4574
    env->ir[IR_SP] = frame_addr;
4575
}
4576

    
4577
static void setup_rt_frame(int sig, struct target_sigaction *ka,
4578
                           target_siginfo_t *info,
4579
                           target_sigset_t *set, CPUState *env)
4580
{
4581
    abi_ulong frame_addr, r26;
4582
    struct target_rt_sigframe *frame;
4583
    int i, err = 0;
4584

    
4585
    frame_addr = get_sigframe(ka, env, sizeof(*frame));
4586
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) {
4587
        goto give_sigsegv;
4588
    }
4589

    
4590
    err |= copy_siginfo_to_user(&frame->info, info);
4591

    
4592
    err |= __put_user(0, &frame->uc.uc_flags);
4593
    err |= __put_user(0, &frame->uc.uc_link);
4594
    err |= __put_user(set->sig[0], &frame->uc.uc_osf_sigmask);
4595
    err |= __put_user(target_sigaltstack_used.ss_sp,
4596
                      &frame->uc.uc_stack.ss_sp);
4597
    err |= __put_user(sas_ss_flags(env->ir[IR_SP]),
4598
                      &frame->uc.uc_stack.ss_flags);
4599
    err |= __put_user(target_sigaltstack_used.ss_size,
4600
                      &frame->uc.uc_stack.ss_size);
4601
    err |= setup_sigcontext(&frame->uc.uc_mcontext, env, frame_addr, set);
4602
    for (i = 0; i < TARGET_NSIG_WORDS; ++i) {
4603
        err |= __put_user(set->sig[i], &frame->uc.uc_sigmask.sig[i]);
4604
    }
4605

    
4606
    if (ka->sa_restorer) {
4607
        r26 = ka->sa_restorer;
4608
    } else {
4609
        err |= __put_user(INSN_MOV_R30_R16, &frame->retcode[0]);
4610
        err |= __put_user(INSN_LDI_R0 + TARGET_NR_rt_sigreturn,
4611
                          &frame->retcode[1]);
4612
        err |= __put_user(INSN_CALLSYS, &frame->retcode[2]);
4613
        /* imb(); */
4614
        r26 = frame_addr;
4615
    }
4616

    
4617
    if (err) {
4618
    give_sigsegv:
4619
       if (sig == TARGET_SIGSEGV) {
4620
            ka->_sa_handler = TARGET_SIG_DFL;
4621
        }
4622
        force_sig(TARGET_SIGSEGV);
4623
    }
4624

    
4625
    env->ir[IR_RA] = r26;
4626
    env->ir[IR_PV] = env->pc = ka->_sa_handler;
4627
    env->ir[IR_A0] = sig;
4628
    env->ir[IR_A1] = frame_addr + offsetof(struct target_rt_sigframe, info);
4629
    env->ir[IR_A2] = frame_addr + offsetof(struct target_rt_sigframe, uc);
4630
    env->ir[IR_SP] = frame_addr;
4631
}
4632

    
4633
long do_sigreturn(CPUState *env)
4634
{
4635
    struct target_sigcontext *sc;
4636
    abi_ulong sc_addr = env->ir[IR_A0];
4637
    target_sigset_t target_set;
4638
    sigset_t set;
4639

    
4640
    if (!lock_user_struct(VERIFY_READ, sc, sc_addr, 1)) {
4641
        goto badframe;
4642
    }
4643

    
4644
    target_sigemptyset(&target_set);
4645
    if (__get_user(target_set.sig[0], &sc->sc_mask)) {
4646
        goto badframe;
4647
    }
4648

    
4649
    target_to_host_sigset_internal(&set, &target_set);
4650
    sigprocmask(SIG_SETMASK, &set, NULL);
4651

    
4652
    if (restore_sigcontext(env, sc)) {
4653
        goto badframe;
4654
    }
4655
    unlock_user_struct(sc, sc_addr, 0);
4656
    return env->ir[IR_V0];
4657

    
4658
 badframe:
4659
    unlock_user_struct(sc, sc_addr, 0);
4660
    force_sig(TARGET_SIGSEGV);
4661
}
4662

    
4663
long do_rt_sigreturn(CPUState *env)
4664
{
4665
    abi_ulong frame_addr = env->ir[IR_A0];
4666
    struct target_rt_sigframe *frame;
4667
    sigset_t set;
4668

    
4669
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) {
4670
        goto badframe;
4671
    }
4672
    target_to_host_sigset(&set, &frame->uc.uc_sigmask);
4673
    sigprocmask(SIG_SETMASK, &set, NULL);
4674

    
4675
    if (restore_sigcontext(env, &frame->uc.uc_mcontext)) {
4676
        goto badframe;
4677
    }
4678
    if (do_sigaltstack(frame_addr + offsetof(struct target_rt_sigframe,
4679
                                             uc.uc_stack),
4680
                       0, env->ir[IR_SP]) == -EFAULT) {
4681
        goto badframe;
4682
    }
4683

    
4684
    unlock_user_struct(frame, frame_addr, 0);
4685
    return env->ir[IR_V0];
4686

    
4687

    
4688
 badframe:
4689
    unlock_user_struct(frame, frame_addr, 0);
4690
    force_sig(TARGET_SIGSEGV);
4691
}
4692

    
4693
#else
4694

    
4695
static void setup_frame(int sig, struct target_sigaction *ka,
4696
                        target_sigset_t *set, CPUState *env)
4697
{
4698
    fprintf(stderr, "setup_frame: not implemented\n");
4699
}
4700

    
4701
static void setup_rt_frame(int sig, struct target_sigaction *ka,
4702
                           target_siginfo_t *info,
4703
                           target_sigset_t *set, CPUState *env)
4704
{
4705
    fprintf(stderr, "setup_rt_frame: not implemented\n");
4706
}
4707

    
4708
long do_sigreturn(CPUState *env)
4709
{
4710
    fprintf(stderr, "do_sigreturn: not implemented\n");
4711
    return -TARGET_ENOSYS;
4712
}
4713

    
4714
long do_rt_sigreturn(CPUState *env)
4715
{
4716
    fprintf(stderr, "do_rt_sigreturn: not implemented\n");
4717
    return -TARGET_ENOSYS;
4718
}
4719

    
4720
#endif
4721

    
4722
void process_pending_signals(CPUState *cpu_env)
4723
{
4724
    int sig;
4725
    abi_ulong handler;
4726
    sigset_t set, old_set;
4727
    target_sigset_t target_old_set;
4728
    struct emulated_sigtable *k;
4729
    struct target_sigaction *sa;
4730
    struct sigqueue *q;
4731
    TaskState *ts = cpu_env->opaque;
4732

    
4733
    if (!ts->signal_pending)
4734
        return;
4735

    
4736
    /* FIXME: This is not threadsafe.  */
4737
    k = ts->sigtab;
4738
    for(sig = 1; sig <= TARGET_NSIG; sig++) {
4739
        if (k->pending)
4740
            goto handle_signal;
4741
        k++;
4742
    }
4743
    /* if no signal is pending, just return */
4744
    ts->signal_pending = 0;
4745
    return;
4746

    
4747
 handle_signal:
4748
#ifdef DEBUG_SIGNAL
4749
    fprintf(stderr, "qemu: process signal %d\n", sig);
4750
#endif
4751
    /* dequeue signal */
4752
    q = k->first;
4753
    k->first = q->next;
4754
    if (!k->first)
4755
        k->pending = 0;
4756

    
4757
    sig = gdb_handlesig (cpu_env, sig);
4758
    if (!sig) {
4759
        sa = NULL;
4760
        handler = TARGET_SIG_IGN;
4761
    } else {
4762
        sa = &sigact_table[sig - 1];
4763
        handler = sa->_sa_handler;
4764
    }
4765

    
4766
    if (handler == TARGET_SIG_DFL) {
4767
        /* default handler : ignore some signal. The other are job control or fatal */
4768
        if (sig == TARGET_SIGTSTP || sig == TARGET_SIGTTIN || sig == TARGET_SIGTTOU) {
4769
            kill(getpid(),SIGSTOP);
4770
        } else if (sig != TARGET_SIGCHLD &&
4771
                   sig != TARGET_SIGURG &&
4772
                   sig != TARGET_SIGWINCH &&
4773
                   sig != TARGET_SIGCONT) {
4774
            force_sig(sig);
4775
        }
4776
    } else if (handler == TARGET_SIG_IGN) {
4777
        /* ignore sig */
4778
    } else if (handler == TARGET_SIG_ERR) {
4779
        force_sig(sig);
4780
    } else {
4781
        /* compute the blocked signals during the handler execution */
4782
        target_to_host_sigset(&set, &sa->sa_mask);
4783
        /* SA_NODEFER indicates that the current signal should not be
4784
           blocked during the handler */
4785
        if (!(sa->sa_flags & TARGET_SA_NODEFER))
4786
            sigaddset(&set, target_to_host_signal(sig));
4787

    
4788
        /* block signals in the handler using Linux */
4789
        sigprocmask(SIG_BLOCK, &set, &old_set);
4790
        /* save the previous blocked signal state to restore it at the
4791
           end of the signal execution (see do_sigreturn) */
4792
        host_to_target_sigset_internal(&target_old_set, &old_set);
4793

    
4794
        /* if the CPU is in VM86 mode, we restore the 32 bit values */
4795
#if defined(TARGET_I386) && !defined(TARGET_X86_64)
4796
        {
4797
            CPUX86State *env = cpu_env;
4798
            if (env->eflags & VM_MASK)
4799
                save_v86_state(env);
4800
        }
4801
#endif
4802
        /* prepare the stack frame of the virtual CPU */
4803
        if (sa->sa_flags & TARGET_SA_SIGINFO)
4804
            setup_rt_frame(sig, sa, &q->info, &target_old_set, cpu_env);
4805
        else
4806
            setup_frame(sig, sa, &target_old_set, cpu_env);
4807
        if (sa->sa_flags & TARGET_SA_RESETHAND)
4808
            sa->_sa_handler = TARGET_SIG_DFL;
4809
    }
4810
    if (q != &k->info)
4811
        free_sigqueue(cpu_env, q);
4812
}