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