Statistics
| Branch: | Revision:

root / linux-user / signal.c @ 2c3c6689

History | View | Annotate | Download (162.5 kB)

1
/*
2
 *  Emulation of Linux signals
3
 *
4
 *  Copyright (c) 2003 Fabrice Bellard
5
 *
6
 *  This program is free software; you can redistribute it and/or modify
7
 *  it under the terms of the GNU General Public License as published by
8
 *  the Free Software Foundation; either version 2 of the License, or
9
 *  (at your option) any later version.
10
 *
11
 *  This program is distributed in the hope that it will be useful,
12
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 *  GNU General Public License for more details.
15
 *
16
 *  You should have received a copy of the GNU General Public License
17
 *  along with this program; if not, see <http://www.gnu.org/licenses/>.
18
 */
19
#include <stdlib.h>
20
#include <stdio.h>
21
#include <string.h>
22
#include <stdarg.h>
23
#include <unistd.h>
24
#include <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_ABI_MIPSO32)
2442

    
2443
struct target_sigcontext {
2444
    uint32_t   sc_regmask;     /* Unused */
2445
    uint32_t   sc_status;
2446
    uint64_t   sc_pc;
2447
    uint64_t   sc_regs[32];
2448
    uint64_t   sc_fpregs[32];
2449
    uint32_t   sc_ownedfp;     /* Unused */
2450
    uint32_t   sc_fpc_csr;
2451
    uint32_t   sc_fpc_eir;     /* Unused */
2452
    uint32_t   sc_used_math;
2453
    uint32_t   sc_dsp;         /* dsp status, was sc_ssflags */
2454
    uint32_t   pad0;
2455
    uint64_t   sc_mdhi;
2456
    uint64_t   sc_mdlo;
2457
    target_ulong   sc_hi1;         /* Was sc_cause */
2458
    target_ulong   sc_lo1;         /* Was sc_badvaddr */
2459
    target_ulong   sc_hi2;         /* Was sc_sigset[4] */
2460
    target_ulong   sc_lo2;
2461
    target_ulong   sc_hi3;
2462
    target_ulong   sc_lo3;
2463
};
2464

    
2465
struct sigframe {
2466
    uint32_t sf_ass[4];                        /* argument save space for o32 */
2467
    uint32_t sf_code[2];                        /* signal trampoline */
2468
    struct target_sigcontext sf_sc;
2469
    target_sigset_t sf_mask;
2470
};
2471

    
2472
struct target_ucontext {
2473
    target_ulong tuc_flags;
2474
    target_ulong tuc_link;
2475
    target_stack_t tuc_stack;
2476
    target_ulong pad0;
2477
    struct target_sigcontext tuc_mcontext;
2478
    target_sigset_t tuc_sigmask;
2479
};
2480

    
2481
struct target_rt_sigframe {
2482
    uint32_t rs_ass[4];               /* argument save space for o32 */
2483
    uint32_t rs_code[2];              /* signal trampoline */
2484
    struct target_siginfo rs_info;
2485
    struct target_ucontext rs_uc;
2486
};
2487

    
2488
/* Install trampoline to jump back from signal handler */
2489
static inline int install_sigtramp(unsigned int *tramp,   unsigned int syscall)
2490
{
2491
    int err;
2492

    
2493
    /*
2494
    * Set up the return code ...
2495
    *
2496
    *         li      v0, __NR__foo_sigreturn
2497
    *         syscall
2498
    */
2499

    
2500
    err = __put_user(0x24020000 + syscall, tramp + 0);
2501
    err |= __put_user(0x0000000c          , tramp + 1);
2502
    /* flush_cache_sigtramp((unsigned long) tramp); */
2503
    return err;
2504
}
2505

    
2506
static inline int
2507
setup_sigcontext(CPUMIPSState *regs, struct target_sigcontext *sc)
2508
{
2509
    int err = 0;
2510

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

    
2513
#define save_gp_reg(i) do {                                                   \
2514
        err |= __put_user(regs->active_tc.gpr[i], &sc->sc_regs[i]);        \
2515
    } while(0)
2516
    __put_user(0, &sc->sc_regs[0]); save_gp_reg(1); save_gp_reg(2);
2517
    save_gp_reg(3); save_gp_reg(4); save_gp_reg(5); save_gp_reg(6);
2518
    save_gp_reg(7); save_gp_reg(8); save_gp_reg(9); save_gp_reg(10);
2519
    save_gp_reg(11); save_gp_reg(12); save_gp_reg(13); save_gp_reg(14);
2520
    save_gp_reg(15); save_gp_reg(16); save_gp_reg(17); save_gp_reg(18);
2521
    save_gp_reg(19); save_gp_reg(20); save_gp_reg(21); save_gp_reg(22);
2522
    save_gp_reg(23); save_gp_reg(24); save_gp_reg(25); save_gp_reg(26);
2523
    save_gp_reg(27); save_gp_reg(28); save_gp_reg(29); save_gp_reg(30);
2524
    save_gp_reg(31);
2525
#undef save_gp_reg
2526

    
2527
    err |= __put_user(regs->active_tc.HI[0], &sc->sc_mdhi);
2528
    err |= __put_user(regs->active_tc.LO[0], &sc->sc_mdlo);
2529

    
2530
    /* Not used yet, but might be useful if we ever have DSP suppport */
2531
#if 0
2532
    if (cpu_has_dsp) {
2533
        err |= __put_user(mfhi1(), &sc->sc_hi1);
2534
        err |= __put_user(mflo1(), &sc->sc_lo1);
2535
        err |= __put_user(mfhi2(), &sc->sc_hi2);
2536
        err |= __put_user(mflo2(), &sc->sc_lo2);
2537
        err |= __put_user(mfhi3(), &sc->sc_hi3);
2538
        err |= __put_user(mflo3(), &sc->sc_lo3);
2539
        err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp);
2540
    }
2541
    /* same with 64 bit */
2542
#ifdef CONFIG_64BIT
2543
    err |= __put_user(regs->hi, &sc->sc_hi[0]);
2544
    err |= __put_user(regs->lo, &sc->sc_lo[0]);
2545
    if (cpu_has_dsp) {
2546
        err |= __put_user(mfhi1(), &sc->sc_hi[1]);
2547
        err |= __put_user(mflo1(), &sc->sc_lo[1]);
2548
        err |= __put_user(mfhi2(), &sc->sc_hi[2]);
2549
        err |= __put_user(mflo2(), &sc->sc_lo[2]);
2550
        err |= __put_user(mfhi3(), &sc->sc_hi[3]);
2551
        err |= __put_user(mflo3(), &sc->sc_lo[3]);
2552
        err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp);
2553
    }
2554
#endif
2555
#endif
2556

    
2557
#if 0
2558
    err |= __put_user(!!used_math(), &sc->sc_used_math);
2559

2560
    if (!used_math())
2561
        goto out;
2562

2563
    /*
2564
    * Save FPU state to signal context.  Signal handler will "inherit"
2565
    * current FPU state.
2566
    */
2567
    preempt_disable();
2568

2569
    if (!is_fpu_owner()) {
2570
        own_fpu();
2571
        restore_fp(current);
2572
    }
2573
    err |= save_fp_context(sc);
2574

2575
    preempt_enable();
2576
    out:
2577
#endif
2578
    return err;
2579
}
2580

    
2581
static inline int
2582
restore_sigcontext(CPUMIPSState *regs, struct target_sigcontext *sc)
2583
{
2584
    int err = 0;
2585

    
2586
    err |= __get_user(regs->CP0_EPC, &sc->sc_pc);
2587

    
2588
    err |= __get_user(regs->active_tc.HI[0], &sc->sc_mdhi);
2589
    err |= __get_user(regs->active_tc.LO[0], &sc->sc_mdlo);
2590

    
2591
#define restore_gp_reg(i) do {                                                           \
2592
        err |= __get_user(regs->active_tc.gpr[i], &sc->sc_regs[i]);                \
2593
    } while(0)
2594
    restore_gp_reg( 1); restore_gp_reg( 2); restore_gp_reg( 3);
2595
    restore_gp_reg( 4); restore_gp_reg( 5); restore_gp_reg( 6);
2596
    restore_gp_reg( 7); restore_gp_reg( 8); restore_gp_reg( 9);
2597
    restore_gp_reg(10); restore_gp_reg(11); restore_gp_reg(12);
2598
    restore_gp_reg(13); restore_gp_reg(14); restore_gp_reg(15);
2599
    restore_gp_reg(16); restore_gp_reg(17); restore_gp_reg(18);
2600
    restore_gp_reg(19); restore_gp_reg(20); restore_gp_reg(21);
2601
    restore_gp_reg(22); restore_gp_reg(23); restore_gp_reg(24);
2602
    restore_gp_reg(25); restore_gp_reg(26); restore_gp_reg(27);
2603
    restore_gp_reg(28); restore_gp_reg(29); restore_gp_reg(30);
2604
    restore_gp_reg(31);
2605
#undef restore_gp_reg
2606

    
2607
#if 0
2608
    if (cpu_has_dsp) {
2609
        err |= __get_user(treg, &sc->sc_hi1); mthi1(treg);
2610
        err |= __get_user(treg, &sc->sc_lo1); mtlo1(treg);
2611
        err |= __get_user(treg, &sc->sc_hi2); mthi2(treg);
2612
        err |= __get_user(treg, &sc->sc_lo2); mtlo2(treg);
2613
        err |= __get_user(treg, &sc->sc_hi3); mthi3(treg);
2614
        err |= __get_user(treg, &sc->sc_lo3); mtlo3(treg);
2615
        err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK);
2616
    }
2617
#ifdef CONFIG_64BIT
2618
    err |= __get_user(regs->hi, &sc->sc_hi[0]);
2619
    err |= __get_user(regs->lo, &sc->sc_lo[0]);
2620
    if (cpu_has_dsp) {
2621
        err |= __get_user(treg, &sc->sc_hi[1]); mthi1(treg);
2622
        err |= __get_user(treg, &sc->sc_lo[1]); mthi1(treg);
2623
        err |= __get_user(treg, &sc->sc_hi[2]); mthi2(treg);
2624
        err |= __get_user(treg, &sc->sc_lo[2]); mthi2(treg);
2625
        err |= __get_user(treg, &sc->sc_hi[3]); mthi3(treg);
2626
        err |= __get_user(treg, &sc->sc_lo[3]); mthi3(treg);
2627
        err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK);
2628
    }
2629
#endif
2630

    
2631
    err |= __get_user(used_math, &sc->sc_used_math);
2632
    conditional_used_math(used_math);
2633

    
2634
    preempt_disable();
2635

    
2636
    if (used_math()) {
2637
        /* restore fpu context if we have used it before */
2638
        own_fpu();
2639
        err |= restore_fp_context(sc);
2640
    } else {
2641
        /* signal handler may have used FPU.  Give it up. */
2642
        lose_fpu();
2643
    }
2644

    
2645
    preempt_enable();
2646
#endif
2647
    return err;
2648
}
2649
/*
2650
 * Determine which stack to use..
2651
 */
2652
static inline abi_ulong
2653
get_sigframe(struct target_sigaction *ka, CPUMIPSState *regs, size_t frame_size)
2654
{
2655
    unsigned long sp;
2656

    
2657
    /* Default to using normal stack */
2658
    sp = regs->active_tc.gpr[29];
2659

    
2660
    /*
2661
     * FPU emulator may have its own trampoline active just
2662
     * above the user stack, 16-bytes before the next lowest
2663
     * 16 byte boundary.  Try to avoid trashing it.
2664
     */
2665
    sp -= 32;
2666

    
2667
    /* This is the X/Open sanctioned signal stack switching.  */
2668
    if ((ka->sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags (sp) == 0)) {
2669
        sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
2670
    }
2671

    
2672
    return (sp - frame_size) & ~7;
2673
}
2674

    
2675
/* compare linux/arch/mips/kernel/signal.c:setup_frame() */
2676
static void setup_frame(int sig, struct target_sigaction * ka,
2677
                        target_sigset_t *set, CPUMIPSState *regs)
2678
{
2679
    struct sigframe *frame;
2680
    abi_ulong frame_addr;
2681
    int i;
2682

    
2683
    frame_addr = get_sigframe(ka, regs, sizeof(*frame));
2684
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
2685
        goto give_sigsegv;
2686

    
2687
    install_sigtramp(frame->sf_code, TARGET_NR_sigreturn);
2688

    
2689
    if(setup_sigcontext(regs, &frame->sf_sc))
2690
        goto give_sigsegv;
2691

    
2692
    for(i = 0; i < TARGET_NSIG_WORDS; i++) {
2693
        if(__put_user(set->sig[i], &frame->sf_mask.sig[i]))
2694
            goto give_sigsegv;
2695
    }
2696

    
2697
    /*
2698
    * Arguments to signal handler:
2699
    *
2700
    *   a0 = signal number
2701
    *   a1 = 0 (should be cause)
2702
    *   a2 = pointer to struct sigcontext
2703
    *
2704
    * $25 and PC point to the signal handler, $29 points to the
2705
    * struct sigframe.
2706
    */
2707
    regs->active_tc.gpr[ 4] = sig;
2708
    regs->active_tc.gpr[ 5] = 0;
2709
    regs->active_tc.gpr[ 6] = frame_addr + offsetof(struct sigframe, sf_sc);
2710
    regs->active_tc.gpr[29] = frame_addr;
2711
    regs->active_tc.gpr[31] = frame_addr + offsetof(struct sigframe, sf_code);
2712
    /* The original kernel code sets CP0_EPC to the handler
2713
    * since it returns to userland using eret
2714
    * we cannot do this here, and we must set PC directly */
2715
    regs->active_tc.PC = regs->active_tc.gpr[25] = ka->_sa_handler;
2716
    unlock_user_struct(frame, frame_addr, 1);
2717
    return;
2718

    
2719
give_sigsegv:
2720
    unlock_user_struct(frame, frame_addr, 1);
2721
    force_sig(TARGET_SIGSEGV/*, current*/);
2722
}
2723

    
2724
long do_sigreturn(CPUMIPSState *regs)
2725
{
2726
    struct sigframe *frame;
2727
    abi_ulong frame_addr;
2728
    sigset_t blocked;
2729
    target_sigset_t target_set;
2730
    int i;
2731

    
2732
#if defined(DEBUG_SIGNAL)
2733
    fprintf(stderr, "do_sigreturn\n");
2734
#endif
2735
    frame_addr = regs->active_tc.gpr[29];
2736
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
2737
           goto badframe;
2738

    
2739
    for(i = 0; i < TARGET_NSIG_WORDS; i++) {
2740
           if(__get_user(target_set.sig[i], &frame->sf_mask.sig[i]))
2741
            goto badframe;
2742
    }
2743

    
2744
    target_to_host_sigset_internal(&blocked, &target_set);
2745
    sigprocmask(SIG_SETMASK, &blocked, NULL);
2746

    
2747
    if (restore_sigcontext(regs, &frame->sf_sc))
2748
           goto badframe;
2749

    
2750
#if 0
2751
    /*
2752
     * Don't let your children do this ...
2753
     */
2754
    __asm__ __volatile__(
2755
           "move\t$29, %0\n\t"
2756
           "j\tsyscall_exit"
2757
           :/* no outputs */
2758
           :"r" (&regs));
2759
    /* Unreached */
2760
#endif
2761

    
2762
    regs->active_tc.PC = regs->CP0_EPC;
2763
    /* I am not sure this is right, but it seems to work
2764
    * maybe a problem with nested signals ? */
2765
    regs->CP0_EPC = 0;
2766
    return -TARGET_QEMU_ESIGRETURN;
2767

    
2768
badframe:
2769
    force_sig(TARGET_SIGSEGV/*, current*/);
2770
    return 0;
2771
}
2772

    
2773
static void setup_rt_frame(int sig, struct target_sigaction *ka,
2774
                           target_siginfo_t *info,
2775
                           target_sigset_t *set, CPUMIPSState *env)
2776
{
2777
    struct target_rt_sigframe *frame;
2778
    abi_ulong frame_addr;
2779
    int i;
2780

    
2781
    frame_addr = get_sigframe(ka, env, sizeof(*frame));
2782
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
2783
        goto give_sigsegv;
2784

    
2785
    install_sigtramp(frame->rs_code, TARGET_NR_rt_sigreturn);
2786

    
2787
    copy_siginfo_to_user(&frame->rs_info, info);
2788

    
2789
    __put_user(0, &frame->rs_uc.tuc_flags);
2790
    __put_user(0, &frame->rs_uc.tuc_link);
2791
    __put_user(target_sigaltstack_used.ss_sp, &frame->rs_uc.tuc_stack.ss_sp);
2792
    __put_user(target_sigaltstack_used.ss_size, &frame->rs_uc.tuc_stack.ss_size);
2793
    __put_user(sas_ss_flags(get_sp_from_cpustate(env)),
2794
               &frame->rs_uc.tuc_stack.ss_flags);
2795

    
2796
    setup_sigcontext(env, &frame->rs_uc.tuc_mcontext);
2797

    
2798
    for(i = 0; i < TARGET_NSIG_WORDS; i++) {
2799
        __put_user(set->sig[i], &frame->rs_uc.tuc_sigmask.sig[i]);
2800
    }
2801

    
2802
    /*
2803
    * Arguments to signal handler:
2804
    *
2805
    *   a0 = signal number
2806
    *   a1 = pointer to siginfo_t
2807
    *   a2 = pointer to struct ucontext
2808
    *
2809
    * $25 and PC point to the signal handler, $29 points to the
2810
    * struct sigframe.
2811
    */
2812
    env->active_tc.gpr[ 4] = sig;
2813
    env->active_tc.gpr[ 5] = frame_addr
2814
                             + offsetof(struct target_rt_sigframe, rs_info);
2815
    env->active_tc.gpr[ 6] = frame_addr
2816
                             + offsetof(struct target_rt_sigframe, rs_uc);
2817
    env->active_tc.gpr[29] = frame_addr;
2818
    env->active_tc.gpr[31] = frame_addr
2819
                             + offsetof(struct target_rt_sigframe, rs_code);
2820
    /* The original kernel code sets CP0_EPC to the handler
2821
    * since it returns to userland using eret
2822
    * we cannot do this here, and we must set PC directly */
2823
    env->active_tc.PC = env->active_tc.gpr[25] = ka->_sa_handler;
2824
    unlock_user_struct(frame, frame_addr, 1);
2825
    return;
2826

    
2827
give_sigsegv:
2828
    unlock_user_struct(frame, frame_addr, 1);
2829
    force_sig(TARGET_SIGSEGV/*, current*/);
2830
}
2831

    
2832
long do_rt_sigreturn(CPUMIPSState *env)
2833
{
2834
    struct target_rt_sigframe *frame;
2835
    abi_ulong frame_addr;
2836
    sigset_t blocked;
2837

    
2838
#if defined(DEBUG_SIGNAL)
2839
    fprintf(stderr, "do_rt_sigreturn\n");
2840
#endif
2841
    frame_addr = env->active_tc.gpr[29];
2842
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
2843
           goto badframe;
2844

    
2845
    target_to_host_sigset(&blocked, &frame->rs_uc.tuc_sigmask);
2846
    sigprocmask(SIG_SETMASK, &blocked, NULL);
2847

    
2848
    if (restore_sigcontext(env, &frame->rs_uc.tuc_mcontext))
2849
        goto badframe;
2850

    
2851
    if (do_sigaltstack(frame_addr +
2852
                       offsetof(struct target_rt_sigframe, rs_uc.tuc_stack),
2853
                       0, get_sp_from_cpustate(env)) == -EFAULT)
2854
        goto badframe;
2855

    
2856
    env->active_tc.PC = env->CP0_EPC;
2857
    /* I am not sure this is right, but it seems to work
2858
    * maybe a problem with nested signals ? */
2859
    env->CP0_EPC = 0;
2860
    return -TARGET_QEMU_ESIGRETURN;
2861

    
2862
badframe:
2863
    force_sig(TARGET_SIGSEGV/*, current*/);
2864
    return 0;
2865
}
2866

    
2867
#elif defined(TARGET_SH4)
2868

    
2869
/*
2870
 * code and data structures from linux kernel:
2871
 * include/asm-sh/sigcontext.h
2872
 * arch/sh/kernel/signal.c
2873
 */
2874

    
2875
struct target_sigcontext {
2876
    target_ulong  oldmask;
2877

    
2878
    /* CPU registers */
2879
    target_ulong  sc_gregs[16];
2880
    target_ulong  sc_pc;
2881
    target_ulong  sc_pr;
2882
    target_ulong  sc_sr;
2883
    target_ulong  sc_gbr;
2884
    target_ulong  sc_mach;
2885
    target_ulong  sc_macl;
2886

    
2887
    /* FPU registers */
2888
    target_ulong  sc_fpregs[16];
2889
    target_ulong  sc_xfpregs[16];
2890
    unsigned int sc_fpscr;
2891
    unsigned int sc_fpul;
2892
    unsigned int sc_ownedfp;
2893
};
2894

    
2895
struct target_sigframe
2896
{
2897
    struct target_sigcontext sc;
2898
    target_ulong extramask[TARGET_NSIG_WORDS-1];
2899
    uint16_t retcode[3];
2900
};
2901

    
2902

    
2903
struct target_ucontext {
2904
    target_ulong tuc_flags;
2905
    struct target_ucontext *tuc_link;
2906
    target_stack_t tuc_stack;
2907
    struct target_sigcontext tuc_mcontext;
2908
    target_sigset_t tuc_sigmask;        /* mask last for extensibility */
2909
};
2910

    
2911
struct target_rt_sigframe
2912
{
2913
    struct target_siginfo info;
2914
    struct target_ucontext uc;
2915
    uint16_t retcode[3];
2916
};
2917

    
2918

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

    
2922
static abi_ulong get_sigframe(struct target_sigaction *ka,
2923
                         unsigned long sp, size_t frame_size)
2924
{
2925
    if ((ka->sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags(sp) == 0)) {
2926
        sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
2927
    }
2928

    
2929
    return (sp - frame_size) & -8ul;
2930
}
2931

    
2932
static int setup_sigcontext(struct target_sigcontext *sc,
2933
                            CPUSH4State *regs, unsigned long mask)
2934
{
2935
    int err = 0;
2936
    int i;
2937

    
2938
#define COPY(x)         err |= __put_user(regs->x, &sc->sc_##x)
2939
    COPY(gregs[0]); COPY(gregs[1]);
2940
    COPY(gregs[2]); COPY(gregs[3]);
2941
    COPY(gregs[4]); COPY(gregs[5]);
2942
    COPY(gregs[6]); COPY(gregs[7]);
2943
    COPY(gregs[8]); COPY(gregs[9]);
2944
    COPY(gregs[10]); COPY(gregs[11]);
2945
    COPY(gregs[12]); COPY(gregs[13]);
2946
    COPY(gregs[14]); COPY(gregs[15]);
2947
    COPY(gbr); COPY(mach);
2948
    COPY(macl); COPY(pr);
2949
    COPY(sr); COPY(pc);
2950
#undef COPY
2951

    
2952
    for (i=0; i<16; i++) {
2953
        err |= __put_user(regs->fregs[i], &sc->sc_fpregs[i]);
2954
    }
2955
    err |= __put_user(regs->fpscr, &sc->sc_fpscr);
2956
    err |= __put_user(regs->fpul, &sc->sc_fpul);
2957

    
2958
    /* non-iBCS2 extensions.. */
2959
    err |= __put_user(mask, &sc->oldmask);
2960

    
2961
    return err;
2962
}
2963

    
2964
static int restore_sigcontext(CPUSH4State *regs, struct target_sigcontext *sc,
2965
                              target_ulong *r0_p)
2966
{
2967
    unsigned int err = 0;
2968
    int i;
2969

    
2970
#define COPY(x)         err |= __get_user(regs->x, &sc->sc_##x)
2971
    COPY(gregs[1]);
2972
    COPY(gregs[2]); COPY(gregs[3]);
2973
    COPY(gregs[4]); COPY(gregs[5]);
2974
    COPY(gregs[6]); COPY(gregs[7]);
2975
    COPY(gregs[8]); COPY(gregs[9]);
2976
    COPY(gregs[10]); COPY(gregs[11]);
2977
    COPY(gregs[12]); COPY(gregs[13]);
2978
    COPY(gregs[14]); COPY(gregs[15]);
2979
    COPY(gbr); COPY(mach);
2980
    COPY(macl); COPY(pr);
2981
    COPY(sr); COPY(pc);
2982
#undef COPY
2983

    
2984
    for (i=0; i<16; i++) {
2985
        err |= __get_user(regs->fregs[i], &sc->sc_fpregs[i]);
2986
    }
2987
    err |= __get_user(regs->fpscr, &sc->sc_fpscr);
2988
    err |= __get_user(regs->fpul, &sc->sc_fpul);
2989

    
2990
    regs->tra = -1;         /* disable syscall checks */
2991
    err |= __get_user(*r0_p, &sc->sc_gregs[0]);
2992
    return err;
2993
}
2994

    
2995
static void setup_frame(int sig, struct target_sigaction *ka,
2996
                        target_sigset_t *set, CPUSH4State *regs)
2997
{
2998
    struct target_sigframe *frame;
2999
    abi_ulong frame_addr;
3000
    int i;
3001
    int err = 0;
3002
    int signal;
3003

    
3004
    frame_addr = get_sigframe(ka, regs->gregs[15], sizeof(*frame));
3005
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
3006
        goto give_sigsegv;
3007

    
3008
    signal = current_exec_domain_sig(sig);
3009

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

    
3012
    for (i = 0; i < TARGET_NSIG_WORDS - 1; i++) {
3013
        err |= __put_user(set->sig[i + 1], &frame->extramask[i]);
3014
    }
3015

    
3016
    /* Set up to return from userspace.  If provided, use a stub
3017
       already in userspace.  */
3018
    if (ka->sa_flags & TARGET_SA_RESTORER) {
3019
        regs->pr = (unsigned long) ka->sa_restorer;
3020
    } else {
3021
        /* Generate return code (system call to sigreturn) */
3022
        err |= __put_user(MOVW(2), &frame->retcode[0]);
3023
        err |= __put_user(TRAP_NOARG, &frame->retcode[1]);
3024
        err |= __put_user((TARGET_NR_sigreturn), &frame->retcode[2]);
3025
        regs->pr = (unsigned long) frame->retcode;
3026
    }
3027

    
3028
    if (err)
3029
        goto give_sigsegv;
3030

    
3031
    /* Set up registers for signal handler */
3032
    regs->gregs[15] = frame_addr;
3033
    regs->gregs[4] = signal; /* Arg for signal handler */
3034
    regs->gregs[5] = 0;
3035
    regs->gregs[6] = frame_addr += offsetof(typeof(*frame), sc);
3036
    regs->pc = (unsigned long) ka->_sa_handler;
3037

    
3038
    unlock_user_struct(frame, frame_addr, 1);
3039
    return;
3040

    
3041
give_sigsegv:
3042
    unlock_user_struct(frame, frame_addr, 1);
3043
    force_sig(TARGET_SIGSEGV);
3044
}
3045

    
3046
static void setup_rt_frame(int sig, struct target_sigaction *ka,
3047
                           target_siginfo_t *info,
3048
                           target_sigset_t *set, CPUSH4State *regs)
3049
{
3050
    struct target_rt_sigframe *frame;
3051
    abi_ulong frame_addr;
3052
    int i;
3053
    int err = 0;
3054
    int signal;
3055

    
3056
    frame_addr = get_sigframe(ka, regs->gregs[15], sizeof(*frame));
3057
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
3058
        goto give_sigsegv;
3059

    
3060
    signal = current_exec_domain_sig(sig);
3061

    
3062
    err |= copy_siginfo_to_user(&frame->info, info);
3063

    
3064
    /* Create the ucontext.  */
3065
    err |= __put_user(0, &frame->uc.tuc_flags);
3066
    err |= __put_user(0, (unsigned long *)&frame->uc.tuc_link);
3067
    err |= __put_user((unsigned long)target_sigaltstack_used.ss_sp,
3068
                      &frame->uc.tuc_stack.ss_sp);
3069
    err |= __put_user(sas_ss_flags(regs->gregs[15]),
3070
                      &frame->uc.tuc_stack.ss_flags);
3071
    err |= __put_user(target_sigaltstack_used.ss_size,
3072
                      &frame->uc.tuc_stack.ss_size);
3073
    err |= setup_sigcontext(&frame->uc.tuc_mcontext,
3074
                            regs, set->sig[0]);
3075
    for(i = 0; i < TARGET_NSIG_WORDS; i++) {
3076
        err |= __put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]);
3077
    }
3078

    
3079
    /* Set up to return from userspace.  If provided, use a stub
3080
       already in userspace.  */
3081
    if (ka->sa_flags & TARGET_SA_RESTORER) {
3082
        regs->pr = (unsigned long) ka->sa_restorer;
3083
    } else {
3084
        /* Generate return code (system call to sigreturn) */
3085
        err |= __put_user(MOVW(2), &frame->retcode[0]);
3086
        err |= __put_user(TRAP_NOARG, &frame->retcode[1]);
3087
        err |= __put_user((TARGET_NR_rt_sigreturn), &frame->retcode[2]);
3088
        regs->pr = (unsigned long) frame->retcode;
3089
    }
3090

    
3091
    if (err)
3092
        goto give_sigsegv;
3093

    
3094
    /* Set up registers for signal handler */
3095
    regs->gregs[15] = frame_addr;
3096
    regs->gregs[4] = signal; /* Arg for signal handler */
3097
    regs->gregs[5] = frame_addr + offsetof(typeof(*frame), info);
3098
    regs->gregs[6] = frame_addr + offsetof(typeof(*frame), uc);
3099
    regs->pc = (unsigned long) ka->_sa_handler;
3100

    
3101
    unlock_user_struct(frame, frame_addr, 1);
3102
    return;
3103

    
3104
give_sigsegv:
3105
    unlock_user_struct(frame, frame_addr, 1);
3106
    force_sig(TARGET_SIGSEGV);
3107
}
3108

    
3109
long do_sigreturn(CPUSH4State *regs)
3110
{
3111
    struct target_sigframe *frame;
3112
    abi_ulong frame_addr;
3113
    sigset_t blocked;
3114
    target_sigset_t target_set;
3115
    target_ulong r0;
3116
    int i;
3117
    int err = 0;
3118

    
3119
#if defined(DEBUG_SIGNAL)
3120
    fprintf(stderr, "do_sigreturn\n");
3121
#endif
3122
    frame_addr = regs->gregs[15];
3123
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
3124
           goto badframe;
3125

    
3126
    err |= __get_user(target_set.sig[0], &frame->sc.oldmask);
3127
    for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3128
        err |= (__get_user(target_set.sig[i], &frame->extramask[i - 1]));
3129
    }
3130

    
3131
    if (err)
3132
        goto badframe;
3133

    
3134
    target_to_host_sigset_internal(&blocked, &target_set);
3135
    sigprocmask(SIG_SETMASK, &blocked, NULL);
3136

    
3137
    if (restore_sigcontext(regs, &frame->sc, &r0))
3138
        goto badframe;
3139

    
3140
    unlock_user_struct(frame, frame_addr, 0);
3141
    return r0;
3142

    
3143
badframe:
3144
    unlock_user_struct(frame, frame_addr, 0);
3145
    force_sig(TARGET_SIGSEGV);
3146
    return 0;
3147
}
3148

    
3149
long do_rt_sigreturn(CPUSH4State *regs)
3150
{
3151
    struct target_rt_sigframe *frame;
3152
    abi_ulong frame_addr;
3153
    sigset_t blocked;
3154
    target_ulong r0;
3155

    
3156
#if defined(DEBUG_SIGNAL)
3157
    fprintf(stderr, "do_rt_sigreturn\n");
3158
#endif
3159
    frame_addr = regs->gregs[15];
3160
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
3161
           goto badframe;
3162

    
3163
    target_to_host_sigset(&blocked, &frame->uc.tuc_sigmask);
3164
    sigprocmask(SIG_SETMASK, &blocked, NULL);
3165

    
3166
    if (restore_sigcontext(regs, &frame->uc.tuc_mcontext, &r0))
3167
        goto badframe;
3168

    
3169
    if (do_sigaltstack(frame_addr +
3170
                       offsetof(struct target_rt_sigframe, uc.tuc_stack),
3171
                       0, get_sp_from_cpustate(regs)) == -EFAULT)
3172
        goto badframe;
3173

    
3174
    unlock_user_struct(frame, frame_addr, 0);
3175
    return r0;
3176

    
3177
badframe:
3178
    unlock_user_struct(frame, frame_addr, 0);
3179
    force_sig(TARGET_SIGSEGV);
3180
    return 0;
3181
}
3182
#elif defined(TARGET_MICROBLAZE)
3183

    
3184
struct target_sigcontext {
3185
    struct target_pt_regs regs;  /* needs to be first */
3186
    uint32_t oldmask;
3187
};
3188

    
3189
struct target_stack_t {
3190
    abi_ulong ss_sp;
3191
    int ss_flags;
3192
    unsigned int ss_size;
3193
};
3194

    
3195
struct target_ucontext {
3196
    abi_ulong tuc_flags;
3197
    abi_ulong tuc_link;
3198
    struct target_stack_t tuc_stack;
3199
    struct target_sigcontext tuc_mcontext;
3200
    uint32_t tuc_extramask[TARGET_NSIG_WORDS - 1];
3201
};
3202

    
3203
/* Signal frames. */
3204
struct target_signal_frame {
3205
    struct target_ucontext uc;
3206
    uint32_t extramask[TARGET_NSIG_WORDS - 1];
3207
    uint32_t tramp[2];
3208
};
3209

    
3210
struct rt_signal_frame {
3211
    siginfo_t info;
3212
    struct ucontext uc;
3213
    uint32_t tramp[2];
3214
};
3215

    
3216
static void setup_sigcontext(struct target_sigcontext *sc, CPUMBState *env)
3217
{
3218
    __put_user(env->regs[0], &sc->regs.r0);
3219
    __put_user(env->regs[1], &sc->regs.r1);
3220
    __put_user(env->regs[2], &sc->regs.r2);
3221
    __put_user(env->regs[3], &sc->regs.r3);
3222
    __put_user(env->regs[4], &sc->regs.r4);
3223
    __put_user(env->regs[5], &sc->regs.r5);
3224
    __put_user(env->regs[6], &sc->regs.r6);
3225
    __put_user(env->regs[7], &sc->regs.r7);
3226
    __put_user(env->regs[8], &sc->regs.r8);
3227
    __put_user(env->regs[9], &sc->regs.r9);
3228
    __put_user(env->regs[10], &sc->regs.r10);
3229
    __put_user(env->regs[11], &sc->regs.r11);
3230
    __put_user(env->regs[12], &sc->regs.r12);
3231
    __put_user(env->regs[13], &sc->regs.r13);
3232
    __put_user(env->regs[14], &sc->regs.r14);
3233
    __put_user(env->regs[15], &sc->regs.r15);
3234
    __put_user(env->regs[16], &sc->regs.r16);
3235
    __put_user(env->regs[17], &sc->regs.r17);
3236
    __put_user(env->regs[18], &sc->regs.r18);
3237
    __put_user(env->regs[19], &sc->regs.r19);
3238
    __put_user(env->regs[20], &sc->regs.r20);
3239
    __put_user(env->regs[21], &sc->regs.r21);
3240
    __put_user(env->regs[22], &sc->regs.r22);
3241
    __put_user(env->regs[23], &sc->regs.r23);
3242
    __put_user(env->regs[24], &sc->regs.r24);
3243
    __put_user(env->regs[25], &sc->regs.r25);
3244
    __put_user(env->regs[26], &sc->regs.r26);
3245
    __put_user(env->regs[27], &sc->regs.r27);
3246
    __put_user(env->regs[28], &sc->regs.r28);
3247
    __put_user(env->regs[29], &sc->regs.r29);
3248
    __put_user(env->regs[30], &sc->regs.r30);
3249
    __put_user(env->regs[31], &sc->regs.r31);
3250
    __put_user(env->sregs[SR_PC], &sc->regs.pc);
3251
}
3252

    
3253
static void restore_sigcontext(struct target_sigcontext *sc, CPUMBState *env)
3254
{
3255
    __get_user(env->regs[0], &sc->regs.r0);
3256
    __get_user(env->regs[1], &sc->regs.r1);
3257
    __get_user(env->regs[2], &sc->regs.r2);
3258
    __get_user(env->regs[3], &sc->regs.r3);
3259
    __get_user(env->regs[4], &sc->regs.r4);
3260
    __get_user(env->regs[5], &sc->regs.r5);
3261
    __get_user(env->regs[6], &sc->regs.r6);
3262
    __get_user(env->regs[7], &sc->regs.r7);
3263
    __get_user(env->regs[8], &sc->regs.r8);
3264
    __get_user(env->regs[9], &sc->regs.r9);
3265
    __get_user(env->regs[10], &sc->regs.r10);
3266
    __get_user(env->regs[11], &sc->regs.r11);
3267
    __get_user(env->regs[12], &sc->regs.r12);
3268
    __get_user(env->regs[13], &sc->regs.r13);
3269
    __get_user(env->regs[14], &sc->regs.r14);
3270
    __get_user(env->regs[15], &sc->regs.r15);
3271
    __get_user(env->regs[16], &sc->regs.r16);
3272
    __get_user(env->regs[17], &sc->regs.r17);
3273
    __get_user(env->regs[18], &sc->regs.r18);
3274
    __get_user(env->regs[19], &sc->regs.r19);
3275
    __get_user(env->regs[20], &sc->regs.r20);
3276
    __get_user(env->regs[21], &sc->regs.r21);
3277
    __get_user(env->regs[22], &sc->regs.r22);
3278
    __get_user(env->regs[23], &sc->regs.r23);
3279
    __get_user(env->regs[24], &sc->regs.r24);
3280
    __get_user(env->regs[25], &sc->regs.r25);
3281
    __get_user(env->regs[26], &sc->regs.r26);
3282
    __get_user(env->regs[27], &sc->regs.r27);
3283
    __get_user(env->regs[28], &sc->regs.r28);
3284
    __get_user(env->regs[29], &sc->regs.r29);
3285
    __get_user(env->regs[30], &sc->regs.r30);
3286
    __get_user(env->regs[31], &sc->regs.r31);
3287
    __get_user(env->sregs[SR_PC], &sc->regs.pc);
3288
}
3289

    
3290
static abi_ulong get_sigframe(struct target_sigaction *ka,
3291
                              CPUMBState *env, int frame_size)
3292
{
3293
    abi_ulong sp = env->regs[1];
3294

    
3295
    if ((ka->sa_flags & SA_ONSTACK) != 0 && !on_sig_stack(sp))
3296
        sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
3297

    
3298
    return ((sp - frame_size) & -8UL);
3299
}
3300

    
3301
static void setup_frame(int sig, struct target_sigaction *ka,
3302
                        target_sigset_t *set, CPUMBState *env)
3303
{
3304
    struct target_signal_frame *frame;
3305
    abi_ulong frame_addr;
3306
    int err = 0;
3307
    int i;
3308

    
3309
    frame_addr = get_sigframe(ka, env, sizeof *frame);
3310
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
3311
        goto badframe;
3312

    
3313
    /* Save the mask.  */
3314
    err |= __put_user(set->sig[0], &frame->uc.tuc_mcontext.oldmask);
3315
    if (err)
3316
        goto badframe;
3317

    
3318
    for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3319
        if (__put_user(set->sig[i], &frame->extramask[i - 1]))
3320
            goto badframe;
3321
    }
3322

    
3323
    setup_sigcontext(&frame->uc.tuc_mcontext, env);
3324

    
3325
    /* Set up to return from userspace. If provided, use a stub
3326
       already in userspace. */
3327
    /* minus 8 is offset to cater for "rtsd r15,8" offset */
3328
    if (ka->sa_flags & TARGET_SA_RESTORER) {
3329
        env->regs[15] = ((unsigned long)ka->sa_restorer)-8;
3330
    } else {
3331
        uint32_t t;
3332
        /* Note, these encodings are _big endian_! */
3333
        /* addi r12, r0, __NR_sigreturn */
3334
        t = 0x31800000UL | TARGET_NR_sigreturn;
3335
        err |= __put_user(t, frame->tramp + 0);
3336
        /* brki r14, 0x8 */
3337
        t = 0xb9cc0008UL;
3338
        err |= __put_user(t, frame->tramp + 1);
3339

    
3340
        /* Return from sighandler will jump to the tramp.
3341
           Negative 8 offset because return is rtsd r15, 8 */
3342
        env->regs[15] = ((unsigned long)frame->tramp) - 8;
3343
    }
3344

    
3345
    if (err)
3346
        goto badframe;
3347

    
3348
    /* Set up registers for signal handler */
3349
    env->regs[1] = frame_addr;
3350
    /* Signal handler args: */
3351
    env->regs[5] = sig; /* Arg 0: signum */
3352
    env->regs[6] = 0;
3353
    /* arg 1: sigcontext */
3354
    env->regs[7] = frame_addr += offsetof(typeof(*frame), uc);
3355

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

    
3359
    unlock_user_struct(frame, frame_addr, 1);
3360
    return;
3361
  badframe:
3362
    unlock_user_struct(frame, frame_addr, 1);
3363
    force_sig(TARGET_SIGSEGV);
3364
}
3365

    
3366
static void setup_rt_frame(int sig, struct target_sigaction *ka,
3367
                           target_siginfo_t *info,
3368
                           target_sigset_t *set, CPUMBState *env)
3369
{
3370
    fprintf(stderr, "Microblaze setup_rt_frame: not implemented\n");
3371
}
3372

    
3373
long do_sigreturn(CPUMBState *env)
3374
{
3375
    struct target_signal_frame *frame;
3376
    abi_ulong frame_addr;
3377
    target_sigset_t target_set;
3378
    sigset_t set;
3379
    int i;
3380

    
3381
    frame_addr = env->regs[R_SP];
3382
    /* Make sure the guest isn't playing games.  */
3383
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 1))
3384
        goto badframe;
3385

    
3386
    /* Restore blocked signals */
3387
    if (__get_user(target_set.sig[0], &frame->uc.tuc_mcontext.oldmask))
3388
        goto badframe;
3389
    for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3390
        if (__get_user(target_set.sig[i], &frame->extramask[i - 1]))
3391
            goto badframe;
3392
    }
3393
    target_to_host_sigset_internal(&set, &target_set);
3394
    sigprocmask(SIG_SETMASK, &set, NULL);
3395

    
3396
    restore_sigcontext(&frame->uc.tuc_mcontext, env);
3397
    /* We got here through a sigreturn syscall, our path back is via an
3398
       rtb insn so setup r14 for that.  */
3399
    env->regs[14] = env->sregs[SR_PC];
3400
 
3401
    unlock_user_struct(frame, frame_addr, 0);
3402
    return env->regs[10];
3403
  badframe:
3404
    unlock_user_struct(frame, frame_addr, 0);
3405
    force_sig(TARGET_SIGSEGV);
3406
}
3407

    
3408
long do_rt_sigreturn(CPUMBState *env)
3409
{
3410
    fprintf(stderr, "Microblaze do_rt_sigreturn: not implemented\n");
3411
    return -TARGET_ENOSYS;
3412
}
3413

    
3414
#elif defined(TARGET_CRIS)
3415

    
3416
struct target_sigcontext {
3417
        struct target_pt_regs regs;  /* needs to be first */
3418
        uint32_t oldmask;
3419
        uint32_t usp;    /* usp before stacking this gunk on it */
3420
};
3421

    
3422
/* Signal frames. */
3423
struct target_signal_frame {
3424
        struct target_sigcontext sc;
3425
        uint32_t extramask[TARGET_NSIG_WORDS - 1];
3426
        uint8_t retcode[8];       /* Trampoline code. */
3427
};
3428

    
3429
struct rt_signal_frame {
3430
        siginfo_t *pinfo;
3431
        void *puc;
3432
        siginfo_t info;
3433
        struct ucontext uc;
3434
        uint8_t retcode[8];       /* Trampoline code. */
3435
};
3436

    
3437
static void setup_sigcontext(struct target_sigcontext *sc, CPUCRISState *env)
3438
{
3439
        __put_user(env->regs[0], &sc->regs.r0);
3440
        __put_user(env->regs[1], &sc->regs.r1);
3441
        __put_user(env->regs[2], &sc->regs.r2);
3442
        __put_user(env->regs[3], &sc->regs.r3);
3443
        __put_user(env->regs[4], &sc->regs.r4);
3444
        __put_user(env->regs[5], &sc->regs.r5);
3445
        __put_user(env->regs[6], &sc->regs.r6);
3446
        __put_user(env->regs[7], &sc->regs.r7);
3447
        __put_user(env->regs[8], &sc->regs.r8);
3448
        __put_user(env->regs[9], &sc->regs.r9);
3449
        __put_user(env->regs[10], &sc->regs.r10);
3450
        __put_user(env->regs[11], &sc->regs.r11);
3451
        __put_user(env->regs[12], &sc->regs.r12);
3452
        __put_user(env->regs[13], &sc->regs.r13);
3453
        __put_user(env->regs[14], &sc->usp);
3454
        __put_user(env->regs[15], &sc->regs.acr);
3455
        __put_user(env->pregs[PR_MOF], &sc->regs.mof);
3456
        __put_user(env->pregs[PR_SRP], &sc->regs.srp);
3457
        __put_user(env->pc, &sc->regs.erp);
3458
}
3459

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

    
3483
static abi_ulong get_sigframe(CPUCRISState *env, int framesize)
3484
{
3485
        abi_ulong sp;
3486
        /* Align the stack downwards to 4.  */
3487
        sp = (env->regs[R_SP] & ~3);
3488
        return sp - framesize;
3489
}
3490

    
3491
static void setup_frame(int sig, struct target_sigaction *ka,
3492
                        target_sigset_t *set, CPUCRISState *env)
3493
{
3494
        struct target_signal_frame *frame;
3495
        abi_ulong frame_addr;
3496
        int err = 0;
3497
        int i;
3498

    
3499
        frame_addr = get_sigframe(env, sizeof *frame);
3500
        if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
3501
                goto badframe;
3502

    
3503
        /*
3504
         * The CRIS signal return trampoline. A real linux/CRIS kernel doesn't
3505
         * use this trampoline anymore but it sets it up for GDB.
3506
         * In QEMU, using the trampoline simplifies things a bit so we use it.
3507
         *
3508
         * This is movu.w __NR_sigreturn, r9; break 13;
3509
         */
3510
        err |= __put_user(0x9c5f, frame->retcode+0);
3511
        err |= __put_user(TARGET_NR_sigreturn, 
3512
                          frame->retcode+2);
3513
        err |= __put_user(0xe93d, frame->retcode+4);
3514

    
3515
        /* Save the mask.  */
3516
        err |= __put_user(set->sig[0], &frame->sc.oldmask);
3517
        if (err)
3518
                goto badframe;
3519

    
3520
        for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3521
                if (__put_user(set->sig[i], &frame->extramask[i - 1]))
3522
                        goto badframe;
3523
        }
3524

    
3525
        setup_sigcontext(&frame->sc, env);
3526

    
3527
        /* Move the stack and setup the arguments for the handler.  */
3528
        env->regs[R_SP] = frame_addr;
3529
        env->regs[10] = sig;
3530
        env->pc = (unsigned long) ka->_sa_handler;
3531
        /* Link SRP so the guest returns through the trampoline.  */
3532
        env->pregs[PR_SRP] = frame_addr + offsetof(typeof(*frame), retcode);
3533

    
3534
        unlock_user_struct(frame, frame_addr, 1);
3535
        return;
3536
  badframe:
3537
        unlock_user_struct(frame, frame_addr, 1);
3538
        force_sig(TARGET_SIGSEGV);
3539
}
3540

    
3541
static void setup_rt_frame(int sig, struct target_sigaction *ka,
3542
                           target_siginfo_t *info,
3543
                           target_sigset_t *set, CPUCRISState *env)
3544
{
3545
    fprintf(stderr, "CRIS setup_rt_frame: not implemented\n");
3546
}
3547

    
3548
long do_sigreturn(CPUCRISState *env)
3549
{
3550
        struct target_signal_frame *frame;
3551
        abi_ulong frame_addr;
3552
        target_sigset_t target_set;
3553
        sigset_t set;
3554
        int i;
3555

    
3556
        frame_addr = env->regs[R_SP];
3557
        /* Make sure the guest isn't playing games.  */
3558
        if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 1))
3559
                goto badframe;
3560

    
3561
        /* Restore blocked signals */
3562
        if (__get_user(target_set.sig[0], &frame->sc.oldmask))
3563
                goto badframe;
3564
        for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3565
                if (__get_user(target_set.sig[i], &frame->extramask[i - 1]))
3566
                        goto badframe;
3567
        }
3568
        target_to_host_sigset_internal(&set, &target_set);
3569
        sigprocmask(SIG_SETMASK, &set, NULL);
3570

    
3571
        restore_sigcontext(&frame->sc, env);
3572
        unlock_user_struct(frame, frame_addr, 0);
3573
        return env->regs[10];
3574
  badframe:
3575
        unlock_user_struct(frame, frame_addr, 0);
3576
        force_sig(TARGET_SIGSEGV);
3577
}
3578

    
3579
long do_rt_sigreturn(CPUCRISState *env)
3580
{
3581
    fprintf(stderr, "CRIS do_rt_sigreturn: not implemented\n");
3582
    return -TARGET_ENOSYS;
3583
}
3584

    
3585
#elif defined(TARGET_OPENRISC)
3586

    
3587
struct target_sigcontext {
3588
    struct target_pt_regs regs;
3589
    abi_ulong oldmask;
3590
    abi_ulong usp;
3591
};
3592

    
3593
struct target_ucontext {
3594
    abi_ulong tuc_flags;
3595
    abi_ulong tuc_link;
3596
    target_stack_t tuc_stack;
3597
    struct target_sigcontext tuc_mcontext;
3598
    target_sigset_t tuc_sigmask;   /* mask last for extensibility */
3599
};
3600

    
3601
struct target_rt_sigframe {
3602
    abi_ulong pinfo;
3603
    uint64_t puc;
3604
    struct target_siginfo info;
3605
    struct target_sigcontext sc;
3606
    struct target_ucontext uc;
3607
    unsigned char retcode[16];  /* trampoline code */
3608
};
3609

    
3610
/* This is the asm-generic/ucontext.h version */
3611
#if 0
3612
static int restore_sigcontext(CPUOpenRISCState *regs,
3613
                              struct target_sigcontext *sc)
3614
{
3615
    unsigned int err = 0;
3616
    unsigned long old_usp;
3617

3618
    /* Alwys make any pending restarted system call return -EINTR */
3619
    current_thread_info()->restart_block.fn = do_no_restart_syscall;
3620

3621
    /* restore the regs from &sc->regs (same as sc, since regs is first)
3622
     * (sc is already checked for VERIFY_READ since the sigframe was
3623
     *  checked in sys_sigreturn previously)
3624
     */
3625

3626
    if (copy_from_user(regs, &sc, sizeof(struct target_pt_regs))) {
3627
        goto badframe;
3628
    }
3629

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

3632
    regs->sr &= ~SR_SM;
3633

3634
    /* restore the old USP as it was before we stacked the sc etc.
3635
     * (we cannot just pop the sigcontext since we aligned the sp and
3636
     *  stuff after pushing it)
3637
     */
3638

3639
    err |= __get_user(old_usp, &sc->usp);
3640
    phx_signal("old_usp 0x%lx", old_usp);
3641

3642
    __PHX__ REALLY           /* ??? */
3643
    wrusp(old_usp);
3644
    regs->gpr[1] = old_usp;
3645

3646
    /* TODO: the other ports use regs->orig_XX to disable syscall checks
3647
     * after this completes, but we don't use that mechanism. maybe we can
3648
     * use it now ?
3649
     */
3650

3651
    return err;
3652

3653
badframe:
3654
    return 1;
3655
}
3656
#endif
3657

    
3658
/* Set up a signal frame.  */
3659

    
3660
static int setup_sigcontext(struct target_sigcontext *sc,
3661
                            CPUOpenRISCState *regs,
3662
                            unsigned long mask)
3663
{
3664
    int err = 0;
3665
    unsigned long usp = regs->gpr[1];
3666

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

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

    
3671
    /* Set the frametype to CRIS_FRAME_NORMAL for the execution of
3672
       the signal handler. The frametype will be restored to its previous
3673
       value in restore_sigcontext. */
3674
    /*regs->frametype = CRIS_FRAME_NORMAL;*/
3675

    
3676
    /* then some other stuff */
3677
    err |= __put_user(mask, &sc->oldmask);
3678
    err |= __put_user(usp, &sc->usp); return err;
3679
}
3680

    
3681
static inline unsigned long align_sigframe(unsigned long sp)
3682
{
3683
    unsigned long i;
3684
    i = sp & ~3UL;
3685
    return i;
3686
}
3687

    
3688
static inline abi_ulong get_sigframe(struct target_sigaction *ka,
3689
                                     CPUOpenRISCState *regs,
3690
                                     size_t frame_size)
3691
{
3692
    unsigned long sp = regs->gpr[1];
3693
    int onsigstack = on_sig_stack(sp);
3694

    
3695
    /* redzone */
3696
    /* This is the X/Open sanctioned signal stack switching.  */
3697
    if ((ka->sa_flags & SA_ONSTACK) != 0 && !onsigstack) {
3698
        sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
3699
    }
3700

    
3701
    sp = align_sigframe(sp - frame_size);
3702

    
3703
    /*
3704
     * If we are on the alternate signal stack and would overflow it, don't.
3705
     * Return an always-bogus address instead so we will die with SIGSEGV.
3706
     */
3707

    
3708
    if (onsigstack && !likely(on_sig_stack(sp))) {
3709
        return -1L;
3710
    }
3711

    
3712
    return sp;
3713
}
3714

    
3715
static void setup_frame(int sig, struct target_sigaction *ka,
3716
                        target_sigset_t *set, CPUOpenRISCState *env)
3717
{
3718
    qemu_log("Not implement.\n");
3719
}
3720

    
3721
static void setup_rt_frame(int sig, struct target_sigaction *ka,
3722
                           target_siginfo_t *info,
3723
                           target_sigset_t *set, CPUOpenRISCState *env)
3724
{
3725
    int err = 0;
3726
    abi_ulong frame_addr;
3727
    unsigned long return_ip;
3728
    struct target_rt_sigframe *frame;
3729
    abi_ulong info_addr, uc_addr;
3730

    
3731
    frame_addr = get_sigframe(ka, env, sizeof *frame);
3732

    
3733
    frame_addr = get_sigframe(ka, env, sizeof(*frame));
3734
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) {
3735
        goto give_sigsegv;
3736
    }
3737

    
3738
    info_addr = frame_addr + offsetof(struct target_rt_sigframe, info);
3739
    err |= __put_user(info_addr, &frame->pinfo);
3740
    uc_addr = frame_addr + offsetof(struct target_rt_sigframe, uc);
3741
    err |= __put_user(uc_addr, &frame->puc);
3742

    
3743
    if (ka->sa_flags & SA_SIGINFO) {
3744
        err |= copy_siginfo_to_user(&frame->info, info);
3745
    }
3746
    if (err) {
3747
        goto give_sigsegv;
3748
    }
3749

    
3750
    /*err |= __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext));*/
3751
    err |= __put_user(0, &frame->uc.tuc_flags);
3752
    err |= __put_user(0, &frame->uc.tuc_link);
3753
    err |= __put_user(target_sigaltstack_used.ss_sp,
3754
                      &frame->uc.tuc_stack.ss_sp);
3755
    err |= __put_user(sas_ss_flags(env->gpr[1]), &frame->uc.tuc_stack.ss_flags);
3756
    err |= __put_user(target_sigaltstack_used.ss_size,
3757
                      &frame->uc.tuc_stack.ss_size);
3758
    err |= setup_sigcontext(&frame->sc, env, set->sig[0]);
3759

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

    
3762
    if (err) {
3763
        goto give_sigsegv;
3764
    }
3765

    
3766
    /* trampoline - the desired return ip is the retcode itself */
3767
    return_ip = (unsigned long)&frame->retcode;
3768
    /* This is l.ori r11,r0,__NR_sigreturn, l.sys 1 */
3769
    err |= __put_user(0xa960, (short *)(frame->retcode + 0));
3770
    err |= __put_user(TARGET_NR_rt_sigreturn, (short *)(frame->retcode + 2));
3771
    err |= __put_user(0x20000001, (unsigned long *)(frame->retcode + 4));
3772
    err |= __put_user(0x15000000, (unsigned long *)(frame->retcode + 8));
3773

    
3774
    if (err) {
3775
        goto give_sigsegv;
3776
    }
3777

    
3778
    /* TODO what is the current->exec_domain stuff and invmap ? */
3779

    
3780
    /* Set up registers for signal handler */
3781
    env->pc = (unsigned long)ka->_sa_handler; /* what we enter NOW */
3782
    env->gpr[9] = (unsigned long)return_ip;     /* what we enter LATER */
3783
    env->gpr[3] = (unsigned long)sig;           /* arg 1: signo */
3784
    env->gpr[4] = (unsigned long)&frame->info;  /* arg 2: (siginfo_t*) */
3785
    env->gpr[5] = (unsigned long)&frame->uc;    /* arg 3: ucontext */
3786

    
3787
    /* actually move the usp to reflect the stacked frame */
3788
    env->gpr[1] = (unsigned long)frame;
3789

    
3790
    return;
3791

    
3792
give_sigsegv:
3793
    unlock_user_struct(frame, frame_addr, 1);
3794
    if (sig == TARGET_SIGSEGV) {
3795
        ka->_sa_handler = TARGET_SIG_DFL;
3796
    }
3797
    force_sig(TARGET_SIGSEGV);
3798
}
3799

    
3800
long do_sigreturn(CPUOpenRISCState *env)
3801
{
3802

    
3803
    qemu_log("do_sigreturn: not implemented\n");
3804
    return -TARGET_ENOSYS;
3805
}
3806

    
3807
long do_rt_sigreturn(CPUOpenRISCState *env)
3808
{
3809
    qemu_log("do_rt_sigreturn: not implemented\n");
3810
    return -TARGET_ENOSYS;
3811
}
3812
/* TARGET_OPENRISC */
3813

    
3814
#elif defined(TARGET_S390X)
3815

    
3816
#define __NUM_GPRS 16
3817
#define __NUM_FPRS 16
3818
#define __NUM_ACRS 16
3819

    
3820
#define S390_SYSCALL_SIZE   2
3821
#define __SIGNAL_FRAMESIZE      160 /* FIXME: 31-bit mode -> 96 */
3822

    
3823
#define _SIGCONTEXT_NSIG        64
3824
#define _SIGCONTEXT_NSIG_BPW    64 /* FIXME: 31-bit mode -> 32 */
3825
#define _SIGCONTEXT_NSIG_WORDS  (_SIGCONTEXT_NSIG / _SIGCONTEXT_NSIG_BPW)
3826
#define _SIGMASK_COPY_SIZE    (sizeof(unsigned long)*_SIGCONTEXT_NSIG_WORDS)
3827
#define PSW_ADDR_AMODE            0x0000000000000000UL /* 0x80000000UL for 31-bit */
3828
#define S390_SYSCALL_OPCODE ((uint16_t)0x0a00)
3829

    
3830
typedef struct {
3831
    target_psw_t psw;
3832
    target_ulong gprs[__NUM_GPRS];
3833
    unsigned int acrs[__NUM_ACRS];
3834
} target_s390_regs_common;
3835

    
3836
typedef struct {
3837
    unsigned int fpc;
3838
    double   fprs[__NUM_FPRS];
3839
} target_s390_fp_regs;
3840

    
3841
typedef struct {
3842
    target_s390_regs_common regs;
3843
    target_s390_fp_regs     fpregs;
3844
} target_sigregs;
3845

    
3846
struct target_sigcontext {
3847
    target_ulong   oldmask[_SIGCONTEXT_NSIG_WORDS];
3848
    target_sigregs *sregs;
3849
};
3850

    
3851
typedef struct {
3852
    uint8_t callee_used_stack[__SIGNAL_FRAMESIZE];
3853
    struct target_sigcontext sc;
3854
    target_sigregs sregs;
3855
    int signo;
3856
    uint8_t retcode[S390_SYSCALL_SIZE];
3857
} sigframe;
3858

    
3859
struct target_ucontext {
3860
    target_ulong tuc_flags;
3861
    struct target_ucontext *tuc_link;
3862
    target_stack_t tuc_stack;
3863
    target_sigregs tuc_mcontext;
3864
    target_sigset_t tuc_sigmask;   /* mask last for extensibility */
3865
};
3866

    
3867
typedef struct {
3868
    uint8_t callee_used_stack[__SIGNAL_FRAMESIZE];
3869
    uint8_t retcode[S390_SYSCALL_SIZE];
3870
    struct target_siginfo info;
3871
    struct target_ucontext uc;
3872
} rt_sigframe;
3873

    
3874
static inline abi_ulong
3875
get_sigframe(struct target_sigaction *ka, CPUS390XState *env, size_t frame_size)
3876
{
3877
    abi_ulong sp;
3878

    
3879
    /* Default to using normal stack */
3880
    sp = env->regs[15];
3881

    
3882
    /* This is the X/Open sanctioned signal stack switching.  */
3883
    if (ka->sa_flags & TARGET_SA_ONSTACK) {
3884
        if (!sas_ss_flags(sp)) {
3885
            sp = target_sigaltstack_used.ss_sp +
3886
                 target_sigaltstack_used.ss_size;
3887
        }
3888
    }
3889

    
3890
    /* This is the legacy signal stack switching. */
3891
    else if (/* FIXME !user_mode(regs) */ 0 &&
3892
             !(ka->sa_flags & TARGET_SA_RESTORER) &&
3893
             ka->sa_restorer) {
3894
        sp = (abi_ulong) ka->sa_restorer;
3895
    }
3896

    
3897
    return (sp - frame_size) & -8ul;
3898
}
3899

    
3900
static void save_sigregs(CPUS390XState *env, target_sigregs *sregs)
3901
{
3902
    int i;
3903
    //save_access_regs(current->thread.acrs); FIXME
3904

    
3905
    /* Copy a 'clean' PSW mask to the user to avoid leaking
3906
       information about whether PER is currently on.  */
3907
    __put_user(env->psw.mask, &sregs->regs.psw.mask);
3908
    __put_user(env->psw.addr, &sregs->regs.psw.addr);
3909
    for (i = 0; i < 16; i++) {
3910
        __put_user(env->regs[i], &sregs->regs.gprs[i]);
3911
    }
3912
    for (i = 0; i < 16; i++) {
3913
        __put_user(env->aregs[i], &sregs->regs.acrs[i]);
3914
    }
3915
    /*
3916
     * We have to store the fp registers to current->thread.fp_regs
3917
     * to merge them with the emulated registers.
3918
     */
3919
    //save_fp_regs(&current->thread.fp_regs); FIXME
3920
    for (i = 0; i < 16; i++) {
3921
        __put_user(env->fregs[i].ll, &sregs->fpregs.fprs[i]);
3922
    }
3923
}
3924

    
3925
static void setup_frame(int sig, struct target_sigaction *ka,
3926
                        target_sigset_t *set, CPUS390XState *env)
3927
{
3928
    sigframe *frame;
3929
    abi_ulong frame_addr;
3930

    
3931
    frame_addr = get_sigframe(ka, env, sizeof(*frame));
3932
    qemu_log("%s: frame_addr 0x%llx\n", __FUNCTION__,
3933
             (unsigned long long)frame_addr);
3934
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) {
3935
            goto give_sigsegv;
3936
    }
3937

    
3938
    qemu_log("%s: 1\n", __FUNCTION__);
3939
    if (__put_user(set->sig[0], &frame->sc.oldmask[0])) {
3940
              goto give_sigsegv;
3941
    }
3942

    
3943
    save_sigregs(env, &frame->sregs);
3944

    
3945
    __put_user((abi_ulong)(unsigned long)&frame->sregs,
3946
               (abi_ulong *)&frame->sc.sregs);
3947

    
3948
    /* Set up to return from userspace.  If provided, use a stub
3949
       already in userspace.  */
3950
    if (ka->sa_flags & TARGET_SA_RESTORER) {
3951
            env->regs[14] = (unsigned long)
3952
                    ka->sa_restorer | PSW_ADDR_AMODE;
3953
    } else {
3954
            env->regs[14] = (unsigned long)
3955
                    frame->retcode | PSW_ADDR_AMODE;
3956
            if (__put_user(S390_SYSCALL_OPCODE | TARGET_NR_sigreturn,
3957
                           (uint16_t *)(frame->retcode)))
3958
                    goto give_sigsegv;
3959
    }
3960

    
3961
    /* Set up backchain. */
3962
    if (__put_user(env->regs[15], (abi_ulong *) frame)) {
3963
            goto give_sigsegv;
3964
    }
3965

    
3966
    /* Set up registers for signal handler */
3967
    env->regs[15] = frame_addr;
3968
    env->psw.addr = (target_ulong) ka->_sa_handler | PSW_ADDR_AMODE;
3969

    
3970
    env->regs[2] = sig; //map_signal(sig);
3971
    env->regs[3] = frame_addr += offsetof(typeof(*frame), sc);
3972

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

    
3978
    /* Place signal number on stack to allow backtrace from handler.  */
3979
    if (__put_user(env->regs[2], (int *) &frame->signo)) {
3980
            goto give_sigsegv;
3981
    }
3982
    unlock_user_struct(frame, frame_addr, 1);
3983
    return;
3984

    
3985
give_sigsegv:
3986
    qemu_log("%s: give_sigsegv\n", __FUNCTION__);
3987
    unlock_user_struct(frame, frame_addr, 1);
3988
    force_sig(TARGET_SIGSEGV);
3989
}
3990

    
3991
static void setup_rt_frame(int sig, struct target_sigaction *ka,
3992
                           target_siginfo_t *info,
3993
                           target_sigset_t *set, CPUS390XState *env)
3994
{
3995
    int i;
3996
    rt_sigframe *frame;
3997
    abi_ulong frame_addr;
3998

    
3999
    frame_addr = get_sigframe(ka, env, sizeof *frame);
4000
    qemu_log("%s: frame_addr 0x%llx\n", __FUNCTION__,
4001
             (unsigned long long)frame_addr);
4002
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) {
4003
        goto give_sigsegv;
4004
    }
4005

    
4006
    qemu_log("%s: 1\n", __FUNCTION__);
4007
    if (copy_siginfo_to_user(&frame->info, info)) {
4008
        goto give_sigsegv;
4009
    }
4010

    
4011
    /* Create the ucontext.  */
4012
    __put_user(0, &frame->uc.tuc_flags);
4013
    __put_user((abi_ulong)0, (abi_ulong *)&frame->uc.tuc_link);
4014
    __put_user(target_sigaltstack_used.ss_sp, &frame->uc.tuc_stack.ss_sp);
4015
    __put_user(sas_ss_flags(get_sp_from_cpustate(env)),
4016
                      &frame->uc.tuc_stack.ss_flags);
4017
    __put_user(target_sigaltstack_used.ss_size, &frame->uc.tuc_stack.ss_size);
4018
    save_sigregs(env, &frame->uc.tuc_mcontext);
4019
    for (i = 0; i < TARGET_NSIG_WORDS; i++) {
4020
        __put_user((abi_ulong)set->sig[i],
4021
        (abi_ulong *)&frame->uc.tuc_sigmask.sig[i]);
4022
    }
4023

    
4024
    /* Set up to return from userspace.  If provided, use a stub
4025
       already in userspace.  */
4026
    if (ka->sa_flags & TARGET_SA_RESTORER) {
4027
        env->regs[14] = (unsigned long) ka->sa_restorer | PSW_ADDR_AMODE;
4028
    } else {
4029
        env->regs[14] = (unsigned long) frame->retcode | PSW_ADDR_AMODE;
4030
        if (__put_user(S390_SYSCALL_OPCODE | TARGET_NR_rt_sigreturn,
4031
                       (uint16_t *)(frame->retcode))) {
4032
            goto give_sigsegv;
4033
        }
4034
    }
4035

    
4036
    /* Set up backchain. */
4037
    if (__put_user(env->regs[15], (abi_ulong *) frame)) {
4038
        goto give_sigsegv;
4039
    }
4040

    
4041
    /* Set up registers for signal handler */
4042
    env->regs[15] = frame_addr;
4043
    env->psw.addr = (target_ulong) ka->_sa_handler | PSW_ADDR_AMODE;
4044

    
4045
    env->regs[2] = sig; //map_signal(sig);
4046
    env->regs[3] = frame_addr + offsetof(typeof(*frame), info);
4047
    env->regs[4] = frame_addr + offsetof(typeof(*frame), uc);
4048
    return;
4049

    
4050
give_sigsegv:
4051
    qemu_log("%s: give_sigsegv\n", __FUNCTION__);
4052
    unlock_user_struct(frame, frame_addr, 1);
4053
    force_sig(TARGET_SIGSEGV);
4054
}
4055

    
4056
static int
4057
restore_sigregs(CPUS390XState *env, target_sigregs *sc)
4058
{
4059
    int err = 0;
4060
    int i;
4061

    
4062
    for (i = 0; i < 16; i++) {
4063
        err |= __get_user(env->regs[i], &sc->regs.gprs[i]);
4064
    }
4065

    
4066
    err |= __get_user(env->psw.mask, &sc->regs.psw.mask);
4067
    qemu_log("%s: sc->regs.psw.addr 0x%llx env->psw.addr 0x%llx\n",
4068
             __FUNCTION__, (unsigned long long)sc->regs.psw.addr,
4069
             (unsigned long long)env->psw.addr);
4070
    err |= __get_user(env->psw.addr, &sc->regs.psw.addr);
4071
    /* FIXME: 31-bit -> | PSW_ADDR_AMODE */
4072

    
4073
    for (i = 0; i < 16; i++) {
4074
        err |= __get_user(env->aregs[i], &sc->regs.acrs[i]);
4075
    }
4076
    for (i = 0; i < 16; i++) {
4077
        err |= __get_user(env->fregs[i].ll, &sc->fpregs.fprs[i]);
4078
    }
4079

    
4080
    return err;
4081
}
4082

    
4083
long do_sigreturn(CPUS390XState *env)
4084
{
4085
    sigframe *frame;
4086
    abi_ulong frame_addr = env->regs[15];
4087
    qemu_log("%s: frame_addr 0x%llx\n", __FUNCTION__,
4088
             (unsigned long long)frame_addr);
4089
    target_sigset_t target_set;
4090
    sigset_t set;
4091

    
4092
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) {
4093
        goto badframe;
4094
    }
4095
    if (__get_user(target_set.sig[0], &frame->sc.oldmask[0])) {
4096
        goto badframe;
4097
    }
4098

    
4099
    target_to_host_sigset_internal(&set, &target_set);
4100
    sigprocmask(SIG_SETMASK, &set, NULL); /* ~_BLOCKABLE? */
4101

    
4102
    if (restore_sigregs(env, &frame->sregs)) {
4103
        goto badframe;
4104
    }
4105

    
4106
    unlock_user_struct(frame, frame_addr, 0);
4107
    return env->regs[2];
4108

    
4109
badframe:
4110
    unlock_user_struct(frame, frame_addr, 0);
4111
    force_sig(TARGET_SIGSEGV);
4112
    return 0;
4113
}
4114

    
4115
long do_rt_sigreturn(CPUS390XState *env)
4116
{
4117
    rt_sigframe *frame;
4118
    abi_ulong frame_addr = env->regs[15];
4119
    qemu_log("%s: frame_addr 0x%llx\n", __FUNCTION__,
4120
             (unsigned long long)frame_addr);
4121
    sigset_t set;
4122

    
4123
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) {
4124
        goto badframe;
4125
    }
4126
    target_to_host_sigset(&set, &frame->uc.tuc_sigmask);
4127

    
4128
    sigprocmask(SIG_SETMASK, &set, NULL); /* ~_BLOCKABLE? */
4129

    
4130
    if (restore_sigregs(env, &frame->uc.tuc_mcontext)) {
4131
        goto badframe;
4132
    }
4133

    
4134
    if (do_sigaltstack(frame_addr + offsetof(rt_sigframe, uc.tuc_stack), 0,
4135
                       get_sp_from_cpustate(env)) == -EFAULT) {
4136
        goto badframe;
4137
    }
4138
    unlock_user_struct(frame, frame_addr, 0);
4139
    return env->regs[2];
4140

    
4141
badframe:
4142
    unlock_user_struct(frame, frame_addr, 0);
4143
    force_sig(TARGET_SIGSEGV);
4144
    return 0;
4145
}
4146

    
4147
#elif defined(TARGET_PPC) && !defined(TARGET_PPC64)
4148

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

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

    
4157
/* Size of dummy stack frame allocated when calling signal handler.
4158
   See arch/powerpc/include/asm/ptrace.h.  */
4159
#if defined(TARGET_PPC64)
4160
#define SIGNAL_FRAMESIZE 128
4161
#else
4162
#define SIGNAL_FRAMESIZE 64
4163
#endif
4164

    
4165
/* See arch/powerpc/include/asm/sigcontext.h.  */
4166
struct target_sigcontext {
4167
    target_ulong _unused[4];
4168
    int32_t signal;
4169
#if defined(TARGET_PPC64)
4170
    int32_t pad0;
4171
#endif
4172
    target_ulong handler;
4173
    target_ulong oldmask;
4174
    target_ulong regs;      /* struct pt_regs __user * */
4175
    /* TODO: PPC64 includes extra bits here.  */
4176
};
4177

    
4178
/* Indices for target_mcontext.mc_gregs, below.
4179
   See arch/powerpc/include/asm/ptrace.h for details.  */
4180
enum {
4181
    TARGET_PT_R0 = 0,
4182
    TARGET_PT_R1 = 1,
4183
    TARGET_PT_R2 = 2,
4184
    TARGET_PT_R3 = 3,
4185
    TARGET_PT_R4 = 4,
4186
    TARGET_PT_R5 = 5,
4187
    TARGET_PT_R6 = 6,
4188
    TARGET_PT_R7 = 7,
4189
    TARGET_PT_R8 = 8,
4190
    TARGET_PT_R9 = 9,
4191
    TARGET_PT_R10 = 10,
4192
    TARGET_PT_R11 = 11,
4193
    TARGET_PT_R12 = 12,
4194
    TARGET_PT_R13 = 13,
4195
    TARGET_PT_R14 = 14,
4196
    TARGET_PT_R15 = 15,
4197
    TARGET_PT_R16 = 16,
4198
    TARGET_PT_R17 = 17,
4199
    TARGET_PT_R18 = 18,
4200
    TARGET_PT_R19 = 19,
4201
    TARGET_PT_R20 = 20,
4202
    TARGET_PT_R21 = 21,
4203
    TARGET_PT_R22 = 22,
4204
    TARGET_PT_R23 = 23,
4205
    TARGET_PT_R24 = 24,
4206
    TARGET_PT_R25 = 25,
4207
    TARGET_PT_R26 = 26,
4208
    TARGET_PT_R27 = 27,
4209
    TARGET_PT_R28 = 28,
4210
    TARGET_PT_R29 = 29,
4211
    TARGET_PT_R30 = 30,
4212
    TARGET_PT_R31 = 31,
4213
    TARGET_PT_NIP = 32,
4214
    TARGET_PT_MSR = 33,
4215
    TARGET_PT_ORIG_R3 = 34,
4216
    TARGET_PT_CTR = 35,
4217
    TARGET_PT_LNK = 36,
4218
    TARGET_PT_XER = 37,
4219
    TARGET_PT_CCR = 38,
4220
    /* Yes, there are two registers with #39.  One is 64-bit only.  */
4221
    TARGET_PT_MQ = 39,
4222
    TARGET_PT_SOFTE = 39,
4223
    TARGET_PT_TRAP = 40,
4224
    TARGET_PT_DAR = 41,
4225
    TARGET_PT_DSISR = 42,
4226
    TARGET_PT_RESULT = 43,
4227
    TARGET_PT_REGS_COUNT = 44
4228
};
4229

    
4230
/* See arch/powerpc/include/asm/ucontext.h.  Only used for 32-bit PPC;
4231
   on 64-bit PPC, sigcontext and mcontext are one and the same.  */
4232
struct target_mcontext {
4233
    target_ulong mc_gregs[48];
4234
    /* Includes fpscr.  */
4235
    uint64_t mc_fregs[33];
4236
    target_ulong mc_pad[2];
4237
    /* We need to handle Altivec and SPE at the same time, which no
4238
       kernel needs to do.  Fortunately, the kernel defines this bit to
4239
       be Altivec-register-large all the time, rather than trying to
4240
       twiddle it based on the specific platform.  */
4241
    union {
4242
        /* SPE vector registers.  One extra for SPEFSCR.  */
4243
        uint32_t spe[33];
4244
        /* Altivec vector registers.  The packing of VSCR and VRSAVE
4245
           varies depending on whether we're PPC64 or not: PPC64 splits
4246
           them apart; PPC32 stuffs them together.  */
4247
#if defined(TARGET_PPC64)
4248
#define QEMU_NVRREG 34
4249
#else
4250
#define QEMU_NVRREG 33
4251
#endif
4252
        ppc_avr_t altivec[QEMU_NVRREG];
4253
#undef QEMU_NVRREG
4254
    } mc_vregs __attribute__((__aligned__(16)));
4255
};
4256

    
4257
struct target_ucontext {
4258
    target_ulong tuc_flags;
4259
    target_ulong tuc_link;    /* struct ucontext __user * */
4260
    struct target_sigaltstack tuc_stack;
4261
#if !defined(TARGET_PPC64)
4262
    int32_t tuc_pad[7];
4263
    target_ulong tuc_regs;    /* struct mcontext __user *
4264
                                points to uc_mcontext field */
4265
#endif
4266
    target_sigset_t tuc_sigmask;
4267
#if defined(TARGET_PPC64)
4268
    target_sigset_t unused[15]; /* Allow for uc_sigmask growth */
4269
    struct target_sigcontext tuc_mcontext;
4270
#else
4271
    int32_t tuc_maskext[30];
4272
    int32_t tuc_pad2[3];
4273
    struct target_mcontext tuc_mcontext;
4274
#endif
4275
};
4276

    
4277
/* See arch/powerpc/kernel/signal_32.c.  */
4278
struct target_sigframe {
4279
    struct target_sigcontext sctx;
4280
    struct target_mcontext mctx;
4281
    int32_t abigap[56];
4282
};
4283

    
4284
struct target_rt_sigframe {
4285
    struct target_siginfo info;
4286
    struct target_ucontext uc;
4287
    int32_t abigap[56];
4288
};
4289

    
4290
/* We use the mc_pad field for the signal return trampoline.  */
4291
#define tramp mc_pad
4292

    
4293
/* See arch/powerpc/kernel/signal.c.  */
4294
static target_ulong get_sigframe(struct target_sigaction *ka,
4295
                                 CPUPPCState *env,
4296
                                 int frame_size)
4297
{
4298
    target_ulong oldsp, newsp;
4299

    
4300
    oldsp = env->gpr[1];
4301

    
4302
    if ((ka->sa_flags & TARGET_SA_ONSTACK) &&
4303
        (sas_ss_flags(oldsp) == 0)) {
4304
        oldsp = (target_sigaltstack_used.ss_sp
4305
                 + target_sigaltstack_used.ss_size);
4306
    }
4307

    
4308
    newsp = (oldsp - frame_size) & ~0xFUL;
4309

    
4310
    return newsp;
4311
}
4312

    
4313
static int save_user_regs(CPUPPCState *env, struct target_mcontext *frame,
4314
                          int sigret)
4315
{
4316
    target_ulong msr = env->msr;
4317
    int i;
4318
    target_ulong ccr = 0;
4319

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

    
4324
    /* Save general registers.  */
4325
    for (i = 0; i < ARRAY_SIZE(env->gpr); i++) {
4326
        if (__put_user(env->gpr[i], &frame->mc_gregs[i])) {
4327
            return 1;
4328
        }
4329
    }
4330
    if (__put_user(env->nip, &frame->mc_gregs[TARGET_PT_NIP])
4331
        || __put_user(env->ctr, &frame->mc_gregs[TARGET_PT_CTR])
4332
        || __put_user(env->lr, &frame->mc_gregs[TARGET_PT_LNK])
4333
        || __put_user(env->xer, &frame->mc_gregs[TARGET_PT_XER]))
4334
        return 1;
4335

    
4336
    for (i = 0; i < ARRAY_SIZE(env->crf); i++) {
4337
        ccr |= env->crf[i] << (32 - ((i + 1) * 4));
4338
    }
4339
    if (__put_user(ccr, &frame->mc_gregs[TARGET_PT_CCR]))
4340
        return 1;
4341

    
4342
    /* Save Altivec registers if necessary.  */
4343
    if (env->insns_flags & PPC_ALTIVEC) {
4344
        for (i = 0; i < ARRAY_SIZE(env->avr); i++) {
4345
            ppc_avr_t *avr = &env->avr[i];
4346
            ppc_avr_t *vreg = &frame->mc_vregs.altivec[i];
4347

    
4348
            if (__put_user(avr->u64[0], &vreg->u64[0]) ||
4349
                __put_user(avr->u64[1], &vreg->u64[1])) {
4350
                return 1;
4351
            }
4352
        }
4353
        /* Set MSR_VR in the saved MSR value to indicate that
4354
           frame->mc_vregs contains valid data.  */
4355
        msr |= MSR_VR;
4356
        if (__put_user((uint32_t)env->spr[SPR_VRSAVE],
4357
                       &frame->mc_vregs.altivec[32].u32[3]))
4358
            return 1;
4359
    }
4360

    
4361
    /* Save floating point registers.  */
4362
    if (env->insns_flags & PPC_FLOAT) {
4363
        for (i = 0; i < ARRAY_SIZE(env->fpr); i++) {
4364
            if (__put_user(env->fpr[i], &frame->mc_fregs[i])) {
4365
                return 1;
4366
            }
4367
        }
4368
        if (__put_user((uint64_t) env->fpscr, &frame->mc_fregs[32]))
4369
            return 1;
4370
    }
4371

    
4372
    /* Save SPE registers.  The kernel only saves the high half.  */
4373
    if (env->insns_flags & PPC_SPE) {
4374
#if defined(TARGET_PPC64)
4375
        for (i = 0; i < ARRAY_SIZE(env->gpr); i++) {
4376
            if (__put_user(env->gpr[i] >> 32, &frame->mc_vregs.spe[i])) {
4377
                return 1;
4378
            }
4379
        }
4380
#else
4381
        for (i = 0; i < ARRAY_SIZE(env->gprh); i++) {
4382
            if (__put_user(env->gprh[i], &frame->mc_vregs.spe[i])) {
4383
                return 1;
4384
            }
4385
        }
4386
#endif
4387
        /* Set MSR_SPE in the saved MSR value to indicate that
4388
           frame->mc_vregs contains valid data.  */
4389
        msr |= MSR_SPE;
4390
        if (__put_user(env->spe_fscr, &frame->mc_vregs.spe[32]))
4391
            return 1;
4392
    }
4393

    
4394
    /* Store MSR.  */
4395
    if (__put_user(msr, &frame->mc_gregs[TARGET_PT_MSR]))
4396
        return 1;
4397

    
4398
    /* Set up the sigreturn trampoline: li r0,sigret; sc.  */
4399
    if (sigret) {
4400
        if (__put_user(0x38000000UL | sigret, &frame->tramp[0]) ||
4401
            __put_user(0x44000002UL, &frame->tramp[1])) {
4402
            return 1;
4403
        }
4404
    }
4405

    
4406
    return 0;
4407
}
4408

    
4409
static int restore_user_regs(CPUPPCState *env,
4410
                             struct target_mcontext *frame, int sig)
4411
{
4412
    target_ulong save_r2 = 0;
4413
    target_ulong msr;
4414
    target_ulong ccr;
4415

    
4416
    int i;
4417

    
4418
    if (!sig) {
4419
        save_r2 = env->gpr[2];
4420
    }
4421

    
4422
    /* Restore general registers.  */
4423
    for (i = 0; i < ARRAY_SIZE(env->gpr); i++) {
4424
        if (__get_user(env->gpr[i], &frame->mc_gregs[i])) {
4425
            return 1;
4426
        }
4427
    }
4428
    if (__get_user(env->nip, &frame->mc_gregs[TARGET_PT_NIP])
4429
        || __get_user(env->ctr, &frame->mc_gregs[TARGET_PT_CTR])
4430
        || __get_user(env->lr, &frame->mc_gregs[TARGET_PT_LNK])
4431
        || __get_user(env->xer, &frame->mc_gregs[TARGET_PT_XER]))
4432
        return 1;
4433
    if (__get_user(ccr, &frame->mc_gregs[TARGET_PT_CCR]))
4434
        return 1;
4435

    
4436
    for (i = 0; i < ARRAY_SIZE(env->crf); i++) {
4437
        env->crf[i] = (ccr >> (32 - ((i + 1) * 4))) & 0xf;
4438
    }
4439

    
4440
    if (!sig) {
4441
        env->gpr[2] = save_r2;
4442
    }
4443
    /* Restore MSR.  */
4444
    if (__get_user(msr, &frame->mc_gregs[TARGET_PT_MSR]))
4445
        return 1;
4446

    
4447
    /* If doing signal return, restore the previous little-endian mode.  */
4448
    if (sig)
4449
        env->msr = (env->msr & ~MSR_LE) | (msr & MSR_LE);
4450

    
4451
    /* Restore Altivec registers if necessary.  */
4452
    if (env->insns_flags & PPC_ALTIVEC) {
4453
        for (i = 0; i < ARRAY_SIZE(env->avr); i++) {
4454
            ppc_avr_t *avr = &env->avr[i];
4455
            ppc_avr_t *vreg = &frame->mc_vregs.altivec[i];
4456

    
4457
            if (__get_user(avr->u64[0], &vreg->u64[0]) ||
4458
                __get_user(avr->u64[1], &vreg->u64[1])) {
4459
                return 1;
4460
            }
4461
        }
4462
        /* Set MSR_VEC in the saved MSR value to indicate that
4463
           frame->mc_vregs contains valid data.  */
4464
        if (__get_user(env->spr[SPR_VRSAVE],
4465
                       (target_ulong *)(&frame->mc_vregs.altivec[32].u32[3])))
4466
            return 1;
4467
    }
4468

    
4469
    /* Restore floating point registers.  */
4470
    if (env->insns_flags & PPC_FLOAT) {
4471
        uint64_t fpscr;
4472
        for (i = 0; i < ARRAY_SIZE(env->fpr); i++) {
4473
            if (__get_user(env->fpr[i], &frame->mc_fregs[i])) {
4474
                return 1;
4475
            }
4476
        }
4477
        if (__get_user(fpscr, &frame->mc_fregs[32]))
4478
            return 1;
4479
        env->fpscr = (uint32_t) fpscr;
4480
    }
4481

    
4482
    /* Save SPE registers.  The kernel only saves the high half.  */
4483
    if (env->insns_flags & PPC_SPE) {
4484
#if defined(TARGET_PPC64)
4485
        for (i = 0; i < ARRAY_SIZE(env->gpr); i++) {
4486
            uint32_t hi;
4487

    
4488
            if (__get_user(hi, &frame->mc_vregs.spe[i])) {
4489
                return 1;
4490
            }
4491
            env->gpr[i] = ((uint64_t)hi << 32) | ((uint32_t) env->gpr[i]);
4492
        }
4493
#else
4494
        for (i = 0; i < ARRAY_SIZE(env->gprh); i++) {
4495
            if (__get_user(env->gprh[i], &frame->mc_vregs.spe[i])) {
4496
                return 1;
4497
            }
4498
        }
4499
#endif
4500
        if (__get_user(env->spe_fscr, &frame->mc_vregs.spe[32]))
4501
            return 1;
4502
    }
4503

    
4504
    return 0;
4505
}
4506

    
4507
static void setup_frame(int sig, struct target_sigaction *ka,
4508
                        target_sigset_t *set, CPUPPCState *env)
4509
{
4510
    struct target_sigframe *frame;
4511
    struct target_sigcontext *sc;
4512
    target_ulong frame_addr, newsp;
4513
    int err = 0;
4514
    int signal;
4515

    
4516
    frame_addr = get_sigframe(ka, env, sizeof(*frame));
4517
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 1))
4518
        goto sigsegv;
4519
    sc = &frame->sctx;
4520

    
4521
    signal = current_exec_domain_sig(sig);
4522

    
4523
    err |= __put_user(ka->_sa_handler, &sc->handler);
4524
    err |= __put_user(set->sig[0], &sc->oldmask);
4525
#if defined(TARGET_PPC64)
4526
    err |= __put_user(set->sig[0] >> 32, &sc->_unused[3]);
4527
#else
4528
    err |= __put_user(set->sig[1], &sc->_unused[3]);
4529
#endif
4530
    err |= __put_user(h2g(&frame->mctx), &sc->regs);
4531
    err |= __put_user(sig, &sc->signal);
4532

    
4533
    /* Save user regs.  */
4534
    err |= save_user_regs(env, &frame->mctx, TARGET_NR_sigreturn);
4535

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

    
4540
    /* Turn off all fp exceptions.  */
4541
    env->fpscr = 0;
4542

    
4543
    /* Create a stack frame for the caller of the handler.  */
4544
    newsp = frame_addr - SIGNAL_FRAMESIZE;
4545
    err |= put_user(env->gpr[1], newsp, target_ulong);
4546

    
4547
    if (err)
4548
        goto sigsegv;
4549

    
4550
    /* Set up registers for signal handler.  */
4551
    env->gpr[1] = newsp;
4552
    env->gpr[3] = signal;
4553
    env->gpr[4] = frame_addr + offsetof(struct target_sigframe, sctx);
4554
    env->nip = (target_ulong) ka->_sa_handler;
4555
    /* Signal handlers are entered in big-endian mode.  */
4556
    env->msr &= ~MSR_LE;
4557

    
4558
    unlock_user_struct(frame, frame_addr, 1);
4559
    return;
4560

    
4561
sigsegv:
4562
    unlock_user_struct(frame, frame_addr, 1);
4563
    qemu_log("segfaulting from setup_frame\n");
4564
    force_sig(TARGET_SIGSEGV);
4565
}
4566

    
4567
static void setup_rt_frame(int sig, struct target_sigaction *ka,
4568
                           target_siginfo_t *info,
4569
                           target_sigset_t *set, CPUPPCState *env)
4570
{
4571
    struct target_rt_sigframe *rt_sf;
4572
    struct target_mcontext *frame;
4573
    target_ulong rt_sf_addr, newsp = 0;
4574
    int i, err = 0;
4575
    int signal;
4576

    
4577
    rt_sf_addr = get_sigframe(ka, env, sizeof(*rt_sf));
4578
    if (!lock_user_struct(VERIFY_WRITE, rt_sf, rt_sf_addr, 1))
4579
        goto sigsegv;
4580

    
4581
    signal = current_exec_domain_sig(sig);
4582

    
4583
    err |= copy_siginfo_to_user(&rt_sf->info, info);
4584

    
4585
    err |= __put_user(0, &rt_sf->uc.tuc_flags);
4586
    err |= __put_user(0, &rt_sf->uc.tuc_link);
4587
    err |= __put_user((target_ulong)target_sigaltstack_used.ss_sp,
4588
                      &rt_sf->uc.tuc_stack.ss_sp);
4589
    err |= __put_user(sas_ss_flags(env->gpr[1]),
4590
                      &rt_sf->uc.tuc_stack.ss_flags);
4591
    err |= __put_user(target_sigaltstack_used.ss_size,
4592
                      &rt_sf->uc.tuc_stack.ss_size);
4593
    err |= __put_user(h2g (&rt_sf->uc.tuc_mcontext),
4594
                      &rt_sf->uc.tuc_regs);
4595
    for(i = 0; i < TARGET_NSIG_WORDS; i++) {
4596
        err |= __put_user(set->sig[i], &rt_sf->uc.tuc_sigmask.sig[i]);
4597
    }
4598

    
4599
    frame = &rt_sf->uc.tuc_mcontext;
4600
    err |= save_user_regs(env, frame, TARGET_NR_rt_sigreturn);
4601

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

    
4606
    /* Turn off all fp exceptions.  */
4607
    env->fpscr = 0;
4608

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

    
4613
    if (err)
4614
        goto sigsegv;
4615

    
4616
    /* Set up registers for signal handler.  */
4617
    env->gpr[1] = newsp;
4618
    env->gpr[3] = (target_ulong) signal;
4619
    env->gpr[4] = (target_ulong) h2g(&rt_sf->info);
4620
    env->gpr[5] = (target_ulong) h2g(&rt_sf->uc);
4621
    env->gpr[6] = (target_ulong) h2g(rt_sf);
4622
    env->nip = (target_ulong) ka->_sa_handler;
4623
    /* Signal handlers are entered in big-endian mode.  */
4624
    env->msr &= ~MSR_LE;
4625

    
4626
    unlock_user_struct(rt_sf, rt_sf_addr, 1);
4627
    return;
4628

    
4629
sigsegv:
4630
    unlock_user_struct(rt_sf, rt_sf_addr, 1);
4631
    qemu_log("segfaulting from setup_rt_frame\n");
4632
    force_sig(TARGET_SIGSEGV);
4633

    
4634
}
4635

    
4636
long do_sigreturn(CPUPPCState *env)
4637
{
4638
    struct target_sigcontext *sc = NULL;
4639
    struct target_mcontext *sr = NULL;
4640
    target_ulong sr_addr, sc_addr;
4641
    sigset_t blocked;
4642
    target_sigset_t set;
4643

    
4644
    sc_addr = env->gpr[1] + SIGNAL_FRAMESIZE;
4645
    if (!lock_user_struct(VERIFY_READ, sc, sc_addr, 1))
4646
        goto sigsegv;
4647

    
4648
#if defined(TARGET_PPC64)
4649
    set.sig[0] = sc->oldmask + ((long)(sc->_unused[3]) << 32);
4650
#else
4651
    if(__get_user(set.sig[0], &sc->oldmask) ||
4652
       __get_user(set.sig[1], &sc->_unused[3]))
4653
       goto sigsegv;
4654
#endif
4655
    target_to_host_sigset_internal(&blocked, &set);
4656
    sigprocmask(SIG_SETMASK, &blocked, NULL);
4657

    
4658
    if (__get_user(sr_addr, &sc->regs))
4659
        goto sigsegv;
4660
    if (!lock_user_struct(VERIFY_READ, sr, sr_addr, 1))
4661
        goto sigsegv;
4662
    if (restore_user_regs(env, sr, 1))
4663
        goto sigsegv;
4664

    
4665
    unlock_user_struct(sr, sr_addr, 1);
4666
    unlock_user_struct(sc, sc_addr, 1);
4667
    return -TARGET_QEMU_ESIGRETURN;
4668

    
4669
sigsegv:
4670
    unlock_user_struct(sr, sr_addr, 1);
4671
    unlock_user_struct(sc, sc_addr, 1);
4672
    qemu_log("segfaulting from do_sigreturn\n");
4673
    force_sig(TARGET_SIGSEGV);
4674
    return 0;
4675
}
4676

    
4677
/* See arch/powerpc/kernel/signal_32.c.  */
4678
static int do_setcontext(struct target_ucontext *ucp, CPUPPCState *env, int sig)
4679
{
4680
    struct target_mcontext *mcp;
4681
    target_ulong mcp_addr;
4682
    sigset_t blocked;
4683
    target_sigset_t set;
4684

    
4685
    if (copy_from_user(&set, h2g(ucp) + offsetof(struct target_ucontext, tuc_sigmask),
4686
                       sizeof (set)))
4687
        return 1;
4688

    
4689
#if defined(TARGET_PPC64)
4690
    fprintf (stderr, "do_setcontext: not implemented\n");
4691
    return 0;
4692
#else
4693
    if (__get_user(mcp_addr, &ucp->tuc_regs))
4694
        return 1;
4695

    
4696
    if (!lock_user_struct(VERIFY_READ, mcp, mcp_addr, 1))
4697
        return 1;
4698

    
4699
    target_to_host_sigset_internal(&blocked, &set);
4700
    sigprocmask(SIG_SETMASK, &blocked, NULL);
4701
    if (restore_user_regs(env, mcp, sig))
4702
        goto sigsegv;
4703

    
4704
    unlock_user_struct(mcp, mcp_addr, 1);
4705
    return 0;
4706

    
4707
sigsegv:
4708
    unlock_user_struct(mcp, mcp_addr, 1);
4709
    return 1;
4710
#endif
4711
}
4712

    
4713
long do_rt_sigreturn(CPUPPCState *env)
4714
{
4715
    struct target_rt_sigframe *rt_sf = NULL;
4716
    target_ulong rt_sf_addr;
4717

    
4718
    rt_sf_addr = env->gpr[1] + SIGNAL_FRAMESIZE + 16;
4719
    if (!lock_user_struct(VERIFY_READ, rt_sf, rt_sf_addr, 1))
4720
        goto sigsegv;
4721

    
4722
    if (do_setcontext(&rt_sf->uc, env, 1))
4723
        goto sigsegv;
4724

    
4725
    do_sigaltstack(rt_sf_addr
4726
                   + offsetof(struct target_rt_sigframe, uc.tuc_stack),
4727
                   0, env->gpr[1]);
4728

    
4729
    unlock_user_struct(rt_sf, rt_sf_addr, 1);
4730
    return -TARGET_QEMU_ESIGRETURN;
4731

    
4732
sigsegv:
4733
    unlock_user_struct(rt_sf, rt_sf_addr, 1);
4734
    qemu_log("segfaulting from do_rt_sigreturn\n");
4735
    force_sig(TARGET_SIGSEGV);
4736
    return 0;
4737
}
4738

    
4739
#elif defined(TARGET_M68K)
4740

    
4741
struct target_sigcontext {
4742
    abi_ulong  sc_mask;
4743
    abi_ulong  sc_usp;
4744
    abi_ulong  sc_d0;
4745
    abi_ulong  sc_d1;
4746
    abi_ulong  sc_a0;
4747
    abi_ulong  sc_a1;
4748
    unsigned short sc_sr;
4749
    abi_ulong  sc_pc;
4750
};
4751

    
4752
struct target_sigframe
4753
{
4754
    abi_ulong pretcode;
4755
    int sig;
4756
    int code;
4757
    abi_ulong psc;
4758
    char retcode[8];
4759
    abi_ulong extramask[TARGET_NSIG_WORDS-1];
4760
    struct target_sigcontext sc;
4761
};
4762
 
4763
typedef int target_greg_t;
4764
#define TARGET_NGREG 18
4765
typedef target_greg_t target_gregset_t[TARGET_NGREG];
4766

    
4767
typedef struct target_fpregset {
4768
    int f_fpcntl[3];
4769
    int f_fpregs[8*3];
4770
} target_fpregset_t;
4771

    
4772
struct target_mcontext {
4773
    int version;
4774
    target_gregset_t gregs;
4775
    target_fpregset_t fpregs;
4776
};
4777

    
4778
#define TARGET_MCONTEXT_VERSION 2
4779

    
4780
struct target_ucontext {
4781
    abi_ulong tuc_flags;
4782
    abi_ulong tuc_link;
4783
    target_stack_t tuc_stack;
4784
    struct target_mcontext tuc_mcontext;
4785
    abi_long tuc_filler[80];
4786
    target_sigset_t tuc_sigmask;
4787
};
4788

    
4789
struct target_rt_sigframe
4790
{
4791
    abi_ulong pretcode;
4792
    int sig;
4793
    abi_ulong pinfo;
4794
    abi_ulong puc;
4795
    char retcode[8];
4796
    struct target_siginfo info;
4797
    struct target_ucontext uc;
4798
};
4799

    
4800
static int
4801
setup_sigcontext(struct target_sigcontext *sc, CPUM68KState *env,
4802
                 abi_ulong mask)
4803
{
4804
    int err = 0;
4805

    
4806
    err |= __put_user(mask, &sc->sc_mask);
4807
    err |= __put_user(env->aregs[7], &sc->sc_usp);
4808
    err |= __put_user(env->dregs[0], &sc->sc_d0);
4809
    err |= __put_user(env->dregs[1], &sc->sc_d1);
4810
    err |= __put_user(env->aregs[0], &sc->sc_a0);
4811
    err |= __put_user(env->aregs[1], &sc->sc_a1);
4812
    err |= __put_user(env->sr, &sc->sc_sr);
4813
    err |= __put_user(env->pc, &sc->sc_pc);
4814

    
4815
    return err;
4816
}
4817

    
4818
static int
4819
restore_sigcontext(CPUM68KState *env, struct target_sigcontext *sc, int *pd0)
4820
{
4821
    int err = 0;
4822
    int temp;
4823

    
4824
    err |= __get_user(env->aregs[7], &sc->sc_usp);
4825
    err |= __get_user(env->dregs[1], &sc->sc_d1);
4826
    err |= __get_user(env->aregs[0], &sc->sc_a0);
4827
    err |= __get_user(env->aregs[1], &sc->sc_a1);
4828
    err |= __get_user(env->pc, &sc->sc_pc);
4829
    err |= __get_user(temp, &sc->sc_sr);
4830
    env->sr = (env->sr & 0xff00) | (temp & 0xff);
4831

    
4832
    *pd0 = tswapl(sc->sc_d0);
4833

    
4834
    return err;
4835
}
4836

    
4837
/*
4838
 * Determine which stack to use..
4839
 */
4840
static inline abi_ulong
4841
get_sigframe(struct target_sigaction *ka, CPUM68KState *regs,
4842
             size_t frame_size)
4843
{
4844
    unsigned long sp;
4845

    
4846
    sp = regs->aregs[7];
4847

    
4848
    /* This is the X/Open sanctioned signal stack switching.  */
4849
    if ((ka->sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags (sp) == 0)) {
4850
        sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
4851
    }
4852

    
4853
    return ((sp - frame_size) & -8UL);
4854
}
4855

    
4856
static void setup_frame(int sig, struct target_sigaction *ka,
4857
                        target_sigset_t *set, CPUM68KState *env)
4858
{
4859
    struct target_sigframe *frame;
4860
    abi_ulong frame_addr;
4861
    abi_ulong retcode_addr;
4862
    abi_ulong sc_addr;
4863
    int err = 0;
4864
    int i;
4865

    
4866
    frame_addr = get_sigframe(ka, env, sizeof *frame);
4867
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
4868
        goto give_sigsegv;
4869

    
4870
    err |= __put_user(sig, &frame->sig);
4871

    
4872
    sc_addr = frame_addr + offsetof(struct target_sigframe, sc);
4873
    err |= __put_user(sc_addr, &frame->psc);
4874

    
4875
    err |= setup_sigcontext(&frame->sc, env, set->sig[0]);
4876
    if (err)
4877
        goto give_sigsegv;
4878

    
4879
    for(i = 1; i < TARGET_NSIG_WORDS; i++) {
4880
        if (__put_user(set->sig[i], &frame->extramask[i - 1]))
4881
            goto give_sigsegv;
4882
    }
4883

    
4884
    /* Set up to return from userspace.  */
4885

    
4886
    retcode_addr = frame_addr + offsetof(struct target_sigframe, retcode);
4887
    err |= __put_user(retcode_addr, &frame->pretcode);
4888

    
4889
    /* moveq #,d0; trap #0 */
4890

    
4891
    err |= __put_user(0x70004e40 + (TARGET_NR_sigreturn << 16),
4892
                      (long *)(frame->retcode));
4893

    
4894
    if (err)
4895
        goto give_sigsegv;
4896

    
4897
    /* Set up to return from userspace */
4898

    
4899
    env->aregs[7] = frame_addr;
4900
    env->pc = ka->_sa_handler;
4901

    
4902
    unlock_user_struct(frame, frame_addr, 1);
4903
    return;
4904

    
4905
give_sigsegv:
4906
    unlock_user_struct(frame, frame_addr, 1);
4907
    force_sig(TARGET_SIGSEGV);
4908
}
4909

    
4910
static inline int target_rt_setup_ucontext(struct target_ucontext *uc,
4911
                                           CPUM68KState *env)
4912
{
4913
    target_greg_t *gregs = uc->tuc_mcontext.gregs;
4914
    int err;
4915

    
4916
    err = __put_user(TARGET_MCONTEXT_VERSION, &uc->tuc_mcontext.version);
4917
    err |= __put_user(env->dregs[0], &gregs[0]);
4918
    err |= __put_user(env->dregs[1], &gregs[1]);
4919
    err |= __put_user(env->dregs[2], &gregs[2]);
4920
    err |= __put_user(env->dregs[3], &gregs[3]);
4921
    err |= __put_user(env->dregs[4], &gregs[4]);
4922
    err |= __put_user(env->dregs[5], &gregs[5]);
4923
    err |= __put_user(env->dregs[6], &gregs[6]);
4924
    err |= __put_user(env->dregs[7], &gregs[7]);
4925
    err |= __put_user(env->aregs[0], &gregs[8]);
4926
    err |= __put_user(env->aregs[1], &gregs[9]);
4927
    err |= __put_user(env->aregs[2], &gregs[10]);
4928
    err |= __put_user(env->aregs[3], &gregs[11]);
4929
    err |= __put_user(env->aregs[4], &gregs[12]);
4930
    err |= __put_user(env->aregs[5], &gregs[13]);
4931
    err |= __put_user(env->aregs[6], &gregs[14]);
4932
    err |= __put_user(env->aregs[7], &gregs[15]);
4933
    err |= __put_user(env->pc, &gregs[16]);
4934
    err |= __put_user(env->sr, &gregs[17]);
4935

    
4936
    return err;
4937
}
4938
 
4939
static inline int target_rt_restore_ucontext(CPUM68KState *env,
4940
                                             struct target_ucontext *uc,
4941
                                             int *pd0)
4942
{
4943
    int temp;
4944
    int err;
4945
    target_greg_t *gregs = uc->tuc_mcontext.gregs;
4946
    
4947
    err = __get_user(temp, &uc->tuc_mcontext.version);
4948
    if (temp != TARGET_MCONTEXT_VERSION)
4949
        goto badframe;
4950

    
4951
    /* restore passed registers */
4952
    err |= __get_user(env->dregs[0], &gregs[0]);
4953
    err |= __get_user(env->dregs[1], &gregs[1]);
4954
    err |= __get_user(env->dregs[2], &gregs[2]);
4955
    err |= __get_user(env->dregs[3], &gregs[3]);
4956
    err |= __get_user(env->dregs[4], &gregs[4]);
4957
    err |= __get_user(env->dregs[5], &gregs[5]);
4958
    err |= __get_user(env->dregs[6], &gregs[6]);
4959
    err |= __get_user(env->dregs[7], &gregs[7]);
4960
    err |= __get_user(env->aregs[0], &gregs[8]);
4961
    err |= __get_user(env->aregs[1], &gregs[9]);
4962
    err |= __get_user(env->aregs[2], &gregs[10]);
4963
    err |= __get_user(env->aregs[3], &gregs[11]);
4964
    err |= __get_user(env->aregs[4], &gregs[12]);
4965
    err |= __get_user(env->aregs[5], &gregs[13]);
4966
    err |= __get_user(env->aregs[6], &gregs[14]);
4967
    err |= __get_user(env->aregs[7], &gregs[15]);
4968
    err |= __get_user(env->pc, &gregs[16]);
4969
    err |= __get_user(temp, &gregs[17]);
4970
    env->sr = (env->sr & 0xff00) | (temp & 0xff);
4971

    
4972
    *pd0 = env->dregs[0];
4973
    return err;
4974

    
4975
badframe:
4976
    return 1;
4977
}
4978

    
4979
static void setup_rt_frame(int sig, struct target_sigaction *ka,
4980
                           target_siginfo_t *info,
4981
                           target_sigset_t *set, CPUM68KState *env)
4982
{
4983
    struct target_rt_sigframe *frame;
4984
    abi_ulong frame_addr;
4985
    abi_ulong retcode_addr;
4986
    abi_ulong info_addr;
4987
    abi_ulong uc_addr;
4988
    int err = 0;
4989
    int i;
4990

    
4991
    frame_addr = get_sigframe(ka, env, sizeof *frame);
4992
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
4993
        goto give_sigsegv;
4994

    
4995
    err |= __put_user(sig, &frame->sig);
4996

    
4997
    info_addr = frame_addr + offsetof(struct target_rt_sigframe, info);
4998
    err |= __put_user(info_addr, &frame->pinfo);
4999

    
5000
    uc_addr = frame_addr + offsetof(struct target_rt_sigframe, uc);
5001
    err |= __put_user(uc_addr, &frame->puc);
5002

    
5003
    err |= copy_siginfo_to_user(&frame->info, info);
5004

    
5005
    /* Create the ucontext */
5006

    
5007
    err |= __put_user(0, &frame->uc.tuc_flags);
5008
    err |= __put_user(0, &frame->uc.tuc_link);
5009
    err |= __put_user(target_sigaltstack_used.ss_sp,
5010
                      &frame->uc.tuc_stack.ss_sp);
5011
    err |= __put_user(sas_ss_flags(env->aregs[7]),
5012
                      &frame->uc.tuc_stack.ss_flags);
5013
    err |= __put_user(target_sigaltstack_used.ss_size,
5014
                      &frame->uc.tuc_stack.ss_size);
5015
    err |= target_rt_setup_ucontext(&frame->uc, env);
5016

    
5017
    if (err)
5018
            goto give_sigsegv;
5019

    
5020
    for(i = 0; i < TARGET_NSIG_WORDS; i++) {
5021
        if (__put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]))
5022
            goto give_sigsegv;
5023
    }
5024

    
5025
    /* Set up to return from userspace.  */
5026

    
5027
    retcode_addr = frame_addr + offsetof(struct target_sigframe, retcode);
5028
    err |= __put_user(retcode_addr, &frame->pretcode);
5029

    
5030
    /* moveq #,d0; notb d0; trap #0 */
5031

    
5032
    err |= __put_user(0x70004600 + ((TARGET_NR_rt_sigreturn ^ 0xff) << 16),
5033
                      (long *)(frame->retcode + 0));
5034
    err |= __put_user(0x4e40, (short *)(frame->retcode + 4));
5035

    
5036
    if (err)
5037
        goto give_sigsegv;
5038

    
5039
    /* Set up to return from userspace */
5040

    
5041
    env->aregs[7] = frame_addr;
5042
    env->pc = ka->_sa_handler;
5043

    
5044
    unlock_user_struct(frame, frame_addr, 1);
5045
    return;
5046

    
5047
give_sigsegv:
5048
    unlock_user_struct(frame, frame_addr, 1);
5049
    force_sig(TARGET_SIGSEGV);
5050
}
5051

    
5052
long do_sigreturn(CPUM68KState *env)
5053
{
5054
    struct target_sigframe *frame;
5055
    abi_ulong frame_addr = env->aregs[7] - 4;
5056
    target_sigset_t target_set;
5057
    sigset_t set;
5058
    int d0, i;
5059

    
5060
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
5061
        goto badframe;
5062

    
5063
    /* set blocked signals */
5064

    
5065
    if (__get_user(target_set.sig[0], &frame->sc.sc_mask))
5066
        goto badframe;
5067

    
5068
    for(i = 1; i < TARGET_NSIG_WORDS; i++) {
5069
        if (__get_user(target_set.sig[i], &frame->extramask[i - 1]))
5070
            goto badframe;
5071
    }
5072

    
5073
    target_to_host_sigset_internal(&set, &target_set);
5074
    sigprocmask(SIG_SETMASK, &set, NULL);
5075

    
5076
    /* restore registers */
5077

    
5078
    if (restore_sigcontext(env, &frame->sc, &d0))
5079
        goto badframe;
5080

    
5081
    unlock_user_struct(frame, frame_addr, 0);
5082
    return d0;
5083

    
5084
badframe:
5085
    unlock_user_struct(frame, frame_addr, 0);
5086
    force_sig(TARGET_SIGSEGV);
5087
    return 0;
5088
}
5089

    
5090
long do_rt_sigreturn(CPUM68KState *env)
5091
{
5092
    struct target_rt_sigframe *frame;
5093
    abi_ulong frame_addr = env->aregs[7] - 4;
5094
    target_sigset_t target_set;
5095
    sigset_t set;
5096
    int d0;
5097

    
5098
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
5099
        goto badframe;
5100

    
5101
    target_to_host_sigset_internal(&set, &target_set);
5102
    sigprocmask(SIG_SETMASK, &set, NULL);
5103

    
5104
    /* restore registers */
5105

    
5106
    if (target_rt_restore_ucontext(env, &frame->uc, &d0))
5107
        goto badframe;
5108

    
5109
    if (do_sigaltstack(frame_addr +
5110
                       offsetof(struct target_rt_sigframe, uc.tuc_stack),
5111
                       0, get_sp_from_cpustate(env)) == -EFAULT)
5112
        goto badframe;
5113

    
5114
    unlock_user_struct(frame, frame_addr, 0);
5115
    return d0;
5116

    
5117
badframe:
5118
    unlock_user_struct(frame, frame_addr, 0);
5119
    force_sig(TARGET_SIGSEGV);
5120
    return 0;
5121
}
5122

    
5123
#elif defined(TARGET_ALPHA)
5124

    
5125
struct target_sigcontext {
5126
    abi_long sc_onstack;
5127
    abi_long sc_mask;
5128
    abi_long sc_pc;
5129
    abi_long sc_ps;
5130
    abi_long sc_regs[32];
5131
    abi_long sc_ownedfp;
5132
    abi_long sc_fpregs[32];
5133
    abi_ulong sc_fpcr;
5134
    abi_ulong sc_fp_control;
5135
    abi_ulong sc_reserved1;
5136
    abi_ulong sc_reserved2;
5137
    abi_ulong sc_ssize;
5138
    abi_ulong sc_sbase;
5139
    abi_ulong sc_traparg_a0;
5140
    abi_ulong sc_traparg_a1;
5141
    abi_ulong sc_traparg_a2;
5142
    abi_ulong sc_fp_trap_pc;
5143
    abi_ulong sc_fp_trigger_sum;
5144
    abi_ulong sc_fp_trigger_inst;
5145
};
5146

    
5147
struct target_ucontext {
5148
    abi_ulong tuc_flags;
5149
    abi_ulong tuc_link;
5150
    abi_ulong tuc_osf_sigmask;
5151
    target_stack_t tuc_stack;
5152
    struct target_sigcontext tuc_mcontext;
5153
    target_sigset_t tuc_sigmask;
5154
};
5155

    
5156
struct target_sigframe {
5157
    struct target_sigcontext sc;
5158
    unsigned int retcode[3];
5159
};
5160

    
5161
struct target_rt_sigframe {
5162
    target_siginfo_t info;
5163
    struct target_ucontext uc;
5164
    unsigned int retcode[3];
5165
};
5166

    
5167
#define INSN_MOV_R30_R16        0x47fe0410
5168
#define INSN_LDI_R0             0x201f0000
5169
#define INSN_CALLSYS            0x00000083
5170

    
5171
static int setup_sigcontext(struct target_sigcontext *sc, CPUAlphaState *env,
5172
                            abi_ulong frame_addr, target_sigset_t *set)
5173
{
5174
    int i, err = 0;
5175

    
5176
    err |= __put_user(on_sig_stack(frame_addr), &sc->sc_onstack);
5177
    err |= __put_user(set->sig[0], &sc->sc_mask);
5178
    err |= __put_user(env->pc, &sc->sc_pc);
5179
    err |= __put_user(8, &sc->sc_ps);
5180

    
5181
    for (i = 0; i < 31; ++i) {
5182
        err |= __put_user(env->ir[i], &sc->sc_regs[i]);
5183
    }
5184
    err |= __put_user(0, &sc->sc_regs[31]);
5185

    
5186
    for (i = 0; i < 31; ++i) {
5187
        err |= __put_user(env->fir[i], &sc->sc_fpregs[i]);
5188
    }
5189
    err |= __put_user(0, &sc->sc_fpregs[31]);
5190
    err |= __put_user(cpu_alpha_load_fpcr(env), &sc->sc_fpcr);
5191

    
5192
    err |= __put_user(0, &sc->sc_traparg_a0); /* FIXME */
5193
    err |= __put_user(0, &sc->sc_traparg_a1); /* FIXME */
5194
    err |= __put_user(0, &sc->sc_traparg_a2); /* FIXME */
5195

    
5196
    return err;
5197
}
5198

    
5199
static int restore_sigcontext(CPUAlphaState *env,
5200
                              struct target_sigcontext *sc)
5201
{
5202
    uint64_t fpcr;
5203
    int i, err = 0;
5204

    
5205
    err |= __get_user(env->pc, &sc->sc_pc);
5206

    
5207
    for (i = 0; i < 31; ++i) {
5208
        err |= __get_user(env->ir[i], &sc->sc_regs[i]);
5209
    }
5210
    for (i = 0; i < 31; ++i) {
5211
        err |= __get_user(env->fir[i], &sc->sc_fpregs[i]);
5212
    }
5213

    
5214
    err |= __get_user(fpcr, &sc->sc_fpcr);
5215
    cpu_alpha_store_fpcr(env, fpcr);
5216

    
5217
    return err;
5218
}
5219

    
5220
static inline abi_ulong get_sigframe(struct target_sigaction *sa,
5221
                                     CPUAlphaState *env,
5222
                                     unsigned long framesize)
5223
{
5224
    abi_ulong sp = env->ir[IR_SP];
5225

    
5226
    /* This is the X/Open sanctioned signal stack switching.  */
5227
    if ((sa->sa_flags & TARGET_SA_ONSTACK) != 0 && !sas_ss_flags(sp)) {
5228
        sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
5229
    }
5230
    return (sp - framesize) & -32;
5231
}
5232

    
5233
static void setup_frame(int sig, struct target_sigaction *ka,
5234
                        target_sigset_t *set, CPUAlphaState *env)
5235
{
5236
    abi_ulong frame_addr, r26;
5237
    struct target_sigframe *frame;
5238
    int err = 0;
5239

    
5240
    frame_addr = get_sigframe(ka, env, sizeof(*frame));
5241
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) {
5242
        goto give_sigsegv;
5243
    }
5244

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

    
5247
    if (ka->sa_restorer) {
5248
        r26 = ka->sa_restorer;
5249
    } else {
5250
        err |= __put_user(INSN_MOV_R30_R16, &frame->retcode[0]);
5251
        err |= __put_user(INSN_LDI_R0 + TARGET_NR_sigreturn,
5252
                          &frame->retcode[1]);
5253
        err |= __put_user(INSN_CALLSYS, &frame->retcode[2]);
5254
        /* imb() */
5255
        r26 = frame_addr;
5256
    }
5257

    
5258
    unlock_user_struct(frame, frame_addr, 1);
5259

    
5260
    if (err) {
5261
    give_sigsegv:
5262
        if (sig == TARGET_SIGSEGV) {
5263
            ka->_sa_handler = TARGET_SIG_DFL;
5264
        }
5265
        force_sig(TARGET_SIGSEGV);
5266
    }
5267

    
5268
    env->ir[IR_RA] = r26;
5269
    env->ir[IR_PV] = env->pc = ka->_sa_handler;
5270
    env->ir[IR_A0] = sig;
5271
    env->ir[IR_A1] = 0;
5272
    env->ir[IR_A2] = frame_addr + offsetof(struct target_sigframe, sc);
5273
    env->ir[IR_SP] = frame_addr;
5274
}
5275

    
5276
static void setup_rt_frame(int sig, struct target_sigaction *ka,
5277
                           target_siginfo_t *info,
5278
                           target_sigset_t *set, CPUAlphaState *env)
5279
{
5280
    abi_ulong frame_addr, r26;
5281
    struct target_rt_sigframe *frame;
5282
    int i, err = 0;
5283

    
5284
    frame_addr = get_sigframe(ka, env, sizeof(*frame));
5285
    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) {
5286
        goto give_sigsegv;
5287
    }
5288

    
5289
    err |= copy_siginfo_to_user(&frame->info, info);
5290

    
5291
    err |= __put_user(0, &frame->uc.tuc_flags);
5292
    err |= __put_user(0, &frame->uc.tuc_link);
5293
    err |= __put_user(set->sig[0], &frame->uc.tuc_osf_sigmask);
5294
    err |= __put_user(target_sigaltstack_used.ss_sp,
5295
                      &frame->uc.tuc_stack.ss_sp);
5296
    err |= __put_user(sas_ss_flags(env->ir[IR_SP]),
5297
                      &frame->uc.tuc_stack.ss_flags);
5298
    err |= __put_user(target_sigaltstack_used.ss_size,
5299
                      &frame->uc.tuc_stack.ss_size);
5300
    err |= setup_sigcontext(&frame->uc.tuc_mcontext, env, frame_addr, set);
5301
    for (i = 0; i < TARGET_NSIG_WORDS; ++i) {
5302
        err |= __put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]);
5303
    }
5304

    
5305
    if (ka->sa_restorer) {
5306
        r26 = ka->sa_restorer;
5307
    } else {
5308
        err |= __put_user(INSN_MOV_R30_R16, &frame->retcode[0]);
5309
        err |= __put_user(INSN_LDI_R0 + TARGET_NR_rt_sigreturn,
5310
                          &frame->retcode[1]);
5311
        err |= __put_user(INSN_CALLSYS, &frame->retcode[2]);
5312
        /* imb(); */
5313
        r26 = frame_addr;
5314
    }
5315

    
5316
    if (err) {
5317
    give_sigsegv:
5318
       if (sig == TARGET_SIGSEGV) {
5319
            ka->_sa_handler = TARGET_SIG_DFL;
5320
        }
5321
        force_sig(TARGET_SIGSEGV);
5322
    }
5323

    
5324
    env->ir[IR_RA] = r26;
5325
    env->ir[IR_PV] = env->pc = ka->_sa_handler;
5326
    env->ir[IR_A0] = sig;
5327
    env->ir[IR_A1] = frame_addr + offsetof(struct target_rt_sigframe, info);
5328
    env->ir[IR_A2] = frame_addr + offsetof(struct target_rt_sigframe, uc);
5329
    env->ir[IR_SP] = frame_addr;
5330
}
5331

    
5332
long do_sigreturn(CPUAlphaState *env)
5333
{
5334
    struct target_sigcontext *sc;
5335
    abi_ulong sc_addr = env->ir[IR_A0];
5336
    target_sigset_t target_set;
5337
    sigset_t set;
5338

    
5339
    if (!lock_user_struct(VERIFY_READ, sc, sc_addr, 1)) {
5340
        goto badframe;
5341
    }
5342

    
5343
    target_sigemptyset(&target_set);
5344
    if (__get_user(target_set.sig[0], &sc->sc_mask)) {
5345
        goto badframe;
5346
    }
5347

    
5348
    target_to_host_sigset_internal(&set, &target_set);
5349
    sigprocmask(SIG_SETMASK, &set, NULL);
5350

    
5351
    if (restore_sigcontext(env, sc)) {
5352
        goto badframe;
5353
    }
5354
    unlock_user_struct(sc, sc_addr, 0);
5355
    return env->ir[IR_V0];
5356

    
5357
 badframe:
5358
    unlock_user_struct(sc, sc_addr, 0);
5359
    force_sig(TARGET_SIGSEGV);
5360
}
5361

    
5362
long do_rt_sigreturn(CPUAlphaState *env)
5363
{
5364
    abi_ulong frame_addr = env->ir[IR_A0];
5365
    struct target_rt_sigframe *frame;
5366
    sigset_t set;
5367

    
5368
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) {
5369
        goto badframe;
5370
    }
5371
    target_to_host_sigset(&set, &frame->uc.tuc_sigmask);
5372
    sigprocmask(SIG_SETMASK, &set, NULL);
5373

    
5374
    if (restore_sigcontext(env, &frame->uc.tuc_mcontext)) {
5375
        goto badframe;
5376
    }
5377
    if (do_sigaltstack(frame_addr + offsetof(struct target_rt_sigframe,
5378
                                             uc.tuc_stack),
5379
                       0, env->ir[IR_SP]) == -EFAULT) {
5380
        goto badframe;
5381
    }
5382

    
5383
    unlock_user_struct(frame, frame_addr, 0);
5384
    return env->ir[IR_V0];
5385

    
5386

    
5387
 badframe:
5388
    unlock_user_struct(frame, frame_addr, 0);
5389
    force_sig(TARGET_SIGSEGV);
5390
}
5391

    
5392
#else
5393

    
5394
static void setup_frame(int sig, struct target_sigaction *ka,
5395
                        target_sigset_t *set, CPUArchState *env)
5396
{
5397
    fprintf(stderr, "setup_frame: not implemented\n");
5398
}
5399

    
5400
static void setup_rt_frame(int sig, struct target_sigaction *ka,
5401
                           target_siginfo_t *info,
5402
                           target_sigset_t *set, CPUArchState *env)
5403
{
5404
    fprintf(stderr, "setup_rt_frame: not implemented\n");
5405
}
5406

    
5407
long do_sigreturn(CPUArchState *env)
5408
{
5409
    fprintf(stderr, "do_sigreturn: not implemented\n");
5410
    return -TARGET_ENOSYS;
5411
}
5412

    
5413
long do_rt_sigreturn(CPUArchState *env)
5414
{
5415
    fprintf(stderr, "do_rt_sigreturn: not implemented\n");
5416
    return -TARGET_ENOSYS;
5417
}
5418

    
5419
#endif
5420

    
5421
void process_pending_signals(CPUArchState *cpu_env)
5422
{
5423
    int sig;
5424
    abi_ulong handler;
5425
    sigset_t set, old_set;
5426
    target_sigset_t target_old_set;
5427
    struct emulated_sigtable *k;
5428
    struct target_sigaction *sa;
5429
    struct sigqueue *q;
5430
    TaskState *ts = cpu_env->opaque;
5431

    
5432
    if (!ts->signal_pending)
5433
        return;
5434

    
5435
    /* FIXME: This is not threadsafe.  */
5436
    k = ts->sigtab;
5437
    for(sig = 1; sig <= TARGET_NSIG; sig++) {
5438
        if (k->pending)
5439
            goto handle_signal;
5440
        k++;
5441
    }
5442
    /* if no signal is pending, just return */
5443
    ts->signal_pending = 0;
5444
    return;
5445

    
5446
 handle_signal:
5447
#ifdef DEBUG_SIGNAL
5448
    fprintf(stderr, "qemu: process signal %d\n", sig);
5449
#endif
5450
    /* dequeue signal */
5451
    q = k->first;
5452
    k->first = q->next;
5453
    if (!k->first)
5454
        k->pending = 0;
5455

    
5456
    sig = gdb_handlesig (cpu_env, sig);
5457
    if (!sig) {
5458
        sa = NULL;
5459
        handler = TARGET_SIG_IGN;
5460
    } else {
5461
        sa = &sigact_table[sig - 1];
5462
        handler = sa->_sa_handler;
5463
    }
5464

    
5465
    if (handler == TARGET_SIG_DFL) {
5466
        /* default handler : ignore some signal. The other are job control or fatal */
5467
        if (sig == TARGET_SIGTSTP || sig == TARGET_SIGTTIN || sig == TARGET_SIGTTOU) {
5468
            kill(getpid(),SIGSTOP);
5469
        } else if (sig != TARGET_SIGCHLD &&
5470
                   sig != TARGET_SIGURG &&
5471
                   sig != TARGET_SIGWINCH &&
5472
                   sig != TARGET_SIGCONT) {
5473
            force_sig(sig);
5474
        }
5475
    } else if (handler == TARGET_SIG_IGN) {
5476
        /* ignore sig */
5477
    } else if (handler == TARGET_SIG_ERR) {
5478
        force_sig(sig);
5479
    } else {
5480
        /* compute the blocked signals during the handler execution */
5481
        target_to_host_sigset(&set, &sa->sa_mask);
5482
        /* SA_NODEFER indicates that the current signal should not be
5483
           blocked during the handler */
5484
        if (!(sa->sa_flags & TARGET_SA_NODEFER))
5485
            sigaddset(&set, target_to_host_signal(sig));
5486

    
5487
        /* block signals in the handler using Linux */
5488
        sigprocmask(SIG_BLOCK, &set, &old_set);
5489
        /* save the previous blocked signal state to restore it at the
5490
           end of the signal execution (see do_sigreturn) */
5491
        host_to_target_sigset_internal(&target_old_set, &old_set);
5492

    
5493
        /* if the CPU is in VM86 mode, we restore the 32 bit values */
5494
#if defined(TARGET_I386) && !defined(TARGET_X86_64)
5495
        {
5496
            CPUX86State *env = cpu_env;
5497
            if (env->eflags & VM_MASK)
5498
                save_v86_state(env);
5499
        }
5500
#endif
5501
        /* prepare the stack frame of the virtual CPU */
5502
        if (sa->sa_flags & TARGET_SA_SIGINFO)
5503
            setup_rt_frame(sig, sa, &q->info, &target_old_set, cpu_env);
5504
        else
5505
            setup_frame(sig, sa, &target_old_set, cpu_env);
5506
        if (sa->sa_flags & TARGET_SA_RESETHAND)
5507
            sa->_sa_handler = TARGET_SIG_DFL;
5508
    }
5509
    if (q != &k->info)
5510
        free_sigqueue(cpu_env, q);
5511
}