Statistics
| Branch: | Revision:

root / linux-user / signal.c @ ff970904

History | View | Annotate | Download (163.2 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 <errno.h>
25
#include <assert.h>
26
#include <sys/ucontext.h>
27
#include <sys/resource.h>
28

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

    
33
//#define DEBUG_SIGNAL
34

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

    
41
static struct target_sigaction sigact_table[TARGET_NSIG];
42

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

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

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

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

    
103
int host_to_target_signal(int sig)
104
{
105
    if (sig >= _NSIG)
106
        return sig;
107
    return host_to_target_signal_table[sig];
108
}
109

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

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

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

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

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

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

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

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

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

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

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

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

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

    
200
/* siginfo conversion */
201

    
202
static inline void host_to_target_siginfo_noswap(target_siginfo_t *tinfo,
203
                                                 const siginfo_t *info)
204
{
205
    int sig = host_to_target_signal(info->si_signo);
206
    tinfo->si_signo = sig;
207
    tinfo->si_errno = 0;
208
    tinfo->si_code = info->si_code;
209

    
210
    if (sig == TARGET_SIGILL || sig == TARGET_SIGFPE || sig == TARGET_SIGSEGV
211
        || sig == TARGET_SIGBUS || sig == TARGET_SIGTRAP) {
212
        /* Should never come here, but who knows. The information for
213
           the target is irrelevant.  */
214
        tinfo->_sifields._sigfault._addr = 0;
215
    } else if (sig == TARGET_SIGIO) {
216
        tinfo->_sifields._sigpoll._band = info->si_band;
217
        tinfo->_sifields._sigpoll._fd = info->si_fd;
218
    } else if (sig == TARGET_SIGCHLD) {
219
        tinfo->_sifields._sigchld._pid = info->si_pid;
220
        tinfo->_sifields._sigchld._uid = info->si_uid;
221
        tinfo->_sifields._sigchld._status
222
            = host_to_target_waitstatus(info->si_status);
223
        tinfo->_sifields._sigchld._utime = info->si_utime;
224
        tinfo->_sifields._sigchld._stime = info->si_stime;
225
    } else if (sig >= TARGET_SIGRTMIN) {
226
        tinfo->_sifields._rt._pid = info->si_pid;
227
        tinfo->_sifields._rt._uid = info->si_uid;
228
        /* XXX: potential problem if 64 bit */
229
        tinfo->_sifields._rt._sigval.sival_ptr
230
            = (abi_ulong)(unsigned long)info->si_value.sival_ptr;
231
    }
232
}
233

    
234
static void tswap_siginfo(target_siginfo_t *tinfo,
235
                          const target_siginfo_t *info)
236
{
237
    int sig = info->si_signo;
238
    tinfo->si_signo = tswap32(sig);
239
    tinfo->si_errno = tswap32(info->si_errno);
240
    tinfo->si_code = tswap32(info->si_code);
241

    
242
    if (sig == TARGET_SIGILL || sig == TARGET_SIGFPE || sig == TARGET_SIGSEGV
243
        || sig == TARGET_SIGBUS || sig == TARGET_SIGTRAP) {
244
        tinfo->_sifields._sigfault._addr
245
            = tswapal(info->_sifields._sigfault._addr);
246
    } else if (sig == TARGET_SIGIO) {
247
        tinfo->_sifields._sigpoll._band
248
            = tswap32(info->_sifields._sigpoll._band);
249
        tinfo->_sifields._sigpoll._fd = tswap32(info->_sifields._sigpoll._fd);
250
    } else if (sig == TARGET_SIGCHLD) {
251
        tinfo->_sifields._sigchld._pid
252
            = tswap32(info->_sifields._sigchld._pid);
253
        tinfo->_sifields._sigchld._uid
254
            = tswap32(info->_sifields._sigchld._uid);
255
        tinfo->_sifields._sigchld._status
256
            = tswap32(info->_sifields._sigchld._status);
257
        tinfo->_sifields._sigchld._utime
258
            = tswapal(info->_sifields._sigchld._utime);
259
        tinfo->_sifields._sigchld._stime
260
            = tswapal(info->_sifields._sigchld._stime);
261
    } else if (sig >= TARGET_SIGRTMIN) {
262
        tinfo->_sifields._rt._pid = tswap32(info->_sifields._rt._pid);
263
        tinfo->_sifields._rt._uid = tswap32(info->_sifields._rt._uid);
264
        tinfo->_sifields._rt._sigval.sival_ptr
265
            = tswapal(info->_sifields._rt._sigval.sival_ptr);
266
    }
267
}
268

    
269

    
270
void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info)
271
{
272
    host_to_target_siginfo_noswap(tinfo, info);
273
    tswap_siginfo(tinfo, tinfo);
274
}
275

    
276
/* XXX: we support only POSIX RT signals are used. */
277
/* XXX: find a solution for 64 bit (additional malloced data is needed) */
278
void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo)
279
{
280
    info->si_signo = tswap32(tinfo->si_signo);
281
    info->si_errno = tswap32(tinfo->si_errno);
282
    info->si_code = tswap32(tinfo->si_code);
283
    info->si_pid = tswap32(tinfo->_sifields._rt._pid);
284
    info->si_uid = tswap32(tinfo->_sifields._rt._uid);
285
    info->si_value.sival_ptr =
286
            (void *)(long)tswapal(tinfo->_sifields._rt._sigval.sival_ptr);
287
}
288

    
289
static int fatal_signal (int sig)
290
{
291
    switch (sig) {
292
    case TARGET_SIGCHLD:
293
    case TARGET_SIGURG:
294
    case TARGET_SIGWINCH:
295
        /* Ignored by default.  */
296
        return 0;
297
    case TARGET_SIGCONT:
298
    case TARGET_SIGSTOP:
299
    case TARGET_SIGTSTP:
300
    case TARGET_SIGTTIN:
301
    case TARGET_SIGTTOU:
302
        /* Job control signals.  */
303
        return 0;
304
    default:
305
        return 1;
306
    }
307
}
308

    
309
/* returns 1 if given signal should dump core if not handled */
310
static int core_dump_signal(int sig)
311
{
312
    switch (sig) {
313
    case TARGET_SIGABRT:
314
    case TARGET_SIGFPE:
315
    case TARGET_SIGILL:
316
    case TARGET_SIGQUIT:
317
    case TARGET_SIGSEGV:
318
    case TARGET_SIGTRAP:
319
    case TARGET_SIGBUS:
320
        return (1);
321
    default:
322
        return (0);
323
    }
324
}
325

    
326
void signal_init(void)
327
{
328
    struct sigaction act;
329
    struct sigaction oact;
330
    int i, j;
331
    int host_sig;
332

    
333
    /* generate signal conversion tables */
334
    for(i = 1; i < _NSIG; i++) {
335
        if (host_to_target_signal_table[i] == 0)
336
            host_to_target_signal_table[i] = i;
337
    }
338
    for(i = 1; i < _NSIG; i++) {
339
        j = host_to_target_signal_table[i];
340
        target_to_host_signal_table[j] = i;
341
    }
342

    
343
    /* set all host signal handlers. ALL signals are blocked during
344
       the handlers to serialize them. */
345
    memset(sigact_table, 0, sizeof(sigact_table));
346

    
347
    sigfillset(&act.sa_mask);
348
    act.sa_flags = SA_SIGINFO;
349
    act.sa_sigaction = host_signal_handler;
350
    for(i = 1; i <= TARGET_NSIG; i++) {
351
        host_sig = target_to_host_signal(i);
352
        sigaction(host_sig, NULL, &oact);
353
        if (oact.sa_sigaction == (void *)SIG_IGN) {
354
            sigact_table[i - 1]._sa_handler = TARGET_SIG_IGN;
355
        } else if (oact.sa_sigaction == (void *)SIG_DFL) {
356
            sigact_table[i - 1]._sa_handler = TARGET_SIG_DFL;
357
        }
358
        /* If there's already a handler installed then something has
359
           gone horribly wrong, so don't even try to handle that case.  */
360
        /* Install some handlers for our own use.  We need at least
361
           SIGSEGV and SIGBUS, to detect exceptions.  We can not just
362
           trap all signals because it affects syscall interrupt
363
           behavior.  But do trap all default-fatal signals.  */
364
        if (fatal_signal (i))
365
            sigaction(host_sig, &act, NULL);
366
    }
367
}
368

    
369
/* signal queue handling */
370

    
371
static inline struct sigqueue *alloc_sigqueue(CPUArchState *env)
372
{
373
    TaskState *ts = env->opaque;
374
    struct sigqueue *q = ts->first_free;
375
    if (!q)
376
        return NULL;
377
    ts->first_free = q->next;
378
    return q;
379
}
380

    
381
static inline void free_sigqueue(CPUArchState *env, struct sigqueue *q)
382
{
383
    TaskState *ts = env->opaque;
384
    q->next = ts->first_free;
385
    ts->first_free = q;
386
}
387

    
388
/* abort execution with signal */
389
static void QEMU_NORETURN force_sig(int target_sig)
390
{
391
    TaskState *ts = (TaskState *)thread_env->opaque;
392
    int host_sig, core_dumped = 0;
393
    struct sigaction act;
394
    host_sig = target_to_host_signal(target_sig);
395
    gdb_signalled(thread_env, target_sig);
396

    
397
    /* dump core if supported by target binary format */
398
    if (core_dump_signal(target_sig) && (ts->bprm->core_dump != NULL)) {
399
        stop_all_tasks();
400
        core_dumped =
401
            ((*ts->bprm->core_dump)(target_sig, thread_env) == 0);
402
    }
403
    if (core_dumped) {
404
        /* we already dumped the core of target process, we don't want
405
         * a coredump of qemu itself */
406
        struct rlimit nodump;
407
        getrlimit(RLIMIT_CORE, &nodump);
408
        nodump.rlim_cur=0;
409
        setrlimit(RLIMIT_CORE, &nodump);
410
        (void) fprintf(stderr, "qemu: uncaught target signal %d (%s) - %s\n",
411
            target_sig, strsignal(host_sig), "core dumped" );
412
    }
413

    
414
    /* The proper exit code for dying from an uncaught signal is
415
     * -<signal>.  The kernel doesn't allow exit() or _exit() to pass
416
     * a negative value.  To get the proper exit code we need to
417
     * actually die from an uncaught signal.  Here the default signal
418
     * handler is installed, we send ourself a signal and we wait for
419
     * it to arrive. */
420
    sigfillset(&act.sa_mask);
421
    act.sa_handler = SIG_DFL;
422
    sigaction(host_sig, &act, NULL);
423

    
424
    /* For some reason raise(host_sig) doesn't send the signal when
425
     * statically linked on x86-64. */
426
    kill(getpid(), host_sig);
427

    
428
    /* Make sure the signal isn't masked (just reuse the mask inside
429
    of act) */
430
    sigdelset(&act.sa_mask, host_sig);
431
    sigsuspend(&act.sa_mask);
432

    
433
    /* unreachable */
434
    abort();
435
}
436

    
437
/* queue a signal so that it will be send to the virtual CPU as soon
438
   as possible */
439
int queue_signal(CPUArchState *env, int sig, target_siginfo_t *info)
440
{
441
    TaskState *ts = env->opaque;
442
    struct emulated_sigtable *k;
443
    struct sigqueue *q, **pq;
444
    abi_ulong handler;
445
    int queue;
446

    
447
#if defined(DEBUG_SIGNAL)
448
    fprintf(stderr, "queue_signal: sig=%d\n",
449
            sig);
450
#endif
451
    k = &ts->sigtab[sig - 1];
452
    queue = gdb_queuesig ();
453
    handler = sigact_table[sig - 1]._sa_handler;
454
    if (!queue && handler == TARGET_SIG_DFL) {
455
        if (sig == TARGET_SIGTSTP || sig == TARGET_SIGTTIN || sig == TARGET_SIGTTOU) {
456
            kill(getpid(),SIGSTOP);
457
            return 0;
458
        } else
459
        /* default handler : ignore some signal. The other are fatal */
460
        if (sig != TARGET_SIGCHLD &&
461
            sig != TARGET_SIGURG &&
462
            sig != TARGET_SIGWINCH &&
463
            sig != TARGET_SIGCONT) {
464
            force_sig(sig);
465
        } else {
466
            return 0; /* indicate ignored */
467
        }
468
    } else if (!queue && handler == TARGET_SIG_IGN) {
469
        /* ignore signal */
470
        return 0;
471
    } else if (!queue && handler == TARGET_SIG_ERR) {
472
        force_sig(sig);
473
    } else {
474
        pq = &k->first;
475
        if (sig < TARGET_SIGRTMIN) {
476
            /* if non real time signal, we queue exactly one signal */
477
            if (!k->pending)
478
                q = &k->info;
479
            else
480
                return 0;
481
        } else {
482
            if (!k->pending) {
483
                /* first signal */
484
                q = &k->info;
485
            } else {
486
                q = alloc_sigqueue(env);
487
                if (!q)
488
                    return -EAGAIN;
489
                while (*pq != NULL)
490
                    pq = &(*pq)->next;
491
            }
492
        }
493
        *pq = q;
494
        q->info = *info;
495
        q->next = NULL;
496
        k->pending = 1;
497
        /* signal that a new signal is pending */
498
        ts->signal_pending = 1;
499
        return 1; /* indicates that the signal was queued */
500
    }
501
}
502

    
503
static void host_signal_handler(int host_signum, siginfo_t *info,
504
                                void *puc)
505
{
506
    int sig;
507
    target_siginfo_t tinfo;
508

    
509
    /* the CPU emulator uses some host signals to detect exceptions,
510
       we forward to it some signals */
511
    if ((host_signum == SIGSEGV || host_signum == SIGBUS)
512
        && info->si_code > 0) {
513
        if (cpu_signal_handler(host_signum, info, puc))
514
            return;
515
    }
516

    
517
    /* get target signal number */
518
    sig = host_to_target_signal(host_signum);
519
    if (sig < 1 || sig > TARGET_NSIG)
520
        return;
521
#if defined(DEBUG_SIGNAL)
522
    fprintf(stderr, "qemu: got signal %d\n", sig);
523
#endif
524
    host_to_target_siginfo_noswap(&tinfo, info);
525
    if (queue_signal(thread_env, sig, &tinfo) == 1) {
526
        /* interrupt the virtual CPU as soon as possible */
527
        cpu_exit(thread_env);
528
    }
529
}
530

    
531
/* do_sigaltstack() returns target values and errnos. */
532
/* compare linux/kernel/signal.c:do_sigaltstack() */
533
abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong uoss_addr, abi_ulong sp)
534
{
535
    int ret;
536
    struct target_sigaltstack oss;
537

    
538
    /* XXX: test errors */
539
    if(uoss_addr)
540
    {
541
        __put_user(target_sigaltstack_used.ss_sp, &oss.ss_sp);
542
        __put_user(target_sigaltstack_used.ss_size, &oss.ss_size);
543
        __put_user(sas_ss_flags(sp), &oss.ss_flags);
544
    }
545

    
546
    if(uss_addr)
547
    {
548
        struct target_sigaltstack *uss;
549
        struct target_sigaltstack ss;
550

    
551
        ret = -TARGET_EFAULT;
552
        if (!lock_user_struct(VERIFY_READ, uss, uss_addr, 1)
553
            || __get_user(ss.ss_sp, &uss->ss_sp)
554
            || __get_user(ss.ss_size, &uss->ss_size)
555
            || __get_user(ss.ss_flags, &uss->ss_flags))
556
            goto out;
557
        unlock_user_struct(uss, uss_addr, 0);
558

    
559
        ret = -TARGET_EPERM;
560
        if (on_sig_stack(sp))
561
            goto out;
562

    
563
        ret = -TARGET_EINVAL;
564
        if (ss.ss_flags != TARGET_SS_DISABLE
565
            && ss.ss_flags != TARGET_SS_ONSTACK
566
            && ss.ss_flags != 0)
567
            goto out;
568

    
569
        if (ss.ss_flags == TARGET_SS_DISABLE) {
570
            ss.ss_size = 0;
571
            ss.ss_sp = 0;
572
        } else {
573
            ret = -TARGET_ENOMEM;
574
            if (ss.ss_size < MINSIGSTKSZ)
575
                goto out;
576
        }
577

    
578
        target_sigaltstack_used.ss_sp = ss.ss_sp;
579
        target_sigaltstack_used.ss_size = ss.ss_size;
580
    }
581

    
582
    if (uoss_addr) {
583
        ret = -TARGET_EFAULT;
584
        if (copy_to_user(uoss_addr, &oss, sizeof(oss)))
585
            goto out;
586
    }
587

    
588
    ret = 0;
589
out:
590
    return ret;
591
}
592

    
593
/* do_sigaction() return host values and errnos */
594
int do_sigaction(int sig, const struct target_sigaction *act,
595
                 struct target_sigaction *oact)
596
{
597
    struct target_sigaction *k;
598
    struct sigaction act1;
599
    int host_sig;
600
    int ret = 0;
601

    
602
    if (sig < 1 || sig > TARGET_NSIG || sig == TARGET_SIGKILL || sig == TARGET_SIGSTOP)
603
        return -EINVAL;
604
    k = &sigact_table[sig - 1];
605
#if defined(DEBUG_SIGNAL)
606
    fprintf(stderr, "sigaction sig=%d act=0x%p, oact=0x%p\n",
607
            sig, act, oact);
608
#endif
609
    if (oact) {
610
        __put_user(k->_sa_handler, &oact->_sa_handler);
611
        __put_user(k->sa_flags, &oact->sa_flags);
612
#if !defined(TARGET_MIPS)
613
        __put_user(k->sa_restorer, &oact->sa_restorer);
614
#endif
615
        /* Not swapped.  */
616
        oact->sa_mask = k->sa_mask;
617
    }
618
    if (act) {
619
        /* FIXME: This is not threadsafe.  */
620
        __get_user(k->_sa_handler, &act->_sa_handler);
621
        __get_user(k->sa_flags, &act->sa_flags);
622
#if !defined(TARGET_MIPS)
623
        __get_user(k->sa_restorer, &act->sa_restorer);
624
#endif
625
        /* To be swapped in target_to_host_sigset.  */
626
        k->sa_mask = act->sa_mask;
627

    
628
        /* we update the host linux signal state */
629
        host_sig = target_to_host_signal(sig);
630
        if (host_sig != SIGSEGV && host_sig != SIGBUS) {
631
            sigfillset(&act1.sa_mask);
632
            act1.sa_flags = SA_SIGINFO;
633
            if (k->sa_flags & TARGET_SA_RESTART)
634
                act1.sa_flags |= SA_RESTART;
635
            /* NOTE: it is important to update the host kernel signal
636
               ignore state to avoid getting unexpected interrupted
637
               syscalls */
638
            if (k->_sa_handler == TARGET_SIG_IGN) {
639
                act1.sa_sigaction = (void *)SIG_IGN;
640
            } else if (k->_sa_handler == TARGET_SIG_DFL) {
641
                if (fatal_signal (sig))
642
                    act1.sa_sigaction = host_signal_handler;
643
                else
644
                    act1.sa_sigaction = (void *)SIG_DFL;
645
            } else {
646
                act1.sa_sigaction = host_signal_handler;
647
            }
648
            ret = sigaction(host_sig, &act1, NULL);
649
        }
650
    }
651
    return ret;
652
}
653

    
654
static inline int copy_siginfo_to_user(target_siginfo_t *tinfo,
655
                                       const target_siginfo_t *info)
656
{
657
    tswap_siginfo(tinfo, info);
658
    return 0;
659
}
660

    
661
static inline int current_exec_domain_sig(int sig)
662
{
663
    return /* current->exec_domain && current->exec_domain->signal_invmap
664
              && sig < 32 ? current->exec_domain->signal_invmap[sig] : */ sig;
665
}
666

    
667
#if defined(TARGET_I386) && TARGET_ABI_BITS == 32
668

    
669
/* from the Linux kernel */
670

    
671
struct target_fpreg {
672
        uint16_t significand[4];
673
        uint16_t exponent;
674
};
675

    
676
struct target_fpxreg {
677
        uint16_t significand[4];
678
        uint16_t exponent;
679
        uint16_t padding[3];
680
};
681

    
682
struct target_xmmreg {
683
        abi_ulong element[4];
684
};
685

    
686
struct target_fpstate {
687
        /* Regular FPU environment */
688
        abi_ulong       cw;
689
        abi_ulong       sw;
690
        abi_ulong       tag;
691
        abi_ulong       ipoff;
692
        abi_ulong       cssel;
693
        abi_ulong       dataoff;
694
        abi_ulong       datasel;
695
        struct target_fpreg        _st[8];
696
        uint16_t        status;
697
        uint16_t        magic;                /* 0xffff = regular FPU data only */
698

    
699
        /* FXSR FPU environment */
700
        abi_ulong       _fxsr_env[6];   /* FXSR FPU env is ignored */
701
        abi_ulong       mxcsr;
702
        abi_ulong       reserved;
703
        struct target_fpxreg        _fxsr_st[8];        /* FXSR FPU reg data is ignored */
704
        struct target_xmmreg        _xmm[8];
705
        abi_ulong       padding[56];
706
};
707

    
708
#define X86_FXSR_MAGIC                0x0000
709

    
710
struct target_sigcontext {
711
        uint16_t gs, __gsh;
712
        uint16_t fs, __fsh;
713
        uint16_t es, __esh;
714
        uint16_t ds, __dsh;
715
        abi_ulong edi;
716
        abi_ulong esi;
717
        abi_ulong ebp;
718
        abi_ulong esp;
719
        abi_ulong ebx;
720
        abi_ulong edx;
721
        abi_ulong ecx;
722
        abi_ulong eax;
723
        abi_ulong trapno;
724
        abi_ulong err;
725
        abi_ulong eip;
726
        uint16_t cs, __csh;
727
        abi_ulong eflags;
728
        abi_ulong esp_at_signal;
729
        uint16_t ss, __ssh;
730
        abi_ulong fpstate; /* pointer */
731
        abi_ulong oldmask;
732
        abi_ulong cr2;
733
};
734

    
735
struct target_ucontext {
736
        abi_ulong         tuc_flags;
737
        abi_ulong         tuc_link;
738
        target_stack_t          tuc_stack;
739
        struct target_sigcontext tuc_mcontext;
740
        target_sigset_t          tuc_sigmask;        /* mask last for extensibility */
741
};
742

    
743
struct sigframe
744
{
745
    abi_ulong pretcode;
746
    int sig;
747
    struct target_sigcontext sc;
748
    struct target_fpstate fpstate;
749
    abi_ulong extramask[TARGET_NSIG_WORDS-1];
750
    char retcode[8];
751
};
752

    
753
struct rt_sigframe
754
{
755
    abi_ulong pretcode;
756
    int sig;
757
    abi_ulong pinfo;
758
    abi_ulong puc;
759
    struct target_siginfo info;
760
    struct target_ucontext uc;
761
    struct target_fpstate fpstate;
762
    char retcode[8];
763
};
764

    
765
/*
766
 * Set up a signal frame.
767
 */
768

    
769
/* XXX: save x87 state */
770
static int
771
setup_sigcontext(struct target_sigcontext *sc, struct target_fpstate *fpstate,
772
                 CPUX86State *env, abi_ulong mask, abi_ulong fpstate_addr)
773
{
774
        int err = 0;
775
        uint16_t magic;
776

    
777
        /* already locked in setup_frame() */
778
        err |= __put_user(env->segs[R_GS].selector, (unsigned int *)&sc->gs);
779
        err |= __put_user(env->segs[R_FS].selector, (unsigned int *)&sc->fs);
780
        err |= __put_user(env->segs[R_ES].selector, (unsigned int *)&sc->es);
781
        err |= __put_user(env->segs[R_DS].selector, (unsigned int *)&sc->ds);
782
        err |= __put_user(env->regs[R_EDI], &sc->edi);
783
        err |= __put_user(env->regs[R_ESI], &sc->esi);
784
        err |= __put_user(env->regs[R_EBP], &sc->ebp);
785
        err |= __put_user(env->regs[R_ESP], &sc->esp);
786
        err |= __put_user(env->regs[R_EBX], &sc->ebx);
787
        err |= __put_user(env->regs[R_EDX], &sc->edx);
788
        err |= __put_user(env->regs[R_ECX], &sc->ecx);
789
        err |= __put_user(env->regs[R_EAX], &sc->eax);
790
        err |= __put_user(env->exception_index, &sc->trapno);
791
        err |= __put_user(env->error_code, &sc->err);
792
        err |= __put_user(env->eip, &sc->eip);
793
        err |= __put_user(env->segs[R_CS].selector, (unsigned int *)&sc->cs);
794
        err |= __put_user(env->eflags, &sc->eflags);
795
        err |= __put_user(env->regs[R_ESP], &sc->esp_at_signal);
796
        err |= __put_user(env->segs[R_SS].selector, (unsigned int *)&sc->ss);
797

    
798
        cpu_x86_fsave(env, fpstate_addr, 1);
799
        fpstate->status = fpstate->sw;
800
        magic = 0xffff;
801
        err |= __put_user(magic, &fpstate->magic);
802
        err |= __put_user(fpstate_addr, &sc->fpstate);
803

    
804
        /* non-iBCS2 extensions.. */
805
        err |= __put_user(mask, &sc->oldmask);
806
        err |= __put_user(env->cr[2], &sc->cr2);
807
        return err;
808
}
809

    
810
/*
811
 * Determine which stack to use..
812
 */
813

    
814
static inline abi_ulong
815
get_sigframe(struct target_sigaction *ka, CPUX86State *env, size_t frame_size)
816
{
817
        unsigned long esp;
818

    
819
        /* Default to using normal stack */
820
        esp = env->regs[R_ESP];
821
        /* This is the X/Open sanctioned signal stack switching.  */
822
        if (ka->sa_flags & TARGET_SA_ONSTACK) {
823
            if (sas_ss_flags(esp) == 0)
824
                esp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
825
        }
826

    
827
        /* This is the legacy signal stack switching. */
828
        else
829
        if ((env->segs[R_SS].selector & 0xffff) != __USER_DS &&
830
            !(ka->sa_flags & TARGET_SA_RESTORER) &&
831
            ka->sa_restorer) {
832
            esp = (unsigned long) ka->sa_restorer;
833
        }
834
        return (esp - frame_size) & -8ul;
835
}
836

    
837
/* compare linux/arch/i386/kernel/signal.c:setup_frame() */
838
static void setup_frame(int sig, struct target_sigaction *ka,
839
                        target_sigset_t *set, CPUX86State *env)
840
{
841
        abi_ulong frame_addr;
842
        struct sigframe *frame;
843
        int i, err = 0;
844

    
845
        frame_addr = get_sigframe(ka, env, sizeof(*frame));
846

    
847
        if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
848
                goto give_sigsegv;
849

    
850
        err |= __put_user(current_exec_domain_sig(sig),
851
                          &frame->sig);
852
        if (err)
853
                goto give_sigsegv;
854

    
855
        setup_sigcontext(&frame->sc, &frame->fpstate, env, set->sig[0],
856
                         frame_addr + offsetof(struct sigframe, fpstate));
857
        if (err)
858
                goto give_sigsegv;
859

    
860
        for(i = 1; i < TARGET_NSIG_WORDS; i++) {
861
            if (__put_user(set->sig[i], &frame->extramask[i - 1]))
862
                goto give_sigsegv;
863
        }
864

    
865
        /* Set up to return from userspace.  If provided, use a stub
866
           already in userspace.  */
867
        if (ka->sa_flags & TARGET_SA_RESTORER) {
868
                err |= __put_user(ka->sa_restorer, &frame->pretcode);
869
        } else {
870
                uint16_t val16;
871
                abi_ulong retcode_addr;
872
                retcode_addr = frame_addr + offsetof(struct sigframe, retcode);
873
                err |= __put_user(retcode_addr, &frame->pretcode);
874
                /* This is popl %eax ; movl $,%eax ; int $0x80 */
875
                val16 = 0xb858;
876
                err |= __put_user(val16, (uint16_t *)(frame->retcode+0));
877
                err |= __put_user(TARGET_NR_sigreturn, (int *)(frame->retcode+2));
878
                val16 = 0x80cd;
879
                err |= __put_user(val16, (uint16_t *)(frame->retcode+6));
880
        }
881

    
882
        if (err)
883
                goto give_sigsegv;
884

    
885
        /* Set up registers for signal handler */
886
        env->regs[R_ESP] = frame_addr;
887
        env->eip = ka->_sa_handler;
888

    
889
        cpu_x86_load_seg(env, R_DS, __USER_DS);
890
        cpu_x86_load_seg(env, R_ES, __USER_DS);
891
        cpu_x86_load_seg(env, R_SS, __USER_DS);
892
        cpu_x86_load_seg(env, R_CS, __USER_CS);
893
        env->eflags &= ~TF_MASK;
894

    
895
        unlock_user_struct(frame, frame_addr, 1);
896

    
897
        return;
898

    
899
give_sigsegv:
900
        unlock_user_struct(frame, frame_addr, 1);
901
        if (sig == TARGET_SIGSEGV)
902
                ka->_sa_handler = TARGET_SIG_DFL;
903
        force_sig(TARGET_SIGSEGV /* , current */);
904
}
905

    
906
/* compare linux/arch/i386/kernel/signal.c:setup_rt_frame() */
907
static void setup_rt_frame(int sig, struct target_sigaction *ka,
908
                           target_siginfo_t *info,
909
                           target_sigset_t *set, CPUX86State *env)
910
{
911
        abi_ulong frame_addr, addr;
912
        struct rt_sigframe *frame;
913
        int i, err = 0;
914

    
915
        frame_addr = get_sigframe(ka, env, sizeof(*frame));
916

    
917
        if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
918
                goto give_sigsegv;
919

    
920
        err |= __put_user(current_exec_domain_sig(sig),
921
                          &frame->sig);
922
        addr = frame_addr + offsetof(struct rt_sigframe, info);
923
        err |= __put_user(addr, &frame->pinfo);
924
        addr = frame_addr + offsetof(struct rt_sigframe, uc);
925
        err |= __put_user(addr, &frame->puc);
926
        err |= copy_siginfo_to_user(&frame->info, info);
927
        if (err)
928
                goto give_sigsegv;
929

    
930
        /* Create the ucontext.  */
931
        err |= __put_user(0, &frame->uc.tuc_flags);
932
        err |= __put_user(0, &frame->uc.tuc_link);
933
        err |= __put_user(target_sigaltstack_used.ss_sp,
934
                          &frame->uc.tuc_stack.ss_sp);
935
        err |= __put_user(sas_ss_flags(get_sp_from_cpustate(env)),
936
                          &frame->uc.tuc_stack.ss_flags);
937
        err |= __put_user(target_sigaltstack_used.ss_size,
938
                          &frame->uc.tuc_stack.ss_size);
939
        err |= setup_sigcontext(&frame->uc.tuc_mcontext, &frame->fpstate,
940
                                env, set->sig[0], 
941
                                frame_addr + offsetof(struct rt_sigframe, fpstate));
942
        for(i = 0; i < TARGET_NSIG_WORDS; i++) {
943
            if (__put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]))
944
                goto give_sigsegv;
945
        }
946

    
947
        /* Set up to return from userspace.  If provided, use a stub
948
           already in userspace.  */
949
        if (ka->sa_flags & TARGET_SA_RESTORER) {
950
                err |= __put_user(ka->sa_restorer, &frame->pretcode);
951
        } else {
952
                uint16_t val16;
953
                addr = frame_addr + offsetof(struct rt_sigframe, retcode);
954
                err |= __put_user(addr, &frame->pretcode);
955
                /* This is movl $,%eax ; int $0x80 */
956
                err |= __put_user(0xb8, (char *)(frame->retcode+0));
957
                err |= __put_user(TARGET_NR_rt_sigreturn, (int *)(frame->retcode+1));
958
                val16 = 0x80cd;
959
                err |= __put_user(val16, (uint16_t *)(frame->retcode+5));
960
        }
961

    
962
        if (err)
963
                goto give_sigsegv;
964

    
965
        /* Set up registers for signal handler */
966
        env->regs[R_ESP] = frame_addr;
967
        env->eip = ka->_sa_handler;
968

    
969
        cpu_x86_load_seg(env, R_DS, __USER_DS);
970
        cpu_x86_load_seg(env, R_ES, __USER_DS);
971
        cpu_x86_load_seg(env, R_SS, __USER_DS);
972
        cpu_x86_load_seg(env, R_CS, __USER_CS);
973
        env->eflags &= ~TF_MASK;
974

    
975
        unlock_user_struct(frame, frame_addr, 1);
976

    
977
        return;
978

    
979
give_sigsegv:
980
        unlock_user_struct(frame, frame_addr, 1);
981
        if (sig == TARGET_SIGSEGV)
982
                ka->_sa_handler = TARGET_SIG_DFL;
983
        force_sig(TARGET_SIGSEGV /* , current */);
984
}
985

    
986
static int
987
restore_sigcontext(CPUX86State *env, struct target_sigcontext *sc, int *peax)
988
{
989
        unsigned int err = 0;
990
        abi_ulong fpstate_addr;
991
        unsigned int tmpflags;
992

    
993
        cpu_x86_load_seg(env, R_GS, tswap16(sc->gs));
994
        cpu_x86_load_seg(env, R_FS, tswap16(sc->fs));
995
        cpu_x86_load_seg(env, R_ES, tswap16(sc->es));
996
        cpu_x86_load_seg(env, R_DS, tswap16(sc->ds));
997

    
998
        env->regs[R_EDI] = tswapl(sc->edi);
999
        env->regs[R_ESI] = tswapl(sc->esi);
1000
        env->regs[R_EBP] = tswapl(sc->ebp);
1001
        env->regs[R_ESP] = tswapl(sc->esp);
1002
        env->regs[R_EBX] = tswapl(sc->ebx);
1003
        env->regs[R_EDX] = tswapl(sc->edx);
1004
        env->regs[R_ECX] = tswapl(sc->ecx);
1005
        env->eip = tswapl(sc->eip);
1006

    
1007
        cpu_x86_load_seg(env, R_CS, lduw_p(&sc->cs) | 3);
1008
        cpu_x86_load_seg(env, R_SS, lduw_p(&sc->ss) | 3);
1009

    
1010
        tmpflags = tswapl(sc->eflags);
1011
        env->eflags = (env->eflags & ~0x40DD5) | (tmpflags & 0x40DD5);
1012
        //                regs->orig_eax = -1;                /* disable syscall checks */
1013

    
1014
        fpstate_addr = tswapl(sc->fpstate);
1015
        if (fpstate_addr != 0) {
1016
                if (!access_ok(VERIFY_READ, fpstate_addr, 
1017
                               sizeof(struct target_fpstate)))
1018
                        goto badframe;
1019
                cpu_x86_frstor(env, fpstate_addr, 1);
1020
        }
1021

    
1022
        *peax = tswapl(sc->eax);
1023
        return err;
1024
badframe:
1025
        return 1;
1026
}
1027

    
1028
long do_sigreturn(CPUX86State *env)
1029
{
1030
    struct sigframe *frame;
1031
    abi_ulong frame_addr = env->regs[R_ESP] - 8;
1032
    target_sigset_t target_set;
1033
    sigset_t set;
1034
    int eax, i;
1035

    
1036
#if defined(DEBUG_SIGNAL)
1037
    fprintf(stderr, "do_sigreturn\n");
1038
#endif
1039
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1040
        goto badframe;
1041
    /* set blocked signals */
1042
    if (__get_user(target_set.sig[0], &frame->sc.oldmask))
1043
        goto badframe;
1044
    for(i = 1; i < TARGET_NSIG_WORDS; i++) {
1045
        if (__get_user(target_set.sig[i], &frame->extramask[i - 1]))
1046
            goto badframe;
1047
    }
1048

    
1049
    target_to_host_sigset_internal(&set, &target_set);
1050
    sigprocmask(SIG_SETMASK, &set, NULL);
1051

    
1052
    /* restore registers */
1053
    if (restore_sigcontext(env, &frame->sc, &eax))
1054
        goto badframe;
1055
    unlock_user_struct(frame, frame_addr, 0);
1056
    return eax;
1057

    
1058
badframe:
1059
    unlock_user_struct(frame, frame_addr, 0);
1060
    force_sig(TARGET_SIGSEGV);
1061
    return 0;
1062
}
1063

    
1064
long do_rt_sigreturn(CPUX86State *env)
1065
{
1066
        abi_ulong frame_addr;
1067
        struct rt_sigframe *frame;
1068
        sigset_t set;
1069
        int eax;
1070

    
1071
        frame_addr = env->regs[R_ESP] - 4;
1072
        if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1073
                goto badframe;
1074
        target_to_host_sigset(&set, &frame->uc.tuc_sigmask);
1075
        sigprocmask(SIG_SETMASK, &set, NULL);
1076

    
1077
        if (restore_sigcontext(env, &frame->uc.tuc_mcontext, &eax))
1078
                goto badframe;
1079

    
1080
        if (do_sigaltstack(frame_addr + offsetof(struct rt_sigframe, uc.tuc_stack), 0, 
1081
                           get_sp_from_cpustate(env)) == -EFAULT)
1082
                goto badframe;
1083

    
1084
        unlock_user_struct(frame, frame_addr, 0);
1085
        return eax;
1086

    
1087
badframe:
1088
        unlock_user_struct(frame, frame_addr, 0);
1089
        force_sig(TARGET_SIGSEGV);
1090
        return 0;
1091
}
1092

    
1093
#elif defined(TARGET_ARM)
1094

    
1095
struct target_sigcontext {
1096
        abi_ulong trap_no;
1097
        abi_ulong error_code;
1098
        abi_ulong oldmask;
1099
        abi_ulong arm_r0;
1100
        abi_ulong arm_r1;
1101
        abi_ulong arm_r2;
1102
        abi_ulong arm_r3;
1103
        abi_ulong arm_r4;
1104
        abi_ulong arm_r5;
1105
        abi_ulong arm_r6;
1106
        abi_ulong arm_r7;
1107
        abi_ulong arm_r8;
1108
        abi_ulong arm_r9;
1109
        abi_ulong arm_r10;
1110
        abi_ulong arm_fp;
1111
        abi_ulong arm_ip;
1112
        abi_ulong arm_sp;
1113
        abi_ulong arm_lr;
1114
        abi_ulong arm_pc;
1115
        abi_ulong arm_cpsr;
1116
        abi_ulong fault_address;
1117
};
1118

    
1119
struct target_ucontext_v1 {
1120
    abi_ulong tuc_flags;
1121
    abi_ulong tuc_link;
1122
    target_stack_t tuc_stack;
1123
    struct target_sigcontext tuc_mcontext;
1124
    target_sigset_t  tuc_sigmask;        /* mask last for extensibility */
1125
};
1126

    
1127
struct target_ucontext_v2 {
1128
    abi_ulong tuc_flags;
1129
    abi_ulong tuc_link;
1130
    target_stack_t tuc_stack;
1131
    struct target_sigcontext tuc_mcontext;
1132
    target_sigset_t  tuc_sigmask;        /* mask last for extensibility */
1133
    char __unused[128 - sizeof(target_sigset_t)];
1134
    abi_ulong tuc_regspace[128] __attribute__((__aligned__(8)));
1135
};
1136

    
1137
struct target_user_vfp {
1138
    uint64_t fpregs[32];
1139
    abi_ulong fpscr;
1140
};
1141

    
1142
struct target_user_vfp_exc {
1143
    abi_ulong fpexc;
1144
    abi_ulong fpinst;
1145
    abi_ulong fpinst2;
1146
};
1147

    
1148
struct target_vfp_sigframe {
1149
    abi_ulong magic;
1150
    abi_ulong size;
1151
    struct target_user_vfp ufp;
1152
    struct target_user_vfp_exc ufp_exc;
1153
} __attribute__((__aligned__(8)));
1154

    
1155
struct target_iwmmxt_sigframe {
1156
    abi_ulong magic;
1157
    abi_ulong size;
1158
    uint64_t regs[16];
1159
    /* Note that not all the coprocessor control registers are stored here */
1160
    uint32_t wcssf;
1161
    uint32_t wcasf;
1162
    uint32_t wcgr0;
1163
    uint32_t wcgr1;
1164
    uint32_t wcgr2;
1165
    uint32_t wcgr3;
1166
} __attribute__((__aligned__(8)));
1167

    
1168
#define TARGET_VFP_MAGIC 0x56465001
1169
#define TARGET_IWMMXT_MAGIC 0x12ef842a
1170

    
1171
struct sigframe_v1
1172
{
1173
    struct target_sigcontext sc;
1174
    abi_ulong extramask[TARGET_NSIG_WORDS-1];
1175
    abi_ulong retcode;
1176
};
1177

    
1178
struct sigframe_v2
1179
{
1180
    struct target_ucontext_v2 uc;
1181
    abi_ulong retcode;
1182
};
1183

    
1184
struct rt_sigframe_v1
1185
{
1186
    abi_ulong pinfo;
1187
    abi_ulong puc;
1188
    struct target_siginfo info;
1189
    struct target_ucontext_v1 uc;
1190
    abi_ulong retcode;
1191
};
1192

    
1193
struct rt_sigframe_v2
1194
{
1195
    struct target_siginfo info;
1196
    struct target_ucontext_v2 uc;
1197
    abi_ulong retcode;
1198
};
1199

    
1200
#define TARGET_CONFIG_CPU_32 1
1201

    
1202
/*
1203
 * For ARM syscalls, we encode the syscall number into the instruction.
1204
 */
1205
#define SWI_SYS_SIGRETURN        (0xef000000|(TARGET_NR_sigreturn + ARM_SYSCALL_BASE))
1206
#define SWI_SYS_RT_SIGRETURN        (0xef000000|(TARGET_NR_rt_sigreturn + ARM_SYSCALL_BASE))
1207

    
1208
/*
1209
 * For Thumb syscalls, we pass the syscall number via r7.  We therefore
1210
 * need two 16-bit instructions.
1211
 */
1212
#define SWI_THUMB_SIGRETURN        (0xdf00 << 16 | 0x2700 | (TARGET_NR_sigreturn))
1213
#define SWI_THUMB_RT_SIGRETURN        (0xdf00 << 16 | 0x2700 | (TARGET_NR_rt_sigreturn))
1214

    
1215
static const abi_ulong retcodes[4] = {
1216
        SWI_SYS_SIGRETURN,        SWI_THUMB_SIGRETURN,
1217
        SWI_SYS_RT_SIGRETURN,        SWI_THUMB_RT_SIGRETURN
1218
};
1219

    
1220

    
1221
#define __get_user_error(x,p,e) __get_user(x, p)
1222

    
1223
static inline int valid_user_regs(CPUARMState *regs)
1224
{
1225
    return 1;
1226
}
1227

    
1228
static void
1229
setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/
1230
                 CPUARMState *env, abi_ulong mask)
1231
{
1232
        __put_user(env->regs[0], &sc->arm_r0);
1233
        __put_user(env->regs[1], &sc->arm_r1);
1234
        __put_user(env->regs[2], &sc->arm_r2);
1235
        __put_user(env->regs[3], &sc->arm_r3);
1236
        __put_user(env->regs[4], &sc->arm_r4);
1237
        __put_user(env->regs[5], &sc->arm_r5);
1238
        __put_user(env->regs[6], &sc->arm_r6);
1239
        __put_user(env->regs[7], &sc->arm_r7);
1240
        __put_user(env->regs[8], &sc->arm_r8);
1241
        __put_user(env->regs[9], &sc->arm_r9);
1242
        __put_user(env->regs[10], &sc->arm_r10);
1243
        __put_user(env->regs[11], &sc->arm_fp);
1244
        __put_user(env->regs[12], &sc->arm_ip);
1245
        __put_user(env->regs[13], &sc->arm_sp);
1246
        __put_user(env->regs[14], &sc->arm_lr);
1247
        __put_user(env->regs[15], &sc->arm_pc);
1248
#ifdef TARGET_CONFIG_CPU_32
1249
        __put_user(cpsr_read(env), &sc->arm_cpsr);
1250
#endif
1251

    
1252
        __put_user(/* current->thread.trap_no */ 0, &sc->trap_no);
1253
        __put_user(/* current->thread.error_code */ 0, &sc->error_code);
1254
        __put_user(/* current->thread.address */ 0, &sc->fault_address);
1255
        __put_user(mask, &sc->oldmask);
1256
}
1257

    
1258
static inline abi_ulong
1259
get_sigframe(struct target_sigaction *ka, CPUARMState *regs, int framesize)
1260
{
1261
        unsigned long sp = regs->regs[13];
1262

    
1263
        /*
1264
         * This is the X/Open sanctioned signal stack switching.
1265
         */
1266
        if ((ka->sa_flags & TARGET_SA_ONSTACK) && !sas_ss_flags(sp))
1267
            sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
1268
        /*
1269
         * ATPCS B01 mandates 8-byte alignment
1270
         */
1271
        return (sp - framesize) & ~7;
1272
}
1273

    
1274
static int
1275
setup_return(CPUARMState *env, struct target_sigaction *ka,
1276
             abi_ulong *rc, abi_ulong frame_addr, int usig, abi_ulong rc_addr)
1277
{
1278
        abi_ulong handler = ka->_sa_handler;
1279
        abi_ulong retcode;
1280
        int thumb = handler & 1;
1281
        uint32_t cpsr = cpsr_read(env);
1282

    
1283
        cpsr &= ~CPSR_IT;
1284
        if (thumb) {
1285
                cpsr |= CPSR_T;
1286
        } else {
1287
                cpsr &= ~CPSR_T;
1288
        }
1289

    
1290
        if (ka->sa_flags & TARGET_SA_RESTORER) {
1291
                retcode = ka->sa_restorer;
1292
        } else {
1293
                unsigned int idx = thumb;
1294

    
1295
                if (ka->sa_flags & TARGET_SA_SIGINFO)
1296
                        idx += 2;
1297

    
1298
                if (__put_user(retcodes[idx], rc))
1299
                        return 1;
1300

    
1301
                retcode = rc_addr + thumb;
1302
        }
1303

    
1304
        env->regs[0] = usig;
1305
        env->regs[13] = frame_addr;
1306
        env->regs[14] = retcode;
1307
        env->regs[15] = handler & (thumb ? ~1 : ~3);
1308
        cpsr_write(env, cpsr, 0xffffffff);
1309

    
1310
        return 0;
1311
}
1312

    
1313
static abi_ulong *setup_sigframe_v2_vfp(abi_ulong *regspace, CPUARMState *env)
1314
{
1315
    int i;
1316
    struct target_vfp_sigframe *vfpframe;
1317
    vfpframe = (struct target_vfp_sigframe *)regspace;
1318
    __put_user(TARGET_VFP_MAGIC, &vfpframe->magic);
1319
    __put_user(sizeof(*vfpframe), &vfpframe->size);
1320
    for (i = 0; i < 32; i++) {
1321
        __put_user(float64_val(env->vfp.regs[i]), &vfpframe->ufp.fpregs[i]);
1322
    }
1323
    __put_user(vfp_get_fpscr(env), &vfpframe->ufp.fpscr);
1324
    __put_user(env->vfp.xregs[ARM_VFP_FPEXC], &vfpframe->ufp_exc.fpexc);
1325
    __put_user(env->vfp.xregs[ARM_VFP_FPINST], &vfpframe->ufp_exc.fpinst);
1326
    __put_user(env->vfp.xregs[ARM_VFP_FPINST2], &vfpframe->ufp_exc.fpinst2);
1327
    return (abi_ulong*)(vfpframe+1);
1328
}
1329

    
1330
static abi_ulong *setup_sigframe_v2_iwmmxt(abi_ulong *regspace,
1331
                                           CPUARMState *env)
1332
{
1333
    int i;
1334
    struct target_iwmmxt_sigframe *iwmmxtframe;
1335
    iwmmxtframe = (struct target_iwmmxt_sigframe *)regspace;
1336
    __put_user(TARGET_IWMMXT_MAGIC, &iwmmxtframe->magic);
1337
    __put_user(sizeof(*iwmmxtframe), &iwmmxtframe->size);
1338
    for (i = 0; i < 16; i++) {
1339
        __put_user(env->iwmmxt.regs[i], &iwmmxtframe->regs[i]);
1340
    }
1341
    __put_user(env->vfp.xregs[ARM_IWMMXT_wCSSF], &iwmmxtframe->wcssf);
1342
    __put_user(env->vfp.xregs[ARM_IWMMXT_wCASF], &iwmmxtframe->wcssf);
1343
    __put_user(env->vfp.xregs[ARM_IWMMXT_wCGR0], &iwmmxtframe->wcgr0);
1344
    __put_user(env->vfp.xregs[ARM_IWMMXT_wCGR1], &iwmmxtframe->wcgr1);
1345
    __put_user(env->vfp.xregs[ARM_IWMMXT_wCGR2], &iwmmxtframe->wcgr2);
1346
    __put_user(env->vfp.xregs[ARM_IWMMXT_wCGR3], &iwmmxtframe->wcgr3);
1347
    return (abi_ulong*)(iwmmxtframe+1);
1348
}
1349

    
1350
static void setup_sigframe_v2(struct target_ucontext_v2 *uc,
1351
                              target_sigset_t *set, CPUARMState *env)
1352
{
1353
    struct target_sigaltstack stack;
1354
    int i;
1355
    abi_ulong *regspace;
1356

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

    
1360
    memset(&stack, 0, sizeof(stack));
1361
    __put_user(target_sigaltstack_used.ss_sp, &stack.ss_sp);
1362
    __put_user(target_sigaltstack_used.ss_size, &stack.ss_size);
1363
    __put_user(sas_ss_flags(get_sp_from_cpustate(env)), &stack.ss_flags);
1364
    memcpy(&uc->tuc_stack, &stack, sizeof(stack));
1365

    
1366
    setup_sigcontext(&uc->tuc_mcontext, env, set->sig[0]);
1367
    /* Save coprocessor signal frame.  */
1368
    regspace = uc->tuc_regspace;
1369
    if (arm_feature(env, ARM_FEATURE_VFP)) {
1370
        regspace = setup_sigframe_v2_vfp(regspace, env);
1371
    }
1372
    if (arm_feature(env, ARM_FEATURE_IWMMXT)) {
1373
        regspace = setup_sigframe_v2_iwmmxt(regspace, env);
1374
    }
1375

    
1376
    /* Write terminating magic word */
1377
    __put_user(0, regspace);
1378

    
1379
    for(i = 0; i < TARGET_NSIG_WORDS; i++) {
1380
        __put_user(set->sig[i], &uc->tuc_sigmask.sig[i]);
1381
    }
1382
}
1383

    
1384
/* compare linux/arch/arm/kernel/signal.c:setup_frame() */
1385
static void setup_frame_v1(int usig, struct target_sigaction *ka,
1386
                           target_sigset_t *set, CPUARMState *regs)
1387
{
1388
        struct sigframe_v1 *frame;
1389
        abi_ulong frame_addr = get_sigframe(ka, regs, sizeof(*frame));
1390
        int i;
1391

    
1392
        if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
1393
                return;
1394

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

    
1397
        for(i = 1; i < TARGET_NSIG_WORDS; i++) {
1398
            if (__put_user(set->sig[i], &frame->extramask[i - 1]))
1399
                goto end;
1400
        }
1401

    
1402
        setup_return(regs, ka, &frame->retcode, frame_addr, usig,
1403
                     frame_addr + offsetof(struct sigframe_v1, retcode));
1404

    
1405
end:
1406
        unlock_user_struct(frame, frame_addr, 1);
1407
}
1408

    
1409
static void setup_frame_v2(int usig, struct target_sigaction *ka,
1410
                           target_sigset_t *set, CPUARMState *regs)
1411
{
1412
        struct sigframe_v2 *frame;
1413
        abi_ulong frame_addr = get_sigframe(ka, regs, sizeof(*frame));
1414

    
1415
        if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
1416
                return;
1417

    
1418
        setup_sigframe_v2(&frame->uc, set, regs);
1419

    
1420
        setup_return(regs, ka, &frame->retcode, frame_addr, usig,
1421
                     frame_addr + offsetof(struct sigframe_v2, retcode));
1422

    
1423
        unlock_user_struct(frame, frame_addr, 1);
1424
}
1425

    
1426
static void setup_frame(int usig, struct target_sigaction *ka,
1427
                        target_sigset_t *set, CPUARMState *regs)
1428
{
1429
    if (get_osversion() >= 0x020612) {
1430
        setup_frame_v2(usig, ka, set, regs);
1431
    } else {
1432
        setup_frame_v1(usig, ka, set, regs);
1433
    }
1434
}
1435

    
1436
/* compare linux/arch/arm/kernel/signal.c:setup_rt_frame() */
1437
static void setup_rt_frame_v1(int usig, struct target_sigaction *ka,
1438
                              target_siginfo_t *info,
1439
                              target_sigset_t *set, CPUARMState *env)
1440
{
1441
        struct rt_sigframe_v1 *frame;
1442
        abi_ulong frame_addr = get_sigframe(ka, env, sizeof(*frame));
1443
        struct target_sigaltstack stack;
1444
        int i;
1445
        abi_ulong info_addr, uc_addr;
1446

    
1447
        if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
1448
            return /* 1 */;
1449

    
1450
        info_addr = frame_addr + offsetof(struct rt_sigframe_v1, info);
1451
        __put_user(info_addr, &frame->pinfo);
1452
        uc_addr = frame_addr + offsetof(struct rt_sigframe_v1, uc);
1453
        __put_user(uc_addr, &frame->puc);
1454
        copy_siginfo_to_user(&frame->info, info);
1455

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

    
1459
        memset(&stack, 0, sizeof(stack));
1460
        __put_user(target_sigaltstack_used.ss_sp, &stack.ss_sp);
1461
        __put_user(target_sigaltstack_used.ss_size, &stack.ss_size);
1462
        __put_user(sas_ss_flags(get_sp_from_cpustate(env)), &stack.ss_flags);
1463
        memcpy(&frame->uc.tuc_stack, &stack, sizeof(stack));
1464

    
1465
        setup_sigcontext(&frame->uc.tuc_mcontext, env, set->sig[0]);
1466
        for(i = 0; i < TARGET_NSIG_WORDS; i++) {
1467
            if (__put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]))
1468
                goto end;
1469
        }
1470

    
1471
        setup_return(env, ka, &frame->retcode, frame_addr, usig,
1472
                     frame_addr + offsetof(struct rt_sigframe_v1, retcode));
1473

    
1474
        env->regs[1] = info_addr;
1475
        env->regs[2] = uc_addr;
1476

    
1477
end:
1478
        unlock_user_struct(frame, frame_addr, 1);
1479
}
1480

    
1481
static void setup_rt_frame_v2(int usig, struct target_sigaction *ka,
1482
                              target_siginfo_t *info,
1483
                              target_sigset_t *set, CPUARMState *env)
1484
{
1485
        struct rt_sigframe_v2 *frame;
1486
        abi_ulong frame_addr = get_sigframe(ka, env, sizeof(*frame));
1487
        abi_ulong info_addr, uc_addr;
1488

    
1489
        if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
1490
            return /* 1 */;
1491

    
1492
        info_addr = frame_addr + offsetof(struct rt_sigframe_v2, info);
1493
        uc_addr = frame_addr + offsetof(struct rt_sigframe_v2, uc);
1494
        copy_siginfo_to_user(&frame->info, info);
1495

    
1496
        setup_sigframe_v2(&frame->uc, set, env);
1497

    
1498
        setup_return(env, ka, &frame->retcode, frame_addr, usig,
1499
                     frame_addr + offsetof(struct rt_sigframe_v2, retcode));
1500

    
1501
        env->regs[1] = info_addr;
1502
        env->regs[2] = uc_addr;
1503

    
1504
        unlock_user_struct(frame, frame_addr, 1);
1505
}
1506

    
1507
static void setup_rt_frame(int usig, struct target_sigaction *ka,
1508
                           target_siginfo_t *info,
1509
                           target_sigset_t *set, CPUARMState *env)
1510
{
1511
    if (get_osversion() >= 0x020612) {
1512
        setup_rt_frame_v2(usig, ka, info, set, env);
1513
    } else {
1514
        setup_rt_frame_v1(usig, ka, info, set, env);
1515
    }
1516
}
1517

    
1518
static int
1519
restore_sigcontext(CPUARMState *env, struct target_sigcontext *sc)
1520
{
1521
        int err = 0;
1522
        uint32_t cpsr;
1523

    
1524
        __get_user_error(env->regs[0], &sc->arm_r0, err);
1525
        __get_user_error(env->regs[1], &sc->arm_r1, err);
1526
        __get_user_error(env->regs[2], &sc->arm_r2, err);
1527
        __get_user_error(env->regs[3], &sc->arm_r3, err);
1528
        __get_user_error(env->regs[4], &sc->arm_r4, err);
1529
        __get_user_error(env->regs[5], &sc->arm_r5, err);
1530
        __get_user_error(env->regs[6], &sc->arm_r6, err);
1531
        __get_user_error(env->regs[7], &sc->arm_r7, err);
1532
        __get_user_error(env->regs[8], &sc->arm_r8, err);
1533
        __get_user_error(env->regs[9], &sc->arm_r9, err);
1534
        __get_user_error(env->regs[10], &sc->arm_r10, err);
1535
        __get_user_error(env->regs[11], &sc->arm_fp, err);
1536
        __get_user_error(env->regs[12], &sc->arm_ip, err);
1537
        __get_user_error(env->regs[13], &sc->arm_sp, err);
1538
        __get_user_error(env->regs[14], &sc->arm_lr, err);
1539
        __get_user_error(env->regs[15], &sc->arm_pc, err);
1540
#ifdef TARGET_CONFIG_CPU_32
1541
        __get_user_error(cpsr, &sc->arm_cpsr, err);
1542
        cpsr_write(env, cpsr, CPSR_USER | CPSR_EXEC);
1543
#endif
1544

    
1545
        err |= !valid_user_regs(env);
1546

    
1547
        return err;
1548
}
1549

    
1550
static long do_sigreturn_v1(CPUARMState *env)
1551
{
1552
        abi_ulong frame_addr;
1553
        struct sigframe_v1 *frame;
1554
        target_sigset_t set;
1555
        sigset_t host_set;
1556
        int i;
1557

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

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

    
1570
        if (__get_user(set.sig[0], &frame->sc.oldmask))
1571
            goto badframe;
1572
        for(i = 1; i < TARGET_NSIG_WORDS; i++) {
1573
            if (__get_user(set.sig[i], &frame->extramask[i - 1]))
1574
                goto badframe;
1575
        }
1576

    
1577
        target_to_host_sigset_internal(&host_set, &set);
1578
        sigprocmask(SIG_SETMASK, &host_set, NULL);
1579

    
1580
        if (restore_sigcontext(env, &frame->sc))
1581
                goto badframe;
1582

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

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

    
1597
static abi_ulong *restore_sigframe_v2_vfp(CPUARMState *env, abi_ulong *regspace)
1598
{
1599
    int i;
1600
    abi_ulong magic, sz;
1601
    uint32_t fpscr, fpexc;
1602
    struct target_vfp_sigframe *vfpframe;
1603
    vfpframe = (struct target_vfp_sigframe *)regspace;
1604

    
1605
    __get_user(magic, &vfpframe->magic);
1606
    __get_user(sz, &vfpframe->size);
1607
    if (magic != TARGET_VFP_MAGIC || sz != sizeof(*vfpframe)) {
1608
        return 0;
1609
    }
1610
    for (i = 0; i < 32; i++) {
1611
        __get_user(float64_val(env->vfp.regs[i]), &vfpframe->ufp.fpregs[i]);
1612
    }
1613
    __get_user(fpscr, &vfpframe->ufp.fpscr);
1614
    vfp_set_fpscr(env, fpscr);
1615
    __get_user(fpexc, &vfpframe->ufp_exc.fpexc);
1616
    /* Sanitise FPEXC: ensure VFP is enabled, FPINST2 is invalid
1617
     * and the exception flag is cleared
1618
     */
1619
    fpexc |= (1 << 30);
1620
    fpexc &= ~((1 << 31) | (1 << 28));
1621
    env->vfp.xregs[ARM_VFP_FPEXC] = fpexc;
1622
    __get_user(env->vfp.xregs[ARM_VFP_FPINST], &vfpframe->ufp_exc.fpinst);
1623
    __get_user(env->vfp.xregs[ARM_VFP_FPINST2], &vfpframe->ufp_exc.fpinst2);
1624
    return (abi_ulong*)(vfpframe + 1);
1625
}
1626

    
1627
static abi_ulong *restore_sigframe_v2_iwmmxt(CPUARMState *env,
1628
                                             abi_ulong *regspace)
1629
{
1630
    int i;
1631
    abi_ulong magic, sz;
1632
    struct target_iwmmxt_sigframe *iwmmxtframe;
1633
    iwmmxtframe = (struct target_iwmmxt_sigframe *)regspace;
1634

    
1635
    __get_user(magic, &iwmmxtframe->magic);
1636
    __get_user(sz, &iwmmxtframe->size);
1637
    if (magic != TARGET_IWMMXT_MAGIC || sz != sizeof(*iwmmxtframe)) {
1638
        return 0;
1639
    }
1640
    for (i = 0; i < 16; i++) {
1641
        __get_user(env->iwmmxt.regs[i], &iwmmxtframe->regs[i]);
1642
    }
1643
    __get_user(env->vfp.xregs[ARM_IWMMXT_wCSSF], &iwmmxtframe->wcssf);
1644
    __get_user(env->vfp.xregs[ARM_IWMMXT_wCASF], &iwmmxtframe->wcssf);
1645
    __get_user(env->vfp.xregs[ARM_IWMMXT_wCGR0], &iwmmxtframe->wcgr0);
1646
    __get_user(env->vfp.xregs[ARM_IWMMXT_wCGR1], &iwmmxtframe->wcgr1);
1647
    __get_user(env->vfp.xregs[ARM_IWMMXT_wCGR2], &iwmmxtframe->wcgr2);
1648
    __get_user(env->vfp.xregs[ARM_IWMMXT_wCGR3], &iwmmxtframe->wcgr3);
1649
    return (abi_ulong*)(iwmmxtframe + 1);
1650
}
1651

    
1652
static int do_sigframe_return_v2(CPUARMState *env, target_ulong frame_addr,
1653
                                 struct target_ucontext_v2 *uc)
1654
{
1655
    sigset_t host_set;
1656
    abi_ulong *regspace;
1657

    
1658
    target_to_host_sigset(&host_set, &uc->tuc_sigmask);
1659
    sigprocmask(SIG_SETMASK, &host_set, NULL);
1660

    
1661
    if (restore_sigcontext(env, &uc->tuc_mcontext))
1662
        return 1;
1663

    
1664
    /* Restore coprocessor signal frame */
1665
    regspace = uc->tuc_regspace;
1666
    if (arm_feature(env, ARM_FEATURE_VFP)) {
1667
        regspace = restore_sigframe_v2_vfp(env, regspace);
1668
        if (!regspace) {
1669
            return 1;
1670
        }
1671
    }
1672
    if (arm_feature(env, ARM_FEATURE_IWMMXT)) {
1673
        regspace = restore_sigframe_v2_iwmmxt(env, regspace);
1674
        if (!regspace) {
1675
            return 1;
1676
        }
1677
    }
1678

    
1679
    if (do_sigaltstack(frame_addr + offsetof(struct target_ucontext_v2, tuc_stack), 0, get_sp_from_cpustate(env)) == -EFAULT)
1680
        return 1;
1681

    
1682
#if 0
1683
    /* Send SIGTRAP if we're single-stepping */
1684
    if (ptrace_cancel_bpt(current))
1685
            send_sig(SIGTRAP, current, 1);
1686
#endif
1687

    
1688
    return 0;
1689
}
1690

    
1691
static long do_sigreturn_v2(CPUARMState *env)
1692
{
1693
        abi_ulong frame_addr;
1694
        struct sigframe_v2 *frame;
1695

    
1696
        /*
1697
         * Since we stacked the signal on a 64-bit boundary,
1698
         * then 'sp' should be word aligned here.  If it's
1699
         * not, then the user is trying to mess with us.
1700
         */
1701
        if (env->regs[13] & 7)
1702
                goto badframe;
1703

    
1704
        frame_addr = env->regs[13];
1705
        if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1706
                goto badframe;
1707

    
1708
        if (do_sigframe_return_v2(env, frame_addr, &frame->uc))
1709
                goto badframe;
1710

    
1711
        unlock_user_struct(frame, frame_addr, 0);
1712
        return env->regs[0];
1713

    
1714
badframe:
1715
        unlock_user_struct(frame, frame_addr, 0);
1716
        force_sig(TARGET_SIGSEGV /* , current */);
1717
        return 0;
1718
}
1719

    
1720
long do_sigreturn(CPUARMState *env)
1721
{
1722
    if (get_osversion() >= 0x020612) {
1723
        return do_sigreturn_v2(env);
1724
    } else {
1725
        return do_sigreturn_v1(env);
1726
    }
1727
}
1728

    
1729
static long do_rt_sigreturn_v1(CPUARMState *env)
1730
{
1731
        abi_ulong frame_addr;
1732
        struct rt_sigframe_v1 *frame;
1733
        sigset_t host_set;
1734

    
1735
        /*
1736
         * Since we stacked the signal on a 64-bit boundary,
1737
         * then 'sp' should be word aligned here.  If it's
1738
         * not, then the user is trying to mess with us.
1739
         */
1740
        if (env->regs[13] & 7)
1741
                goto badframe;
1742

    
1743
        frame_addr = env->regs[13];
1744
        if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1745
                goto badframe;
1746

    
1747
        target_to_host_sigset(&host_set, &frame->uc.tuc_sigmask);
1748
        sigprocmask(SIG_SETMASK, &host_set, NULL);
1749

    
1750
        if (restore_sigcontext(env, &frame->uc.tuc_mcontext))
1751
                goto badframe;
1752

    
1753
        if (do_sigaltstack(frame_addr + offsetof(struct rt_sigframe_v1, uc.tuc_stack), 0, get_sp_from_cpustate(env)) == -EFAULT)
1754
                goto badframe;
1755

    
1756
#if 0
1757
        /* Send SIGTRAP if we're single-stepping */
1758
        if (ptrace_cancel_bpt(current))
1759
                send_sig(SIGTRAP, current, 1);
1760
#endif
1761
        unlock_user_struct(frame, frame_addr, 0);
1762
        return env->regs[0];
1763

    
1764
badframe:
1765
        unlock_user_struct(frame, frame_addr, 0);
1766
        force_sig(TARGET_SIGSEGV /* , current */);
1767
        return 0;
1768
}
1769

    
1770
static long do_rt_sigreturn_v2(CPUARMState *env)
1771
{
1772
        abi_ulong frame_addr;
1773
        struct rt_sigframe_v2 *frame;
1774

    
1775
        /*
1776
         * Since we stacked the signal on a 64-bit boundary,
1777
         * then 'sp' should be word aligned here.  If it's
1778
         * not, then the user is trying to mess with us.
1779
         */
1780
        if (env->regs[13] & 7)
1781
                goto badframe;
1782

    
1783
        frame_addr = env->regs[13];
1784
        if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1785
                goto badframe;
1786

    
1787
        if (do_sigframe_return_v2(env, frame_addr, &frame->uc))
1788
                goto badframe;
1789

    
1790
        unlock_user_struct(frame, frame_addr, 0);
1791
        return env->regs[0];
1792

    
1793
badframe:
1794
        unlock_user_struct(frame, frame_addr, 0);
1795
        force_sig(TARGET_SIGSEGV /* , current */);
1796
        return 0;
1797
}
1798

    
1799
long do_rt_sigreturn(CPUARMState *env)
1800
{
1801
    if (get_osversion() >= 0x020612) {
1802
        return do_rt_sigreturn_v2(env);
1803
    } else {
1804
        return do_rt_sigreturn_v1(env);
1805
    }
1806
}
1807

    
1808
#elif defined(TARGET_SPARC)
1809

    
1810
#define __SUNOS_MAXWIN   31
1811

    
1812
/* This is what SunOS does, so shall I. */
1813
struct target_sigcontext {
1814
        abi_ulong sigc_onstack;      /* state to restore */
1815

    
1816
        abi_ulong sigc_mask;         /* sigmask to restore */
1817
        abi_ulong sigc_sp;           /* stack pointer */
1818
        abi_ulong sigc_pc;           /* program counter */
1819
        abi_ulong sigc_npc;          /* next program counter */
1820
        abi_ulong sigc_psr;          /* for condition codes etc */
1821
        abi_ulong sigc_g1;           /* User uses these two registers */
1822
        abi_ulong sigc_o0;           /* within the trampoline code. */
1823

    
1824
        /* Now comes information regarding the users window set
1825
         * at the time of the signal.
1826
         */
1827
        abi_ulong sigc_oswins;       /* outstanding windows */
1828

    
1829
        /* stack ptrs for each regwin buf */
1830
        char *sigc_spbuf[__SUNOS_MAXWIN];
1831

    
1832
        /* Windows to restore after signal */
1833
        struct {
1834
                abi_ulong locals[8];
1835
                abi_ulong ins[8];
1836
        } sigc_wbuf[__SUNOS_MAXWIN];
1837
};
1838
/* A Sparc stack frame */
1839
struct sparc_stackf {
1840
        abi_ulong locals[8];
1841
        abi_ulong ins[8];
1842
        /* It's simpler to treat fp and callers_pc as elements of ins[]
1843
         * since we never need to access them ourselves.
1844
         */
1845
        char *structptr;
1846
        abi_ulong xargs[6];
1847
        abi_ulong xxargs[1];
1848
};
1849

    
1850
typedef struct {
1851
        struct {
1852
                abi_ulong psr;
1853
                abi_ulong pc;
1854
                abi_ulong npc;
1855
                abi_ulong y;
1856
                abi_ulong u_regs[16]; /* globals and ins */
1857
        }               si_regs;
1858
        int             si_mask;
1859
} __siginfo_t;
1860

    
1861
typedef struct {
1862
        abi_ulong       si_float_regs[32];
1863
        unsigned   long si_fsr;
1864
        unsigned   long si_fpqdepth;
1865
        struct {
1866
                unsigned long *insn_addr;
1867
                unsigned long insn;
1868
        } si_fpqueue [16];
1869
} qemu_siginfo_fpu_t;
1870

    
1871

    
1872
struct target_signal_frame {
1873
        struct sparc_stackf        ss;
1874
        __siginfo_t                info;
1875
        abi_ulong               fpu_save;
1876
        abi_ulong                insns[2] __attribute__ ((aligned (8)));
1877
        abi_ulong                extramask[TARGET_NSIG_WORDS - 1];
1878
        abi_ulong                extra_size; /* Should be 0 */
1879
        qemu_siginfo_fpu_t        fpu_state;
1880
};
1881
struct target_rt_signal_frame {
1882
        struct sparc_stackf        ss;
1883
        siginfo_t                info;
1884
        abi_ulong                regs[20];
1885
        sigset_t                mask;
1886
        abi_ulong               fpu_save;
1887
        unsigned int                insns[2];
1888
        stack_t                        stack;
1889
        unsigned int                extra_size; /* Should be 0 */
1890
        qemu_siginfo_fpu_t        fpu_state;
1891
};
1892

    
1893
#define UREG_O0        16
1894
#define UREG_O6        22
1895
#define UREG_I0        0
1896
#define UREG_I1        1
1897
#define UREG_I2        2
1898
#define UREG_I3        3
1899
#define UREG_I4        4
1900
#define UREG_I5        5
1901
#define UREG_I6        6
1902
#define UREG_I7        7
1903
#define UREG_L0               8
1904
#define UREG_FP        UREG_I6
1905
#define UREG_SP        UREG_O6
1906

    
1907
static inline abi_ulong get_sigframe(struct target_sigaction *sa, 
1908
                                     CPUSPARCState *env,
1909
                                     unsigned long framesize)
1910
{
1911
        abi_ulong sp;
1912

    
1913
        sp = env->regwptr[UREG_FP];
1914

    
1915
        /* This is the X/Open sanctioned signal stack switching.  */
1916
        if (sa->sa_flags & TARGET_SA_ONSTACK) {
1917
            if (!on_sig_stack(sp)
1918
                && !((target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size) & 7))
1919
                sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
1920
        }
1921
        return sp - framesize;
1922
}
1923

    
1924
static int
1925
setup___siginfo(__siginfo_t *si, CPUSPARCState *env, abi_ulong mask)
1926
{
1927
        int err = 0, i;
1928

    
1929
        err |= __put_user(env->psr, &si->si_regs.psr);
1930
        err |= __put_user(env->pc, &si->si_regs.pc);
1931
        err |= __put_user(env->npc, &si->si_regs.npc);
1932
        err |= __put_user(env->y, &si->si_regs.y);
1933
        for (i=0; i < 8; i++) {
1934
                err |= __put_user(env->gregs[i], &si->si_regs.u_regs[i]);
1935
        }
1936
        for (i=0; i < 8; i++) {
1937
                err |= __put_user(env->regwptr[UREG_I0 + i], &si->si_regs.u_regs[i+8]);
1938
        }
1939
        err |= __put_user(mask, &si->si_mask);
1940
        return err;
1941
}
1942

    
1943
#if 0
1944
static int
1945
setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/
1946
                 CPUSPARCState *env, unsigned long mask)
1947
{
1948
        int err = 0;
1949

1950
        err |= __put_user(mask, &sc->sigc_mask);
1951
        err |= __put_user(env->regwptr[UREG_SP], &sc->sigc_sp);
1952
        err |= __put_user(env->pc, &sc->sigc_pc);
1953
        err |= __put_user(env->npc, &sc->sigc_npc);
1954
        err |= __put_user(env->psr, &sc->sigc_psr);
1955
        err |= __put_user(env->gregs[1], &sc->sigc_g1);
1956
        err |= __put_user(env->regwptr[UREG_O0], &sc->sigc_o0);
1957

1958
        return err;
1959
}
1960
#endif
1961
#define NF_ALIGNEDSZ  (((sizeof(struct target_signal_frame) + 7) & (~7)))
1962

    
1963
static void setup_frame(int sig, struct target_sigaction *ka,
1964
                        target_sigset_t *set, CPUSPARCState *env)
1965
{
1966
        abi_ulong sf_addr;
1967
        struct target_signal_frame *sf;
1968
        int sigframe_size, err, i;
1969

    
1970
        /* 1. Make sure everything is clean */
1971
        //synchronize_user_stack();
1972

    
1973
        sigframe_size = NF_ALIGNEDSZ;
1974
        sf_addr = get_sigframe(ka, env, sigframe_size);
1975

    
1976
        sf = lock_user(VERIFY_WRITE, sf_addr, 
1977
                       sizeof(struct target_signal_frame), 0);
1978
        if (!sf)
1979
                goto sigsegv;
1980
                
1981
        //fprintf(stderr, "sf: %x pc %x fp %x sp %x\n", sf, env->pc, env->regwptr[UREG_FP], env->regwptr[UREG_SP]);
1982
#if 0
1983
        if (invalid_frame_pointer(sf, sigframe_size))
1984
                goto sigill_and_return;
1985
#endif
1986
        /* 2. Save the current process state */
1987
        err = setup___siginfo(&sf->info, env, set->sig[0]);
1988
        err |= __put_user(0, &sf->extra_size);
1989

    
1990
        //err |= save_fpu_state(regs, &sf->fpu_state);
1991
        //err |= __put_user(&sf->fpu_state, &sf->fpu_save);
1992

    
1993
        err |= __put_user(set->sig[0], &sf->info.si_mask);
1994
        for (i = 0; i < TARGET_NSIG_WORDS - 1; i++) {
1995
                err |= __put_user(set->sig[i + 1], &sf->extramask[i]);
1996
        }
1997

    
1998
        for (i = 0; i < 8; i++) {
1999
                  err |= __put_user(env->regwptr[i + UREG_L0], &sf->ss.locals[i]);
2000
        }
2001
        for (i = 0; i < 8; i++) {
2002
                  err |= __put_user(env->regwptr[i + UREG_I0], &sf->ss.ins[i]);
2003
        }
2004
        if (err)
2005
                goto sigsegv;
2006

    
2007
        /* 3. signal handler back-trampoline and parameters */
2008
        env->regwptr[UREG_FP] = sf_addr;
2009
        env->regwptr[UREG_I0] = sig;
2010
        env->regwptr[UREG_I1] = sf_addr + 
2011
                offsetof(struct target_signal_frame, info);
2012
        env->regwptr[UREG_I2] = sf_addr + 
2013
                offsetof(struct target_signal_frame, info);
2014

    
2015
        /* 4. signal handler */
2016
        env->pc = ka->_sa_handler;
2017
        env->npc = (env->pc + 4);
2018
        /* 5. return to kernel instructions */
2019
        if (ka->sa_restorer)
2020
                env->regwptr[UREG_I7] = ka->sa_restorer;
2021
        else {
2022
                uint32_t val32;
2023

    
2024
                env->regwptr[UREG_I7] = sf_addr + 
2025
                        offsetof(struct target_signal_frame, insns) - 2 * 4;
2026

    
2027
                /* mov __NR_sigreturn, %g1 */
2028
                val32 = 0x821020d8;
2029
                err |= __put_user(val32, &sf->insns[0]);
2030

    
2031
                /* t 0x10 */
2032
                val32 = 0x91d02010;
2033
                err |= __put_user(val32, &sf->insns[1]);
2034
                if (err)
2035
                        goto sigsegv;
2036

    
2037
                /* Flush instruction space. */
2038
                //flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0]));
2039
                //                tb_flush(env);
2040
        }
2041
        unlock_user(sf, sf_addr, sizeof(struct target_signal_frame));
2042
        return;
2043
#if 0
2044
sigill_and_return:
2045
        force_sig(TARGET_SIGILL);
2046
#endif
2047
sigsegv:
2048
        //fprintf(stderr, "force_sig\n");
2049
        unlock_user(sf, sf_addr, sizeof(struct target_signal_frame));
2050
        force_sig(TARGET_SIGSEGV);
2051
}
2052
static inline int
2053
restore_fpu_state(CPUSPARCState *env, qemu_siginfo_fpu_t *fpu)
2054
{
2055
        int err;
2056
#if 0
2057
#ifdef CONFIG_SMP
2058
        if (current->flags & PF_USEDFPU)
2059
                regs->psr &= ~PSR_EF;
2060
#else
2061
        if (current == last_task_used_math) {
2062
                last_task_used_math = 0;
2063
                regs->psr &= ~PSR_EF;
2064
        }
2065
#endif
2066
        current->used_math = 1;
2067
        current->flags &= ~PF_USEDFPU;
2068
#endif
2069
#if 0
2070
        if (verify_area (VERIFY_READ, fpu, sizeof(*fpu)))
2071
                return -EFAULT;
2072
#endif
2073

    
2074
        /* XXX: incorrect */
2075
        err = copy_from_user(&env->fpr[0], fpu->si_float_regs[0],
2076
                             (sizeof(abi_ulong) * 32));
2077
        err |= __get_user(env->fsr, &fpu->si_fsr);
2078
#if 0
2079
        err |= __get_user(current->thread.fpqdepth, &fpu->si_fpqdepth);
2080
        if (current->thread.fpqdepth != 0)
2081
                err |= __copy_from_user(&current->thread.fpqueue[0],
2082
                                        &fpu->si_fpqueue[0],
2083
                                        ((sizeof(unsigned long) +
2084
                                        (sizeof(unsigned long *)))*16));
2085
#endif
2086
        return err;
2087
}
2088

    
2089

    
2090
static void setup_rt_frame(int sig, struct target_sigaction *ka,
2091
                           target_siginfo_t *info,
2092
                           target_sigset_t *set, CPUSPARCState *env)
2093
{
2094
    fprintf(stderr, "setup_rt_frame: not implemented\n");
2095
}
2096

    
2097
long do_sigreturn(CPUSPARCState *env)
2098
{
2099
        abi_ulong sf_addr;
2100
        struct target_signal_frame *sf;
2101
        uint32_t up_psr, pc, npc;
2102
        target_sigset_t set;
2103
        sigset_t host_set;
2104
        int err, i;
2105

    
2106
        sf_addr = env->regwptr[UREG_FP];
2107
        if (!lock_user_struct(VERIFY_READ, sf, sf_addr, 1))
2108
                goto segv_and_exit;
2109
#if 0
2110
        fprintf(stderr, "sigreturn\n");
2111
        fprintf(stderr, "sf: %x pc %x fp %x sp %x\n", sf, env->pc, env->regwptr[UREG_FP], env->regwptr[UREG_SP]);
2112
#endif
2113
        //cpu_dump_state(env, stderr, fprintf, 0);
2114

    
2115
        /* 1. Make sure we are not getting garbage from the user */
2116

    
2117
        if (sf_addr & 3)
2118
                goto segv_and_exit;
2119

    
2120
        err = __get_user(pc,  &sf->info.si_regs.pc);
2121
        err |= __get_user(npc, &sf->info.si_regs.npc);
2122

    
2123
        if ((pc | npc) & 3)
2124
                goto segv_and_exit;
2125

    
2126
        /* 2. Restore the state */
2127
        err |= __get_user(up_psr, &sf->info.si_regs.psr);
2128

    
2129
        /* User can only change condition codes and FPU enabling in %psr. */
2130
        env->psr = (up_psr & (PSR_ICC /* | PSR_EF */))
2131
                  | (env->psr & ~(PSR_ICC /* | PSR_EF */));
2132

    
2133
        env->pc = pc;
2134
        env->npc = npc;
2135
        err |= __get_user(env->y, &sf->info.si_regs.y);
2136
        for (i=0; i < 8; i++) {
2137
                err |= __get_user(env->gregs[i], &sf->info.si_regs.u_regs[i]);
2138
        }
2139
        for (i=0; i < 8; i++) {
2140
                err |= __get_user(env->regwptr[i + UREG_I0], &sf->info.si_regs.u_regs[i+8]);
2141
        }
2142

    
2143
        /* FIXME: implement FPU save/restore:
2144
         * __get_user(fpu_save, &sf->fpu_save);
2145
         * if (fpu_save)
2146
         *        err |= restore_fpu_state(env, fpu_save);
2147
         */
2148

    
2149
        /* This is pretty much atomic, no amount locking would prevent
2150
         * the races which exist anyways.
2151
         */
2152
        err |= __get_user(set.sig[0], &sf->info.si_mask);
2153
        for(i = 1; i < TARGET_NSIG_WORDS; i++) {
2154
            err |= (__get_user(set.sig[i], &sf->extramask[i - 1]));
2155
        }
2156

    
2157
        target_to_host_sigset_internal(&host_set, &set);
2158
        sigprocmask(SIG_SETMASK, &host_set, NULL);
2159

    
2160
        if (err)
2161
                goto segv_and_exit;
2162
        unlock_user_struct(sf, sf_addr, 0);
2163
        return env->regwptr[0];
2164

    
2165
segv_and_exit:
2166
        unlock_user_struct(sf, sf_addr, 0);
2167
        force_sig(TARGET_SIGSEGV);
2168
}
2169

    
2170
long do_rt_sigreturn(CPUSPARCState *env)
2171
{
2172
    fprintf(stderr, "do_rt_sigreturn: not implemented\n");
2173
    return -TARGET_ENOSYS;
2174
}
2175

    
2176
#if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
2177
#define MC_TSTATE 0
2178
#define MC_PC 1
2179
#define MC_NPC 2
2180
#define MC_Y 3
2181
#define MC_G1 4
2182
#define MC_G2 5
2183
#define MC_G3 6
2184
#define MC_G4 7
2185
#define MC_G5 8
2186
#define MC_G6 9
2187
#define MC_G7 10
2188
#define MC_O0 11
2189
#define MC_O1 12
2190
#define MC_O2 13
2191
#define MC_O3 14
2192
#define MC_O4 15
2193
#define MC_O5 16
2194
#define MC_O6 17
2195
#define MC_O7 18
2196
#define MC_NGREG 19
2197

    
2198
typedef abi_ulong target_mc_greg_t;
2199
typedef target_mc_greg_t target_mc_gregset_t[MC_NGREG];
2200

    
2201
struct target_mc_fq {
2202
    abi_ulong *mcfq_addr;
2203
    uint32_t mcfq_insn;
2204
};
2205

    
2206
struct target_mc_fpu {
2207
    union {
2208
        uint32_t sregs[32];
2209
        uint64_t dregs[32];
2210
        //uint128_t qregs[16];
2211
    } mcfpu_fregs;
2212
    abi_ulong mcfpu_fsr;
2213
    abi_ulong mcfpu_fprs;
2214
    abi_ulong mcfpu_gsr;
2215
    struct target_mc_fq *mcfpu_fq;
2216
    unsigned char mcfpu_qcnt;
2217
    unsigned char mcfpu_qentsz;
2218
    unsigned char mcfpu_enab;
2219
};
2220
typedef struct target_mc_fpu target_mc_fpu_t;
2221

    
2222
typedef struct {
2223
    target_mc_gregset_t mc_gregs;
2224
    target_mc_greg_t mc_fp;
2225
    target_mc_greg_t mc_i7;
2226
    target_mc_fpu_t mc_fpregs;
2227
} target_mcontext_t;
2228

    
2229
struct target_ucontext {
2230
    struct target_ucontext *tuc_link;
2231
    abi_ulong tuc_flags;
2232
    target_sigset_t tuc_sigmask;
2233
    target_mcontext_t tuc_mcontext;
2234
};
2235

    
2236
/* A V9 register window */
2237
struct target_reg_window {
2238
    abi_ulong locals[8];
2239
    abi_ulong ins[8];
2240
};
2241

    
2242
#define TARGET_STACK_BIAS 2047
2243

    
2244
/* {set, get}context() needed for 64-bit SparcLinux userland. */
2245
void sparc64_set_context(CPUSPARCState *env)
2246
{
2247
    abi_ulong ucp_addr;
2248
    struct target_ucontext *ucp;
2249
    target_mc_gregset_t *grp;
2250
    abi_ulong pc, npc, tstate;
2251
    abi_ulong fp, i7, w_addr;
2252
    int err;
2253
    unsigned int i;
2254

    
2255
    ucp_addr = env->regwptr[UREG_I0];
2256
    if (!lock_user_struct(VERIFY_READ, ucp, ucp_addr, 1))
2257
        goto do_sigsegv;
2258
    grp  = &ucp->tuc_mcontext.mc_gregs;
2259
    err  = __get_user(pc, &((*grp)[MC_PC]));
2260
    err |= __get_user(npc, &((*grp)[MC_NPC]));
2261
    if (err || ((pc | npc) & 3))
2262
        goto do_sigsegv;
2263
    if (env->regwptr[UREG_I1]) {
2264
        target_sigset_t target_set;
2265
        sigset_t set;
2266

    
2267
        if (TARGET_NSIG_WORDS == 1) {
2268
            if (__get_user(target_set.sig[0], &ucp->tuc_sigmask.sig[0]))
2269
                goto do_sigsegv;
2270
        } else {
2271
            abi_ulong *src, *dst;
2272
            src = ucp->tuc_sigmask.sig;
2273
            dst = target_set.sig;
2274
            for (i = 0; i < sizeof(target_sigset_t) / sizeof(abi_ulong);
2275
                 i++, dst++, src++)
2276
                err |= __get_user(*dst, src);
2277
            if (err)
2278
                goto do_sigsegv;
2279
        }
2280
        target_to_host_sigset_internal(&set, &target_set);
2281
        sigprocmask(SIG_SETMASK, &set, NULL);
2282
    }
2283
    env->pc = pc;
2284
    env->npc = npc;
2285
    err |= __get_user(env->y, &((*grp)[MC_Y]));
2286
    err |= __get_user(tstate, &((*grp)[MC_TSTATE]));
2287
    env->asi = (tstate >> 24) & 0xff;
2288
    cpu_put_ccr(env, tstate >> 32);
2289
    cpu_put_cwp64(env, tstate & 0x1f);
2290
    err |= __get_user(env->gregs[1], (&(*grp)[MC_G1]));
2291
    err |= __get_user(env->gregs[2], (&(*grp)[MC_G2]));
2292
    err |= __get_user(env->gregs[3], (&(*grp)[MC_G3]));
2293
    err |= __get_user(env->gregs[4], (&(*grp)[MC_G4]));
2294
    err |= __get_user(env->gregs[5], (&(*grp)[MC_G5]));
2295
    err |= __get_user(env->gregs[6], (&(*grp)[MC_G6]));
2296
    err |= __get_user(env->gregs[7], (&(*grp)[MC_G7]));
2297
    err |= __get_user(env->regwptr[UREG_I0], (&(*grp)[MC_O0]));
2298
    err |= __get_user(env->regwptr[UREG_I1], (&(*grp)[MC_O1]));
2299
    err |= __get_user(env->regwptr[UREG_I2], (&(*grp)[MC_O2]));
2300
    err |= __get_user(env->regwptr[UREG_I3], (&(*grp)[MC_O3]));
2301
    err |= __get_user(env->regwptr[UREG_I4], (&(*grp)[MC_O4]));
2302
    err |= __get_user(env->regwptr[UREG_I5], (&(*grp)[MC_O5]));
2303
    err |= __get_user(env->regwptr[UREG_I6], (&(*grp)[MC_O6]));
2304
    err |= __get_user(env->regwptr[UREG_I7], (&(*grp)[MC_O7]));
2305

    
2306
    err |= __get_user(fp, &(ucp->tuc_mcontext.mc_fp));
2307
    err |= __get_user(i7, &(ucp->tuc_mcontext.mc_i7));
2308

    
2309
    w_addr = TARGET_STACK_BIAS+env->regwptr[UREG_I6];
2310
    if (put_user(fp, w_addr + offsetof(struct target_reg_window, ins[6]), 
2311
                 abi_ulong) != 0)
2312
        goto do_sigsegv;
2313
    if (put_user(i7, w_addr + offsetof(struct target_reg_window, ins[7]), 
2314
                 abi_ulong) != 0)
2315
        goto do_sigsegv;
2316
    /* FIXME this does not match how the kernel handles the FPU in
2317
     * its sparc64_set_context implementation. In particular the FPU
2318
     * is only restored if fenab is non-zero in:
2319
     *   __get_user(fenab, &(ucp->tuc_mcontext.mc_fpregs.mcfpu_enab));
2320
     */
2321
    err |= __get_user(env->fprs, &(ucp->tuc_mcontext.mc_fpregs.mcfpu_fprs));
2322
    {
2323
        uint32_t *src = ucp->tuc_mcontext.mc_fpregs.mcfpu_fregs.sregs;
2324
        for (i = 0; i < 64; i++, src++) {
2325
            if (i & 1) {
2326
                err |= __get_user(env->fpr[i/2].l.lower, src);
2327
            } else {
2328
                err |= __get_user(env->fpr[i/2].l.upper, src);
2329
            }
2330
        }
2331
    }
2332
    err |= __get_user(env->fsr,
2333
                      &(ucp->tuc_mcontext.mc_fpregs.mcfpu_fsr));
2334
    err |= __get_user(env->gsr,
2335
                      &(ucp->tuc_mcontext.mc_fpregs.mcfpu_gsr));
2336
    if (err)
2337
        goto do_sigsegv;
2338
    unlock_user_struct(ucp, ucp_addr, 0);
2339
    return;
2340
 do_sigsegv:
2341
    unlock_user_struct(ucp, ucp_addr, 0);
2342
    force_sig(TARGET_SIGSEGV);
2343
}
2344

    
2345
void sparc64_get_context(CPUSPARCState *env)
2346
{
2347
    abi_ulong ucp_addr;
2348
    struct target_ucontext *ucp;
2349
    target_mc_gregset_t *grp;
2350
    target_mcontext_t *mcp;
2351
    abi_ulong fp, i7, w_addr;
2352
    int err;
2353
    unsigned int i;
2354
    target_sigset_t target_set;
2355
    sigset_t set;
2356

    
2357
    ucp_addr = env->regwptr[UREG_I0];
2358
    if (!lock_user_struct(VERIFY_WRITE, ucp, ucp_addr, 0))
2359
        goto do_sigsegv;
2360
    
2361
    mcp = &ucp->tuc_mcontext;
2362
    grp = &mcp->mc_gregs;
2363

    
2364
    /* Skip over the trap instruction, first. */
2365
    env->pc = env->npc;
2366
    env->npc += 4;
2367

    
2368
    err = 0;
2369

    
2370
    sigprocmask(0, NULL, &set);
2371
    host_to_target_sigset_internal(&target_set, &set);
2372
    if (TARGET_NSIG_WORDS == 1) {
2373
        err |= __put_user(target_set.sig[0],
2374
                          (abi_ulong *)&ucp->tuc_sigmask);
2375
    } else {
2376
        abi_ulong *src, *dst;
2377
        src = target_set.sig;
2378
        dst = ucp->tuc_sigmask.sig;
2379
        for (i = 0; i < sizeof(target_sigset_t) / sizeof(abi_ulong);
2380
             i++, dst++, src++)
2381
            err |= __put_user(*src, dst);
2382
        if (err)
2383
            goto do_sigsegv;
2384
    }
2385

    
2386
    /* XXX: tstate must be saved properly */
2387
    //    err |= __put_user(env->tstate, &((*grp)[MC_TSTATE]));
2388
    err |= __put_user(env->pc, &((*grp)[MC_PC]));
2389
    err |= __put_user(env->npc, &((*grp)[MC_NPC]));
2390
    err |= __put_user(env->y, &((*grp)[MC_Y]));
2391
    err |= __put_user(env->gregs[1], &((*grp)[MC_G1]));
2392
    err |= __put_user(env->gregs[2], &((*grp)[MC_G2]));
2393
    err |= __put_user(env->gregs[3], &((*grp)[MC_G3]));
2394
    err |= __put_user(env->gregs[4], &((*grp)[MC_G4]));
2395
    err |= __put_user(env->gregs[5], &((*grp)[MC_G5]));
2396
    err |= __put_user(env->gregs[6], &((*grp)[MC_G6]));
2397
    err |= __put_user(env->gregs[7], &((*grp)[MC_G7]));
2398
    err |= __put_user(env->regwptr[UREG_I0], &((*grp)[MC_O0]));
2399
    err |= __put_user(env->regwptr[UREG_I1], &((*grp)[MC_O1]));
2400
    err |= __put_user(env->regwptr[UREG_I2], &((*grp)[MC_O2]));
2401
    err |= __put_user(env->regwptr[UREG_I3], &((*grp)[MC_O3]));
2402
    err |= __put_user(env->regwptr[UREG_I4], &((*grp)[MC_O4]));
2403
    err |= __put_user(env->regwptr[UREG_I5], &((*grp)[MC_O5]));
2404
    err |= __put_user(env->regwptr[UREG_I6], &((*grp)[MC_O6]));
2405
    err |= __put_user(env->regwptr[UREG_I7], &((*grp)[MC_O7]));
2406

    
2407
    w_addr = TARGET_STACK_BIAS+env->regwptr[UREG_I6];
2408
    fp = i7 = 0;
2409
    if (get_user(fp, w_addr + offsetof(struct target_reg_window, ins[6]), 
2410
                 abi_ulong) != 0)
2411
        goto do_sigsegv;
2412
    if (get_user(i7, w_addr + offsetof(struct target_reg_window, ins[7]), 
2413
                 abi_ulong) != 0)
2414
        goto do_sigsegv;
2415
    err |= __put_user(fp, &(mcp->mc_fp));
2416
    err |= __put_user(i7, &(mcp->mc_i7));
2417

    
2418
    {
2419
        uint32_t *dst = ucp->tuc_mcontext.mc_fpregs.mcfpu_fregs.sregs;
2420
        for (i = 0; i < 64; i++, dst++) {
2421
            if (i & 1) {
2422
                err |= __put_user(env->fpr[i/2].l.lower, dst);
2423
            } else {
2424
                err |= __put_user(env->fpr[i/2].l.upper, dst);
2425
            }
2426
        }
2427
    }
2428
    err |= __put_user(env->fsr, &(mcp->mc_fpregs.mcfpu_fsr));
2429
    err |= __put_user(env->gsr, &(mcp->mc_fpregs.mcfpu_gsr));
2430
    err |= __put_user(env->fprs, &(mcp->mc_fpregs.mcfpu_fprs));
2431

    
2432
    if (err)
2433
        goto do_sigsegv;
2434
    unlock_user_struct(ucp, ucp_addr, 1);
2435
    return;
2436
 do_sigsegv:
2437
    unlock_user_struct(ucp, ucp_addr, 1);
2438
    force_sig(TARGET_SIGSEGV);
2439
}
2440
#endif
2441
#elif defined(TARGET_MIPS) || defined(TARGET_MIPS64)
2442

    
2443
# if defined(TARGET_ABI_MIPSO32)
2444
struct target_sigcontext {
2445
    uint32_t   sc_regmask;     /* Unused */
2446
    uint32_t   sc_status;
2447
    uint64_t   sc_pc;
2448
    uint64_t   sc_regs[32];
2449
    uint64_t   sc_fpregs[32];
2450
    uint32_t   sc_ownedfp;     /* Unused */
2451
    uint32_t   sc_fpc_csr;
2452
    uint32_t   sc_fpc_eir;     /* Unused */
2453
    uint32_t   sc_used_math;
2454
    uint32_t   sc_dsp;         /* dsp status, was sc_ssflags */
2455
    uint32_t   pad0;
2456
    uint64_t   sc_mdhi;
2457
    uint64_t   sc_mdlo;
2458
    target_ulong   sc_hi1;         /* Was sc_cause */
2459
    target_ulong   sc_lo1;         /* Was sc_badvaddr */
2460
    target_ulong   sc_hi2;         /* Was sc_sigset[4] */
2461
    target_ulong   sc_lo2;
2462
    target_ulong   sc_hi3;
2463
    target_ulong   sc_lo3;
2464
};
2465
# else /* N32 || N64 */
2466
struct target_sigcontext {
2467
    uint64_t sc_regs[32];
2468
    uint64_t sc_fpregs[32];
2469
    uint64_t sc_mdhi;
2470
    uint64_t sc_hi1;
2471
    uint64_t sc_hi2;
2472
    uint64_t sc_hi3;
2473
    uint64_t sc_mdlo;
2474
    uint64_t sc_lo1;
2475
    uint64_t sc_lo2;
2476
    uint64_t sc_lo3;
2477
    uint64_t sc_pc;
2478
    uint32_t sc_fpc_csr;
2479
    uint32_t sc_used_math;
2480
    uint32_t sc_dsp;
2481
    uint32_t sc_reserved;
2482
};
2483
# endif /* O32 */
2484

    
2485
struct sigframe {
2486
    uint32_t sf_ass[4];                        /* argument save space for o32 */
2487
    uint32_t sf_code[2];                        /* signal trampoline */
2488
    struct target_sigcontext sf_sc;
2489
    target_sigset_t sf_mask;
2490
};
2491

    
2492
struct target_ucontext {
2493
    target_ulong tuc_flags;
2494
    target_ulong tuc_link;
2495
    target_stack_t tuc_stack;
2496
    target_ulong pad0;
2497
    struct target_sigcontext tuc_mcontext;
2498
    target_sigset_t tuc_sigmask;
2499
};
2500

    
2501
struct target_rt_sigframe {
2502
    uint32_t rs_ass[4];               /* argument save space for o32 */
2503
    uint32_t rs_code[2];              /* signal trampoline */
2504
    struct target_siginfo rs_info;
2505
    struct target_ucontext rs_uc;
2506
};
2507

    
2508
/* Install trampoline to jump back from signal handler */
2509
static inline int install_sigtramp(unsigned int *tramp,   unsigned int syscall)
2510
{
2511
    int err;
2512

    
2513
    /*
2514
    * Set up the return code ...
2515
    *
2516
    *         li      v0, __NR__foo_sigreturn
2517
    *         syscall
2518
    */
2519

    
2520
    err = __put_user(0x24020000 + syscall, tramp + 0);
2521
    err |= __put_user(0x0000000c          , tramp + 1);
2522
    /* flush_cache_sigtramp((unsigned long) tramp); */
2523
    return err;
2524
}
2525

    
2526
static inline int
2527
setup_sigcontext(CPUMIPSState *regs, struct target_sigcontext *sc)
2528
{
2529
    int err = 0;
2530

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

    
2533
#define save_gp_reg(i) do {                                                   \
2534
        err |= __put_user(regs->active_tc.gpr[i], &sc->sc_regs[i]);        \
2535
    } while(0)
2536
    __put_user(0, &sc->sc_regs[0]); save_gp_reg(1); save_gp_reg(2);
2537
    save_gp_reg(3); save_gp_reg(4); save_gp_reg(5); save_gp_reg(6);
2538
    save_gp_reg(7); save_gp_reg(8); save_gp_reg(9); save_gp_reg(10);
2539
    save_gp_reg(11); save_gp_reg(12); save_gp_reg(13); save_gp_reg(14);
2540
    save_gp_reg(15); save_gp_reg(16); save_gp_reg(17); save_gp_reg(18);
2541
    save_gp_reg(19); save_gp_reg(20); save_gp_reg(21); save_gp_reg(22);
2542
    save_gp_reg(23); save_gp_reg(24); save_gp_reg(25); save_gp_reg(26);
2543
    save_gp_reg(27); save_gp_reg(28); save_gp_reg(29); save_gp_reg(30);
2544
    save_gp_reg(31);
2545
#undef save_gp_reg
2546

    
2547
    err |= __put_user(regs->active_tc.HI[0], &sc->sc_mdhi);
2548
    err |= __put_user(regs->active_tc.LO[0], &sc->sc_mdlo);
2549

    
2550
    /* Not used yet, but might be useful if we ever have DSP suppport */
2551
#if 0
2552
    if (cpu_has_dsp) {
2553
        err |= __put_user(mfhi1(), &sc->sc_hi1);
2554
        err |= __put_user(mflo1(), &sc->sc_lo1);
2555
        err |= __put_user(mfhi2(), &sc->sc_hi2);
2556
        err |= __put_user(mflo2(), &sc->sc_lo2);
2557
        err |= __put_user(mfhi3(), &sc->sc_hi3);
2558
        err |= __put_user(mflo3(), &sc->sc_lo3);
2559
        err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp);
2560
    }
2561
    /* same with 64 bit */
2562
#ifdef CONFIG_64BIT
2563
    err |= __put_user(regs->hi, &sc->sc_hi[0]);
2564
    err |= __put_user(regs->lo, &sc->sc_lo[0]);
2565
    if (cpu_has_dsp) {
2566
        err |= __put_user(mfhi1(), &sc->sc_hi[1]);
2567
        err |= __put_user(mflo1(), &sc->sc_lo[1]);
2568
        err |= __put_user(mfhi2(), &sc->sc_hi[2]);
2569
        err |= __put_user(mflo2(), &sc->sc_lo[2]);
2570
        err |= __put_user(mfhi3(), &sc->sc_hi[3]);
2571
        err |= __put_user(mflo3(), &sc->sc_lo[3]);
2572
        err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp);
2573
    }
2574
#endif
2575
#endif
2576

    
2577
#if 0
2578
    err |= __put_user(!!used_math(), &sc->sc_used_math);
2579

2580
    if (!used_math())
2581
        goto out;
2582

2583
    /*
2584
    * Save FPU state to signal context.  Signal handler will "inherit"
2585
    * current FPU state.
2586
    */
2587
    preempt_disable();
2588

2589
    if (!is_fpu_owner()) {
2590
        own_fpu();
2591
        restore_fp(current);
2592
    }
2593
    err |= save_fp_context(sc);
2594

2595
    preempt_enable();
2596
    out:
2597
#endif
2598
    return err;
2599
}
2600

    
2601
static inline int
2602
restore_sigcontext(CPUMIPSState *regs, struct target_sigcontext *sc)
2603
{
2604
    int err = 0;
2605

    
2606
    err |= __get_user(regs->CP0_EPC, &sc->sc_pc);
2607

    
2608
    err |= __get_user(regs->active_tc.HI[0], &sc->sc_mdhi);
2609
    err |= __get_user(regs->active_tc.LO[0], &sc->sc_mdlo);
2610

    
2611
#define restore_gp_reg(i) do {                                                           \
2612
        err |= __get_user(regs->active_tc.gpr[i], &sc->sc_regs[i]);                \
2613
    } while(0)
2614
    restore_gp_reg( 1); restore_gp_reg( 2); restore_gp_reg( 3);
2615
    restore_gp_reg( 4); restore_gp_reg( 5); restore_gp_reg( 6);
2616
    restore_gp_reg( 7); restore_gp_reg( 8); restore_gp_reg( 9);
2617
    restore_gp_reg(10); restore_gp_reg(11); restore_gp_reg(12);
2618
    restore_gp_reg(13); restore_gp_reg(14); restore_gp_reg(15);
2619
    restore_gp_reg(16); restore_gp_reg(17); restore_gp_reg(18);
2620
    restore_gp_reg(19); restore_gp_reg(20); restore_gp_reg(21);
2621
    restore_gp_reg(22); restore_gp_reg(23); restore_gp_reg(24);
2622
    restore_gp_reg(25); restore_gp_reg(26); restore_gp_reg(27);
2623
    restore_gp_reg(28); restore_gp_reg(29); restore_gp_reg(30);
2624
    restore_gp_reg(31);
2625
#undef restore_gp_reg
2626

    
2627
#if 0
2628
    if (cpu_has_dsp) {
2629
        err |= __get_user(treg, &sc->sc_hi1); mthi1(treg);
2630
        err |= __get_user(treg, &sc->sc_lo1); mtlo1(treg);
2631
        err |= __get_user(treg, &sc->sc_hi2); mthi2(treg);
2632
        err |= __get_user(treg, &sc->sc_lo2); mtlo2(treg);
2633
        err |= __get_user(treg, &sc->sc_hi3); mthi3(treg);
2634
        err |= __get_user(treg, &sc->sc_lo3); mtlo3(treg);
2635
        err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK);
2636
    }
2637
#ifdef CONFIG_64BIT
2638
    err |= __get_user(regs->hi, &sc->sc_hi[0]);
2639
    err |= __get_user(regs->lo, &sc->sc_lo[0]);
2640
    if (cpu_has_dsp) {
2641
        err |= __get_user(treg, &sc->sc_hi[1]); mthi1(treg);
2642
        err |= __get_user(treg, &sc->sc_lo[1]); mthi1(treg);
2643
        err |= __get_user(treg, &sc->sc_hi[2]); mthi2(treg);
2644
        err |= __get_user(treg, &sc->sc_lo[2]); mthi2(treg);
2645
        err |= __get_user(treg, &sc->sc_hi[3]); mthi3(treg);
2646
        err |= __get_user(treg, &sc->sc_lo[3]); mthi3(treg);
2647
        err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK);
2648
    }
2649
#endif
2650

    
2651
    err |= __get_user(used_math, &sc->sc_used_math);
2652
    conditional_used_math(used_math);
2653

    
2654
    preempt_disable();
2655

    
2656
    if (used_math()) {
2657
        /* restore fpu context if we have used it before */
2658
        own_fpu();
2659
        err |= restore_fp_context(sc);
2660
    } else {
2661
        /* signal handler may have used FPU.  Give it up. */
2662
        lose_fpu();
2663
    }
2664

    
2665
    preempt_enable();
2666
#endif
2667
    return err;
2668
}
2669

    
2670
/*
2671
 * Determine which stack to use..
2672
 */
2673
static inline abi_ulong
2674
get_sigframe(struct target_sigaction *ka, CPUMIPSState *regs, size_t frame_size)
2675
{
2676
    unsigned long sp;
2677

    
2678
    /* Default to using normal stack */
2679
    sp = regs->active_tc.gpr[29];
2680

    
2681
    /*
2682
     * FPU emulator may have its own trampoline active just
2683
     * above the user stack, 16-bytes before the next lowest
2684
     * 16 byte boundary.  Try to avoid trashing it.
2685
     */
2686
    sp -= 32;
2687

    
2688
    /* This is the X/Open sanctioned signal stack switching.  */
2689
    if ((ka->sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags (sp) == 0)) {
2690
        sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
2691
    }
2692

    
2693
    return (sp - frame_size) & ~7;
2694
}
2695

    
2696
# if defined(TARGET_ABI_MIPSO32)
2697
/* compare linux/arch/mips/kernel/signal.c:setup_frame() */
2698
static void setup_frame(int sig, struct target_sigaction * ka,
2699
                        target_sigset_t *set, CPUMIPSState *regs)
2700
{
2701
    struct sigframe *frame;
2702
    abi_ulong frame_addr;
2703
    int i;
2704

    
2705
    frame_addr = get_sigframe(ka, regs, sizeof(*frame));
2706
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
2707
        goto give_sigsegv;
2708

    
2709
    install_sigtramp(frame->sf_code, TARGET_NR_sigreturn);
2710

    
2711
    if(setup_sigcontext(regs, &frame->sf_sc))
2712
        goto give_sigsegv;
2713

    
2714
    for(i = 0; i < TARGET_NSIG_WORDS; i++) {
2715
        if(__put_user(set->sig[i], &frame->sf_mask.sig[i]))
2716
            goto give_sigsegv;
2717
    }
2718

    
2719
    /*
2720
    * Arguments to signal handler:
2721
    *
2722
    *   a0 = signal number
2723
    *   a1 = 0 (should be cause)
2724
    *   a2 = pointer to struct sigcontext
2725
    *
2726
    * $25 and PC point to the signal handler, $29 points to the
2727
    * struct sigframe.
2728
    */
2729
    regs->active_tc.gpr[ 4] = sig;
2730
    regs->active_tc.gpr[ 5] = 0;
2731
    regs->active_tc.gpr[ 6] = frame_addr + offsetof(struct sigframe, sf_sc);
2732
    regs->active_tc.gpr[29] = frame_addr;
2733
    regs->active_tc.gpr[31] = frame_addr + offsetof(struct sigframe, sf_code);
2734
    /* The original kernel code sets CP0_EPC to the handler
2735
    * since it returns to userland using eret
2736
    * we cannot do this here, and we must set PC directly */
2737
    regs->active_tc.PC = regs->active_tc.gpr[25] = ka->_sa_handler;
2738
    unlock_user_struct(frame, frame_addr, 1);
2739
    return;
2740

    
2741
give_sigsegv:
2742
    unlock_user_struct(frame, frame_addr, 1);
2743
    force_sig(TARGET_SIGSEGV/*, current*/);
2744
}
2745

    
2746
long do_sigreturn(CPUMIPSState *regs)
2747
{
2748
    struct sigframe *frame;
2749
    abi_ulong frame_addr;
2750
    sigset_t blocked;
2751
    target_sigset_t target_set;
2752
    int i;
2753

    
2754
#if defined(DEBUG_SIGNAL)
2755
    fprintf(stderr, "do_sigreturn\n");
2756
#endif
2757
    frame_addr = regs->active_tc.gpr[29];
2758
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
2759
           goto badframe;
2760

    
2761
    for(i = 0; i < TARGET_NSIG_WORDS; i++) {
2762
           if(__get_user(target_set.sig[i], &frame->sf_mask.sig[i]))
2763
            goto badframe;
2764
    }
2765

    
2766
    target_to_host_sigset_internal(&blocked, &target_set);
2767
    sigprocmask(SIG_SETMASK, &blocked, NULL);
2768

    
2769
    if (restore_sigcontext(regs, &frame->sf_sc))
2770
           goto badframe;
2771

    
2772
#if 0
2773
    /*
2774
     * Don't let your children do this ...
2775
     */
2776
    __asm__ __volatile__(
2777
           "move\t$29, %0\n\t"
2778
           "j\tsyscall_exit"
2779
           :/* no outputs */
2780
           :"r" (&regs));
2781
    /* Unreached */
2782
#endif
2783

    
2784
    regs->active_tc.PC = regs->CP0_EPC;
2785
    /* I am not sure this is right, but it seems to work
2786
    * maybe a problem with nested signals ? */
2787
    regs->CP0_EPC = 0;
2788
    return -TARGET_QEMU_ESIGRETURN;
2789

    
2790
badframe:
2791
    force_sig(TARGET_SIGSEGV/*, current*/);
2792
    return 0;
2793
}
2794
# endif /* O32 */
2795

    
2796
static void setup_rt_frame(int sig, struct target_sigaction *ka,
2797
                           target_siginfo_t *info,
2798
                           target_sigset_t *set, CPUMIPSState *env)
2799
{
2800
    struct target_rt_sigframe *frame;
2801
    abi_ulong frame_addr;
2802
    int i;
2803

    
2804
    frame_addr = get_sigframe(ka, env, sizeof(*frame));
2805
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
2806
        goto give_sigsegv;
2807

    
2808
    install_sigtramp(frame->rs_code, TARGET_NR_rt_sigreturn);
2809

    
2810
    copy_siginfo_to_user(&frame->rs_info, info);
2811

    
2812
    __put_user(0, &frame->rs_uc.tuc_flags);
2813
    __put_user(0, &frame->rs_uc.tuc_link);
2814
    __put_user(target_sigaltstack_used.ss_sp, &frame->rs_uc.tuc_stack.ss_sp);
2815
    __put_user(target_sigaltstack_used.ss_size, &frame->rs_uc.tuc_stack.ss_size);
2816
    __put_user(sas_ss_flags(get_sp_from_cpustate(env)),
2817
               &frame->rs_uc.tuc_stack.ss_flags);
2818

    
2819
    setup_sigcontext(env, &frame->rs_uc.tuc_mcontext);
2820

    
2821
    for(i = 0; i < TARGET_NSIG_WORDS; i++) {
2822
        __put_user(set->sig[i], &frame->rs_uc.tuc_sigmask.sig[i]);
2823
    }
2824

    
2825
    /*
2826
    * Arguments to signal handler:
2827
    *
2828
    *   a0 = signal number
2829
    *   a1 = pointer to siginfo_t
2830
    *   a2 = pointer to struct ucontext
2831
    *
2832
    * $25 and PC point to the signal handler, $29 points to the
2833
    * struct sigframe.
2834
    */
2835
    env->active_tc.gpr[ 4] = sig;
2836
    env->active_tc.gpr[ 5] = frame_addr
2837
                             + offsetof(struct target_rt_sigframe, rs_info);
2838
    env->active_tc.gpr[ 6] = frame_addr
2839
                             + offsetof(struct target_rt_sigframe, rs_uc);
2840
    env->active_tc.gpr[29] = frame_addr;
2841
    env->active_tc.gpr[31] = frame_addr
2842
                             + offsetof(struct target_rt_sigframe, rs_code);
2843
    /* The original kernel code sets CP0_EPC to the handler
2844
    * since it returns to userland using eret
2845
    * we cannot do this here, and we must set PC directly */
2846
    env->active_tc.PC = env->active_tc.gpr[25] = ka->_sa_handler;
2847
    unlock_user_struct(frame, frame_addr, 1);
2848
    return;
2849

    
2850
give_sigsegv:
2851
    unlock_user_struct(frame, frame_addr, 1);
2852
    force_sig(TARGET_SIGSEGV/*, current*/);
2853
}
2854

    
2855
long do_rt_sigreturn(CPUMIPSState *env)
2856
{
2857
    struct target_rt_sigframe *frame;
2858
    abi_ulong frame_addr;
2859
    sigset_t blocked;
2860

    
2861
#if defined(DEBUG_SIGNAL)
2862
    fprintf(stderr, "do_rt_sigreturn\n");
2863
#endif
2864
    frame_addr = env->active_tc.gpr[29];
2865
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
2866
           goto badframe;
2867

    
2868
    target_to_host_sigset(&blocked, &frame->rs_uc.tuc_sigmask);
2869
    sigprocmask(SIG_SETMASK, &blocked, NULL);
2870

    
2871
    if (restore_sigcontext(env, &frame->rs_uc.tuc_mcontext))
2872
        goto badframe;
2873

    
2874
    if (do_sigaltstack(frame_addr +
2875
                       offsetof(struct target_rt_sigframe, rs_uc.tuc_stack),
2876
                       0, get_sp_from_cpustate(env)) == -EFAULT)
2877
        goto badframe;
2878

    
2879
    env->active_tc.PC = env->CP0_EPC;
2880
    /* I am not sure this is right, but it seems to work
2881
    * maybe a problem with nested signals ? */
2882
    env->CP0_EPC = 0;
2883
    return -TARGET_QEMU_ESIGRETURN;
2884

    
2885
badframe:
2886
    force_sig(TARGET_SIGSEGV/*, current*/);
2887
    return 0;
2888
}
2889

    
2890
#elif defined(TARGET_SH4)
2891

    
2892
/*
2893
 * code and data structures from linux kernel:
2894
 * include/asm-sh/sigcontext.h
2895
 * arch/sh/kernel/signal.c
2896
 */
2897

    
2898
struct target_sigcontext {
2899
    target_ulong  oldmask;
2900

    
2901
    /* CPU registers */
2902
    target_ulong  sc_gregs[16];
2903
    target_ulong  sc_pc;
2904
    target_ulong  sc_pr;
2905
    target_ulong  sc_sr;
2906
    target_ulong  sc_gbr;
2907
    target_ulong  sc_mach;
2908
    target_ulong  sc_macl;
2909

    
2910
    /* FPU registers */
2911
    target_ulong  sc_fpregs[16];
2912
    target_ulong  sc_xfpregs[16];
2913
    unsigned int sc_fpscr;
2914
    unsigned int sc_fpul;
2915
    unsigned int sc_ownedfp;
2916
};
2917

    
2918
struct target_sigframe
2919
{
2920
    struct target_sigcontext sc;
2921
    target_ulong extramask[TARGET_NSIG_WORDS-1];
2922
    uint16_t retcode[3];
2923
};
2924

    
2925

    
2926
struct target_ucontext {
2927
    target_ulong tuc_flags;
2928
    struct target_ucontext *tuc_link;
2929
    target_stack_t tuc_stack;
2930
    struct target_sigcontext tuc_mcontext;
2931
    target_sigset_t tuc_sigmask;        /* mask last for extensibility */
2932
};
2933

    
2934
struct target_rt_sigframe
2935
{
2936
    struct target_siginfo info;
2937
    struct target_ucontext uc;
2938
    uint16_t retcode[3];
2939
};
2940

    
2941

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

    
2945
static abi_ulong get_sigframe(struct target_sigaction *ka,
2946
                         unsigned long sp, size_t frame_size)
2947
{
2948
    if ((ka->sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags(sp) == 0)) {
2949
        sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
2950
    }
2951

    
2952
    return (sp - frame_size) & -8ul;
2953
}
2954

    
2955
static int setup_sigcontext(struct target_sigcontext *sc,
2956
                            CPUSH4State *regs, unsigned long mask)
2957
{
2958
    int err = 0;
2959
    int i;
2960

    
2961
#define COPY(x)         err |= __put_user(regs->x, &sc->sc_##x)
2962
    COPY(gregs[0]); COPY(gregs[1]);
2963
    COPY(gregs[2]); COPY(gregs[3]);
2964
    COPY(gregs[4]); COPY(gregs[5]);
2965
    COPY(gregs[6]); COPY(gregs[7]);
2966
    COPY(gregs[8]); COPY(gregs[9]);
2967
    COPY(gregs[10]); COPY(gregs[11]);
2968
    COPY(gregs[12]); COPY(gregs[13]);
2969
    COPY(gregs[14]); COPY(gregs[15]);
2970
    COPY(gbr); COPY(mach);
2971
    COPY(macl); COPY(pr);
2972
    COPY(sr); COPY(pc);
2973
#undef COPY
2974

    
2975
    for (i=0; i<16; i++) {
2976
        err |= __put_user(regs->fregs[i], &sc->sc_fpregs[i]);
2977
    }
2978
    err |= __put_user(regs->fpscr, &sc->sc_fpscr);
2979
    err |= __put_user(regs->fpul, &sc->sc_fpul);
2980

    
2981
    /* non-iBCS2 extensions.. */
2982
    err |= __put_user(mask, &sc->oldmask);
2983

    
2984
    return err;
2985
}
2986

    
2987
static int restore_sigcontext(CPUSH4State *regs, struct target_sigcontext *sc,
2988
                              target_ulong *r0_p)
2989
{
2990
    unsigned int err = 0;
2991
    int i;
2992

    
2993
#define COPY(x)         err |= __get_user(regs->x, &sc->sc_##x)
2994
    COPY(gregs[1]);
2995
    COPY(gregs[2]); COPY(gregs[3]);
2996
    COPY(gregs[4]); COPY(gregs[5]);
2997
    COPY(gregs[6]); COPY(gregs[7]);
2998
    COPY(gregs[8]); COPY(gregs[9]);
2999
    COPY(gregs[10]); COPY(gregs[11]);
3000
    COPY(gregs[12]); COPY(gregs[13]);
3001
    COPY(gregs[14]); COPY(gregs[15]);
3002
    COPY(gbr); COPY(mach);
3003
    COPY(macl); COPY(pr);
3004
    COPY(sr); COPY(pc);
3005
#undef COPY
3006

    
3007
    for (i=0; i<16; i++) {
3008
        err |= __get_user(regs->fregs[i], &sc->sc_fpregs[i]);
3009
    }
3010
    err |= __get_user(regs->fpscr, &sc->sc_fpscr);
3011
    err |= __get_user(regs->fpul, &sc->sc_fpul);
3012

    
3013
    regs->tra = -1;         /* disable syscall checks */
3014
    err |= __get_user(*r0_p, &sc->sc_gregs[0]);
3015
    return err;
3016
}
3017

    
3018
static void setup_frame(int sig, struct target_sigaction *ka,
3019
                        target_sigset_t *set, CPUSH4State *regs)
3020
{
3021
    struct target_sigframe *frame;
3022
    abi_ulong frame_addr;
3023
    int i;
3024
    int err = 0;
3025
    int signal;
3026

    
3027
    frame_addr = get_sigframe(ka, regs->gregs[15], sizeof(*frame));
3028
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
3029
        goto give_sigsegv;
3030

    
3031
    signal = current_exec_domain_sig(sig);
3032

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

    
3035
    for (i = 0; i < TARGET_NSIG_WORDS - 1; i++) {
3036
        err |= __put_user(set->sig[i + 1], &frame->extramask[i]);
3037
    }
3038

    
3039
    /* Set up to return from userspace.  If provided, use a stub
3040
       already in userspace.  */
3041
    if (ka->sa_flags & TARGET_SA_RESTORER) {
3042
        regs->pr = (unsigned long) ka->sa_restorer;
3043
    } else {
3044
        /* Generate return code (system call to sigreturn) */
3045
        err |= __put_user(MOVW(2), &frame->retcode[0]);
3046
        err |= __put_user(TRAP_NOARG, &frame->retcode[1]);
3047
        err |= __put_user((TARGET_NR_sigreturn), &frame->retcode[2]);
3048
        regs->pr = (unsigned long) frame->retcode;
3049
    }
3050

    
3051
    if (err)
3052
        goto give_sigsegv;
3053

    
3054
    /* Set up registers for signal handler */
3055
    regs->gregs[15] = frame_addr;
3056
    regs->gregs[4] = signal; /* Arg for signal handler */
3057
    regs->gregs[5] = 0;
3058
    regs->gregs[6] = frame_addr += offsetof(typeof(*frame), sc);
3059
    regs->pc = (unsigned long) ka->_sa_handler;
3060

    
3061
    unlock_user_struct(frame, frame_addr, 1);
3062
    return;
3063

    
3064
give_sigsegv:
3065
    unlock_user_struct(frame, frame_addr, 1);
3066
    force_sig(TARGET_SIGSEGV);
3067
}
3068

    
3069
static void setup_rt_frame(int sig, struct target_sigaction *ka,
3070
                           target_siginfo_t *info,
3071
                           target_sigset_t *set, CPUSH4State *regs)
3072
{
3073
    struct target_rt_sigframe *frame;
3074
    abi_ulong frame_addr;
3075
    int i;
3076
    int err = 0;
3077
    int signal;
3078

    
3079
    frame_addr = get_sigframe(ka, regs->gregs[15], sizeof(*frame));
3080
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
3081
        goto give_sigsegv;
3082

    
3083
    signal = current_exec_domain_sig(sig);
3084

    
3085
    err |= copy_siginfo_to_user(&frame->info, info);
3086

    
3087
    /* Create the ucontext.  */
3088
    err |= __put_user(0, &frame->uc.tuc_flags);
3089
    err |= __put_user(0, (unsigned long *)&frame->uc.tuc_link);
3090
    err |= __put_user((unsigned long)target_sigaltstack_used.ss_sp,
3091
                      &frame->uc.tuc_stack.ss_sp);
3092
    err |= __put_user(sas_ss_flags(regs->gregs[15]),
3093
                      &frame->uc.tuc_stack.ss_flags);
3094
    err |= __put_user(target_sigaltstack_used.ss_size,
3095
                      &frame->uc.tuc_stack.ss_size);
3096
    err |= setup_sigcontext(&frame->uc.tuc_mcontext,
3097
                            regs, set->sig[0]);
3098
    for(i = 0; i < TARGET_NSIG_WORDS; i++) {
3099
        err |= __put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]);
3100
    }
3101

    
3102
    /* Set up to return from userspace.  If provided, use a stub
3103
       already in userspace.  */
3104
    if (ka->sa_flags & TARGET_SA_RESTORER) {
3105
        regs->pr = (unsigned long) ka->sa_restorer;
3106
    } else {
3107
        /* Generate return code (system call to sigreturn) */
3108
        err |= __put_user(MOVW(2), &frame->retcode[0]);
3109
        err |= __put_user(TRAP_NOARG, &frame->retcode[1]);
3110
        err |= __put_user((TARGET_NR_rt_sigreturn), &frame->retcode[2]);
3111
        regs->pr = (unsigned long) frame->retcode;
3112
    }
3113

    
3114
    if (err)
3115
        goto give_sigsegv;
3116

    
3117
    /* Set up registers for signal handler */
3118
    regs->gregs[15] = frame_addr;
3119
    regs->gregs[4] = signal; /* Arg for signal handler */
3120
    regs->gregs[5] = frame_addr + offsetof(typeof(*frame), info);
3121
    regs->gregs[6] = frame_addr + offsetof(typeof(*frame), uc);
3122
    regs->pc = (unsigned long) ka->_sa_handler;
3123

    
3124
    unlock_user_struct(frame, frame_addr, 1);
3125
    return;
3126

    
3127
give_sigsegv:
3128
    unlock_user_struct(frame, frame_addr, 1);
3129
    force_sig(TARGET_SIGSEGV);
3130
}
3131

    
3132
long do_sigreturn(CPUSH4State *regs)
3133
{
3134
    struct target_sigframe *frame;
3135
    abi_ulong frame_addr;
3136
    sigset_t blocked;
3137
    target_sigset_t target_set;
3138
    target_ulong r0;
3139
    int i;
3140
    int err = 0;
3141

    
3142
#if defined(DEBUG_SIGNAL)
3143
    fprintf(stderr, "do_sigreturn\n");
3144
#endif
3145
    frame_addr = regs->gregs[15];
3146
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
3147
           goto badframe;
3148

    
3149
    err |= __get_user(target_set.sig[0], &frame->sc.oldmask);
3150
    for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3151
        err |= (__get_user(target_set.sig[i], &frame->extramask[i - 1]));
3152
    }
3153

    
3154
    if (err)
3155
        goto badframe;
3156

    
3157
    target_to_host_sigset_internal(&blocked, &target_set);
3158
    sigprocmask(SIG_SETMASK, &blocked, NULL);
3159

    
3160
    if (restore_sigcontext(regs, &frame->sc, &r0))
3161
        goto badframe;
3162

    
3163
    unlock_user_struct(frame, frame_addr, 0);
3164
    return r0;
3165

    
3166
badframe:
3167
    unlock_user_struct(frame, frame_addr, 0);
3168
    force_sig(TARGET_SIGSEGV);
3169
    return 0;
3170
}
3171

    
3172
long do_rt_sigreturn(CPUSH4State *regs)
3173
{
3174
    struct target_rt_sigframe *frame;
3175
    abi_ulong frame_addr;
3176
    sigset_t blocked;
3177
    target_ulong r0;
3178

    
3179
#if defined(DEBUG_SIGNAL)
3180
    fprintf(stderr, "do_rt_sigreturn\n");
3181
#endif
3182
    frame_addr = regs->gregs[15];
3183
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
3184
           goto badframe;
3185

    
3186
    target_to_host_sigset(&blocked, &frame->uc.tuc_sigmask);
3187
    sigprocmask(SIG_SETMASK, &blocked, NULL);
3188

    
3189
    if (restore_sigcontext(regs, &frame->uc.tuc_mcontext, &r0))
3190
        goto badframe;
3191

    
3192
    if (do_sigaltstack(frame_addr +
3193
                       offsetof(struct target_rt_sigframe, uc.tuc_stack),
3194
                       0, get_sp_from_cpustate(regs)) == -EFAULT)
3195
        goto badframe;
3196

    
3197
    unlock_user_struct(frame, frame_addr, 0);
3198
    return r0;
3199

    
3200
badframe:
3201
    unlock_user_struct(frame, frame_addr, 0);
3202
    force_sig(TARGET_SIGSEGV);
3203
    return 0;
3204
}
3205
#elif defined(TARGET_MICROBLAZE)
3206

    
3207
struct target_sigcontext {
3208
    struct target_pt_regs regs;  /* needs to be first */
3209
    uint32_t oldmask;
3210
};
3211

    
3212
struct target_stack_t {
3213
    abi_ulong ss_sp;
3214
    int ss_flags;
3215
    unsigned int ss_size;
3216
};
3217

    
3218
struct target_ucontext {
3219
    abi_ulong tuc_flags;
3220
    abi_ulong tuc_link;
3221
    struct target_stack_t tuc_stack;
3222
    struct target_sigcontext tuc_mcontext;
3223
    uint32_t tuc_extramask[TARGET_NSIG_WORDS - 1];
3224
};
3225

    
3226
/* Signal frames. */
3227
struct target_signal_frame {
3228
    struct target_ucontext uc;
3229
    uint32_t extramask[TARGET_NSIG_WORDS - 1];
3230
    uint32_t tramp[2];
3231
};
3232

    
3233
struct rt_signal_frame {
3234
    siginfo_t info;
3235
    struct ucontext uc;
3236
    uint32_t tramp[2];
3237
};
3238

    
3239
static void setup_sigcontext(struct target_sigcontext *sc, CPUMBState *env)
3240
{
3241
    __put_user(env->regs[0], &sc->regs.r0);
3242
    __put_user(env->regs[1], &sc->regs.r1);
3243
    __put_user(env->regs[2], &sc->regs.r2);
3244
    __put_user(env->regs[3], &sc->regs.r3);
3245
    __put_user(env->regs[4], &sc->regs.r4);
3246
    __put_user(env->regs[5], &sc->regs.r5);
3247
    __put_user(env->regs[6], &sc->regs.r6);
3248
    __put_user(env->regs[7], &sc->regs.r7);
3249
    __put_user(env->regs[8], &sc->regs.r8);
3250
    __put_user(env->regs[9], &sc->regs.r9);
3251
    __put_user(env->regs[10], &sc->regs.r10);
3252
    __put_user(env->regs[11], &sc->regs.r11);
3253
    __put_user(env->regs[12], &sc->regs.r12);
3254
    __put_user(env->regs[13], &sc->regs.r13);
3255
    __put_user(env->regs[14], &sc->regs.r14);
3256
    __put_user(env->regs[15], &sc->regs.r15);
3257
    __put_user(env->regs[16], &sc->regs.r16);
3258
    __put_user(env->regs[17], &sc->regs.r17);
3259
    __put_user(env->regs[18], &sc->regs.r18);
3260
    __put_user(env->regs[19], &sc->regs.r19);
3261
    __put_user(env->regs[20], &sc->regs.r20);
3262
    __put_user(env->regs[21], &sc->regs.r21);
3263
    __put_user(env->regs[22], &sc->regs.r22);
3264
    __put_user(env->regs[23], &sc->regs.r23);
3265
    __put_user(env->regs[24], &sc->regs.r24);
3266
    __put_user(env->regs[25], &sc->regs.r25);
3267
    __put_user(env->regs[26], &sc->regs.r26);
3268
    __put_user(env->regs[27], &sc->regs.r27);
3269
    __put_user(env->regs[28], &sc->regs.r28);
3270
    __put_user(env->regs[29], &sc->regs.r29);
3271
    __put_user(env->regs[30], &sc->regs.r30);
3272
    __put_user(env->regs[31], &sc->regs.r31);
3273
    __put_user(env->sregs[SR_PC], &sc->regs.pc);
3274
}
3275

    
3276
static void restore_sigcontext(struct target_sigcontext *sc, CPUMBState *env)
3277
{
3278
    __get_user(env->regs[0], &sc->regs.r0);
3279
    __get_user(env->regs[1], &sc->regs.r1);
3280
    __get_user(env->regs[2], &sc->regs.r2);
3281
    __get_user(env->regs[3], &sc->regs.r3);
3282
    __get_user(env->regs[4], &sc->regs.r4);
3283
    __get_user(env->regs[5], &sc->regs.r5);
3284
    __get_user(env->regs[6], &sc->regs.r6);
3285
    __get_user(env->regs[7], &sc->regs.r7);
3286
    __get_user(env->regs[8], &sc->regs.r8);
3287
    __get_user(env->regs[9], &sc->regs.r9);
3288
    __get_user(env->regs[10], &sc->regs.r10);
3289
    __get_user(env->regs[11], &sc->regs.r11);
3290
    __get_user(env->regs[12], &sc->regs.r12);
3291
    __get_user(env->regs[13], &sc->regs.r13);
3292
    __get_user(env->regs[14], &sc->regs.r14);
3293
    __get_user(env->regs[15], &sc->regs.r15);
3294
    __get_user(env->regs[16], &sc->regs.r16);
3295
    __get_user(env->regs[17], &sc->regs.r17);
3296
    __get_user(env->regs[18], &sc->regs.r18);
3297
    __get_user(env->regs[19], &sc->regs.r19);
3298
    __get_user(env->regs[20], &sc->regs.r20);
3299
    __get_user(env->regs[21], &sc->regs.r21);
3300
    __get_user(env->regs[22], &sc->regs.r22);
3301
    __get_user(env->regs[23], &sc->regs.r23);
3302
    __get_user(env->regs[24], &sc->regs.r24);
3303
    __get_user(env->regs[25], &sc->regs.r25);
3304
    __get_user(env->regs[26], &sc->regs.r26);
3305
    __get_user(env->regs[27], &sc->regs.r27);
3306
    __get_user(env->regs[28], &sc->regs.r28);
3307
    __get_user(env->regs[29], &sc->regs.r29);
3308
    __get_user(env->regs[30], &sc->regs.r30);
3309
    __get_user(env->regs[31], &sc->regs.r31);
3310
    __get_user(env->sregs[SR_PC], &sc->regs.pc);
3311
}
3312

    
3313
static abi_ulong get_sigframe(struct target_sigaction *ka,
3314
                              CPUMBState *env, int frame_size)
3315
{
3316
    abi_ulong sp = env->regs[1];
3317

    
3318
    if ((ka->sa_flags & SA_ONSTACK) != 0 && !on_sig_stack(sp))
3319
        sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
3320

    
3321
    return ((sp - frame_size) & -8UL);
3322
}
3323

    
3324
static void setup_frame(int sig, struct target_sigaction *ka,
3325
                        target_sigset_t *set, CPUMBState *env)
3326
{
3327
    struct target_signal_frame *frame;
3328
    abi_ulong frame_addr;
3329
    int err = 0;
3330
    int i;
3331

    
3332
    frame_addr = get_sigframe(ka, env, sizeof *frame);
3333
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
3334
        goto badframe;
3335

    
3336
    /* Save the mask.  */
3337
    err |= __put_user(set->sig[0], &frame->uc.tuc_mcontext.oldmask);
3338
    if (err)
3339
        goto badframe;
3340

    
3341
    for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3342
        if (__put_user(set->sig[i], &frame->extramask[i - 1]))
3343
            goto badframe;
3344
    }
3345

    
3346
    setup_sigcontext(&frame->uc.tuc_mcontext, env);
3347

    
3348
    /* Set up to return from userspace. If provided, use a stub
3349
       already in userspace. */
3350
    /* minus 8 is offset to cater for "rtsd r15,8" offset */
3351
    if (ka->sa_flags & TARGET_SA_RESTORER) {
3352
        env->regs[15] = ((unsigned long)ka->sa_restorer)-8;
3353
    } else {
3354
        uint32_t t;
3355
        /* Note, these encodings are _big endian_! */
3356
        /* addi r12, r0, __NR_sigreturn */
3357
        t = 0x31800000UL | TARGET_NR_sigreturn;
3358
        err |= __put_user(t, frame->tramp + 0);
3359
        /* brki r14, 0x8 */
3360
        t = 0xb9cc0008UL;
3361
        err |= __put_user(t, frame->tramp + 1);
3362

    
3363
        /* Return from sighandler will jump to the tramp.
3364
           Negative 8 offset because return is rtsd r15, 8 */
3365
        env->regs[15] = ((unsigned long)frame->tramp) - 8;
3366
    }
3367

    
3368
    if (err)
3369
        goto badframe;
3370

    
3371
    /* Set up registers for signal handler */
3372
    env->regs[1] = frame_addr;
3373
    /* Signal handler args: */
3374
    env->regs[5] = sig; /* Arg 0: signum */
3375
    env->regs[6] = 0;
3376
    /* arg 1: sigcontext */
3377
    env->regs[7] = frame_addr += offsetof(typeof(*frame), uc);
3378

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

    
3382
    unlock_user_struct(frame, frame_addr, 1);
3383
    return;
3384
  badframe:
3385
    unlock_user_struct(frame, frame_addr, 1);
3386
    force_sig(TARGET_SIGSEGV);
3387
}
3388

    
3389
static void setup_rt_frame(int sig, struct target_sigaction *ka,
3390
                           target_siginfo_t *info,
3391
                           target_sigset_t *set, CPUMBState *env)
3392
{
3393
    fprintf(stderr, "Microblaze setup_rt_frame: not implemented\n");
3394
}
3395

    
3396
long do_sigreturn(CPUMBState *env)
3397
{
3398
    struct target_signal_frame *frame;
3399
    abi_ulong frame_addr;
3400
    target_sigset_t target_set;
3401
    sigset_t set;
3402
    int i;
3403

    
3404
    frame_addr = env->regs[R_SP];
3405
    /* Make sure the guest isn't playing games.  */
3406
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 1))
3407
        goto badframe;
3408

    
3409
    /* Restore blocked signals */
3410
    if (__get_user(target_set.sig[0], &frame->uc.tuc_mcontext.oldmask))
3411
        goto badframe;
3412
    for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3413
        if (__get_user(target_set.sig[i], &frame->extramask[i - 1]))
3414
            goto badframe;
3415
    }
3416
    target_to_host_sigset_internal(&set, &target_set);
3417
    sigprocmask(SIG_SETMASK, &set, NULL);
3418

    
3419
    restore_sigcontext(&frame->uc.tuc_mcontext, env);
3420
    /* We got here through a sigreturn syscall, our path back is via an
3421
       rtb insn so setup r14 for that.  */
3422
    env->regs[14] = env->sregs[SR_PC];
3423
 
3424
    unlock_user_struct(frame, frame_addr, 0);
3425
    return env->regs[10];
3426
  badframe:
3427
    unlock_user_struct(frame, frame_addr, 0);
3428
    force_sig(TARGET_SIGSEGV);
3429
}
3430

    
3431
long do_rt_sigreturn(CPUMBState *env)
3432
{
3433
    fprintf(stderr, "Microblaze do_rt_sigreturn: not implemented\n");
3434
    return -TARGET_ENOSYS;
3435
}
3436

    
3437
#elif defined(TARGET_CRIS)
3438

    
3439
struct target_sigcontext {
3440
        struct target_pt_regs regs;  /* needs to be first */
3441
        uint32_t oldmask;
3442
        uint32_t usp;    /* usp before stacking this gunk on it */
3443
};
3444

    
3445
/* Signal frames. */
3446
struct target_signal_frame {
3447
        struct target_sigcontext sc;
3448
        uint32_t extramask[TARGET_NSIG_WORDS - 1];
3449
        uint8_t retcode[8];       /* Trampoline code. */
3450
};
3451

    
3452
struct rt_signal_frame {
3453
        siginfo_t *pinfo;
3454
        void *puc;
3455
        siginfo_t info;
3456
        struct ucontext uc;
3457
        uint8_t retcode[8];       /* Trampoline code. */
3458
};
3459

    
3460
static void setup_sigcontext(struct target_sigcontext *sc, CPUCRISState *env)
3461
{
3462
        __put_user(env->regs[0], &sc->regs.r0);
3463
        __put_user(env->regs[1], &sc->regs.r1);
3464
        __put_user(env->regs[2], &sc->regs.r2);
3465
        __put_user(env->regs[3], &sc->regs.r3);
3466
        __put_user(env->regs[4], &sc->regs.r4);
3467
        __put_user(env->regs[5], &sc->regs.r5);
3468
        __put_user(env->regs[6], &sc->regs.r6);
3469
        __put_user(env->regs[7], &sc->regs.r7);
3470
        __put_user(env->regs[8], &sc->regs.r8);
3471
        __put_user(env->regs[9], &sc->regs.r9);
3472
        __put_user(env->regs[10], &sc->regs.r10);
3473
        __put_user(env->regs[11], &sc->regs.r11);
3474
        __put_user(env->regs[12], &sc->regs.r12);
3475
        __put_user(env->regs[13], &sc->regs.r13);
3476
        __put_user(env->regs[14], &sc->usp);
3477
        __put_user(env->regs[15], &sc->regs.acr);
3478
        __put_user(env->pregs[PR_MOF], &sc->regs.mof);
3479
        __put_user(env->pregs[PR_SRP], &sc->regs.srp);
3480
        __put_user(env->pc, &sc->regs.erp);
3481
}
3482

    
3483
static void restore_sigcontext(struct target_sigcontext *sc, CPUCRISState *env)
3484
{
3485
        __get_user(env->regs[0], &sc->regs.r0);
3486
        __get_user(env->regs[1], &sc->regs.r1);
3487
        __get_user(env->regs[2], &sc->regs.r2);
3488
        __get_user(env->regs[3], &sc->regs.r3);
3489
        __get_user(env->regs[4], &sc->regs.r4);
3490
        __get_user(env->regs[5], &sc->regs.r5);
3491
        __get_user(env->regs[6], &sc->regs.r6);
3492
        __get_user(env->regs[7], &sc->regs.r7);
3493
        __get_user(env->regs[8], &sc->regs.r8);
3494
        __get_user(env->regs[9], &sc->regs.r9);
3495
        __get_user(env->regs[10], &sc->regs.r10);
3496
        __get_user(env->regs[11], &sc->regs.r11);
3497
        __get_user(env->regs[12], &sc->regs.r12);
3498
        __get_user(env->regs[13], &sc->regs.r13);
3499
        __get_user(env->regs[14], &sc->usp);
3500
        __get_user(env->regs[15], &sc->regs.acr);
3501
        __get_user(env->pregs[PR_MOF], &sc->regs.mof);
3502
        __get_user(env->pregs[PR_SRP], &sc->regs.srp);
3503
        __get_user(env->pc, &sc->regs.erp);
3504
}
3505

    
3506
static abi_ulong get_sigframe(CPUCRISState *env, int framesize)
3507
{
3508
        abi_ulong sp;
3509
        /* Align the stack downwards to 4.  */
3510
        sp = (env->regs[R_SP] & ~3);
3511
        return sp - framesize;
3512
}
3513

    
3514
static void setup_frame(int sig, struct target_sigaction *ka,
3515
                        target_sigset_t *set, CPUCRISState *env)
3516
{
3517
        struct target_signal_frame *frame;
3518
        abi_ulong frame_addr;
3519
        int err = 0;
3520
        int i;
3521

    
3522
        frame_addr = get_sigframe(env, sizeof *frame);
3523
        if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
3524
                goto badframe;
3525

    
3526
        /*
3527
         * The CRIS signal return trampoline. A real linux/CRIS kernel doesn't
3528
         * use this trampoline anymore but it sets it up for GDB.
3529
         * In QEMU, using the trampoline simplifies things a bit so we use it.
3530
         *
3531
         * This is movu.w __NR_sigreturn, r9; break 13;
3532
         */
3533
        err |= __put_user(0x9c5f, frame->retcode+0);
3534
        err |= __put_user(TARGET_NR_sigreturn, 
3535
                          frame->retcode+2);
3536
        err |= __put_user(0xe93d, frame->retcode+4);
3537

    
3538
        /* Save the mask.  */
3539
        err |= __put_user(set->sig[0], &frame->sc.oldmask);
3540
        if (err)
3541
                goto badframe;
3542

    
3543
        for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3544
                if (__put_user(set->sig[i], &frame->extramask[i - 1]))
3545
                        goto badframe;
3546
        }
3547

    
3548
        setup_sigcontext(&frame->sc, env);
3549

    
3550
        /* Move the stack and setup the arguments for the handler.  */
3551
        env->regs[R_SP] = frame_addr;
3552
        env->regs[10] = sig;
3553
        env->pc = (unsigned long) ka->_sa_handler;
3554
        /* Link SRP so the guest returns through the trampoline.  */
3555
        env->pregs[PR_SRP] = frame_addr + offsetof(typeof(*frame), retcode);
3556

    
3557
        unlock_user_struct(frame, frame_addr, 1);
3558
        return;
3559
  badframe:
3560
        unlock_user_struct(frame, frame_addr, 1);
3561
        force_sig(TARGET_SIGSEGV);
3562
}
3563

    
3564
static void setup_rt_frame(int sig, struct target_sigaction *ka,
3565
                           target_siginfo_t *info,
3566
                           target_sigset_t *set, CPUCRISState *env)
3567
{
3568
    fprintf(stderr, "CRIS setup_rt_frame: not implemented\n");
3569
}
3570

    
3571
long do_sigreturn(CPUCRISState *env)
3572
{
3573
        struct target_signal_frame *frame;
3574
        abi_ulong frame_addr;
3575
        target_sigset_t target_set;
3576
        sigset_t set;
3577
        int i;
3578

    
3579
        frame_addr = env->regs[R_SP];
3580
        /* Make sure the guest isn't playing games.  */
3581
        if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 1))
3582
                goto badframe;
3583

    
3584
        /* Restore blocked signals */
3585
        if (__get_user(target_set.sig[0], &frame->sc.oldmask))
3586
                goto badframe;
3587
        for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3588
                if (__get_user(target_set.sig[i], &frame->extramask[i - 1]))
3589
                        goto badframe;
3590
        }
3591
        target_to_host_sigset_internal(&set, &target_set);
3592
        sigprocmask(SIG_SETMASK, &set, NULL);
3593

    
3594
        restore_sigcontext(&frame->sc, env);
3595
        unlock_user_struct(frame, frame_addr, 0);
3596
        return env->regs[10];
3597
  badframe:
3598
        unlock_user_struct(frame, frame_addr, 0);
3599
        force_sig(TARGET_SIGSEGV);
3600
}
3601

    
3602
long do_rt_sigreturn(CPUCRISState *env)
3603
{
3604
    fprintf(stderr, "CRIS do_rt_sigreturn: not implemented\n");
3605
    return -TARGET_ENOSYS;
3606
}
3607

    
3608
#elif defined(TARGET_OPENRISC)
3609

    
3610
struct target_sigcontext {
3611
    struct target_pt_regs regs;
3612
    abi_ulong oldmask;
3613
    abi_ulong usp;
3614
};
3615

    
3616
struct target_ucontext {
3617
    abi_ulong tuc_flags;
3618
    abi_ulong tuc_link;
3619
    target_stack_t tuc_stack;
3620
    struct target_sigcontext tuc_mcontext;
3621
    target_sigset_t tuc_sigmask;   /* mask last for extensibility */
3622
};
3623

    
3624
struct target_rt_sigframe {
3625
    abi_ulong pinfo;
3626
    uint64_t puc;
3627
    struct target_siginfo info;
3628
    struct target_sigcontext sc;
3629
    struct target_ucontext uc;
3630
    unsigned char retcode[16];  /* trampoline code */
3631
};
3632

    
3633
/* This is the asm-generic/ucontext.h version */
3634
#if 0
3635
static int restore_sigcontext(CPUOpenRISCState *regs,
3636
                              struct target_sigcontext *sc)
3637
{
3638
    unsigned int err = 0;
3639
    unsigned long old_usp;
3640

3641
    /* Alwys make any pending restarted system call return -EINTR */
3642
    current_thread_info()->restart_block.fn = do_no_restart_syscall;
3643

3644
    /* restore the regs from &sc->regs (same as sc, since regs is first)
3645
     * (sc is already checked for VERIFY_READ since the sigframe was
3646
     *  checked in sys_sigreturn previously)
3647
     */
3648

3649
    if (copy_from_user(regs, &sc, sizeof(struct target_pt_regs))) {
3650
        goto badframe;
3651
    }
3652

3653
    /* make sure the U-flag is set so user-mode cannot fool us */
3654

3655
    regs->sr &= ~SR_SM;
3656

3657
    /* restore the old USP as it was before we stacked the sc etc.
3658
     * (we cannot just pop the sigcontext since we aligned the sp and
3659
     *  stuff after pushing it)
3660
     */
3661

3662
    err |= __get_user(old_usp, &sc->usp);
3663
    phx_signal("old_usp 0x%lx", old_usp);
3664

3665
    __PHX__ REALLY           /* ??? */
3666
    wrusp(old_usp);
3667
    regs->gpr[1] = old_usp;
3668

3669
    /* TODO: the other ports use regs->orig_XX to disable syscall checks
3670
     * after this completes, but we don't use that mechanism. maybe we can
3671
     * use it now ?
3672
     */
3673

3674
    return err;
3675

3676
badframe:
3677
    return 1;
3678
}
3679
#endif
3680

    
3681
/* Set up a signal frame.  */
3682

    
3683
static int setup_sigcontext(struct target_sigcontext *sc,
3684
                            CPUOpenRISCState *regs,
3685
                            unsigned long mask)
3686
{
3687
    int err = 0;
3688
    unsigned long usp = regs->gpr[1];
3689

    
3690
    /* copy the regs. they are first in sc so we can use sc directly */
3691

    
3692
    /*err |= copy_to_user(&sc, regs, sizeof(struct target_pt_regs));*/
3693

    
3694
    /* Set the frametype to CRIS_FRAME_NORMAL for the execution of
3695
       the signal handler. The frametype will be restored to its previous
3696
       value in restore_sigcontext. */
3697
    /*regs->frametype = CRIS_FRAME_NORMAL;*/
3698

    
3699
    /* then some other stuff */
3700
    err |= __put_user(mask, &sc->oldmask);
3701
    err |= __put_user(usp, &sc->usp); return err;
3702
}
3703

    
3704
static inline unsigned long align_sigframe(unsigned long sp)
3705
{
3706
    unsigned long i;
3707
    i = sp & ~3UL;
3708
    return i;
3709
}
3710

    
3711
static inline abi_ulong get_sigframe(struct target_sigaction *ka,
3712
                                     CPUOpenRISCState *regs,
3713
                                     size_t frame_size)
3714
{
3715
    unsigned long sp = regs->gpr[1];
3716
    int onsigstack = on_sig_stack(sp);
3717

    
3718
    /* redzone */
3719
    /* This is the X/Open sanctioned signal stack switching.  */
3720
    if ((ka->sa_flags & SA_ONSTACK) != 0 && !onsigstack) {
3721
        sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
3722
    }
3723

    
3724
    sp = align_sigframe(sp - frame_size);
3725

    
3726
    /*
3727
     * If we are on the alternate signal stack and would overflow it, don't.
3728
     * Return an always-bogus address instead so we will die with SIGSEGV.
3729
     */
3730

    
3731
    if (onsigstack && !likely(on_sig_stack(sp))) {
3732
        return -1L;
3733
    }
3734

    
3735
    return sp;
3736
}
3737

    
3738
static void setup_frame(int sig, struct target_sigaction *ka,
3739
                        target_sigset_t *set, CPUOpenRISCState *env)
3740
{
3741
    qemu_log("Not implement.\n");
3742
}
3743

    
3744
static void setup_rt_frame(int sig, struct target_sigaction *ka,
3745
                           target_siginfo_t *info,
3746
                           target_sigset_t *set, CPUOpenRISCState *env)
3747
{
3748
    int err = 0;
3749
    abi_ulong frame_addr;
3750
    unsigned long return_ip;
3751
    struct target_rt_sigframe *frame;
3752
    abi_ulong info_addr, uc_addr;
3753

    
3754
    frame_addr = get_sigframe(ka, env, sizeof *frame);
3755

    
3756
    frame_addr = get_sigframe(ka, env, sizeof(*frame));
3757
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) {
3758
        goto give_sigsegv;
3759
    }
3760

    
3761
    info_addr = frame_addr + offsetof(struct target_rt_sigframe, info);
3762
    err |= __put_user(info_addr, &frame->pinfo);
3763
    uc_addr = frame_addr + offsetof(struct target_rt_sigframe, uc);
3764
    err |= __put_user(uc_addr, &frame->puc);
3765

    
3766
    if (ka->sa_flags & SA_SIGINFO) {
3767
        err |= copy_siginfo_to_user(&frame->info, info);
3768
    }
3769
    if (err) {
3770
        goto give_sigsegv;
3771
    }
3772

    
3773
    /*err |= __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext));*/
3774
    err |= __put_user(0, &frame->uc.tuc_flags);
3775
    err |= __put_user(0, &frame->uc.tuc_link);
3776
    err |= __put_user(target_sigaltstack_used.ss_sp,
3777
                      &frame->uc.tuc_stack.ss_sp);
3778
    err |= __put_user(sas_ss_flags(env->gpr[1]), &frame->uc.tuc_stack.ss_flags);
3779
    err |= __put_user(target_sigaltstack_used.ss_size,
3780
                      &frame->uc.tuc_stack.ss_size);
3781
    err |= setup_sigcontext(&frame->sc, env, set->sig[0]);
3782

    
3783
    /*err |= copy_to_user(frame->uc.tuc_sigmask, set, sizeof(*set));*/
3784

    
3785
    if (err) {
3786
        goto give_sigsegv;
3787
    }
3788

    
3789
    /* trampoline - the desired return ip is the retcode itself */
3790
    return_ip = (unsigned long)&frame->retcode;
3791
    /* This is l.ori r11,r0,__NR_sigreturn, l.sys 1 */
3792
    err |= __put_user(0xa960, (short *)(frame->retcode + 0));
3793
    err |= __put_user(TARGET_NR_rt_sigreturn, (short *)(frame->retcode + 2));
3794
    err |= __put_user(0x20000001, (unsigned long *)(frame->retcode + 4));
3795
    err |= __put_user(0x15000000, (unsigned long *)(frame->retcode + 8));
3796

    
3797
    if (err) {
3798
        goto give_sigsegv;
3799
    }
3800

    
3801
    /* TODO what is the current->exec_domain stuff and invmap ? */
3802

    
3803
    /* Set up registers for signal handler */
3804
    env->pc = (unsigned long)ka->_sa_handler; /* what we enter NOW */
3805
    env->gpr[9] = (unsigned long)return_ip;     /* what we enter LATER */
3806
    env->gpr[3] = (unsigned long)sig;           /* arg 1: signo */
3807
    env->gpr[4] = (unsigned long)&frame->info;  /* arg 2: (siginfo_t*) */
3808
    env->gpr[5] = (unsigned long)&frame->uc;    /* arg 3: ucontext */
3809

    
3810
    /* actually move the usp to reflect the stacked frame */
3811
    env->gpr[1] = (unsigned long)frame;
3812

    
3813
    return;
3814

    
3815
give_sigsegv:
3816
    unlock_user_struct(frame, frame_addr, 1);
3817
    if (sig == TARGET_SIGSEGV) {
3818
        ka->_sa_handler = TARGET_SIG_DFL;
3819
    }
3820
    force_sig(TARGET_SIGSEGV);
3821
}
3822

    
3823
long do_sigreturn(CPUOpenRISCState *env)
3824
{
3825

    
3826
    qemu_log("do_sigreturn: not implemented\n");
3827
    return -TARGET_ENOSYS;
3828
}
3829

    
3830
long do_rt_sigreturn(CPUOpenRISCState *env)
3831
{
3832
    qemu_log("do_rt_sigreturn: not implemented\n");
3833
    return -TARGET_ENOSYS;
3834
}
3835
/* TARGET_OPENRISC */
3836

    
3837
#elif defined(TARGET_S390X)
3838

    
3839
#define __NUM_GPRS 16
3840
#define __NUM_FPRS 16
3841
#define __NUM_ACRS 16
3842

    
3843
#define S390_SYSCALL_SIZE   2
3844
#define __SIGNAL_FRAMESIZE      160 /* FIXME: 31-bit mode -> 96 */
3845

    
3846
#define _SIGCONTEXT_NSIG        64
3847
#define _SIGCONTEXT_NSIG_BPW    64 /* FIXME: 31-bit mode -> 32 */
3848
#define _SIGCONTEXT_NSIG_WORDS  (_SIGCONTEXT_NSIG / _SIGCONTEXT_NSIG_BPW)
3849
#define _SIGMASK_COPY_SIZE    (sizeof(unsigned long)*_SIGCONTEXT_NSIG_WORDS)
3850
#define PSW_ADDR_AMODE            0x0000000000000000UL /* 0x80000000UL for 31-bit */
3851
#define S390_SYSCALL_OPCODE ((uint16_t)0x0a00)
3852

    
3853
typedef struct {
3854
    target_psw_t psw;
3855
    target_ulong gprs[__NUM_GPRS];
3856
    unsigned int acrs[__NUM_ACRS];
3857
} target_s390_regs_common;
3858

    
3859
typedef struct {
3860
    unsigned int fpc;
3861
    double   fprs[__NUM_FPRS];
3862
} target_s390_fp_regs;
3863

    
3864
typedef struct {
3865
    target_s390_regs_common regs;
3866
    target_s390_fp_regs     fpregs;
3867
} target_sigregs;
3868

    
3869
struct target_sigcontext {
3870
    target_ulong   oldmask[_SIGCONTEXT_NSIG_WORDS];
3871
    target_sigregs *sregs;
3872
};
3873

    
3874
typedef struct {
3875
    uint8_t callee_used_stack[__SIGNAL_FRAMESIZE];
3876
    struct target_sigcontext sc;
3877
    target_sigregs sregs;
3878
    int signo;
3879
    uint8_t retcode[S390_SYSCALL_SIZE];
3880
} sigframe;
3881

    
3882
struct target_ucontext {
3883
    target_ulong tuc_flags;
3884
    struct target_ucontext *tuc_link;
3885
    target_stack_t tuc_stack;
3886
    target_sigregs tuc_mcontext;
3887
    target_sigset_t tuc_sigmask;   /* mask last for extensibility */
3888
};
3889

    
3890
typedef struct {
3891
    uint8_t callee_used_stack[__SIGNAL_FRAMESIZE];
3892
    uint8_t retcode[S390_SYSCALL_SIZE];
3893
    struct target_siginfo info;
3894
    struct target_ucontext uc;
3895
} rt_sigframe;
3896

    
3897
static inline abi_ulong
3898
get_sigframe(struct target_sigaction *ka, CPUS390XState *env, size_t frame_size)
3899
{
3900
    abi_ulong sp;
3901

    
3902
    /* Default to using normal stack */
3903
    sp = env->regs[15];
3904

    
3905
    /* This is the X/Open sanctioned signal stack switching.  */
3906
    if (ka->sa_flags & TARGET_SA_ONSTACK) {
3907
        if (!sas_ss_flags(sp)) {
3908
            sp = target_sigaltstack_used.ss_sp +
3909
                 target_sigaltstack_used.ss_size;
3910
        }
3911
    }
3912

    
3913
    /* This is the legacy signal stack switching. */
3914
    else if (/* FIXME !user_mode(regs) */ 0 &&
3915
             !(ka->sa_flags & TARGET_SA_RESTORER) &&
3916
             ka->sa_restorer) {
3917
        sp = (abi_ulong) ka->sa_restorer;
3918
    }
3919

    
3920
    return (sp - frame_size) & -8ul;
3921
}
3922

    
3923
static void save_sigregs(CPUS390XState *env, target_sigregs *sregs)
3924
{
3925
    int i;
3926
    //save_access_regs(current->thread.acrs); FIXME
3927

    
3928
    /* Copy a 'clean' PSW mask to the user to avoid leaking
3929
       information about whether PER is currently on.  */
3930
    __put_user(env->psw.mask, &sregs->regs.psw.mask);
3931
    __put_user(env->psw.addr, &sregs->regs.psw.addr);
3932
    for (i = 0; i < 16; i++) {
3933
        __put_user(env->regs[i], &sregs->regs.gprs[i]);
3934
    }
3935
    for (i = 0; i < 16; i++) {
3936
        __put_user(env->aregs[i], &sregs->regs.acrs[i]);
3937
    }
3938
    /*
3939
     * We have to store the fp registers to current->thread.fp_regs
3940
     * to merge them with the emulated registers.
3941
     */
3942
    //save_fp_regs(&current->thread.fp_regs); FIXME
3943
    for (i = 0; i < 16; i++) {
3944
        __put_user(env->fregs[i].ll, &sregs->fpregs.fprs[i]);
3945
    }
3946
}
3947

    
3948
static void setup_frame(int sig, struct target_sigaction *ka,
3949
                        target_sigset_t *set, CPUS390XState *env)
3950
{
3951
    sigframe *frame;
3952
    abi_ulong frame_addr;
3953

    
3954
    frame_addr = get_sigframe(ka, env, sizeof(*frame));
3955
    qemu_log("%s: frame_addr 0x%llx\n", __FUNCTION__,
3956
             (unsigned long long)frame_addr);
3957
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) {
3958
            goto give_sigsegv;
3959
    }
3960

    
3961
    qemu_log("%s: 1\n", __FUNCTION__);
3962
    if (__put_user(set->sig[0], &frame->sc.oldmask[0])) {
3963
              goto give_sigsegv;
3964
    }
3965

    
3966
    save_sigregs(env, &frame->sregs);
3967

    
3968
    __put_user((abi_ulong)(unsigned long)&frame->sregs,
3969
               (abi_ulong *)&frame->sc.sregs);
3970

    
3971
    /* Set up to return from userspace.  If provided, use a stub
3972
       already in userspace.  */
3973
    if (ka->sa_flags & TARGET_SA_RESTORER) {
3974
            env->regs[14] = (unsigned long)
3975
                    ka->sa_restorer | PSW_ADDR_AMODE;
3976
    } else {
3977
            env->regs[14] = (unsigned long)
3978
                    frame->retcode | PSW_ADDR_AMODE;
3979
            if (__put_user(S390_SYSCALL_OPCODE | TARGET_NR_sigreturn,
3980
                           (uint16_t *)(frame->retcode)))
3981
                    goto give_sigsegv;
3982
    }
3983

    
3984
    /* Set up backchain. */
3985
    if (__put_user(env->regs[15], (abi_ulong *) frame)) {
3986
            goto give_sigsegv;
3987
    }
3988

    
3989
    /* Set up registers for signal handler */
3990
    env->regs[15] = frame_addr;
3991
    env->psw.addr = (target_ulong) ka->_sa_handler | PSW_ADDR_AMODE;
3992

    
3993
    env->regs[2] = sig; //map_signal(sig);
3994
    env->regs[3] = frame_addr += offsetof(typeof(*frame), sc);
3995

    
3996
    /* We forgot to include these in the sigcontext.
3997
       To avoid breaking binary compatibility, they are passed as args. */
3998
    env->regs[4] = 0; // FIXME: no clue... current->thread.trap_no;
3999
    env->regs[5] = 0; // FIXME: no clue... current->thread.prot_addr;
4000

    
4001
    /* Place signal number on stack to allow backtrace from handler.  */
4002
    if (__put_user(env->regs[2], (int *) &frame->signo)) {
4003
            goto give_sigsegv;
4004
    }
4005
    unlock_user_struct(frame, frame_addr, 1);
4006
    return;
4007

    
4008
give_sigsegv:
4009
    qemu_log("%s: give_sigsegv\n", __FUNCTION__);
4010
    unlock_user_struct(frame, frame_addr, 1);
4011
    force_sig(TARGET_SIGSEGV);
4012
}
4013

    
4014
static void setup_rt_frame(int sig, struct target_sigaction *ka,
4015
                           target_siginfo_t *info,
4016
                           target_sigset_t *set, CPUS390XState *env)
4017
{
4018
    int i;
4019
    rt_sigframe *frame;
4020
    abi_ulong frame_addr;
4021

    
4022
    frame_addr = get_sigframe(ka, env, sizeof *frame);
4023
    qemu_log("%s: frame_addr 0x%llx\n", __FUNCTION__,
4024
             (unsigned long long)frame_addr);
4025
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) {
4026
        goto give_sigsegv;
4027
    }
4028

    
4029
    qemu_log("%s: 1\n", __FUNCTION__);
4030
    if (copy_siginfo_to_user(&frame->info, info)) {
4031
        goto give_sigsegv;
4032
    }
4033

    
4034
    /* Create the ucontext.  */
4035
    __put_user(0, &frame->uc.tuc_flags);
4036
    __put_user((abi_ulong)0, (abi_ulong *)&frame->uc.tuc_link);
4037
    __put_user(target_sigaltstack_used.ss_sp, &frame->uc.tuc_stack.ss_sp);
4038
    __put_user(sas_ss_flags(get_sp_from_cpustate(env)),
4039
                      &frame->uc.tuc_stack.ss_flags);
4040
    __put_user(target_sigaltstack_used.ss_size, &frame->uc.tuc_stack.ss_size);
4041
    save_sigregs(env, &frame->uc.tuc_mcontext);
4042
    for (i = 0; i < TARGET_NSIG_WORDS; i++) {
4043
        __put_user((abi_ulong)set->sig[i],
4044
        (abi_ulong *)&frame->uc.tuc_sigmask.sig[i]);
4045
    }
4046

    
4047
    /* Set up to return from userspace.  If provided, use a stub
4048
       already in userspace.  */
4049
    if (ka->sa_flags & TARGET_SA_RESTORER) {
4050
        env->regs[14] = (unsigned long) ka->sa_restorer | PSW_ADDR_AMODE;
4051
    } else {
4052
        env->regs[14] = (unsigned long) frame->retcode | PSW_ADDR_AMODE;
4053
        if (__put_user(S390_SYSCALL_OPCODE | TARGET_NR_rt_sigreturn,
4054
                       (uint16_t *)(frame->retcode))) {
4055
            goto give_sigsegv;
4056
        }
4057
    }
4058

    
4059
    /* Set up backchain. */
4060
    if (__put_user(env->regs[15], (abi_ulong *) frame)) {
4061
        goto give_sigsegv;
4062
    }
4063

    
4064
    /* Set up registers for signal handler */
4065
    env->regs[15] = frame_addr;
4066
    env->psw.addr = (target_ulong) ka->_sa_handler | PSW_ADDR_AMODE;
4067

    
4068
    env->regs[2] = sig; //map_signal(sig);
4069
    env->regs[3] = frame_addr + offsetof(typeof(*frame), info);
4070
    env->regs[4] = frame_addr + offsetof(typeof(*frame), uc);
4071
    return;
4072

    
4073
give_sigsegv:
4074
    qemu_log("%s: give_sigsegv\n", __FUNCTION__);
4075
    unlock_user_struct(frame, frame_addr, 1);
4076
    force_sig(TARGET_SIGSEGV);
4077
}
4078

    
4079
static int
4080
restore_sigregs(CPUS390XState *env, target_sigregs *sc)
4081
{
4082
    int err = 0;
4083
    int i;
4084

    
4085
    for (i = 0; i < 16; i++) {
4086
        err |= __get_user(env->regs[i], &sc->regs.gprs[i]);
4087
    }
4088

    
4089
    err |= __get_user(env->psw.mask, &sc->regs.psw.mask);
4090
    qemu_log("%s: sc->regs.psw.addr 0x%llx env->psw.addr 0x%llx\n",
4091
             __FUNCTION__, (unsigned long long)sc->regs.psw.addr,
4092
             (unsigned long long)env->psw.addr);
4093
    err |= __get_user(env->psw.addr, &sc->regs.psw.addr);
4094
    /* FIXME: 31-bit -> | PSW_ADDR_AMODE */
4095

    
4096
    for (i = 0; i < 16; i++) {
4097
        err |= __get_user(env->aregs[i], &sc->regs.acrs[i]);
4098
    }
4099
    for (i = 0; i < 16; i++) {
4100
        err |= __get_user(env->fregs[i].ll, &sc->fpregs.fprs[i]);
4101
    }
4102

    
4103
    return err;
4104
}
4105

    
4106
long do_sigreturn(CPUS390XState *env)
4107
{
4108
    sigframe *frame;
4109
    abi_ulong frame_addr = env->regs[15];
4110
    qemu_log("%s: frame_addr 0x%llx\n", __FUNCTION__,
4111
             (unsigned long long)frame_addr);
4112
    target_sigset_t target_set;
4113
    sigset_t set;
4114

    
4115
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) {
4116
        goto badframe;
4117
    }
4118
    if (__get_user(target_set.sig[0], &frame->sc.oldmask[0])) {
4119
        goto badframe;
4120
    }
4121

    
4122
    target_to_host_sigset_internal(&set, &target_set);
4123
    sigprocmask(SIG_SETMASK, &set, NULL); /* ~_BLOCKABLE? */
4124

    
4125
    if (restore_sigregs(env, &frame->sregs)) {
4126
        goto badframe;
4127
    }
4128

    
4129
    unlock_user_struct(frame, frame_addr, 0);
4130
    return env->regs[2];
4131

    
4132
badframe:
4133
    unlock_user_struct(frame, frame_addr, 0);
4134
    force_sig(TARGET_SIGSEGV);
4135
    return 0;
4136
}
4137

    
4138
long do_rt_sigreturn(CPUS390XState *env)
4139
{
4140
    rt_sigframe *frame;
4141
    abi_ulong frame_addr = env->regs[15];
4142
    qemu_log("%s: frame_addr 0x%llx\n", __FUNCTION__,
4143
             (unsigned long long)frame_addr);
4144
    sigset_t set;
4145

    
4146
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) {
4147
        goto badframe;
4148
    }
4149
    target_to_host_sigset(&set, &frame->uc.tuc_sigmask);
4150

    
4151
    sigprocmask(SIG_SETMASK, &set, NULL); /* ~_BLOCKABLE? */
4152

    
4153
    if (restore_sigregs(env, &frame->uc.tuc_mcontext)) {
4154
        goto badframe;
4155
    }
4156

    
4157
    if (do_sigaltstack(frame_addr + offsetof(rt_sigframe, uc.tuc_stack), 0,
4158
                       get_sp_from_cpustate(env)) == -EFAULT) {
4159
        goto badframe;
4160
    }
4161
    unlock_user_struct(frame, frame_addr, 0);
4162
    return env->regs[2];
4163

    
4164
badframe:
4165
    unlock_user_struct(frame, frame_addr, 0);
4166
    force_sig(TARGET_SIGSEGV);
4167
    return 0;
4168
}
4169

    
4170
#elif defined(TARGET_PPC) && !defined(TARGET_PPC64)
4171

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

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

    
4180
/* Size of dummy stack frame allocated when calling signal handler.
4181
   See arch/powerpc/include/asm/ptrace.h.  */
4182
#if defined(TARGET_PPC64)
4183
#define SIGNAL_FRAMESIZE 128
4184
#else
4185
#define SIGNAL_FRAMESIZE 64
4186
#endif
4187

    
4188
/* See arch/powerpc/include/asm/sigcontext.h.  */
4189
struct target_sigcontext {
4190
    target_ulong _unused[4];
4191
    int32_t signal;
4192
#if defined(TARGET_PPC64)
4193
    int32_t pad0;
4194
#endif
4195
    target_ulong handler;
4196
    target_ulong oldmask;
4197
    target_ulong regs;      /* struct pt_regs __user * */
4198
    /* TODO: PPC64 includes extra bits here.  */
4199
};
4200

    
4201
/* Indices for target_mcontext.mc_gregs, below.
4202
   See arch/powerpc/include/asm/ptrace.h for details.  */
4203
enum {
4204
    TARGET_PT_R0 = 0,
4205
    TARGET_PT_R1 = 1,
4206
    TARGET_PT_R2 = 2,
4207
    TARGET_PT_R3 = 3,
4208
    TARGET_PT_R4 = 4,
4209
    TARGET_PT_R5 = 5,
4210
    TARGET_PT_R6 = 6,
4211
    TARGET_PT_R7 = 7,
4212
    TARGET_PT_R8 = 8,
4213
    TARGET_PT_R9 = 9,
4214
    TARGET_PT_R10 = 10,
4215
    TARGET_PT_R11 = 11,
4216
    TARGET_PT_R12 = 12,
4217
    TARGET_PT_R13 = 13,
4218
    TARGET_PT_R14 = 14,
4219
    TARGET_PT_R15 = 15,
4220
    TARGET_PT_R16 = 16,
4221
    TARGET_PT_R17 = 17,
4222
    TARGET_PT_R18 = 18,
4223
    TARGET_PT_R19 = 19,
4224
    TARGET_PT_R20 = 20,
4225
    TARGET_PT_R21 = 21,
4226
    TARGET_PT_R22 = 22,
4227
    TARGET_PT_R23 = 23,
4228
    TARGET_PT_R24 = 24,
4229
    TARGET_PT_R25 = 25,
4230
    TARGET_PT_R26 = 26,
4231
    TARGET_PT_R27 = 27,
4232
    TARGET_PT_R28 = 28,
4233
    TARGET_PT_R29 = 29,
4234
    TARGET_PT_R30 = 30,
4235
    TARGET_PT_R31 = 31,
4236
    TARGET_PT_NIP = 32,
4237
    TARGET_PT_MSR = 33,
4238
    TARGET_PT_ORIG_R3 = 34,
4239
    TARGET_PT_CTR = 35,
4240
    TARGET_PT_LNK = 36,
4241
    TARGET_PT_XER = 37,
4242
    TARGET_PT_CCR = 38,
4243
    /* Yes, there are two registers with #39.  One is 64-bit only.  */
4244
    TARGET_PT_MQ = 39,
4245
    TARGET_PT_SOFTE = 39,
4246
    TARGET_PT_TRAP = 40,
4247
    TARGET_PT_DAR = 41,
4248
    TARGET_PT_DSISR = 42,
4249
    TARGET_PT_RESULT = 43,
4250
    TARGET_PT_REGS_COUNT = 44
4251
};
4252

    
4253
/* See arch/powerpc/include/asm/ucontext.h.  Only used for 32-bit PPC;
4254
   on 64-bit PPC, sigcontext and mcontext are one and the same.  */
4255
struct target_mcontext {
4256
    target_ulong mc_gregs[48];
4257
    /* Includes fpscr.  */
4258
    uint64_t mc_fregs[33];
4259
    target_ulong mc_pad[2];
4260
    /* We need to handle Altivec and SPE at the same time, which no
4261
       kernel needs to do.  Fortunately, the kernel defines this bit to
4262
       be Altivec-register-large all the time, rather than trying to
4263
       twiddle it based on the specific platform.  */
4264
    union {
4265
        /* SPE vector registers.  One extra for SPEFSCR.  */
4266
        uint32_t spe[33];
4267
        /* Altivec vector registers.  The packing of VSCR and VRSAVE
4268
           varies depending on whether we're PPC64 or not: PPC64 splits
4269
           them apart; PPC32 stuffs them together.  */
4270
#if defined(TARGET_PPC64)
4271
#define QEMU_NVRREG 34
4272
#else
4273
#define QEMU_NVRREG 33
4274
#endif
4275
        ppc_avr_t altivec[QEMU_NVRREG];
4276
#undef QEMU_NVRREG
4277
    } mc_vregs __attribute__((__aligned__(16)));
4278
};
4279

    
4280
struct target_ucontext {
4281
    target_ulong tuc_flags;
4282
    target_ulong tuc_link;    /* struct ucontext __user * */
4283
    struct target_sigaltstack tuc_stack;
4284
#if !defined(TARGET_PPC64)
4285
    int32_t tuc_pad[7];
4286
    target_ulong tuc_regs;    /* struct mcontext __user *
4287
                                points to uc_mcontext field */
4288
#endif
4289
    target_sigset_t tuc_sigmask;
4290
#if defined(TARGET_PPC64)
4291
    target_sigset_t unused[15]; /* Allow for uc_sigmask growth */
4292
    struct target_sigcontext tuc_mcontext;
4293
#else
4294
    int32_t tuc_maskext[30];
4295
    int32_t tuc_pad2[3];
4296
    struct target_mcontext tuc_mcontext;
4297
#endif
4298
};
4299

    
4300
/* See arch/powerpc/kernel/signal_32.c.  */
4301
struct target_sigframe {
4302
    struct target_sigcontext sctx;
4303
    struct target_mcontext mctx;
4304
    int32_t abigap[56];
4305
};
4306

    
4307
struct target_rt_sigframe {
4308
    struct target_siginfo info;
4309
    struct target_ucontext uc;
4310
    int32_t abigap[56];
4311
};
4312

    
4313
/* We use the mc_pad field for the signal return trampoline.  */
4314
#define tramp mc_pad
4315

    
4316
/* See arch/powerpc/kernel/signal.c.  */
4317
static target_ulong get_sigframe(struct target_sigaction *ka,
4318
                                 CPUPPCState *env,
4319
                                 int frame_size)
4320
{
4321
    target_ulong oldsp, newsp;
4322

    
4323
    oldsp = env->gpr[1];
4324

    
4325
    if ((ka->sa_flags & TARGET_SA_ONSTACK) &&
4326
        (sas_ss_flags(oldsp) == 0)) {
4327
        oldsp = (target_sigaltstack_used.ss_sp
4328
                 + target_sigaltstack_used.ss_size);
4329
    }
4330

    
4331
    newsp = (oldsp - frame_size) & ~0xFUL;
4332

    
4333
    return newsp;
4334
}
4335

    
4336
static int save_user_regs(CPUPPCState *env, struct target_mcontext *frame,
4337
                          int sigret)
4338
{
4339
    target_ulong msr = env->msr;
4340
    int i;
4341
    target_ulong ccr = 0;
4342

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

    
4347
    /* Save general registers.  */
4348
    for (i = 0; i < ARRAY_SIZE(env->gpr); i++) {
4349
        if (__put_user(env->gpr[i], &frame->mc_gregs[i])) {
4350
            return 1;
4351
        }
4352
    }
4353
    if (__put_user(env->nip, &frame->mc_gregs[TARGET_PT_NIP])
4354
        || __put_user(env->ctr, &frame->mc_gregs[TARGET_PT_CTR])
4355
        || __put_user(env->lr, &frame->mc_gregs[TARGET_PT_LNK])
4356
        || __put_user(env->xer, &frame->mc_gregs[TARGET_PT_XER]))
4357
        return 1;
4358

    
4359
    for (i = 0; i < ARRAY_SIZE(env->crf); i++) {
4360
        ccr |= env->crf[i] << (32 - ((i + 1) * 4));
4361
    }
4362
    if (__put_user(ccr, &frame->mc_gregs[TARGET_PT_CCR]))
4363
        return 1;
4364

    
4365
    /* Save Altivec registers if necessary.  */
4366
    if (env->insns_flags & PPC_ALTIVEC) {
4367
        for (i = 0; i < ARRAY_SIZE(env->avr); i++) {
4368
            ppc_avr_t *avr = &env->avr[i];
4369
            ppc_avr_t *vreg = &frame->mc_vregs.altivec[i];
4370

    
4371
            if (__put_user(avr->u64[0], &vreg->u64[0]) ||
4372
                __put_user(avr->u64[1], &vreg->u64[1])) {
4373
                return 1;
4374
            }
4375
        }
4376
        /* Set MSR_VR in the saved MSR value to indicate that
4377
           frame->mc_vregs contains valid data.  */
4378
        msr |= MSR_VR;
4379
        if (__put_user((uint32_t)env->spr[SPR_VRSAVE],
4380
                       &frame->mc_vregs.altivec[32].u32[3]))
4381
            return 1;
4382
    }
4383

    
4384
    /* Save floating point registers.  */
4385
    if (env->insns_flags & PPC_FLOAT) {
4386
        for (i = 0; i < ARRAY_SIZE(env->fpr); i++) {
4387
            if (__put_user(env->fpr[i], &frame->mc_fregs[i])) {
4388
                return 1;
4389
            }
4390
        }
4391
        if (__put_user((uint64_t) env->fpscr, &frame->mc_fregs[32]))
4392
            return 1;
4393
    }
4394

    
4395
    /* Save SPE registers.  The kernel only saves the high half.  */
4396
    if (env->insns_flags & PPC_SPE) {
4397
#if defined(TARGET_PPC64)
4398
        for (i = 0; i < ARRAY_SIZE(env->gpr); i++) {
4399
            if (__put_user(env->gpr[i] >> 32, &frame->mc_vregs.spe[i])) {
4400
                return 1;
4401
            }
4402
        }
4403
#else
4404
        for (i = 0; i < ARRAY_SIZE(env->gprh); i++) {
4405
            if (__put_user(env->gprh[i], &frame->mc_vregs.spe[i])) {
4406
                return 1;
4407
            }
4408
        }
4409
#endif
4410
        /* Set MSR_SPE in the saved MSR value to indicate that
4411
           frame->mc_vregs contains valid data.  */
4412
        msr |= MSR_SPE;
4413
        if (__put_user(env->spe_fscr, &frame->mc_vregs.spe[32]))
4414
            return 1;
4415
    }
4416

    
4417
    /* Store MSR.  */
4418
    if (__put_user(msr, &frame->mc_gregs[TARGET_PT_MSR]))
4419
        return 1;
4420

    
4421
    /* Set up the sigreturn trampoline: li r0,sigret; sc.  */
4422
    if (sigret) {
4423
        if (__put_user(0x38000000UL | sigret, &frame->tramp[0]) ||
4424
            __put_user(0x44000002UL, &frame->tramp[1])) {
4425
            return 1;
4426
        }
4427
    }
4428

    
4429
    return 0;
4430
}
4431

    
4432
static int restore_user_regs(CPUPPCState *env,
4433
                             struct target_mcontext *frame, int sig)
4434
{
4435
    target_ulong save_r2 = 0;
4436
    target_ulong msr;
4437
    target_ulong ccr;
4438

    
4439
    int i;
4440

    
4441
    if (!sig) {
4442
        save_r2 = env->gpr[2];
4443
    }
4444

    
4445
    /* Restore general registers.  */
4446
    for (i = 0; i < ARRAY_SIZE(env->gpr); i++) {
4447
        if (__get_user(env->gpr[i], &frame->mc_gregs[i])) {
4448
            return 1;
4449
        }
4450
    }
4451
    if (__get_user(env->nip, &frame->mc_gregs[TARGET_PT_NIP])
4452
        || __get_user(env->ctr, &frame->mc_gregs[TARGET_PT_CTR])
4453
        || __get_user(env->lr, &frame->mc_gregs[TARGET_PT_LNK])
4454
        || __get_user(env->xer, &frame->mc_gregs[TARGET_PT_XER]))
4455
        return 1;
4456
    if (__get_user(ccr, &frame->mc_gregs[TARGET_PT_CCR]))
4457
        return 1;
4458

    
4459
    for (i = 0; i < ARRAY_SIZE(env->crf); i++) {
4460
        env->crf[i] = (ccr >> (32 - ((i + 1) * 4))) & 0xf;
4461
    }
4462

    
4463
    if (!sig) {
4464
        env->gpr[2] = save_r2;
4465
    }
4466
    /* Restore MSR.  */
4467
    if (__get_user(msr, &frame->mc_gregs[TARGET_PT_MSR]))
4468
        return 1;
4469

    
4470
    /* If doing signal return, restore the previous little-endian mode.  */
4471
    if (sig)
4472
        env->msr = (env->msr & ~MSR_LE) | (msr & MSR_LE);
4473

    
4474
    /* Restore Altivec registers if necessary.  */
4475
    if (env->insns_flags & PPC_ALTIVEC) {
4476
        for (i = 0; i < ARRAY_SIZE(env->avr); i++) {
4477
            ppc_avr_t *avr = &env->avr[i];
4478
            ppc_avr_t *vreg = &frame->mc_vregs.altivec[i];
4479

    
4480
            if (__get_user(avr->u64[0], &vreg->u64[0]) ||
4481
                __get_user(avr->u64[1], &vreg->u64[1])) {
4482
                return 1;
4483
            }
4484
        }
4485
        /* Set MSR_VEC in the saved MSR value to indicate that
4486
           frame->mc_vregs contains valid data.  */
4487
        if (__get_user(env->spr[SPR_VRSAVE],
4488
                       (target_ulong *)(&frame->mc_vregs.altivec[32].u32[3])))
4489
            return 1;
4490
    }
4491

    
4492
    /* Restore floating point registers.  */
4493
    if (env->insns_flags & PPC_FLOAT) {
4494
        uint64_t fpscr;
4495
        for (i = 0; i < ARRAY_SIZE(env->fpr); i++) {
4496
            if (__get_user(env->fpr[i], &frame->mc_fregs[i])) {
4497
                return 1;
4498
            }
4499
        }
4500
        if (__get_user(fpscr, &frame->mc_fregs[32]))
4501
            return 1;
4502
        env->fpscr = (uint32_t) fpscr;
4503
    }
4504

    
4505
    /* Save SPE registers.  The kernel only saves the high half.  */
4506
    if (env->insns_flags & PPC_SPE) {
4507
#if defined(TARGET_PPC64)
4508
        for (i = 0; i < ARRAY_SIZE(env->gpr); i++) {
4509
            uint32_t hi;
4510

    
4511
            if (__get_user(hi, &frame->mc_vregs.spe[i])) {
4512
                return 1;
4513
            }
4514
            env->gpr[i] = ((uint64_t)hi << 32) | ((uint32_t) env->gpr[i]);
4515
        }
4516
#else
4517
        for (i = 0; i < ARRAY_SIZE(env->gprh); i++) {
4518
            if (__get_user(env->gprh[i], &frame->mc_vregs.spe[i])) {
4519
                return 1;
4520
            }
4521
        }
4522
#endif
4523
        if (__get_user(env->spe_fscr, &frame->mc_vregs.spe[32]))
4524
            return 1;
4525
    }
4526

    
4527
    return 0;
4528
}
4529

    
4530
static void setup_frame(int sig, struct target_sigaction *ka,
4531
                        target_sigset_t *set, CPUPPCState *env)
4532
{
4533
    struct target_sigframe *frame;
4534
    struct target_sigcontext *sc;
4535
    target_ulong frame_addr, newsp;
4536
    int err = 0;
4537
    int signal;
4538

    
4539
    frame_addr = get_sigframe(ka, env, sizeof(*frame));
4540
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 1))
4541
        goto sigsegv;
4542
    sc = &frame->sctx;
4543

    
4544
    signal = current_exec_domain_sig(sig);
4545

    
4546
    err |= __put_user(ka->_sa_handler, &sc->handler);
4547
    err |= __put_user(set->sig[0], &sc->oldmask);
4548
#if defined(TARGET_PPC64)
4549
    err |= __put_user(set->sig[0] >> 32, &sc->_unused[3]);
4550
#else
4551
    err |= __put_user(set->sig[1], &sc->_unused[3]);
4552
#endif
4553
    err |= __put_user(h2g(&frame->mctx), &sc->regs);
4554
    err |= __put_user(sig, &sc->signal);
4555

    
4556
    /* Save user regs.  */
4557
    err |= save_user_regs(env, &frame->mctx, TARGET_NR_sigreturn);
4558

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

    
4563
    /* Turn off all fp exceptions.  */
4564
    env->fpscr = 0;
4565

    
4566
    /* Create a stack frame for the caller of the handler.  */
4567
    newsp = frame_addr - SIGNAL_FRAMESIZE;
4568
    err |= put_user(env->gpr[1], newsp, target_ulong);
4569

    
4570
    if (err)
4571
        goto sigsegv;
4572

    
4573
    /* Set up registers for signal handler.  */
4574
    env->gpr[1] = newsp;
4575
    env->gpr[3] = signal;
4576
    env->gpr[4] = frame_addr + offsetof(struct target_sigframe, sctx);
4577
    env->nip = (target_ulong) ka->_sa_handler;
4578
    /* Signal handlers are entered in big-endian mode.  */
4579
    env->msr &= ~MSR_LE;
4580

    
4581
    unlock_user_struct(frame, frame_addr, 1);
4582
    return;
4583

    
4584
sigsegv:
4585
    unlock_user_struct(frame, frame_addr, 1);
4586
    qemu_log("segfaulting from setup_frame\n");
4587
    force_sig(TARGET_SIGSEGV);
4588
}
4589

    
4590
static void setup_rt_frame(int sig, struct target_sigaction *ka,
4591
                           target_siginfo_t *info,
4592
                           target_sigset_t *set, CPUPPCState *env)
4593
{
4594
    struct target_rt_sigframe *rt_sf;
4595
    struct target_mcontext *frame;
4596
    target_ulong rt_sf_addr, newsp = 0;
4597
    int i, err = 0;
4598
    int signal;
4599

    
4600
    rt_sf_addr = get_sigframe(ka, env, sizeof(*rt_sf));
4601
    if (!lock_user_struct(VERIFY_WRITE, rt_sf, rt_sf_addr, 1))
4602
        goto sigsegv;
4603

    
4604
    signal = current_exec_domain_sig(sig);
4605

    
4606
    err |= copy_siginfo_to_user(&rt_sf->info, info);
4607

    
4608
    err |= __put_user(0, &rt_sf->uc.tuc_flags);
4609
    err |= __put_user(0, &rt_sf->uc.tuc_link);
4610
    err |= __put_user((target_ulong)target_sigaltstack_used.ss_sp,
4611
                      &rt_sf->uc.tuc_stack.ss_sp);
4612
    err |= __put_user(sas_ss_flags(env->gpr[1]),
4613
                      &rt_sf->uc.tuc_stack.ss_flags);
4614
    err |= __put_user(target_sigaltstack_used.ss_size,
4615
                      &rt_sf->uc.tuc_stack.ss_size);
4616
    err |= __put_user(h2g (&rt_sf->uc.tuc_mcontext),
4617
                      &rt_sf->uc.tuc_regs);
4618
    for(i = 0; i < TARGET_NSIG_WORDS; i++) {
4619
        err |= __put_user(set->sig[i], &rt_sf->uc.tuc_sigmask.sig[i]);
4620
    }
4621

    
4622
    frame = &rt_sf->uc.tuc_mcontext;
4623
    err |= save_user_regs(env, frame, TARGET_NR_rt_sigreturn);
4624

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

    
4629
    /* Turn off all fp exceptions.  */
4630
    env->fpscr = 0;
4631

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

    
4636
    if (err)
4637
        goto sigsegv;
4638

    
4639
    /* Set up registers for signal handler.  */
4640
    env->gpr[1] = newsp;
4641
    env->gpr[3] = (target_ulong) signal;
4642
    env->gpr[4] = (target_ulong) h2g(&rt_sf->info);
4643
    env->gpr[5] = (target_ulong) h2g(&rt_sf->uc);
4644
    env->gpr[6] = (target_ulong) h2g(rt_sf);
4645
    env->nip = (target_ulong) ka->_sa_handler;
4646
    /* Signal handlers are entered in big-endian mode.  */
4647
    env->msr &= ~MSR_LE;
4648

    
4649
    unlock_user_struct(rt_sf, rt_sf_addr, 1);
4650
    return;
4651

    
4652
sigsegv:
4653
    unlock_user_struct(rt_sf, rt_sf_addr, 1);
4654
    qemu_log("segfaulting from setup_rt_frame\n");
4655
    force_sig(TARGET_SIGSEGV);
4656

    
4657
}
4658

    
4659
long do_sigreturn(CPUPPCState *env)
4660
{
4661
    struct target_sigcontext *sc = NULL;
4662
    struct target_mcontext *sr = NULL;
4663
    target_ulong sr_addr, sc_addr;
4664
    sigset_t blocked;
4665
    target_sigset_t set;
4666

    
4667
    sc_addr = env->gpr[1] + SIGNAL_FRAMESIZE;
4668
    if (!lock_user_struct(VERIFY_READ, sc, sc_addr, 1))
4669
        goto sigsegv;
4670

    
4671
#if defined(TARGET_PPC64)
4672
    set.sig[0] = sc->oldmask + ((long)(sc->_unused[3]) << 32);
4673
#else
4674
    if(__get_user(set.sig[0], &sc->oldmask) ||
4675
       __get_user(set.sig[1], &sc->_unused[3]))
4676
       goto sigsegv;
4677
#endif
4678
    target_to_host_sigset_internal(&blocked, &set);
4679
    sigprocmask(SIG_SETMASK, &blocked, NULL);
4680

    
4681
    if (__get_user(sr_addr, &sc->regs))
4682
        goto sigsegv;
4683
    if (!lock_user_struct(VERIFY_READ, sr, sr_addr, 1))
4684
        goto sigsegv;
4685
    if (restore_user_regs(env, sr, 1))
4686
        goto sigsegv;
4687

    
4688
    unlock_user_struct(sr, sr_addr, 1);
4689
    unlock_user_struct(sc, sc_addr, 1);
4690
    return -TARGET_QEMU_ESIGRETURN;
4691

    
4692
sigsegv:
4693
    unlock_user_struct(sr, sr_addr, 1);
4694
    unlock_user_struct(sc, sc_addr, 1);
4695
    qemu_log("segfaulting from do_sigreturn\n");
4696
    force_sig(TARGET_SIGSEGV);
4697
    return 0;
4698
}
4699

    
4700
/* See arch/powerpc/kernel/signal_32.c.  */
4701
static int do_setcontext(struct target_ucontext *ucp, CPUPPCState *env, int sig)
4702
{
4703
    struct target_mcontext *mcp;
4704
    target_ulong mcp_addr;
4705
    sigset_t blocked;
4706
    target_sigset_t set;
4707

    
4708
    if (copy_from_user(&set, h2g(ucp) + offsetof(struct target_ucontext, tuc_sigmask),
4709
                       sizeof (set)))
4710
        return 1;
4711

    
4712
#if defined(TARGET_PPC64)
4713
    fprintf (stderr, "do_setcontext: not implemented\n");
4714
    return 0;
4715
#else
4716
    if (__get_user(mcp_addr, &ucp->tuc_regs))
4717
        return 1;
4718

    
4719
    if (!lock_user_struct(VERIFY_READ, mcp, mcp_addr, 1))
4720
        return 1;
4721

    
4722
    target_to_host_sigset_internal(&blocked, &set);
4723
    sigprocmask(SIG_SETMASK, &blocked, NULL);
4724
    if (restore_user_regs(env, mcp, sig))
4725
        goto sigsegv;
4726

    
4727
    unlock_user_struct(mcp, mcp_addr, 1);
4728
    return 0;
4729

    
4730
sigsegv:
4731
    unlock_user_struct(mcp, mcp_addr, 1);
4732
    return 1;
4733
#endif
4734
}
4735

    
4736
long do_rt_sigreturn(CPUPPCState *env)
4737
{
4738
    struct target_rt_sigframe *rt_sf = NULL;
4739
    target_ulong rt_sf_addr;
4740

    
4741
    rt_sf_addr = env->gpr[1] + SIGNAL_FRAMESIZE + 16;
4742
    if (!lock_user_struct(VERIFY_READ, rt_sf, rt_sf_addr, 1))
4743
        goto sigsegv;
4744

    
4745
    if (do_setcontext(&rt_sf->uc, env, 1))
4746
        goto sigsegv;
4747

    
4748
    do_sigaltstack(rt_sf_addr
4749
                   + offsetof(struct target_rt_sigframe, uc.tuc_stack),
4750
                   0, env->gpr[1]);
4751

    
4752
    unlock_user_struct(rt_sf, rt_sf_addr, 1);
4753
    return -TARGET_QEMU_ESIGRETURN;
4754

    
4755
sigsegv:
4756
    unlock_user_struct(rt_sf, rt_sf_addr, 1);
4757
    qemu_log("segfaulting from do_rt_sigreturn\n");
4758
    force_sig(TARGET_SIGSEGV);
4759
    return 0;
4760
}
4761

    
4762
#elif defined(TARGET_M68K)
4763

    
4764
struct target_sigcontext {
4765
    abi_ulong  sc_mask;
4766
    abi_ulong  sc_usp;
4767
    abi_ulong  sc_d0;
4768
    abi_ulong  sc_d1;
4769
    abi_ulong  sc_a0;
4770
    abi_ulong  sc_a1;
4771
    unsigned short sc_sr;
4772
    abi_ulong  sc_pc;
4773
};
4774

    
4775
struct target_sigframe
4776
{
4777
    abi_ulong pretcode;
4778
    int sig;
4779
    int code;
4780
    abi_ulong psc;
4781
    char retcode[8];
4782
    abi_ulong extramask[TARGET_NSIG_WORDS-1];
4783
    struct target_sigcontext sc;
4784
};
4785
 
4786
typedef int target_greg_t;
4787
#define TARGET_NGREG 18
4788
typedef target_greg_t target_gregset_t[TARGET_NGREG];
4789

    
4790
typedef struct target_fpregset {
4791
    int f_fpcntl[3];
4792
    int f_fpregs[8*3];
4793
} target_fpregset_t;
4794

    
4795
struct target_mcontext {
4796
    int version;
4797
    target_gregset_t gregs;
4798
    target_fpregset_t fpregs;
4799
};
4800

    
4801
#define TARGET_MCONTEXT_VERSION 2
4802

    
4803
struct target_ucontext {
4804
    abi_ulong tuc_flags;
4805
    abi_ulong tuc_link;
4806
    target_stack_t tuc_stack;
4807
    struct target_mcontext tuc_mcontext;
4808
    abi_long tuc_filler[80];
4809
    target_sigset_t tuc_sigmask;
4810
};
4811

    
4812
struct target_rt_sigframe
4813
{
4814
    abi_ulong pretcode;
4815
    int sig;
4816
    abi_ulong pinfo;
4817
    abi_ulong puc;
4818
    char retcode[8];
4819
    struct target_siginfo info;
4820
    struct target_ucontext uc;
4821
};
4822

    
4823
static int
4824
setup_sigcontext(struct target_sigcontext *sc, CPUM68KState *env,
4825
                 abi_ulong mask)
4826
{
4827
    int err = 0;
4828

    
4829
    err |= __put_user(mask, &sc->sc_mask);
4830
    err |= __put_user(env->aregs[7], &sc->sc_usp);
4831
    err |= __put_user(env->dregs[0], &sc->sc_d0);
4832
    err |= __put_user(env->dregs[1], &sc->sc_d1);
4833
    err |= __put_user(env->aregs[0], &sc->sc_a0);
4834
    err |= __put_user(env->aregs[1], &sc->sc_a1);
4835
    err |= __put_user(env->sr, &sc->sc_sr);
4836
    err |= __put_user(env->pc, &sc->sc_pc);
4837

    
4838
    return err;
4839
}
4840

    
4841
static int
4842
restore_sigcontext(CPUM68KState *env, struct target_sigcontext *sc, int *pd0)
4843
{
4844
    int err = 0;
4845
    int temp;
4846

    
4847
    err |= __get_user(env->aregs[7], &sc->sc_usp);
4848
    err |= __get_user(env->dregs[1], &sc->sc_d1);
4849
    err |= __get_user(env->aregs[0], &sc->sc_a0);
4850
    err |= __get_user(env->aregs[1], &sc->sc_a1);
4851
    err |= __get_user(env->pc, &sc->sc_pc);
4852
    err |= __get_user(temp, &sc->sc_sr);
4853
    env->sr = (env->sr & 0xff00) | (temp & 0xff);
4854

    
4855
    *pd0 = tswapl(sc->sc_d0);
4856

    
4857
    return err;
4858
}
4859

    
4860
/*
4861
 * Determine which stack to use..
4862
 */
4863
static inline abi_ulong
4864
get_sigframe(struct target_sigaction *ka, CPUM68KState *regs,
4865
             size_t frame_size)
4866
{
4867
    unsigned long sp;
4868

    
4869
    sp = regs->aregs[7];
4870

    
4871
    /* This is the X/Open sanctioned signal stack switching.  */
4872
    if ((ka->sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags (sp) == 0)) {
4873
        sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
4874
    }
4875

    
4876
    return ((sp - frame_size) & -8UL);
4877
}
4878

    
4879
static void setup_frame(int sig, struct target_sigaction *ka,
4880
                        target_sigset_t *set, CPUM68KState *env)
4881
{
4882
    struct target_sigframe *frame;
4883
    abi_ulong frame_addr;
4884
    abi_ulong retcode_addr;
4885
    abi_ulong sc_addr;
4886
    int err = 0;
4887
    int i;
4888

    
4889
    frame_addr = get_sigframe(ka, env, sizeof *frame);
4890
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
4891
        goto give_sigsegv;
4892

    
4893
    err |= __put_user(sig, &frame->sig);
4894

    
4895
    sc_addr = frame_addr + offsetof(struct target_sigframe, sc);
4896
    err |= __put_user(sc_addr, &frame->psc);
4897

    
4898
    err |= setup_sigcontext(&frame->sc, env, set->sig[0]);
4899
    if (err)
4900
        goto give_sigsegv;
4901

    
4902
    for(i = 1; i < TARGET_NSIG_WORDS; i++) {
4903
        if (__put_user(set->sig[i], &frame->extramask[i - 1]))
4904
            goto give_sigsegv;
4905
    }
4906

    
4907
    /* Set up to return from userspace.  */
4908

    
4909
    retcode_addr = frame_addr + offsetof(struct target_sigframe, retcode);
4910
    err |= __put_user(retcode_addr, &frame->pretcode);
4911

    
4912
    /* moveq #,d0; trap #0 */
4913

    
4914
    err |= __put_user(0x70004e40 + (TARGET_NR_sigreturn << 16),
4915
                      (long *)(frame->retcode));
4916

    
4917
    if (err)
4918
        goto give_sigsegv;
4919

    
4920
    /* Set up to return from userspace */
4921

    
4922
    env->aregs[7] = frame_addr;
4923
    env->pc = ka->_sa_handler;
4924

    
4925
    unlock_user_struct(frame, frame_addr, 1);
4926
    return;
4927

    
4928
give_sigsegv:
4929
    unlock_user_struct(frame, frame_addr, 1);
4930
    force_sig(TARGET_SIGSEGV);
4931
}
4932

    
4933
static inline int target_rt_setup_ucontext(struct target_ucontext *uc,
4934
                                           CPUM68KState *env)
4935
{
4936
    target_greg_t *gregs = uc->tuc_mcontext.gregs;
4937
    int err;
4938

    
4939
    err = __put_user(TARGET_MCONTEXT_VERSION, &uc->tuc_mcontext.version);
4940
    err |= __put_user(env->dregs[0], &gregs[0]);
4941
    err |= __put_user(env->dregs[1], &gregs[1]);
4942
    err |= __put_user(env->dregs[2], &gregs[2]);
4943
    err |= __put_user(env->dregs[3], &gregs[3]);
4944
    err |= __put_user(env->dregs[4], &gregs[4]);
4945
    err |= __put_user(env->dregs[5], &gregs[5]);
4946
    err |= __put_user(env->dregs[6], &gregs[6]);
4947
    err |= __put_user(env->dregs[7], &gregs[7]);
4948
    err |= __put_user(env->aregs[0], &gregs[8]);
4949
    err |= __put_user(env->aregs[1], &gregs[9]);
4950
    err |= __put_user(env->aregs[2], &gregs[10]);
4951
    err |= __put_user(env->aregs[3], &gregs[11]);
4952
    err |= __put_user(env->aregs[4], &gregs[12]);
4953
    err |= __put_user(env->aregs[5], &gregs[13]);
4954
    err |= __put_user(env->aregs[6], &gregs[14]);
4955
    err |= __put_user(env->aregs[7], &gregs[15]);
4956
    err |= __put_user(env->pc, &gregs[16]);
4957
    err |= __put_user(env->sr, &gregs[17]);
4958

    
4959
    return err;
4960
}
4961
 
4962
static inline int target_rt_restore_ucontext(CPUM68KState *env,
4963
                                             struct target_ucontext *uc,
4964
                                             int *pd0)
4965
{
4966
    int temp;
4967
    int err;
4968
    target_greg_t *gregs = uc->tuc_mcontext.gregs;
4969
    
4970
    err = __get_user(temp, &uc->tuc_mcontext.version);
4971
    if (temp != TARGET_MCONTEXT_VERSION)
4972
        goto badframe;
4973

    
4974
    /* restore passed registers */
4975
    err |= __get_user(env->dregs[0], &gregs[0]);
4976
    err |= __get_user(env->dregs[1], &gregs[1]);
4977
    err |= __get_user(env->dregs[2], &gregs[2]);
4978
    err |= __get_user(env->dregs[3], &gregs[3]);
4979
    err |= __get_user(env->dregs[4], &gregs[4]);
4980
    err |= __get_user(env->dregs[5], &gregs[5]);
4981
    err |= __get_user(env->dregs[6], &gregs[6]);
4982
    err |= __get_user(env->dregs[7], &gregs[7]);
4983
    err |= __get_user(env->aregs[0], &gregs[8]);
4984
    err |= __get_user(env->aregs[1], &gregs[9]);
4985
    err |= __get_user(env->aregs[2], &gregs[10]);
4986
    err |= __get_user(env->aregs[3], &gregs[11]);
4987
    err |= __get_user(env->aregs[4], &gregs[12]);
4988
    err |= __get_user(env->aregs[5], &gregs[13]);
4989
    err |= __get_user(env->aregs[6], &gregs[14]);
4990
    err |= __get_user(env->aregs[7], &gregs[15]);
4991
    err |= __get_user(env->pc, &gregs[16]);
4992
    err |= __get_user(temp, &gregs[17]);
4993
    env->sr = (env->sr & 0xff00) | (temp & 0xff);
4994

    
4995
    *pd0 = env->dregs[0];
4996
    return err;
4997

    
4998
badframe:
4999
    return 1;
5000
}
5001

    
5002
static void setup_rt_frame(int sig, struct target_sigaction *ka,
5003
                           target_siginfo_t *info,
5004
                           target_sigset_t *set, CPUM68KState *env)
5005
{
5006
    struct target_rt_sigframe *frame;
5007
    abi_ulong frame_addr;
5008
    abi_ulong retcode_addr;
5009
    abi_ulong info_addr;
5010
    abi_ulong uc_addr;
5011
    int err = 0;
5012
    int i;
5013

    
5014
    frame_addr = get_sigframe(ka, env, sizeof *frame);
5015
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
5016
        goto give_sigsegv;
5017

    
5018
    err |= __put_user(sig, &frame->sig);
5019

    
5020
    info_addr = frame_addr + offsetof(struct target_rt_sigframe, info);
5021
    err |= __put_user(info_addr, &frame->pinfo);
5022

    
5023
    uc_addr = frame_addr + offsetof(struct target_rt_sigframe, uc);
5024
    err |= __put_user(uc_addr, &frame->puc);
5025

    
5026
    err |= copy_siginfo_to_user(&frame->info, info);
5027

    
5028
    /* Create the ucontext */
5029

    
5030
    err |= __put_user(0, &frame->uc.tuc_flags);
5031
    err |= __put_user(0, &frame->uc.tuc_link);
5032
    err |= __put_user(target_sigaltstack_used.ss_sp,
5033
                      &frame->uc.tuc_stack.ss_sp);
5034
    err |= __put_user(sas_ss_flags(env->aregs[7]),
5035
                      &frame->uc.tuc_stack.ss_flags);
5036
    err |= __put_user(target_sigaltstack_used.ss_size,
5037
                      &frame->uc.tuc_stack.ss_size);
5038
    err |= target_rt_setup_ucontext(&frame->uc, env);
5039

    
5040
    if (err)
5041
            goto give_sigsegv;
5042

    
5043
    for(i = 0; i < TARGET_NSIG_WORDS; i++) {
5044
        if (__put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]))
5045
            goto give_sigsegv;
5046
    }
5047

    
5048
    /* Set up to return from userspace.  */
5049

    
5050
    retcode_addr = frame_addr + offsetof(struct target_sigframe, retcode);
5051
    err |= __put_user(retcode_addr, &frame->pretcode);
5052

    
5053
    /* moveq #,d0; notb d0; trap #0 */
5054

    
5055
    err |= __put_user(0x70004600 + ((TARGET_NR_rt_sigreturn ^ 0xff) << 16),
5056
                      (long *)(frame->retcode + 0));
5057
    err |= __put_user(0x4e40, (short *)(frame->retcode + 4));
5058

    
5059
    if (err)
5060
        goto give_sigsegv;
5061

    
5062
    /* Set up to return from userspace */
5063

    
5064
    env->aregs[7] = frame_addr;
5065
    env->pc = ka->_sa_handler;
5066

    
5067
    unlock_user_struct(frame, frame_addr, 1);
5068
    return;
5069

    
5070
give_sigsegv:
5071
    unlock_user_struct(frame, frame_addr, 1);
5072
    force_sig(TARGET_SIGSEGV);
5073
}
5074

    
5075
long do_sigreturn(CPUM68KState *env)
5076
{
5077
    struct target_sigframe *frame;
5078
    abi_ulong frame_addr = env->aregs[7] - 4;
5079
    target_sigset_t target_set;
5080
    sigset_t set;
5081
    int d0, i;
5082

    
5083
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
5084
        goto badframe;
5085

    
5086
    /* set blocked signals */
5087

    
5088
    if (__get_user(target_set.sig[0], &frame->sc.sc_mask))
5089
        goto badframe;
5090

    
5091
    for(i = 1; i < TARGET_NSIG_WORDS; i++) {
5092
        if (__get_user(target_set.sig[i], &frame->extramask[i - 1]))
5093
            goto badframe;
5094
    }
5095

    
5096
    target_to_host_sigset_internal(&set, &target_set);
5097
    sigprocmask(SIG_SETMASK, &set, NULL);
5098

    
5099
    /* restore registers */
5100

    
5101
    if (restore_sigcontext(env, &frame->sc, &d0))
5102
        goto badframe;
5103

    
5104
    unlock_user_struct(frame, frame_addr, 0);
5105
    return d0;
5106

    
5107
badframe:
5108
    unlock_user_struct(frame, frame_addr, 0);
5109
    force_sig(TARGET_SIGSEGV);
5110
    return 0;
5111
}
5112

    
5113
long do_rt_sigreturn(CPUM68KState *env)
5114
{
5115
    struct target_rt_sigframe *frame;
5116
    abi_ulong frame_addr = env->aregs[7] - 4;
5117
    target_sigset_t target_set;
5118
    sigset_t set;
5119
    int d0;
5120

    
5121
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
5122
        goto badframe;
5123

    
5124
    target_to_host_sigset_internal(&set, &target_set);
5125
    sigprocmask(SIG_SETMASK, &set, NULL);
5126

    
5127
    /* restore registers */
5128

    
5129
    if (target_rt_restore_ucontext(env, &frame->uc, &d0))
5130
        goto badframe;
5131

    
5132
    if (do_sigaltstack(frame_addr +
5133
                       offsetof(struct target_rt_sigframe, uc.tuc_stack),
5134
                       0, get_sp_from_cpustate(env)) == -EFAULT)
5135
        goto badframe;
5136

    
5137
    unlock_user_struct(frame, frame_addr, 0);
5138
    return d0;
5139

    
5140
badframe:
5141
    unlock_user_struct(frame, frame_addr, 0);
5142
    force_sig(TARGET_SIGSEGV);
5143
    return 0;
5144
}
5145

    
5146
#elif defined(TARGET_ALPHA)
5147

    
5148
struct target_sigcontext {
5149
    abi_long sc_onstack;
5150
    abi_long sc_mask;
5151
    abi_long sc_pc;
5152
    abi_long sc_ps;
5153
    abi_long sc_regs[32];
5154
    abi_long sc_ownedfp;
5155
    abi_long sc_fpregs[32];
5156
    abi_ulong sc_fpcr;
5157
    abi_ulong sc_fp_control;
5158
    abi_ulong sc_reserved1;
5159
    abi_ulong sc_reserved2;
5160
    abi_ulong sc_ssize;
5161
    abi_ulong sc_sbase;
5162
    abi_ulong sc_traparg_a0;
5163
    abi_ulong sc_traparg_a1;
5164
    abi_ulong sc_traparg_a2;
5165
    abi_ulong sc_fp_trap_pc;
5166
    abi_ulong sc_fp_trigger_sum;
5167
    abi_ulong sc_fp_trigger_inst;
5168
};
5169

    
5170
struct target_ucontext {
5171
    abi_ulong tuc_flags;
5172
    abi_ulong tuc_link;
5173
    abi_ulong tuc_osf_sigmask;
5174
    target_stack_t tuc_stack;
5175
    struct target_sigcontext tuc_mcontext;
5176
    target_sigset_t tuc_sigmask;
5177
};
5178

    
5179
struct target_sigframe {
5180
    struct target_sigcontext sc;
5181
    unsigned int retcode[3];
5182
};
5183

    
5184
struct target_rt_sigframe {
5185
    target_siginfo_t info;
5186
    struct target_ucontext uc;
5187
    unsigned int retcode[3];
5188
};
5189

    
5190
#define INSN_MOV_R30_R16        0x47fe0410
5191
#define INSN_LDI_R0             0x201f0000
5192
#define INSN_CALLSYS            0x00000083
5193

    
5194
static int setup_sigcontext(struct target_sigcontext *sc, CPUAlphaState *env,
5195
                            abi_ulong frame_addr, target_sigset_t *set)
5196
{
5197
    int i, err = 0;
5198

    
5199
    err |= __put_user(on_sig_stack(frame_addr), &sc->sc_onstack);
5200
    err |= __put_user(set->sig[0], &sc->sc_mask);
5201
    err |= __put_user(env->pc, &sc->sc_pc);
5202
    err |= __put_user(8, &sc->sc_ps);
5203

    
5204
    for (i = 0; i < 31; ++i) {
5205
        err |= __put_user(env->ir[i], &sc->sc_regs[i]);
5206
    }
5207
    err |= __put_user(0, &sc->sc_regs[31]);
5208

    
5209
    for (i = 0; i < 31; ++i) {
5210
        err |= __put_user(env->fir[i], &sc->sc_fpregs[i]);
5211
    }
5212
    err |= __put_user(0, &sc->sc_fpregs[31]);
5213
    err |= __put_user(cpu_alpha_load_fpcr(env), &sc->sc_fpcr);
5214

    
5215
    err |= __put_user(0, &sc->sc_traparg_a0); /* FIXME */
5216
    err |= __put_user(0, &sc->sc_traparg_a1); /* FIXME */
5217
    err |= __put_user(0, &sc->sc_traparg_a2); /* FIXME */
5218

    
5219
    return err;
5220
}
5221

    
5222
static int restore_sigcontext(CPUAlphaState *env,
5223
                              struct target_sigcontext *sc)
5224
{
5225
    uint64_t fpcr;
5226
    int i, err = 0;
5227

    
5228
    err |= __get_user(env->pc, &sc->sc_pc);
5229

    
5230
    for (i = 0; i < 31; ++i) {
5231
        err |= __get_user(env->ir[i], &sc->sc_regs[i]);
5232
    }
5233
    for (i = 0; i < 31; ++i) {
5234
        err |= __get_user(env->fir[i], &sc->sc_fpregs[i]);
5235
    }
5236

    
5237
    err |= __get_user(fpcr, &sc->sc_fpcr);
5238
    cpu_alpha_store_fpcr(env, fpcr);
5239

    
5240
    return err;
5241
}
5242

    
5243
static inline abi_ulong get_sigframe(struct target_sigaction *sa,
5244
                                     CPUAlphaState *env,
5245
                                     unsigned long framesize)
5246
{
5247
    abi_ulong sp = env->ir[IR_SP];
5248

    
5249
    /* This is the X/Open sanctioned signal stack switching.  */
5250
    if ((sa->sa_flags & TARGET_SA_ONSTACK) != 0 && !sas_ss_flags(sp)) {
5251
        sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
5252
    }
5253
    return (sp - framesize) & -32;
5254
}
5255

    
5256
static void setup_frame(int sig, struct target_sigaction *ka,
5257
                        target_sigset_t *set, CPUAlphaState *env)
5258
{
5259
    abi_ulong frame_addr, r26;
5260
    struct target_sigframe *frame;
5261
    int err = 0;
5262

    
5263
    frame_addr = get_sigframe(ka, env, sizeof(*frame));
5264
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) {
5265
        goto give_sigsegv;
5266
    }
5267

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

    
5270
    if (ka->sa_restorer) {
5271
        r26 = ka->sa_restorer;
5272
    } else {
5273
        err |= __put_user(INSN_MOV_R30_R16, &frame->retcode[0]);
5274
        err |= __put_user(INSN_LDI_R0 + TARGET_NR_sigreturn,
5275
                          &frame->retcode[1]);
5276
        err |= __put_user(INSN_CALLSYS, &frame->retcode[2]);
5277
        /* imb() */
5278
        r26 = frame_addr;
5279
    }
5280

    
5281
    unlock_user_struct(frame, frame_addr, 1);
5282

    
5283
    if (err) {
5284
    give_sigsegv:
5285
        if (sig == TARGET_SIGSEGV) {
5286
            ka->_sa_handler = TARGET_SIG_DFL;
5287
        }
5288
        force_sig(TARGET_SIGSEGV);
5289
    }
5290

    
5291
    env->ir[IR_RA] = r26;
5292
    env->ir[IR_PV] = env->pc = ka->_sa_handler;
5293
    env->ir[IR_A0] = sig;
5294
    env->ir[IR_A1] = 0;
5295
    env->ir[IR_A2] = frame_addr + offsetof(struct target_sigframe, sc);
5296
    env->ir[IR_SP] = frame_addr;
5297
}
5298

    
5299
static void setup_rt_frame(int sig, struct target_sigaction *ka,
5300
                           target_siginfo_t *info,
5301
                           target_sigset_t *set, CPUAlphaState *env)
5302
{
5303
    abi_ulong frame_addr, r26;
5304
    struct target_rt_sigframe *frame;
5305
    int i, err = 0;
5306

    
5307
    frame_addr = get_sigframe(ka, env, sizeof(*frame));
5308
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) {
5309
        goto give_sigsegv;
5310
    }
5311

    
5312
    err |= copy_siginfo_to_user(&frame->info, info);
5313

    
5314
    err |= __put_user(0, &frame->uc.tuc_flags);
5315
    err |= __put_user(0, &frame->uc.tuc_link);
5316
    err |= __put_user(set->sig[0], &frame->uc.tuc_osf_sigmask);
5317
    err |= __put_user(target_sigaltstack_used.ss_sp,
5318
                      &frame->uc.tuc_stack.ss_sp);
5319
    err |= __put_user(sas_ss_flags(env->ir[IR_SP]),
5320
                      &frame->uc.tuc_stack.ss_flags);
5321
    err |= __put_user(target_sigaltstack_used.ss_size,
5322
                      &frame->uc.tuc_stack.ss_size);
5323
    err |= setup_sigcontext(&frame->uc.tuc_mcontext, env, frame_addr, set);
5324
    for (i = 0; i < TARGET_NSIG_WORDS; ++i) {
5325
        err |= __put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]);
5326
    }
5327

    
5328
    if (ka->sa_restorer) {
5329
        r26 = ka->sa_restorer;
5330
    } else {
5331
        err |= __put_user(INSN_MOV_R30_R16, &frame->retcode[0]);
5332
        err |= __put_user(INSN_LDI_R0 + TARGET_NR_rt_sigreturn,
5333
                          &frame->retcode[1]);
5334
        err |= __put_user(INSN_CALLSYS, &frame->retcode[2]);
5335
        /* imb(); */
5336
        r26 = frame_addr;
5337
    }
5338

    
5339
    if (err) {
5340
    give_sigsegv:
5341
       if (sig == TARGET_SIGSEGV) {
5342
            ka->_sa_handler = TARGET_SIG_DFL;
5343
        }
5344
        force_sig(TARGET_SIGSEGV);
5345
    }
5346

    
5347
    env->ir[IR_RA] = r26;
5348
    env->ir[IR_PV] = env->pc = ka->_sa_handler;
5349
    env->ir[IR_A0] = sig;
5350
    env->ir[IR_A1] = frame_addr + offsetof(struct target_rt_sigframe, info);
5351
    env->ir[IR_A2] = frame_addr + offsetof(struct target_rt_sigframe, uc);
5352
    env->ir[IR_SP] = frame_addr;
5353
}
5354

    
5355
long do_sigreturn(CPUAlphaState *env)
5356
{
5357
    struct target_sigcontext *sc;
5358
    abi_ulong sc_addr = env->ir[IR_A0];
5359
    target_sigset_t target_set;
5360
    sigset_t set;
5361

    
5362
    if (!lock_user_struct(VERIFY_READ, sc, sc_addr, 1)) {
5363
        goto badframe;
5364
    }
5365

    
5366
    target_sigemptyset(&target_set);
5367
    if (__get_user(target_set.sig[0], &sc->sc_mask)) {
5368
        goto badframe;
5369
    }
5370

    
5371
    target_to_host_sigset_internal(&set, &target_set);
5372
    sigprocmask(SIG_SETMASK, &set, NULL);
5373

    
5374
    if (restore_sigcontext(env, sc)) {
5375
        goto badframe;
5376
    }
5377
    unlock_user_struct(sc, sc_addr, 0);
5378
    return env->ir[IR_V0];
5379

    
5380
 badframe:
5381
    unlock_user_struct(sc, sc_addr, 0);
5382
    force_sig(TARGET_SIGSEGV);
5383
}
5384

    
5385
long do_rt_sigreturn(CPUAlphaState *env)
5386
{
5387
    abi_ulong frame_addr = env->ir[IR_A0];
5388
    struct target_rt_sigframe *frame;
5389
    sigset_t set;
5390

    
5391
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) {
5392
        goto badframe;
5393
    }
5394
    target_to_host_sigset(&set, &frame->uc.tuc_sigmask);
5395
    sigprocmask(SIG_SETMASK, &set, NULL);
5396

    
5397
    if (restore_sigcontext(env, &frame->uc.tuc_mcontext)) {
5398
        goto badframe;
5399
    }
5400
    if (do_sigaltstack(frame_addr + offsetof(struct target_rt_sigframe,
5401
                                             uc.tuc_stack),
5402
                       0, env->ir[IR_SP]) == -EFAULT) {
5403
        goto badframe;
5404
    }
5405

    
5406
    unlock_user_struct(frame, frame_addr, 0);
5407
    return env->ir[IR_V0];
5408

    
5409

    
5410
 badframe:
5411
    unlock_user_struct(frame, frame_addr, 0);
5412
    force_sig(TARGET_SIGSEGV);
5413
}
5414

    
5415
#else
5416

    
5417
static void setup_frame(int sig, struct target_sigaction *ka,
5418
                        target_sigset_t *set, CPUArchState *env)
5419
{
5420
    fprintf(stderr, "setup_frame: not implemented\n");
5421
}
5422

    
5423
static void setup_rt_frame(int sig, struct target_sigaction *ka,
5424
                           target_siginfo_t *info,
5425
                           target_sigset_t *set, CPUArchState *env)
5426
{
5427
    fprintf(stderr, "setup_rt_frame: not implemented\n");
5428
}
5429

    
5430
long do_sigreturn(CPUArchState *env)
5431
{
5432
    fprintf(stderr, "do_sigreturn: not implemented\n");
5433
    return -TARGET_ENOSYS;
5434
}
5435

    
5436
long do_rt_sigreturn(CPUArchState *env)
5437
{
5438
    fprintf(stderr, "do_rt_sigreturn: not implemented\n");
5439
    return -TARGET_ENOSYS;
5440
}
5441

    
5442
#endif
5443

    
5444
void process_pending_signals(CPUArchState *cpu_env)
5445
{
5446
    int sig;
5447
    abi_ulong handler;
5448
    sigset_t set, old_set;
5449
    target_sigset_t target_old_set;
5450
    struct emulated_sigtable *k;
5451
    struct target_sigaction *sa;
5452
    struct sigqueue *q;
5453
    TaskState *ts = cpu_env->opaque;
5454

    
5455
    if (!ts->signal_pending)
5456
        return;
5457

    
5458
    /* FIXME: This is not threadsafe.  */
5459
    k = ts->sigtab;
5460
    for(sig = 1; sig <= TARGET_NSIG; sig++) {
5461
        if (k->pending)
5462
            goto handle_signal;
5463
        k++;
5464
    }
5465
    /* if no signal is pending, just return */
5466
    ts->signal_pending = 0;
5467
    return;
5468

    
5469
 handle_signal:
5470
#ifdef DEBUG_SIGNAL
5471
    fprintf(stderr, "qemu: process signal %d\n", sig);
5472
#endif
5473
    /* dequeue signal */
5474
    q = k->first;
5475
    k->first = q->next;
5476
    if (!k->first)
5477
        k->pending = 0;
5478

    
5479
    sig = gdb_handlesig (cpu_env, sig);
5480
    if (!sig) {
5481
        sa = NULL;
5482
        handler = TARGET_SIG_IGN;
5483
    } else {
5484
        sa = &sigact_table[sig - 1];
5485
        handler = sa->_sa_handler;
5486
    }
5487

    
5488
    if (handler == TARGET_SIG_DFL) {
5489
        /* default handler : ignore some signal. The other are job control or fatal */
5490
        if (sig == TARGET_SIGTSTP || sig == TARGET_SIGTTIN || sig == TARGET_SIGTTOU) {
5491
            kill(getpid(),SIGSTOP);
5492
        } else if (sig != TARGET_SIGCHLD &&
5493
                   sig != TARGET_SIGURG &&
5494
                   sig != TARGET_SIGWINCH &&
5495
                   sig != TARGET_SIGCONT) {
5496
            force_sig(sig);
5497
        }
5498
    } else if (handler == TARGET_SIG_IGN) {
5499
        /* ignore sig */
5500
    } else if (handler == TARGET_SIG_ERR) {
5501
        force_sig(sig);
5502
    } else {
5503
        /* compute the blocked signals during the handler execution */
5504
        target_to_host_sigset(&set, &sa->sa_mask);
5505
        /* SA_NODEFER indicates that the current signal should not be
5506
           blocked during the handler */
5507
        if (!(sa->sa_flags & TARGET_SA_NODEFER))
5508
            sigaddset(&set, target_to_host_signal(sig));
5509

    
5510
        /* block signals in the handler using Linux */
5511
        sigprocmask(SIG_BLOCK, &set, &old_set);
5512
        /* save the previous blocked signal state to restore it at the
5513
           end of the signal execution (see do_sigreturn) */
5514
        host_to_target_sigset_internal(&target_old_set, &old_set);
5515

    
5516
        /* if the CPU is in VM86 mode, we restore the 32 bit values */
5517
#if defined(TARGET_I386) && !defined(TARGET_X86_64)
5518
        {
5519
            CPUX86State *env = cpu_env;
5520
            if (env->eflags & VM_MASK)
5521
                save_v86_state(env);
5522
        }
5523
#endif
5524
        /* prepare the stack frame of the virtual CPU */
5525
#if defined(TARGET_ABI_MIPSN32) || defined(TARGET_ABI_MIPSN64)
5526
        /* These targets do not have traditional signals.  */
5527
        setup_rt_frame(sig, sa, &q->info, &target_old_set, cpu_env);
5528
#else
5529
        if (sa->sa_flags & TARGET_SA_SIGINFO)
5530
            setup_rt_frame(sig, sa, &q->info, &target_old_set, cpu_env);
5531
        else
5532
            setup_frame(sig, sa, &target_old_set, cpu_env);
5533
#endif
5534
        if (sa->sa_flags & TARGET_SA_RESETHAND)
5535
            sa->_sa_handler = TARGET_SIG_DFL;
5536
    }
5537
    if (q != &k->info)
5538
        free_sigqueue(cpu_env, q);
5539
}