1 /* 2 * Emulation of Linux signals 3 * 4 * Copyright (c) 2003 Fabrice Bellard 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 */ 20 #include <stdlib.h> 21 #include <stdio.h> 22 #include <string.h> 23 #include <stdarg.h> 24 #include <unistd.h> 25 #include <signal.h> 26 #include <errno.h> 27 #include <sys/ucontext.h> 28 29 #include "qemu.h" 30 #include "target_signal.h" 31 32 //#define DEBUG_SIGNAL 33 34 #define MAX_SIGQUEUE_SIZE 1024 35 36 struct sigqueue { 37 struct sigqueue *next; 38 target_siginfo_t info; 39 }; 40 41 struct emulated_sigaction { 42 struct target_sigaction sa; 43 int pending; /* true if signal is pending */ 44 struct sigqueue *first; 45 struct sigqueue info; /* in order to always have memory for the 46 first signal, we put it here */ 47 }; 48 49 struct target_sigaltstack target_sigaltstack_used = { 50 .ss_sp = 0, 51 .ss_size = 0, 52 .ss_flags = TARGET_SS_DISABLE, 53 }; 54 55 static struct emulated_sigaction sigact_table[TARGET_NSIG]; 56 static struct sigqueue sigqueue_table[MAX_SIGQUEUE_SIZE]; /* siginfo queue */ 57 static struct sigqueue *first_free; /* first free siginfo queue entry */ 58 static int signal_pending; /* non zero if a signal may be pending */ 59 60 static void host_signal_handler(int host_signum, siginfo_t *info, 61 void *puc); 62 63 static uint8_t host_to_target_signal_table[65] = { 64 [SIGHUP] = TARGET_SIGHUP, 65 [SIGINT] = TARGET_SIGINT, 66 [SIGQUIT] = TARGET_SIGQUIT, 67 [SIGILL] = TARGET_SIGILL, 68 [SIGTRAP] = TARGET_SIGTRAP, 69 [SIGABRT] = TARGET_SIGABRT, 70 /* [SIGIOT] = TARGET_SIGIOT,*/ 71 [SIGBUS] = TARGET_SIGBUS, 72 [SIGFPE] = TARGET_SIGFPE, 73 [SIGKILL] = TARGET_SIGKILL, 74 [SIGUSR1] = TARGET_SIGUSR1, 75 [SIGSEGV] = TARGET_SIGSEGV, 76 [SIGUSR2] = TARGET_SIGUSR2, 77 [SIGPIPE] = TARGET_SIGPIPE, 78 [SIGALRM] = TARGET_SIGALRM, 79 [SIGTERM] = TARGET_SIGTERM, 80 #ifdef SIGSTKFLT 81 [SIGSTKFLT] = TARGET_SIGSTKFLT, 82 #endif 83 [SIGCHLD] = TARGET_SIGCHLD, 84 [SIGCONT] = TARGET_SIGCONT, 85 [SIGSTOP] = TARGET_SIGSTOP, 86 [SIGTSTP] = TARGET_SIGTSTP, 87 [SIGTTIN] = TARGET_SIGTTIN, 88 [SIGTTOU] = TARGET_SIGTTOU, 89 [SIGURG] = TARGET_SIGURG, 90 [SIGXCPU] = TARGET_SIGXCPU, 91 [SIGXFSZ] = TARGET_SIGXFSZ, 92 [SIGVTALRM] = TARGET_SIGVTALRM, 93 [SIGPROF] = TARGET_SIGPROF, 94 [SIGWINCH] = TARGET_SIGWINCH, 95 [SIGIO] = TARGET_SIGIO, 96 [SIGPWR] = TARGET_SIGPWR, 97 [SIGSYS] = TARGET_SIGSYS, 98 /* next signals stay the same */ 99 }; 100 static uint8_t target_to_host_signal_table[65]; 101 102 static inline int on_sig_stack(unsigned long sp) 103 { 104 return (sp - target_sigaltstack_used.ss_sp 105 < target_sigaltstack_used.ss_size); 106 } 107 108 static inline int sas_ss_flags(unsigned long sp) 109 { 110 return (target_sigaltstack_used.ss_size == 0 ? SS_DISABLE 111 : on_sig_stack(sp) ? SS_ONSTACK : 0); 112 } 113 114 static inline int host_to_target_signal(int sig) 115 { 116 return host_to_target_signal_table[sig]; 117 } 118 119 static inline int target_to_host_signal(int sig) 120 { 121 return target_to_host_signal_table[sig]; 122 } 123 124 static void host_to_target_sigset_internal(target_sigset_t *d, 125 const sigset_t *s) 126 { 127 int i; 128 unsigned long sigmask; 129 uint32_t target_sigmask; 130 131 sigmask = ((unsigned long *)s)[0]; 132 target_sigmask = 0; 133 for(i = 0; i < 32; i++) { 134 if (sigmask & (1 << i)) 135 target_sigmask |= 1 << (host_to_target_signal(i + 1) - 1); 136 } 137 #if TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 32 138 d->sig[0] = target_sigmask; 139 for(i = 1;i < TARGET_NSIG_WORDS; i++) { 140 d->sig[i] = ((unsigned long *)s)[i]; 141 } 142 #elif TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 64 && TARGET_NSIG_WORDS == 2 143 d->sig[0] = target_sigmask; 144 d->sig[1] = sigmask >> 32; 145 #else 146 #warning host_to_target_sigset 147 #endif 148 } 149 150 void host_to_target_sigset(target_sigset_t *d, const sigset_t *s) 151 { 152 target_sigset_t d1; 153 int i; 154 155 host_to_target_sigset_internal(&d1, s); 156 for(i = 0;i < TARGET_NSIG_WORDS; i++) 157 d->sig[i] = tswapl(d1.sig[i]); 158 } 159 160 void target_to_host_sigset_internal(sigset_t *d, const target_sigset_t *s) 161 { 162 int i; 163 unsigned long sigmask; 164 abi_ulong target_sigmask; 165 166 target_sigmask = s->sig[0]; 167 sigmask = 0; 168 for(i = 0; i < 32; i++) { 169 if (target_sigmask & (1 << i)) 170 sigmask |= 1 << (target_to_host_signal(i + 1) - 1); 171 } 172 #if TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 32 173 ((unsigned long *)d)[0] = sigmask; 174 for(i = 1;i < TARGET_NSIG_WORDS; i++) { 175 ((unsigned long *)d)[i] = s->sig[i]; 176 } 177 #elif TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 64 && TARGET_NSIG_WORDS == 2 178 ((unsigned long *)d)[0] = sigmask | ((unsigned long)(s->sig[1]) << 32); 179 #else 180 #warning target_to_host_sigset 181 #endif /* TARGET_ABI_BITS */ 182 } 183 184 void target_to_host_sigset(sigset_t *d, const target_sigset_t *s) 185 { 186 target_sigset_t s1; 187 int i; 188 189 for(i = 0;i < TARGET_NSIG_WORDS; i++) 190 s1.sig[i] = tswapl(s->sig[i]); 191 target_to_host_sigset_internal(d, &s1); 192 } 193 194 void host_to_target_old_sigset(abi_ulong *old_sigset, 195 const sigset_t *sigset) 196 { 197 target_sigset_t d; 198 host_to_target_sigset(&d, sigset); 199 *old_sigset = d.sig[0]; 200 } 201 202 void target_to_host_old_sigset(sigset_t *sigset, 203 const abi_ulong *old_sigset) 204 { 205 target_sigset_t d; 206 int i; 207 208 d.sig[0] = *old_sigset; 209 for(i = 1;i < TARGET_NSIG_WORDS; i++) 210 d.sig[i] = 0; 211 target_to_host_sigset(sigset, &d); 212 } 213 214 /* siginfo conversion */ 215 216 static inline void host_to_target_siginfo_noswap(target_siginfo_t *tinfo, 217 const siginfo_t *info) 218 { 219 int sig; 220 sig = host_to_target_signal(info->si_signo); 221 tinfo->si_signo = sig; 222 tinfo->si_errno = 0; 223 tinfo->si_code = 0; 224 if (sig == SIGILL || sig == SIGFPE || sig == SIGSEGV || 225 sig == SIGBUS || sig == SIGTRAP) { 226 /* should never come here, but who knows. The information for 227 the target is irrelevant */ 228 tinfo->_sifields._sigfault._addr = 0; 229 } else if (sig == SIGIO) { 230 tinfo->_sifields._sigpoll._fd = info->si_fd; 231 } else if (sig >= TARGET_SIGRTMIN) { 232 tinfo->_sifields._rt._pid = info->si_pid; 233 tinfo->_sifields._rt._uid = info->si_uid; 234 /* XXX: potential problem if 64 bit */ 235 tinfo->_sifields._rt._sigval.sival_ptr = 236 (abi_ulong)info->si_value.sival_ptr; 237 } 238 } 239 240 static void tswap_siginfo(target_siginfo_t *tinfo, 241 const target_siginfo_t *info) 242 { 243 int sig; 244 sig = info->si_signo; 245 tinfo->si_signo = tswap32(sig); 246 tinfo->si_errno = tswap32(info->si_errno); 247 tinfo->si_code = tswap32(info->si_code); 248 if (sig == SIGILL || sig == SIGFPE || sig == SIGSEGV || 249 sig == SIGBUS || sig == SIGTRAP) { 250 tinfo->_sifields._sigfault._addr = 251 tswapl(info->_sifields._sigfault._addr); 252 } else if (sig == SIGIO) { 253 tinfo->_sifields._sigpoll._fd = tswap32(info->_sifields._sigpoll._fd); 254 } else if (sig >= TARGET_SIGRTMIN) { 255 tinfo->_sifields._rt._pid = tswap32(info->_sifields._rt._pid); 256 tinfo->_sifields._rt._uid = tswap32(info->_sifields._rt._uid); 257 tinfo->_sifields._rt._sigval.sival_ptr = 258 tswapl(info->_sifields._rt._sigval.sival_ptr); 259 } 260 } 261 262 263 void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info) 264 { 265 host_to_target_siginfo_noswap(tinfo, info); 266 tswap_siginfo(tinfo, tinfo); 267 } 268 269 /* XXX: we support only POSIX RT signals are used. */ 270 /* XXX: find a solution for 64 bit (additional malloced data is needed) */ 271 void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo) 272 { 273 info->si_signo = tswap32(tinfo->si_signo); 274 info->si_errno = tswap32(tinfo->si_errno); 275 info->si_code = tswap32(tinfo->si_code); 276 info->si_pid = tswap32(tinfo->_sifields._rt._pid); 277 info->si_uid = tswap32(tinfo->_sifields._rt._uid); 278 info->si_value.sival_ptr = 279 (void *)tswapl(tinfo->_sifields._rt._sigval.sival_ptr); 280 } 281 282 void signal_init(void) 283 { 284 struct sigaction act; 285 int i, j; 286 287 /* generate signal conversion tables */ 288 for(i = 1; i <= 64; i++) { 289 if (host_to_target_signal_table[i] == 0) 290 host_to_target_signal_table[i] = i; 291 } 292 for(i = 1; i <= 64; i++) { 293 j = host_to_target_signal_table[i]; 294 target_to_host_signal_table[j] = i; 295 } 296 297 /* set all host signal handlers. ALL signals are blocked during 298 the handlers to serialize them. */ 299 sigfillset(&act.sa_mask); 300 act.sa_flags = SA_SIGINFO; 301 act.sa_sigaction = host_signal_handler; 302 for(i = 1; i < NSIG; i++) { 303 sigaction(i, &act, NULL); 304 } 305 306 memset(sigact_table, 0, sizeof(sigact_table)); 307 308 first_free = &sigqueue_table[0]; 309 for(i = 0; i < MAX_SIGQUEUE_SIZE - 1; i++) 310 sigqueue_table[i].next = &sigqueue_table[i + 1]; 311 sigqueue_table[MAX_SIGQUEUE_SIZE - 1].next = NULL; 312 } 313 314 /* signal queue handling */ 315 316 static inline struct sigqueue *alloc_sigqueue(void) 317 { 318 struct sigqueue *q = first_free; 319 if (!q) 320 return NULL; 321 first_free = q->next; 322 return q; 323 } 324 325 static inline void free_sigqueue(struct sigqueue *q) 326 { 327 q->next = first_free; 328 first_free = q; 329 } 330 331 /* abort execution with signal */ 332 void __attribute((noreturn)) force_sig(int sig) 333 { 334 int host_sig; 335 host_sig = target_to_host_signal(sig); 336 fprintf(stderr, "qemu: uncaught target signal %d (%s) - exiting\n", 337 sig, strsignal(host_sig)); 338 #if 1 339 _exit(-host_sig); 340 #else 341 { 342 struct sigaction act; 343 sigemptyset(&act.sa_mask); 344 act.sa_flags = SA_SIGINFO; 345 act.sa_sigaction = SIG_DFL; 346 sigaction(SIGABRT, &act, NULL); 347 abort(); 348 } 349 #endif 350 } 351 352 /* queue a signal so that it will be send to the virtual CPU as soon 353 as possible */ 354 int queue_signal(int sig, target_siginfo_t *info) 355 { 356 struct emulated_sigaction *k; 357 struct sigqueue *q, **pq; 358 abi_ulong handler; 359 360 #if defined(DEBUG_SIGNAL) 361 fprintf(stderr, "queue_signal: sig=%d\n", 362 sig); 363 #endif 364 k = &sigact_table[sig - 1]; 365 handler = k->sa._sa_handler; 366 if (handler == TARGET_SIG_DFL) { 367 /* default handler : ignore some signal. The other are fatal */ 368 if (sig != TARGET_SIGCHLD && 369 sig != TARGET_SIGURG && 370 sig != TARGET_SIGWINCH) { 371 force_sig(sig); 372 } else { 373 return 0; /* indicate ignored */ 374 } 375 } else if (handler == TARGET_SIG_IGN) { 376 /* ignore signal */ 377 return 0; 378 } else if (handler == TARGET_SIG_ERR) { 379 force_sig(sig); 380 } else { 381 pq = &k->first; 382 if (sig < TARGET_SIGRTMIN) { 383 /* if non real time signal, we queue exactly one signal */ 384 if (!k->pending) 385 q = &k->info; 386 else 387 return 0; 388 } else { 389 if (!k->pending) { 390 /* first signal */ 391 q = &k->info; 392 } else { 393 q = alloc_sigqueue(); 394 if (!q) 395 return -EAGAIN; 396 while (*pq != NULL) 397 pq = &(*pq)->next; 398 } 399 } 400 *pq = q; 401 q->info = *info; 402 q->next = NULL; 403 k->pending = 1; 404 /* signal that a new signal is pending */ 405 signal_pending = 1; 406 return 1; /* indicates that the signal was queued */ 407 } 408 } 409 410 static void host_signal_handler(int host_signum, siginfo_t *info, 411 void *puc) 412 { 413 int sig; 414 target_siginfo_t tinfo; 415 416 /* the CPU emulator uses some host signals to detect exceptions, 417 we we forward to it some signals */ 418 if (host_signum == SIGSEGV || host_signum == SIGBUS) { 419 if (cpu_signal_handler(host_signum, info, puc)) 420 return; 421 } 422 423 /* get target signal number */ 424 sig = host_to_target_signal(host_signum); 425 if (sig < 1 || sig > TARGET_NSIG) 426 return; 427 #if defined(DEBUG_SIGNAL) 428 fprintf(stderr, "qemu: got signal %d\n", sig); 429 #endif 430 host_to_target_siginfo_noswap(&tinfo, info); 431 if (queue_signal(sig, &tinfo) == 1) { 432 /* interrupt the virtual CPU as soon as possible */ 433 cpu_interrupt(global_env, CPU_INTERRUPT_EXIT); 434 } 435 } 436 437 /* do_sigaltstack() returns target values and errnos. */ 438 int do_sigaltstack(const struct target_sigaltstack *uss, 439 struct target_sigaltstack *uoss, 440 abi_ulong sp) 441 { 442 int ret; 443 struct target_sigaltstack oss; 444 445 /* XXX: test errors */ 446 if(uoss) 447 { 448 __put_user(target_sigaltstack_used.ss_sp, &oss.ss_sp); 449 __put_user(target_sigaltstack_used.ss_size, &oss.ss_size); 450 __put_user(sas_ss_flags(sp), &oss.ss_flags); 451 } 452 453 if(uss) 454 { 455 struct target_sigaltstack ss; 456 457 ret = -TARGET_EFAULT; 458 if (!access_ok(VERIFY_READ, uss, sizeof(*uss)) 459 || __get_user(ss.ss_sp, &uss->ss_sp) 460 || __get_user(ss.ss_size, &uss->ss_size) 461 || __get_user(ss.ss_flags, &uss->ss_flags)) 462 goto out; 463 464 ret = -TARGET_EPERM; 465 if (on_sig_stack(sp)) 466 goto out; 467 468 ret = -TARGET_EINVAL; 469 if (ss.ss_flags != TARGET_SS_DISABLE 470 && ss.ss_flags != TARGET_SS_ONSTACK 471 && ss.ss_flags != 0) 472 goto out; 473 474 if (ss.ss_flags == TARGET_SS_DISABLE) { 475 ss.ss_size = 0; 476 ss.ss_sp = 0; 477 } else { 478 ret = -TARGET_ENOMEM; 479 if (ss.ss_size < MINSIGSTKSZ) 480 goto out; 481 } 482 483 target_sigaltstack_used.ss_sp = ss.ss_sp; 484 target_sigaltstack_used.ss_size = ss.ss_size; 485 } 486 487 if (uoss) { 488 ret = -TARGET_EFAULT; 489 if (!access_ok(VERIFY_WRITE, uoss, sizeof(oss))) 490 goto out; 491 memcpy(uoss, &oss, sizeof(oss)); 492 } 493 494 ret = 0; 495 out: 496 return ret; 497 } 498 499 /* do_sigaction() return host values and errnos */ 500 int do_sigaction(int sig, const struct target_sigaction *act, 501 struct target_sigaction *oact) 502 { 503 struct emulated_sigaction *k; 504 struct sigaction act1; 505 int host_sig; 506 int ret = 0; 507 508 if (sig < 1 || sig > TARGET_NSIG || sig == SIGKILL || sig == SIGSTOP) 509 return -EINVAL; 510 k = &sigact_table[sig - 1]; 511 #if defined(DEBUG_SIGNAL) 512 fprintf(stderr, "sigaction sig=%d act=0x%08x, oact=0x%08x\n", 513 sig, (int)act, (int)oact); 514 #endif 515 if (oact) { 516 oact->_sa_handler = tswapl(k->sa._sa_handler); 517 oact->sa_flags = tswapl(k->sa.sa_flags); 518 #if !defined(TARGET_MIPS) 519 oact->sa_restorer = tswapl(k->sa.sa_restorer); 520 #endif 521 oact->sa_mask = k->sa.sa_mask; 522 } 523 if (act) { 524 k->sa._sa_handler = tswapl(act->_sa_handler); 525 k->sa.sa_flags = tswapl(act->sa_flags); 526 #if !defined(TARGET_MIPS) 527 k->sa.sa_restorer = tswapl(act->sa_restorer); 528 #endif 529 k->sa.sa_mask = act->sa_mask; 530 531 /* we update the host linux signal state */ 532 host_sig = target_to_host_signal(sig); 533 if (host_sig != SIGSEGV && host_sig != SIGBUS) { 534 sigfillset(&act1.sa_mask); 535 act1.sa_flags = SA_SIGINFO; 536 if (k->sa.sa_flags & TARGET_SA_RESTART) 537 act1.sa_flags |= SA_RESTART; 538 /* NOTE: it is important to update the host kernel signal 539 ignore state to avoid getting unexpected interrupted 540 syscalls */ 541 if (k->sa._sa_handler == TARGET_SIG_IGN) { 542 act1.sa_sigaction = (void *)SIG_IGN; 543 } else if (k->sa._sa_handler == TARGET_SIG_DFL) { 544 act1.sa_sigaction = (void *)SIG_DFL; 545 } else { 546 act1.sa_sigaction = host_signal_handler; 547 } 548 ret = sigaction(host_sig, &act1, NULL); 549 } 550 } 551 return ret; 552 } 553 554 #ifndef offsetof 555 #define offsetof(type, field) ((size_t) &((type *)0)->field) 556 #endif 557 558 static inline int copy_siginfo_to_user(target_siginfo_t *tinfo, 559 const target_siginfo_t *info) 560 { 561 tswap_siginfo(tinfo, info); 562 return 0; 563 } 564 565 #ifdef TARGET_I386 566 567 /* from the Linux kernel */ 568 569 struct target_fpreg { 570 uint16_t significand[4]; 571 uint16_t exponent; 572 }; 573 574 struct target_fpxreg { 575 uint16_t significand[4]; 576 uint16_t exponent; 577 uint16_t padding[3]; 578 }; 579 580 struct target_xmmreg { 581 abi_ulong element[4]; 582 }; 583 584 struct target_fpstate { 585 /* Regular FPU environment */ 586 abi_ulong cw; 587 abi_ulong sw; 588 abi_ulong tag; 589 abi_ulong ipoff; 590 abi_ulong cssel; 591 abi_ulong dataoff; 592 abi_ulong datasel; 593 struct target_fpreg _st[8]; 594 uint16_t status; 595 uint16_t magic; /* 0xffff = regular FPU data only */ 596 597 /* FXSR FPU environment */ 598 abi_ulong _fxsr_env[6]; /* FXSR FPU env is ignored */ 599 abi_ulong mxcsr; 600 abi_ulong reserved; 601 struct target_fpxreg _fxsr_st[8]; /* FXSR FPU reg data is ignored */ 602 struct target_xmmreg _xmm[8]; 603 abi_ulong padding[56]; 604 }; 605 606 #define X86_FXSR_MAGIC 0x0000 607 608 struct target_sigcontext { 609 uint16_t gs, __gsh; 610 uint16_t fs, __fsh; 611 uint16_t es, __esh; 612 uint16_t ds, __dsh; 613 abi_ulong edi; 614 abi_ulong esi; 615 abi_ulong ebp; 616 abi_ulong esp; 617 abi_ulong ebx; 618 abi_ulong edx; 619 abi_ulong ecx; 620 abi_ulong eax; 621 abi_ulong trapno; 622 abi_ulong err; 623 abi_ulong eip; 624 uint16_t cs, __csh; 625 abi_ulong eflags; 626 abi_ulong esp_at_signal; 627 uint16_t ss, __ssh; 628 abi_ulong fpstate; /* pointer */ 629 abi_ulong oldmask; 630 abi_ulong cr2; 631 }; 632 633 struct target_ucontext { 634 abi_ulong tuc_flags; 635 abi_ulong tuc_link; 636 target_stack_t tuc_stack; 637 struct target_sigcontext tuc_mcontext; 638 target_sigset_t tuc_sigmask; /* mask last for extensibility */ 639 }; 640 641 struct sigframe 642 { 643 abi_ulong pretcode; 644 int sig; 645 struct target_sigcontext sc; 646 struct target_fpstate fpstate; 647 abi_ulong extramask[TARGET_NSIG_WORDS-1]; 648 char retcode[8]; 649 }; 650 651 struct rt_sigframe 652 { 653 abi_ulong pretcode; 654 int sig; 655 abi_ulong pinfo; 656 abi_ulong puc; 657 struct target_siginfo info; 658 struct target_ucontext uc; 659 struct target_fpstate fpstate; 660 char retcode[8]; 661 }; 662 663 /* 664 * Set up a signal frame. 665 */ 666 667 /* XXX: save x87 state */ 668 static int 669 setup_sigcontext(struct target_sigcontext *sc, struct target_fpstate *fpstate, 670 CPUX86State *env, unsigned long mask) 671 { 672 int err = 0; 673 674 err |= __put_user(env->segs[R_GS].selector, (unsigned int *)&sc->gs); 675 err |= __put_user(env->segs[R_FS].selector, (unsigned int *)&sc->fs); 676 err |= __put_user(env->segs[R_ES].selector, (unsigned int *)&sc->es); 677 err |= __put_user(env->segs[R_DS].selector, (unsigned int *)&sc->ds); 678 err |= __put_user(env->regs[R_EDI], &sc->edi); 679 err |= __put_user(env->regs[R_ESI], &sc->esi); 680 err |= __put_user(env->regs[R_EBP], &sc->ebp); 681 err |= __put_user(env->regs[R_ESP], &sc->esp); 682 err |= __put_user(env->regs[R_EBX], &sc->ebx); 683 err |= __put_user(env->regs[R_EDX], &sc->edx); 684 err |= __put_user(env->regs[R_ECX], &sc->ecx); 685 err |= __put_user(env->regs[R_EAX], &sc->eax); 686 err |= __put_user(env->exception_index, &sc->trapno); 687 err |= __put_user(env->error_code, &sc->err); 688 err |= __put_user(env->eip, &sc->eip); 689 err |= __put_user(env->segs[R_CS].selector, (unsigned int *)&sc->cs); 690 err |= __put_user(env->eflags, &sc->eflags); 691 err |= __put_user(env->regs[R_ESP], &sc->esp_at_signal); 692 err |= __put_user(env->segs[R_SS].selector, (unsigned int *)&sc->ss); 693 694 cpu_x86_fsave(env, (void *)fpstate, 1); 695 fpstate->status = fpstate->sw; 696 err |= __put_user(0xffff, &fpstate->magic); 697 err |= __put_user(fpstate, &sc->fpstate); 698 699 /* non-iBCS2 extensions.. */ 700 err |= __put_user(mask, &sc->oldmask); 701 err |= __put_user(env->cr[2], &sc->cr2); 702 return err; 703 } 704 705 /* 706 * Determine which stack to use.. 707 */ 708 709 static inline void * 710 get_sigframe(struct emulated_sigaction *ka, CPUX86State *env, size_t frame_size) 711 { 712 unsigned long esp; 713 714 /* Default to using normal stack */ 715 esp = env->regs[R_ESP]; 716 /* This is the X/Open sanctioned signal stack switching. */ 717 if (ka->sa.sa_flags & TARGET_SA_ONSTACK) { 718 if (sas_ss_flags(esp) == 0) 719 esp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size; 720 } 721 722 /* This is the legacy signal stack switching. */ 723 else 724 if ((env->segs[R_SS].selector & 0xffff) != __USER_DS && 725 !(ka->sa.sa_flags & TARGET_SA_RESTORER) && 726 ka->sa.sa_restorer) { 727 esp = (unsigned long) ka->sa.sa_restorer; 728 } 729 return g2h((esp - frame_size) & -8ul); 730 } 731 732 static void setup_frame(int sig, struct emulated_sigaction *ka, 733 target_sigset_t *set, CPUX86State *env) 734 { 735 struct sigframe *frame; 736 int i, err = 0; 737 738 frame = get_sigframe(ka, env, sizeof(*frame)); 739 740 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) 741 goto give_sigsegv; 742 err |= __put_user((/*current->exec_domain 743 && current->exec_domain->signal_invmap 744 && sig < 32 745 ? current->exec_domain->signal_invmap[sig] 746 : */ sig), 747 &frame->sig); 748 if (err) 749 goto give_sigsegv; 750 751 setup_sigcontext(&frame->sc, &frame->fpstate, env, set->sig[0]); 752 if (err) 753 goto give_sigsegv; 754 755 for(i = 1; i < TARGET_NSIG_WORDS; i++) { 756 if (__put_user(set->sig[i], &frame->extramask[i - 1])) 757 goto give_sigsegv; 758 } 759 760 /* Set up to return from userspace. If provided, use a stub 761 already in userspace. */ 762 if (ka->sa.sa_flags & TARGET_SA_RESTORER) { 763 err |= __put_user(ka->sa.sa_restorer, &frame->pretcode); 764 } else { 765 err |= __put_user(frame->retcode, &frame->pretcode); 766 /* This is popl %eax ; movl $,%eax ; int $0x80 */ 767 err |= __put_user(0xb858, (short *)(frame->retcode+0)); 768 #if defined(TARGET_X86_64) 769 #warning "Fix this !" 770 #else 771 err |= __put_user(TARGET_NR_sigreturn, (int *)(frame->retcode+2)); 772 #endif 773 err |= __put_user(0x80cd, (short *)(frame->retcode+6)); 774 } 775 776 if (err) 777 goto give_sigsegv; 778 779 /* Set up registers for signal handler */ 780 env->regs[R_ESP] = h2g(frame); 781 env->eip = (unsigned long) ka->sa._sa_handler; 782 783 cpu_x86_load_seg(env, R_DS, __USER_DS); 784 cpu_x86_load_seg(env, R_ES, __USER_DS); 785 cpu_x86_load_seg(env, R_SS, __USER_DS); 786 cpu_x86_load_seg(env, R_CS, __USER_CS); 787 env->eflags &= ~TF_MASK; 788 789 return; 790 791 give_sigsegv: 792 if (sig == TARGET_SIGSEGV) 793 ka->sa._sa_handler = TARGET_SIG_DFL; 794 force_sig(TARGET_SIGSEGV /* , current */); 795 } 796 797 static void setup_rt_frame(int sig, struct emulated_sigaction *ka, 798 target_siginfo_t *info, 799 target_sigset_t *set, CPUX86State *env) 800 { 801 struct rt_sigframe *frame; 802 int i, err = 0; 803 804 frame = get_sigframe(ka, env, sizeof(*frame)); 805 806 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) 807 goto give_sigsegv; 808 809 err |= __put_user((/*current->exec_domain 810 && current->exec_domain->signal_invmap 811 && sig < 32 812 ? current->exec_domain->signal_invmap[sig] 813 : */sig), 814 &frame->sig); 815 err |= __put_user((abi_ulong)&frame->info, &frame->pinfo); 816 err |= __put_user((abi_ulong)&frame->uc, &frame->puc); 817 err |= copy_siginfo_to_user(&frame->info, info); 818 if (err) 819 goto give_sigsegv; 820 821 /* Create the ucontext. */ 822 err |= __put_user(0, &frame->uc.tuc_flags); 823 err |= __put_user(0, &frame->uc.tuc_link); 824 err |= __put_user(target_sigaltstack_used.ss_sp, 825 &frame->uc.tuc_stack.ss_sp); 826 err |= __put_user(sas_ss_flags(get_sp_from_cpustate(env)), 827 &frame->uc.tuc_stack.ss_flags); 828 err |= __put_user(target_sigaltstack_used.ss_size, 829 &frame->uc.tuc_stack.ss_size); 830 err |= setup_sigcontext(&frame->uc.tuc_mcontext, &frame->fpstate, 831 env, set->sig[0]); 832 for(i = 0; i < TARGET_NSIG_WORDS; i++) { 833 if (__put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i])) 834 goto give_sigsegv; 835 } 836 837 /* Set up to return from userspace. If provided, use a stub 838 already in userspace. */ 839 if (ka->sa.sa_flags & TARGET_SA_RESTORER) { 840 err |= __put_user(ka->sa.sa_restorer, &frame->pretcode); 841 } else { 842 err |= __put_user(frame->retcode, &frame->pretcode); 843 /* This is movl $,%eax ; int $0x80 */ 844 err |= __put_user(0xb8, (char *)(frame->retcode+0)); 845 err |= __put_user(TARGET_NR_rt_sigreturn, (int *)(frame->retcode+1)); 846 err |= __put_user(0x80cd, (short *)(frame->retcode+5)); 847 } 848 849 if (err) 850 goto give_sigsegv; 851 852 /* Set up registers for signal handler */ 853 env->regs[R_ESP] = (unsigned long) frame; 854 env->eip = (unsigned long) ka->sa._sa_handler; 855 856 cpu_x86_load_seg(env, R_DS, __USER_DS); 857 cpu_x86_load_seg(env, R_ES, __USER_DS); 858 cpu_x86_load_seg(env, R_SS, __USER_DS); 859 cpu_x86_load_seg(env, R_CS, __USER_CS); 860 env->eflags &= ~TF_MASK; 861 862 return; 863 864 give_sigsegv: 865 if (sig == TARGET_SIGSEGV) 866 ka->sa._sa_handler = TARGET_SIG_DFL; 867 force_sig(TARGET_SIGSEGV /* , current */); 868 } 869 870 static int 871 restore_sigcontext(CPUX86State *env, struct target_sigcontext *sc, int *peax) 872 { 873 unsigned int err = 0; 874 875 cpu_x86_load_seg(env, R_GS, lduw(&sc->gs)); 876 cpu_x86_load_seg(env, R_FS, lduw(&sc->fs)); 877 cpu_x86_load_seg(env, R_ES, lduw(&sc->es)); 878 cpu_x86_load_seg(env, R_DS, lduw(&sc->ds)); 879 880 env->regs[R_EDI] = ldl(&sc->edi); 881 env->regs[R_ESI] = ldl(&sc->esi); 882 env->regs[R_EBP] = ldl(&sc->ebp); 883 env->regs[R_ESP] = ldl(&sc->esp); 884 env->regs[R_EBX] = ldl(&sc->ebx); 885 env->regs[R_EDX] = ldl(&sc->edx); 886 env->regs[R_ECX] = ldl(&sc->ecx); 887 env->eip = ldl(&sc->eip); 888 889 cpu_x86_load_seg(env, R_CS, lduw(&sc->cs) | 3); 890 cpu_x86_load_seg(env, R_SS, lduw(&sc->ss) | 3); 891 892 { 893 unsigned int tmpflags; 894 tmpflags = ldl(&sc->eflags); 895 env->eflags = (env->eflags & ~0x40DD5) | (tmpflags & 0x40DD5); 896 // regs->orig_eax = -1; /* disable syscall checks */ 897 } 898 899 { 900 struct _fpstate * buf; 901 buf = (void *)ldl(&sc->fpstate); 902 if (buf) { 903 #if 0 904 if (verify_area(VERIFY_READ, buf, sizeof(*buf))) 905 goto badframe; 906 #endif 907 cpu_x86_frstor(env, (void *)buf, 1); 908 } 909 } 910 911 *peax = ldl(&sc->eax); 912 return err; 913 #if 0 914 badframe: 915 return 1; 916 #endif 917 } 918 919 long do_sigreturn(CPUX86State *env) 920 { 921 struct sigframe *frame = (struct sigframe *)g2h(env->regs[R_ESP] - 8); 922 target_sigset_t target_set; 923 sigset_t set; 924 int eax, i; 925 926 #if defined(DEBUG_SIGNAL) 927 fprintf(stderr, "do_sigreturn\n"); 928 #endif 929 /* set blocked signals */ 930 if (__get_user(target_set.sig[0], &frame->sc.oldmask)) 931 goto badframe; 932 for(i = 1; i < TARGET_NSIG_WORDS; i++) { 933 if (__get_user(target_set.sig[i], &frame->extramask[i - 1])) 934 goto badframe; 935 } 936 937 target_to_host_sigset_internal(&set, &target_set); 938 sigprocmask(SIG_SETMASK, &set, NULL); 939 940 /* restore registers */ 941 if (restore_sigcontext(env, &frame->sc, &eax)) 942 goto badframe; 943 return eax; 944 945 badframe: 946 force_sig(TARGET_SIGSEGV); 947 return 0; 948 } 949 950 long do_rt_sigreturn(CPUX86State *env) 951 { 952 struct rt_sigframe *frame = (struct rt_sigframe *)g2h(env->regs[R_ESP] - 4); 953 sigset_t set; 954 int eax; 955 956 #if 0 957 if (verify_area(VERIFY_READ, frame, sizeof(*frame))) 958 goto badframe; 959 #endif 960 target_to_host_sigset(&set, &frame->uc.tuc_sigmask); 961 sigprocmask(SIG_SETMASK, &set, NULL); 962 963 if (restore_sigcontext(env, &frame->uc.tuc_mcontext, &eax)) 964 goto badframe; 965 966 if (do_sigaltstack(&frame->uc.tuc_stack, NULL, get_sp_from_cpustate(env)) == -EFAULT) 967 goto badframe; 968 969 return eax; 970 971 badframe: 972 force_sig(TARGET_SIGSEGV); 973 return 0; 974 } 975 976 #elif defined(TARGET_ARM) 977 978 struct target_sigcontext { 979 abi_ulong trap_no; 980 abi_ulong error_code; 981 abi_ulong oldmask; 982 abi_ulong arm_r0; 983 abi_ulong arm_r1; 984 abi_ulong arm_r2; 985 abi_ulong arm_r3; 986 abi_ulong arm_r4; 987 abi_ulong arm_r5; 988 abi_ulong arm_r6; 989 abi_ulong arm_r7; 990 abi_ulong arm_r8; 991 abi_ulong arm_r9; 992 abi_ulong arm_r10; 993 abi_ulong arm_fp; 994 abi_ulong arm_ip; 995 abi_ulong arm_sp; 996 abi_ulong arm_lr; 997 abi_ulong arm_pc; 998 abi_ulong arm_cpsr; 999 abi_ulong fault_address; 1000 }; 1001 1002 struct target_ucontext { 1003 abi_ulong tuc_flags; 1004 abi_ulong tuc_link; 1005 target_stack_t tuc_stack; 1006 struct target_sigcontext tuc_mcontext; 1007 target_sigset_t tuc_sigmask; /* mask last for extensibility */ 1008 }; 1009 1010 struct sigframe 1011 { 1012 struct target_sigcontext sc; 1013 abi_ulong extramask[TARGET_NSIG_WORDS-1]; 1014 abi_ulong retcode; 1015 }; 1016 1017 struct rt_sigframe 1018 { 1019 struct target_siginfo *pinfo; 1020 void *puc; 1021 struct target_siginfo info; 1022 struct target_ucontext uc; 1023 abi_ulong retcode; 1024 }; 1025 1026 #define TARGET_CONFIG_CPU_32 1 1027 1028 /* 1029 * For ARM syscalls, we encode the syscall number into the instruction. 1030 */ 1031 #define SWI_SYS_SIGRETURN (0xef000000|(TARGET_NR_sigreturn + ARM_SYSCALL_BASE)) 1032 #define SWI_SYS_RT_SIGRETURN (0xef000000|(TARGET_NR_rt_sigreturn + ARM_SYSCALL_BASE)) 1033 1034 /* 1035 * For Thumb syscalls, we pass the syscall number via r7. We therefore 1036 * need two 16-bit instructions. 1037 */ 1038 #define SWI_THUMB_SIGRETURN (0xdf00 << 16 | 0x2700 | (TARGET_NR_sigreturn)) 1039 #define SWI_THUMB_RT_SIGRETURN (0xdf00 << 16 | 0x2700 | (TARGET_NR_rt_sigreturn)) 1040 1041 static const abi_ulong retcodes[4] = { 1042 SWI_SYS_SIGRETURN, SWI_THUMB_SIGRETURN, 1043 SWI_SYS_RT_SIGRETURN, SWI_THUMB_RT_SIGRETURN 1044 }; 1045 1046 1047 #define __put_user_error(x,p,e) __put_user(x, p) 1048 #define __get_user_error(x,p,e) __get_user(x, p) 1049 1050 static inline int valid_user_regs(CPUState *regs) 1051 { 1052 return 1; 1053 } 1054 1055 static int 1056 setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/ 1057 CPUState *env, unsigned long mask) 1058 { 1059 int err = 0; 1060 1061 __put_user_error(env->regs[0], &sc->arm_r0, err); 1062 __put_user_error(env->regs[1], &sc->arm_r1, err); 1063 __put_user_error(env->regs[2], &sc->arm_r2, err); 1064 __put_user_error(env->regs[3], &sc->arm_r3, err); 1065 __put_user_error(env->regs[4], &sc->arm_r4, err); 1066 __put_user_error(env->regs[5], &sc->arm_r5, err); 1067 __put_user_error(env->regs[6], &sc->arm_r6, err); 1068 __put_user_error(env->regs[7], &sc->arm_r7, err); 1069 __put_user_error(env->regs[8], &sc->arm_r8, err); 1070 __put_user_error(env->regs[9], &sc->arm_r9, err); 1071 __put_user_error(env->regs[10], &sc->arm_r10, err); 1072 __put_user_error(env->regs[11], &sc->arm_fp, err); 1073 __put_user_error(env->regs[12], &sc->arm_ip, err); 1074 __put_user_error(env->regs[13], &sc->arm_sp, err); 1075 __put_user_error(env->regs[14], &sc->arm_lr, err); 1076 __put_user_error(env->regs[15], &sc->arm_pc, err); 1077 #ifdef TARGET_CONFIG_CPU_32 1078 __put_user_error(cpsr_read(env), &sc->arm_cpsr, err); 1079 #endif 1080 1081 __put_user_error(/* current->thread.trap_no */ 0, &sc->trap_no, err); 1082 __put_user_error(/* current->thread.error_code */ 0, &sc->error_code, err); 1083 __put_user_error(/* current->thread.address */ 0, &sc->fault_address, err); 1084 __put_user_error(mask, &sc->oldmask, err); 1085 1086 return err; 1087 } 1088 1089 static inline void * 1090 get_sigframe(struct emulated_sigaction *ka, CPUState *regs, int framesize) 1091 { 1092 unsigned long sp = regs->regs[13]; 1093 1094 /* 1095 * This is the X/Open sanctioned signal stack switching. 1096 */ 1097 if ((ka->sa.sa_flags & TARGET_SA_ONSTACK) && !sas_ss_flags(sp)) 1098 sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size; 1099 /* 1100 * ATPCS B01 mandates 8-byte alignment 1101 */ 1102 return g2h((sp - framesize) & ~7); 1103 } 1104 1105 static int 1106 setup_return(CPUState *env, struct emulated_sigaction *ka, 1107 abi_ulong *rc, void *frame, int usig) 1108 { 1109 abi_ulong handler = (abi_ulong)ka->sa._sa_handler; 1110 abi_ulong retcode; 1111 int thumb = 0; 1112 #if defined(TARGET_CONFIG_CPU_32) 1113 #if 0 1114 abi_ulong cpsr = env->cpsr; 1115 1116 /* 1117 * Maybe we need to deliver a 32-bit signal to a 26-bit task. 1118 */ 1119 if (ka->sa.sa_flags & SA_THIRTYTWO) 1120 cpsr = (cpsr & ~MODE_MASK) | USR_MODE; 1121 1122 #ifdef CONFIG_ARM_THUMB 1123 if (elf_hwcap & HWCAP_THUMB) { 1124 /* 1125 * The LSB of the handler determines if we're going to 1126 * be using THUMB or ARM mode for this signal handler. 1127 */ 1128 thumb = handler & 1; 1129 1130 if (thumb) 1131 cpsr |= T_BIT; 1132 else 1133 cpsr &= ~T_BIT; 1134 } 1135 #endif /* CONFIG_ARM_THUMB */ 1136 #endif /* 0 */ 1137 #endif /* TARGET_CONFIG_CPU_32 */ 1138 1139 if (ka->sa.sa_flags & TARGET_SA_RESTORER) { 1140 retcode = (abi_ulong)ka->sa.sa_restorer; 1141 } else { 1142 unsigned int idx = thumb; 1143 1144 if (ka->sa.sa_flags & TARGET_SA_SIGINFO) 1145 idx += 2; 1146 1147 if (__put_user(retcodes[idx], rc)) 1148 return 1; 1149 #if 0 1150 flush_icache_range((abi_ulong)rc, 1151 (abi_ulong)(rc + 1)); 1152 #endif 1153 retcode = ((abi_ulong)rc) + thumb; 1154 } 1155 1156 env->regs[0] = usig; 1157 env->regs[13] = h2g(frame); 1158 env->regs[14] = retcode; 1159 env->regs[15] = handler & (thumb ? ~1 : ~3); 1160 1161 #if 0 1162 #ifdef TARGET_CONFIG_CPU_32 1163 env->cpsr = cpsr; 1164 #endif 1165 #endif 1166 1167 return 0; 1168 } 1169 1170 static void setup_frame(int usig, struct emulated_sigaction *ka, 1171 target_sigset_t *set, CPUState *regs) 1172 { 1173 struct sigframe *frame = get_sigframe(ka, regs, sizeof(*frame)); 1174 int i, err = 0; 1175 1176 err |= setup_sigcontext(&frame->sc, /*&frame->fpstate,*/ regs, set->sig[0]); 1177 1178 for(i = 1; i < TARGET_NSIG_WORDS; i++) { 1179 if (__put_user(set->sig[i], &frame->extramask[i - 1])) 1180 return; 1181 } 1182 1183 if (err == 0) 1184 err = setup_return(regs, ka, &frame->retcode, frame, usig); 1185 // return err; 1186 } 1187 1188 static void setup_rt_frame(int usig, struct emulated_sigaction *ka, 1189 target_siginfo_t *info, 1190 target_sigset_t *set, CPUState *env) 1191 { 1192 struct rt_sigframe *frame = get_sigframe(ka, env, sizeof(*frame)); 1193 struct target_sigaltstack stack; 1194 int i, err = 0; 1195 1196 if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame))) 1197 return /* 1 */; 1198 1199 __put_user_error(&frame->info, (abi_ulong *)&frame->pinfo, err); 1200 __put_user_error(&frame->uc, (abi_ulong *)&frame->puc, err); 1201 err |= copy_siginfo_to_user(&frame->info, info); 1202 1203 /* Clear all the bits of the ucontext we don't use. */ 1204 memset(&frame->uc, 0, offsetof(struct target_ucontext, tuc_mcontext)); 1205 1206 memset(&stack, 0, sizeof(stack)); 1207 __put_user(target_sigaltstack_used.ss_sp, &stack.ss_sp); 1208 __put_user(target_sigaltstack_used.ss_size, &stack.ss_size); 1209 __put_user(sas_ss_flags(get_sp_from_cpustate(env)), &stack.ss_flags); 1210 if (!access_ok(VERIFY_WRITE, &frame->uc.tuc_stack, sizeof(stack))) 1211 err = 1; 1212 else 1213 memcpy(&frame->uc.tuc_stack, &stack, sizeof(stack)); 1214 1215 err |= setup_sigcontext(&frame->uc.tuc_mcontext, /*&frame->fpstate,*/ 1216 env, set->sig[0]); 1217 for(i = 0; i < TARGET_NSIG_WORDS; i++) { 1218 if (__put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i])) 1219 return; 1220 } 1221 1222 if (err == 0) 1223 err = setup_return(env, ka, &frame->retcode, frame, usig); 1224 1225 if (err == 0) { 1226 /* 1227 * For realtime signals we must also set the second and third 1228 * arguments for the signal handler. 1229 * -- Peter Maydell <pmaydell@chiark.greenend.org.uk> 2000-12-06 1230 */ 1231 env->regs[1] = (abi_ulong)frame->pinfo; 1232 env->regs[2] = (abi_ulong)frame->puc; 1233 } 1234 1235 // return err; 1236 } 1237 1238 static int 1239 restore_sigcontext(CPUState *env, struct target_sigcontext *sc) 1240 { 1241 int err = 0; 1242 uint32_t cpsr; 1243 1244 __get_user_error(env->regs[0], &sc->arm_r0, err); 1245 __get_user_error(env->regs[1], &sc->arm_r1, err); 1246 __get_user_error(env->regs[2], &sc->arm_r2, err); 1247 __get_user_error(env->regs[3], &sc->arm_r3, err); 1248 __get_user_error(env->regs[4], &sc->arm_r4, err); 1249 __get_user_error(env->regs[5], &sc->arm_r5, err); 1250 __get_user_error(env->regs[6], &sc->arm_r6, err); 1251 __get_user_error(env->regs[7], &sc->arm_r7, err); 1252 __get_user_error(env->regs[8], &sc->arm_r8, err); 1253 __get_user_error(env->regs[9], &sc->arm_r9, err); 1254 __get_user_error(env->regs[10], &sc->arm_r10, err); 1255 __get_user_error(env->regs[11], &sc->arm_fp, err); 1256 __get_user_error(env->regs[12], &sc->arm_ip, err); 1257 __get_user_error(env->regs[13], &sc->arm_sp, err); 1258 __get_user_error(env->regs[14], &sc->arm_lr, err); 1259 __get_user_error(env->regs[15], &sc->arm_pc, err); 1260 #ifdef TARGET_CONFIG_CPU_32 1261 __get_user_error(cpsr, &sc->arm_cpsr, err); 1262 cpsr_write(env, cpsr, 0xffffffff); 1263 #endif 1264 1265 err |= !valid_user_regs(env); 1266 1267 return err; 1268 } 1269 1270 long do_sigreturn(CPUState *env) 1271 { 1272 struct sigframe *frame; 1273 target_sigset_t set; 1274 sigset_t host_set; 1275 int i; 1276 1277 /* 1278 * Since we stacked the signal on a 64-bit boundary, 1279 * then 'sp' should be word aligned here. If it's 1280 * not, then the user is trying to mess with us. 1281 */ 1282 if (env->regs[13] & 7) 1283 goto badframe; 1284 1285 frame = (struct sigframe *)g2h(env->regs[13]); 1286 1287 #if 0 1288 if (verify_area(VERIFY_READ, frame, sizeof (*frame))) 1289 goto badframe; 1290 #endif 1291 if (__get_user(set.sig[0], &frame->sc.oldmask)) 1292 goto badframe; 1293 for(i = 1; i < TARGET_NSIG_WORDS; i++) { 1294 if (__get_user(set.sig[i], &frame->extramask[i - 1])) 1295 goto badframe; 1296 } 1297 1298 target_to_host_sigset_internal(&host_set, &set); 1299 sigprocmask(SIG_SETMASK, &host_set, NULL); 1300 1301 if (restore_sigcontext(env, &frame->sc)) 1302 goto badframe; 1303 1304 #if 0 1305 /* Send SIGTRAP if we're single-stepping */ 1306 if (ptrace_cancel_bpt(current)) 1307 send_sig(SIGTRAP, current, 1); 1308 #endif 1309 return env->regs[0]; 1310 1311 badframe: 1312 force_sig(SIGSEGV /* , current */); 1313 return 0; 1314 } 1315 1316 long do_rt_sigreturn(CPUState *env) 1317 { 1318 struct rt_sigframe *frame; 1319 sigset_t host_set; 1320 1321 /* 1322 * Since we stacked the signal on a 64-bit boundary, 1323 * then 'sp' should be word aligned here. If it's 1324 * not, then the user is trying to mess with us. 1325 */ 1326 if (env->regs[13] & 7) 1327 goto badframe; 1328 1329 frame = (struct rt_sigframe *)env->regs[13]; 1330 1331 #if 0 1332 if (verify_area(VERIFY_READ, frame, sizeof (*frame))) 1333 goto badframe; 1334 #endif 1335 target_to_host_sigset(&host_set, &frame->uc.tuc_sigmask); 1336 sigprocmask(SIG_SETMASK, &host_set, NULL); 1337 1338 if (restore_sigcontext(env, &frame->uc.tuc_mcontext)) 1339 goto badframe; 1340 1341 if (do_sigaltstack(&frame->uc.tuc_stack, NULL, get_sp_from_cpustate(env)) == -EFAULT) 1342 goto badframe; 1343 1344 #if 0 1345 /* Send SIGTRAP if we're single-stepping */ 1346 if (ptrace_cancel_bpt(current)) 1347 send_sig(SIGTRAP, current, 1); 1348 #endif 1349 return env->regs[0]; 1350 1351 badframe: 1352 force_sig(SIGSEGV /* , current */); 1353 return 0; 1354 } 1355 1356 #elif defined(TARGET_SPARC) 1357 1358 #define __SUNOS_MAXWIN 31 1359 1360 /* This is what SunOS does, so shall I. */ 1361 struct target_sigcontext { 1362 abi_ulong sigc_onstack; /* state to restore */ 1363 1364 abi_ulong sigc_mask; /* sigmask to restore */ 1365 abi_ulong sigc_sp; /* stack pointer */ 1366 abi_ulong sigc_pc; /* program counter */ 1367 abi_ulong sigc_npc; /* next program counter */ 1368 abi_ulong sigc_psr; /* for condition codes etc */ 1369 abi_ulong sigc_g1; /* User uses these two registers */ 1370 abi_ulong sigc_o0; /* within the trampoline code. */ 1371 1372 /* Now comes information regarding the users window set 1373 * at the time of the signal. 1374 */ 1375 abi_ulong sigc_oswins; /* outstanding windows */ 1376 1377 /* stack ptrs for each regwin buf */ 1378 char *sigc_spbuf[__SUNOS_MAXWIN]; 1379 1380 /* Windows to restore after signal */ 1381 struct { 1382 abi_ulong locals[8]; 1383 abi_ulong ins[8]; 1384 } sigc_wbuf[__SUNOS_MAXWIN]; 1385 }; 1386 /* A Sparc stack frame */ 1387 struct sparc_stackf { 1388 abi_ulong locals[8]; 1389 abi_ulong ins[6]; 1390 struct sparc_stackf *fp; 1391 abi_ulong callers_pc; 1392 char *structptr; 1393 abi_ulong xargs[6]; 1394 abi_ulong xxargs[1]; 1395 }; 1396 1397 typedef struct { 1398 struct { 1399 abi_ulong psr; 1400 abi_ulong pc; 1401 abi_ulong npc; 1402 abi_ulong y; 1403 abi_ulong u_regs[16]; /* globals and ins */ 1404 } si_regs; 1405 int si_mask; 1406 } __siginfo_t; 1407 1408 typedef struct { 1409 unsigned long si_float_regs [32]; 1410 unsigned long si_fsr; 1411 unsigned long si_fpqdepth; 1412 struct { 1413 unsigned long *insn_addr; 1414 unsigned long insn; 1415 } si_fpqueue [16]; 1416 } qemu_siginfo_fpu_t; 1417 1418 1419 struct target_signal_frame { 1420 struct sparc_stackf ss; 1421 __siginfo_t info; 1422 qemu_siginfo_fpu_t *fpu_save; 1423 abi_ulong insns[2] __attribute__ ((aligned (8))); 1424 abi_ulong extramask[TARGET_NSIG_WORDS - 1]; 1425 abi_ulong extra_size; /* Should be 0 */ 1426 qemu_siginfo_fpu_t fpu_state; 1427 }; 1428 struct target_rt_signal_frame { 1429 struct sparc_stackf ss; 1430 siginfo_t info; 1431 abi_ulong regs[20]; 1432 sigset_t mask; 1433 qemu_siginfo_fpu_t *fpu_save; 1434 unsigned int insns[2]; 1435 stack_t stack; 1436 unsigned int extra_size; /* Should be 0 */ 1437 qemu_siginfo_fpu_t fpu_state; 1438 }; 1439 1440 #define UREG_O0 16 1441 #define UREG_O6 22 1442 #define UREG_I0 0 1443 #define UREG_I1 1 1444 #define UREG_I2 2 1445 #define UREG_I3 3 1446 #define UREG_I4 4 1447 #define UREG_I5 5 1448 #define UREG_I6 6 1449 #define UREG_I7 7 1450 #define UREG_L0 8 1451 #define UREG_FP UREG_I6 1452 #define UREG_SP UREG_O6 1453 1454 static inline void *get_sigframe(struct emulated_sigaction *sa, CPUState *env, unsigned long framesize) 1455 { 1456 unsigned long sp; 1457 1458 sp = env->regwptr[UREG_FP]; 1459 1460 /* This is the X/Open sanctioned signal stack switching. */ 1461 if (sa->sa.sa_flags & TARGET_SA_ONSTACK) { 1462 if (!on_sig_stack(sp) 1463 && !((target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size) & 7)) 1464 sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size; 1465 } 1466 return g2h(sp - framesize); 1467 } 1468 1469 static int 1470 setup___siginfo(__siginfo_t *si, CPUState *env, abi_ulong mask) 1471 { 1472 int err = 0, i; 1473 1474 err |= __put_user(env->psr, &si->si_regs.psr); 1475 err |= __put_user(env->pc, &si->si_regs.pc); 1476 err |= __put_user(env->npc, &si->si_regs.npc); 1477 err |= __put_user(env->y, &si->si_regs.y); 1478 for (i=0; i < 8; i++) { 1479 err |= __put_user(env->gregs[i], &si->si_regs.u_regs[i]); 1480 } 1481 for (i=0; i < 8; i++) { 1482 err |= __put_user(env->regwptr[UREG_I0 + i], &si->si_regs.u_regs[i+8]); 1483 } 1484 err |= __put_user(mask, &si->si_mask); 1485 return err; 1486 } 1487 1488 #if 0 1489 static int 1490 setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/ 1491 CPUState *env, unsigned long mask) 1492 { 1493 int err = 0; 1494 1495 err |= __put_user(mask, &sc->sigc_mask); 1496 err |= __put_user(env->regwptr[UREG_SP], &sc->sigc_sp); 1497 err |= __put_user(env->pc, &sc->sigc_pc); 1498 err |= __put_user(env->npc, &sc->sigc_npc); 1499 err |= __put_user(env->psr, &sc->sigc_psr); 1500 err |= __put_user(env->gregs[1], &sc->sigc_g1); 1501 err |= __put_user(env->regwptr[UREG_O0], &sc->sigc_o0); 1502 1503 return err; 1504 } 1505 #endif 1506 #define NF_ALIGNEDSZ (((sizeof(struct target_signal_frame) + 7) & (~7))) 1507 1508 static void setup_frame(int sig, struct emulated_sigaction *ka, 1509 target_sigset_t *set, CPUState *env) 1510 { 1511 struct target_signal_frame *sf; 1512 int sigframe_size, err, i; 1513 1514 /* 1. Make sure everything is clean */ 1515 //synchronize_user_stack(); 1516 1517 sigframe_size = NF_ALIGNEDSZ; 1518 1519 sf = (struct target_signal_frame *) 1520 get_sigframe(ka, env, sigframe_size); 1521 1522 //fprintf(stderr, "sf: %x pc %x fp %x sp %x\n", sf, env->pc, env->regwptr[UREG_FP], env->regwptr[UREG_SP]); 1523 #if 0 1524 if (invalid_frame_pointer(sf, sigframe_size)) 1525 goto sigill_and_return; 1526 #endif 1527 /* 2. Save the current process state */ 1528 err = setup___siginfo(&sf->info, env, set->sig[0]); 1529 err |= __put_user(0, &sf->extra_size); 1530 1531 //err |= save_fpu_state(regs, &sf->fpu_state); 1532 //err |= __put_user(&sf->fpu_state, &sf->fpu_save); 1533 1534 err |= __put_user(set->sig[0], &sf->info.si_mask); 1535 for (i = 0; i < TARGET_NSIG_WORDS - 1; i++) { 1536 err |= __put_user(set->sig[i + 1], &sf->extramask[i]); 1537 } 1538 1539 for (i = 0; i < 8; i++) { 1540 err |= __put_user(env->regwptr[i + UREG_L0], &sf->ss.locals[i]); 1541 } 1542 for (i = 0; i < 8; i++) { 1543 err |= __put_user(env->regwptr[i + UREG_I0], &sf->ss.ins[i]); 1544 } 1545 if (err) 1546 goto sigsegv; 1547 1548 /* 3. signal handler back-trampoline and parameters */ 1549 env->regwptr[UREG_FP] = h2g(sf); 1550 env->regwptr[UREG_I0] = sig; 1551 env->regwptr[UREG_I1] = h2g(&sf->info); 1552 env->regwptr[UREG_I2] = h2g(&sf->info); 1553 1554 /* 4. signal handler */ 1555 env->pc = (unsigned long) ka->sa._sa_handler; 1556 env->npc = (env->pc + 4); 1557 /* 5. return to kernel instructions */ 1558 if (ka->sa.sa_restorer) 1559 env->regwptr[UREG_I7] = (unsigned long)ka->sa.sa_restorer; 1560 else { 1561 env->regwptr[UREG_I7] = h2g(&(sf->insns[0]) - 2); 1562 1563 /* mov __NR_sigreturn, %g1 */ 1564 err |= __put_user(0x821020d8, &sf->insns[0]); 1565 1566 /* t 0x10 */ 1567 err |= __put_user(0x91d02010, &sf->insns[1]); 1568 if (err) 1569 goto sigsegv; 1570 1571 /* Flush instruction space. */ 1572 //flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0])); 1573 // tb_flush(env); 1574 } 1575 return; 1576 1577 //sigill_and_return: 1578 force_sig(TARGET_SIGILL); 1579 sigsegv: 1580 //fprintf(stderr, "force_sig\n"); 1581 force_sig(TARGET_SIGSEGV); 1582 } 1583 static inline int 1584 restore_fpu_state(CPUState *env, qemu_siginfo_fpu_t *fpu) 1585 { 1586 int err; 1587 #if 0 1588 #ifdef CONFIG_SMP 1589 if (current->flags & PF_USEDFPU) 1590 regs->psr &= ~PSR_EF; 1591 #else 1592 if (current == last_task_used_math) { 1593 last_task_used_math = 0; 1594 regs->psr &= ~PSR_EF; 1595 } 1596 #endif 1597 current->used_math = 1; 1598 current->flags &= ~PF_USEDFPU; 1599 #endif 1600 #if 0 1601 if (verify_area (VERIFY_READ, fpu, sizeof(*fpu))) 1602 return -EFAULT; 1603 #endif 1604 1605 #if 0 1606 /* XXX: incorrect */ 1607 err = __copy_from_user(&env->fpr[0], &fpu->si_float_regs[0], 1608 (sizeof(unsigned long) * 32)); 1609 #endif 1610 err |= __get_user(env->fsr, &fpu->si_fsr); 1611 #if 0 1612 err |= __get_user(current->thread.fpqdepth, &fpu->si_fpqdepth); 1613 if (current->thread.fpqdepth != 0) 1614 err |= __copy_from_user(¤t->thread.fpqueue[0], 1615 &fpu->si_fpqueue[0], 1616 ((sizeof(unsigned long) + 1617 (sizeof(unsigned long *)))*16)); 1618 #endif 1619 return err; 1620 } 1621 1622 1623 static void setup_rt_frame(int sig, struct emulated_sigaction *ka, 1624 target_siginfo_t *info, 1625 target_sigset_t *set, CPUState *env) 1626 { 1627 fprintf(stderr, "setup_rt_frame: not implemented\n"); 1628 } 1629 1630 long do_sigreturn(CPUState *env) 1631 { 1632 struct target_signal_frame *sf; 1633 uint32_t up_psr, pc, npc; 1634 target_sigset_t set; 1635 sigset_t host_set; 1636 abi_ulong fpu_save; 1637 int err, i; 1638 1639 sf = (struct target_signal_frame *)g2h(env->regwptr[UREG_FP]); 1640 #if 0 1641 fprintf(stderr, "sigreturn\n"); 1642 fprintf(stderr, "sf: %x pc %x fp %x sp %x\n", sf, env->pc, env->regwptr[UREG_FP], env->regwptr[UREG_SP]); 1643 #endif 1644 //cpu_dump_state(env, stderr, fprintf, 0); 1645 1646 /* 1. Make sure we are not getting garbage from the user */ 1647 #if 0 1648 if (verify_area (VERIFY_READ, sf, sizeof (*sf))) 1649 goto segv_and_exit; 1650 #endif 1651 1652 if (((uint) sf) & 3) 1653 goto segv_and_exit; 1654 1655 err = __get_user(pc, &sf->info.si_regs.pc); 1656 err |= __get_user(npc, &sf->info.si_regs.npc); 1657 1658 if ((pc | npc) & 3) 1659 goto segv_and_exit; 1660 1661 /* 2. Restore the state */ 1662 err |= __get_user(up_psr, &sf->info.si_regs.psr); 1663 1664 /* User can only change condition codes and FPU enabling in %psr. */ 1665 env->psr = (up_psr & (PSR_ICC /* | PSR_EF */)) 1666 | (env->psr & ~(PSR_ICC /* | PSR_EF */)); 1667 1668 env->pc = pc; 1669 env->npc = npc; 1670 err |= __get_user(env->y, &sf->info.si_regs.y); 1671 for (i=0; i < 8; i++) { 1672 err |= __get_user(env->gregs[i], &sf->info.si_regs.u_regs[i]); 1673 } 1674 for (i=0; i < 8; i++) { 1675 err |= __get_user(env->regwptr[i + UREG_I0], &sf->info.si_regs.u_regs[i+8]); 1676 } 1677 1678 err |= __get_user(fpu_save, (abi_ulong *)&sf->fpu_save); 1679 1680 //if (fpu_save) 1681 // err |= restore_fpu_state(env, fpu_save); 1682 1683 /* This is pretty much atomic, no amount locking would prevent 1684 * the races which exist anyways. 1685 */ 1686 err |= __get_user(set.sig[0], &sf->info.si_mask); 1687 for(i = 1; i < TARGET_NSIG_WORDS; i++) { 1688 err |= (__get_user(set.sig[i], &sf->extramask[i - 1])); 1689 } 1690 1691 target_to_host_sigset_internal(&host_set, &set); 1692 sigprocmask(SIG_SETMASK, &host_set, NULL); 1693 1694 if (err) 1695 goto segv_and_exit; 1696 1697 return env->regwptr[0]; 1698 1699 segv_and_exit: 1700 force_sig(TARGET_SIGSEGV); 1701 } 1702 1703 long do_rt_sigreturn(CPUState *env) 1704 { 1705 fprintf(stderr, "do_rt_sigreturn: not implemented\n"); 1706 return -ENOSYS; 1707 } 1708 1709 #ifdef TARGET_SPARC64 1710 #define MC_TSTATE 0 1711 #define MC_PC 1 1712 #define MC_NPC 2 1713 #define MC_Y 3 1714 #define MC_G1 4 1715 #define MC_G2 5 1716 #define MC_G3 6 1717 #define MC_G4 7 1718 #define MC_G5 8 1719 #define MC_G6 9 1720 #define MC_G7 10 1721 #define MC_O0 11 1722 #define MC_O1 12 1723 #define MC_O2 13 1724 #define MC_O3 14 1725 #define MC_O4 15 1726 #define MC_O5 16 1727 #define MC_O6 17 1728 #define MC_O7 18 1729 #define MC_NGREG 19 1730 1731 typedef abi_ulong target_mc_greg_t; 1732 typedef target_mc_greg_t target_mc_gregset_t[MC_NGREG]; 1733 1734 struct target_mc_fq { 1735 abi_ulong *mcfq_addr; 1736 uint32_t mcfq_insn; 1737 }; 1738 1739 struct target_mc_fpu { 1740 union { 1741 uint32_t sregs[32]; 1742 uint64_t dregs[32]; 1743 //uint128_t qregs[16]; 1744 } mcfpu_fregs; 1745 abi_ulong mcfpu_fsr; 1746 abi_ulong mcfpu_fprs; 1747 abi_ulong mcfpu_gsr; 1748 struct target_mc_fq *mcfpu_fq; 1749 unsigned char mcfpu_qcnt; 1750 unsigned char mcfpu_qentsz; 1751 unsigned char mcfpu_enab; 1752 }; 1753 typedef struct target_mc_fpu target_mc_fpu_t; 1754 1755 typedef struct { 1756 target_mc_gregset_t mc_gregs; 1757 target_mc_greg_t mc_fp; 1758 target_mc_greg_t mc_i7; 1759 target_mc_fpu_t mc_fpregs; 1760 } target_mcontext_t; 1761 1762 struct target_ucontext { 1763 struct target_ucontext *uc_link; 1764 abi_ulong uc_flags; 1765 target_sigset_t uc_sigmask; 1766 target_mcontext_t uc_mcontext; 1767 }; 1768 1769 /* A V9 register window */ 1770 struct target_reg_window { 1771 abi_ulong locals[8]; 1772 abi_ulong ins[8]; 1773 }; 1774 1775 #define TARGET_STACK_BIAS 2047 1776 1777 /* {set, get}context() needed for 64-bit SparcLinux userland. */ 1778 void sparc64_set_context(CPUSPARCState *env) 1779 { 1780 struct target_ucontext *ucp = (struct target_ucontext *) 1781 env->regwptr[UREG_I0]; 1782 target_mc_gregset_t *grp; 1783 abi_ulong pc, npc, tstate; 1784 abi_ulong fp, i7; 1785 unsigned char fenab; 1786 int err; 1787 unsigned int i; 1788 abi_ulong *src, *dst; 1789 1790 grp = &ucp->uc_mcontext.mc_gregs; 1791 err = get_user(pc, &((*grp)[MC_PC])); 1792 err |= get_user(npc, &((*grp)[MC_NPC])); 1793 if (err || ((pc | npc) & 3)) 1794 goto do_sigsegv; 1795 if (env->regwptr[UREG_I1]) { 1796 target_sigset_t target_set; 1797 sigset_t set; 1798 1799 if (TARGET_NSIG_WORDS == 1) { 1800 if (get_user(target_set.sig[0], &ucp->uc_sigmask.sig[0])) 1801 goto do_sigsegv; 1802 } else { 1803 src = &ucp->uc_sigmask; 1804 dst = &target_set; 1805 for (i = 0; i < sizeof(target_sigset_t) / sizeof(abi_ulong); 1806 i++, dst++, src++) 1807 err |= get_user(dst, src); 1808 if (err) 1809 goto do_sigsegv; 1810 } 1811 target_to_host_sigset_internal(&set, &target_set); 1812 sigprocmask(SIG_SETMASK, &set, NULL); 1813 } 1814 env->pc = pc; 1815 env->npc = npc; 1816 err |= get_user(env->y, &((*grp)[MC_Y])); 1817 err |= get_user(tstate, &((*grp)[MC_TSTATE])); 1818 env->asi = (tstate >> 24) & 0xff; 1819 PUT_CCR(env, tstate >> 32); 1820 PUT_CWP64(env, tstate & 0x1f); 1821 err |= get_user(env->gregs[1], (&(*grp)[MC_G1])); 1822 err |= get_user(env->gregs[2], (&(*grp)[MC_G2])); 1823 err |= get_user(env->gregs[3], (&(*grp)[MC_G3])); 1824 err |= get_user(env->gregs[4], (&(*grp)[MC_G4])); 1825 err |= get_user(env->gregs[5], (&(*grp)[MC_G5])); 1826 err |= get_user(env->gregs[6], (&(*grp)[MC_G6])); 1827 err |= get_user(env->gregs[7], (&(*grp)[MC_G7])); 1828 err |= get_user(env->regwptr[UREG_I0], (&(*grp)[MC_O0])); 1829 err |= get_user(env->regwptr[UREG_I1], (&(*grp)[MC_O1])); 1830 err |= get_user(env->regwptr[UREG_I2], (&(*grp)[MC_O2])); 1831 err |= get_user(env->regwptr[UREG_I3], (&(*grp)[MC_O3])); 1832 err |= get_user(env->regwptr[UREG_I4], (&(*grp)[MC_O4])); 1833 err |= get_user(env->regwptr[UREG_I5], (&(*grp)[MC_O5])); 1834 err |= get_user(env->regwptr[UREG_I6], (&(*grp)[MC_O6])); 1835 err |= get_user(env->regwptr[UREG_I7], (&(*grp)[MC_O7])); 1836 1837 err |= get_user(fp, &(ucp->uc_mcontext.mc_fp)); 1838 err |= get_user(i7, &(ucp->uc_mcontext.mc_i7)); 1839 err |= put_user(fp, 1840 (&(((struct target_reg_window *)(TARGET_STACK_BIAS+env->regwptr[UREG_I6]))->ins[6]))); 1841 err |= put_user(i7, 1842 (&(((struct target_reg_window *)(TARGET_STACK_BIAS+env->regwptr[UREG_I6]))->ins[7]))); 1843 1844 err |= get_user(fenab, &(ucp->uc_mcontext.mc_fpregs.mcfpu_enab)); 1845 err |= get_user(env->fprs, &(ucp->uc_mcontext.mc_fpregs.mcfpu_fprs)); 1846 src = &(ucp->uc_mcontext.mc_fpregs.mcfpu_fregs); 1847 dst = &env->fpr; 1848 for (i = 0; i < 64; i++, dst++, src++) 1849 err |= get_user(dst, src); 1850 err |= get_user(env->fsr, 1851 &(ucp->uc_mcontext.mc_fpregs.mcfpu_fsr)); 1852 err |= get_user(env->gsr, 1853 &(ucp->uc_mcontext.mc_fpregs.mcfpu_gsr)); 1854 if (err) 1855 goto do_sigsegv; 1856 1857 return; 1858 do_sigsegv: 1859 force_sig(SIGSEGV); 1860 } 1861 1862 void sparc64_get_context(CPUSPARCState *env) 1863 { 1864 struct target_ucontext *ucp = (struct target_ucontext *) 1865 env->regwptr[UREG_I0]; 1866 target_mc_gregset_t *grp; 1867 target_mcontext_t *mcp; 1868 abi_ulong fp, i7; 1869 int err; 1870 unsigned int i; 1871 abi_ulong *src, *dst; 1872 target_sigset_t target_set; 1873 sigset_t set; 1874 1875 mcp = &ucp->uc_mcontext; 1876 grp = &mcp->mc_gregs; 1877 1878 /* Skip over the trap instruction, first. */ 1879 env->pc = env->npc; 1880 env->npc += 4; 1881 1882 err = 0; 1883 1884 sigprocmask(0, NULL, &set); 1885 host_to_target_sigset_internal(&target_set, &set); 1886 if (TARGET_NSIG_WORDS == 1) 1887 err |= put_user(target_set.sig[0], 1888 (abi_ulong *)&ucp->uc_sigmask); 1889 else { 1890 src = &target_set; 1891 dst = &ucp->uc_sigmask; 1892 for (i = 0; i < sizeof(target_sigset_t) / sizeof(abi_ulong); 1893 i++, dst++, src++) 1894 err |= put_user(src, dst); 1895 if (err) 1896 goto do_sigsegv; 1897 } 1898 1899 err |= put_user(env->tstate, &((*grp)[MC_TSTATE])); 1900 err |= put_user(env->pc, &((*grp)[MC_PC])); 1901 err |= put_user(env->npc, &((*grp)[MC_NPC])); 1902 err |= put_user(env->y, &((*grp)[MC_Y])); 1903 err |= put_user(env->gregs[1], &((*grp)[MC_G1])); 1904 err |= put_user(env->gregs[2], &((*grp)[MC_G2])); 1905 err |= put_user(env->gregs[3], &((*grp)[MC_G3])); 1906 err |= put_user(env->gregs[4], &((*grp)[MC_G4])); 1907 err |= put_user(env->gregs[5], &((*grp)[MC_G5])); 1908 err |= put_user(env->gregs[6], &((*grp)[MC_G6])); 1909 err |= put_user(env->gregs[7], &((*grp)[MC_G7])); 1910 err |= put_user(env->regwptr[UREG_I0], &((*grp)[MC_O0])); 1911 err |= put_user(env->regwptr[UREG_I1], &((*grp)[MC_O1])); 1912 err |= put_user(env->regwptr[UREG_I2], &((*grp)[MC_O2])); 1913 err |= put_user(env->regwptr[UREG_I3], &((*grp)[MC_O3])); 1914 err |= put_user(env->regwptr[UREG_I4], &((*grp)[MC_O4])); 1915 err |= put_user(env->regwptr[UREG_I5], &((*grp)[MC_O5])); 1916 err |= put_user(env->regwptr[UREG_I6], &((*grp)[MC_O6])); 1917 err |= put_user(env->regwptr[UREG_I7], &((*grp)[MC_O7])); 1918 1919 err |= get_user(fp, 1920 (&(((struct target_reg_window *)(TARGET_STACK_BIAS+env->regwptr[UREG_I6]))->ins[6]))); 1921 err |= get_user(i7, 1922 (&(((struct target_reg_window *)(TARGET_STACK_BIAS+env->regwptr[UREG_I6]))->ins[7]))); 1923 err |= put_user(fp, &(mcp->mc_fp)); 1924 err |= put_user(i7, &(mcp->mc_i7)); 1925 1926 src = &env->fpr; 1927 dst = &(ucp->uc_mcontext.mc_fpregs.mcfpu_fregs); 1928 for (i = 0; i < 64; i++, dst++, src++) 1929 err |= put_user(src, dst); 1930 err |= put_user(env->fsr, &(mcp->mc_fpregs.mcfpu_fsr)); 1931 err |= put_user(env->gsr, &(mcp->mc_fpregs.mcfpu_gsr)); 1932 err |= put_user(env->fprs, &(mcp->mc_fpregs.mcfpu_fprs)); 1933 1934 if (err) 1935 goto do_sigsegv; 1936 1937 return; 1938 do_sigsegv: 1939 force_sig(SIGSEGV); 1940 } 1941 #endif 1942 #elif defined(TARGET_MIPS64) 1943 1944 # warning signal handling not implemented 1945 1946 static void setup_frame(int sig, struct emulated_sigaction *ka, 1947 target_sigset_t *set, CPUState *env) 1948 { 1949 fprintf(stderr, "setup_frame: not implemented\n"); 1950 } 1951 1952 static void setup_rt_frame(int sig, struct emulated_sigaction *ka, 1953 target_siginfo_t *info, 1954 target_sigset_t *set, CPUState *env) 1955 { 1956 fprintf(stderr, "setup_rt_frame: not implemented\n"); 1957 } 1958 1959 long do_sigreturn(CPUState *env) 1960 { 1961 fprintf(stderr, "do_sigreturn: not implemented\n"); 1962 return -ENOSYS; 1963 } 1964 1965 long do_rt_sigreturn(CPUState *env) 1966 { 1967 fprintf(stderr, "do_rt_sigreturn: not implemented\n"); 1968 return -ENOSYS; 1969 } 1970 1971 #elif defined(TARGET_MIPSN32) 1972 1973 # warning signal handling not implemented 1974 1975 static void setup_frame(int sig, struct emulated_sigaction *ka, 1976 target_sigset_t *set, CPUState *env) 1977 { 1978 fprintf(stderr, "setup_frame: not implemented\n"); 1979 } 1980 1981 static void setup_rt_frame(int sig, struct emulated_sigaction *ka, 1982 target_siginfo_t *info, 1983 target_sigset_t *set, CPUState *env) 1984 { 1985 fprintf(stderr, "setup_rt_frame: not implemented\n"); 1986 } 1987 1988 long do_sigreturn(CPUState *env) 1989 { 1990 fprintf(stderr, "do_sigreturn: not implemented\n"); 1991 return -ENOSYS; 1992 } 1993 1994 long do_rt_sigreturn(CPUState *env) 1995 { 1996 fprintf(stderr, "do_rt_sigreturn: not implemented\n"); 1997 return -ENOSYS; 1998 } 1999 2000 #elif defined(TARGET_MIPS) 2001 2002 struct target_sigcontext { 2003 uint32_t sc_regmask; /* Unused */ 2004 uint32_t sc_status; 2005 uint64_t sc_pc; 2006 uint64_t sc_regs[32]; 2007 uint64_t sc_fpregs[32]; 2008 uint32_t sc_ownedfp; /* Unused */ 2009 uint32_t sc_fpc_csr; 2010 uint32_t sc_fpc_eir; /* Unused */ 2011 uint32_t sc_used_math; 2012 uint32_t sc_dsp; /* dsp status, was sc_ssflags */ 2013 uint64_t sc_mdhi; 2014 uint64_t sc_mdlo; 2015 target_ulong sc_hi1; /* Was sc_cause */ 2016 target_ulong sc_lo1; /* Was sc_badvaddr */ 2017 target_ulong sc_hi2; /* Was sc_sigset[4] */ 2018 target_ulong sc_lo2; 2019 target_ulong sc_hi3; 2020 target_ulong sc_lo3; 2021 }; 2022 2023 struct sigframe { 2024 uint32_t sf_ass[4]; /* argument save space for o32 */ 2025 uint32_t sf_code[2]; /* signal trampoline */ 2026 struct target_sigcontext sf_sc; 2027 target_sigset_t sf_mask; 2028 }; 2029 2030 /* Install trampoline to jump back from signal handler */ 2031 static inline int install_sigtramp(unsigned int *tramp, unsigned int syscall) 2032 { 2033 int err; 2034 2035 /* 2036 * Set up the return code ... 2037 * 2038 * li v0, __NR__foo_sigreturn 2039 * syscall 2040 */ 2041 2042 err = __put_user(0x24020000 + syscall, tramp + 0); 2043 err |= __put_user(0x0000000c , tramp + 1); 2044 /* flush_cache_sigtramp((unsigned long) tramp); */ 2045 return err; 2046 } 2047 2048 static inline int 2049 setup_sigcontext(CPUState *regs, struct target_sigcontext *sc) 2050 { 2051 int err = 0; 2052 2053 err |= __put_user(regs->PC[regs->current_tc], &sc->sc_pc); 2054 2055 #define save_gp_reg(i) do { \ 2056 err |= __put_user(regs->gpr[i][regs->current_tc], &sc->sc_regs[i]); \ 2057 } while(0) 2058 __put_user(0, &sc->sc_regs[0]); save_gp_reg(1); save_gp_reg(2); 2059 save_gp_reg(3); save_gp_reg(4); save_gp_reg(5); save_gp_reg(6); 2060 save_gp_reg(7); save_gp_reg(8); save_gp_reg(9); save_gp_reg(10); 2061 save_gp_reg(11); save_gp_reg(12); save_gp_reg(13); save_gp_reg(14); 2062 save_gp_reg(15); save_gp_reg(16); save_gp_reg(17); save_gp_reg(18); 2063 save_gp_reg(19); save_gp_reg(20); save_gp_reg(21); save_gp_reg(22); 2064 save_gp_reg(23); save_gp_reg(24); save_gp_reg(25); save_gp_reg(26); 2065 save_gp_reg(27); save_gp_reg(28); save_gp_reg(29); save_gp_reg(30); 2066 save_gp_reg(31); 2067 #undef save_gp_reg 2068 2069 err |= __put_user(regs->HI[0][regs->current_tc], &sc->sc_mdhi); 2070 err |= __put_user(regs->LO[0][regs->current_tc], &sc->sc_mdlo); 2071 2072 /* Not used yet, but might be useful if we ever have DSP suppport */ 2073 #if 0 2074 if (cpu_has_dsp) { 2075 err |= __put_user(mfhi1(), &sc->sc_hi1); 2076 err |= __put_user(mflo1(), &sc->sc_lo1); 2077 err |= __put_user(mfhi2(), &sc->sc_hi2); 2078 err |= __put_user(mflo2(), &sc->sc_lo2); 2079 err |= __put_user(mfhi3(), &sc->sc_hi3); 2080 err |= __put_user(mflo3(), &sc->sc_lo3); 2081 err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp); 2082 } 2083 /* same with 64 bit */ 2084 #ifdef CONFIG_64BIT 2085 err |= __put_user(regs->hi, &sc->sc_hi[0]); 2086 err |= __put_user(regs->lo, &sc->sc_lo[0]); 2087 if (cpu_has_dsp) { 2088 err |= __put_user(mfhi1(), &sc->sc_hi[1]); 2089 err |= __put_user(mflo1(), &sc->sc_lo[1]); 2090 err |= __put_user(mfhi2(), &sc->sc_hi[2]); 2091 err |= __put_user(mflo2(), &sc->sc_lo[2]); 2092 err |= __put_user(mfhi3(), &sc->sc_hi[3]); 2093 err |= __put_user(mflo3(), &sc->sc_lo[3]); 2094 err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp); 2095 } 2096 #endif 2097 #endif 2098 2099 #if 0 2100 err |= __put_user(!!used_math(), &sc->sc_used_math); 2101 2102 if (!used_math()) 2103 goto out; 2104 2105 /* 2106 * Save FPU state to signal context. Signal handler will "inherit" 2107 * current FPU state. 2108 */ 2109 preempt_disable(); 2110 2111 if (!is_fpu_owner()) { 2112 own_fpu(); 2113 restore_fp(current); 2114 } 2115 err |= save_fp_context(sc); 2116 2117 preempt_enable(); 2118 out: 2119 #endif 2120 return err; 2121 } 2122 2123 static inline int 2124 restore_sigcontext(CPUState *regs, struct target_sigcontext *sc) 2125 { 2126 int err = 0; 2127 2128 err |= __get_user(regs->CP0_EPC, &sc->sc_pc); 2129 2130 err |= __get_user(regs->HI[0][regs->current_tc], &sc->sc_mdhi); 2131 err |= __get_user(regs->LO[0][regs->current_tc], &sc->sc_mdlo); 2132 2133 #define restore_gp_reg(i) do { \ 2134 err |= __get_user(regs->gpr[i][regs->current_tc], &sc->sc_regs[i]); \ 2135 } while(0) 2136 restore_gp_reg( 1); restore_gp_reg( 2); restore_gp_reg( 3); 2137 restore_gp_reg( 4); restore_gp_reg( 5); restore_gp_reg( 6); 2138 restore_gp_reg( 7); restore_gp_reg( 8); restore_gp_reg( 9); 2139 restore_gp_reg(10); restore_gp_reg(11); restore_gp_reg(12); 2140 restore_gp_reg(13); restore_gp_reg(14); restore_gp_reg(15); 2141 restore_gp_reg(16); restore_gp_reg(17); restore_gp_reg(18); 2142 restore_gp_reg(19); restore_gp_reg(20); restore_gp_reg(21); 2143 restore_gp_reg(22); restore_gp_reg(23); restore_gp_reg(24); 2144 restore_gp_reg(25); restore_gp_reg(26); restore_gp_reg(27); 2145 restore_gp_reg(28); restore_gp_reg(29); restore_gp_reg(30); 2146 restore_gp_reg(31); 2147 #undef restore_gp_reg 2148 2149 #if 0 2150 if (cpu_has_dsp) { 2151 err |= __get_user(treg, &sc->sc_hi1); mthi1(treg); 2152 err |= __get_user(treg, &sc->sc_lo1); mtlo1(treg); 2153 err |= __get_user(treg, &sc->sc_hi2); mthi2(treg); 2154 err |= __get_user(treg, &sc->sc_lo2); mtlo2(treg); 2155 err |= __get_user(treg, &sc->sc_hi3); mthi3(treg); 2156 err |= __get_user(treg, &sc->sc_lo3); mtlo3(treg); 2157 err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK); 2158 } 2159 #ifdef CONFIG_64BIT 2160 err |= __get_user(regs->hi, &sc->sc_hi[0]); 2161 err |= __get_user(regs->lo, &sc->sc_lo[0]); 2162 if (cpu_has_dsp) { 2163 err |= __get_user(treg, &sc->sc_hi[1]); mthi1(treg); 2164 err |= __get_user(treg, &sc->sc_lo[1]); mthi1(treg); 2165 err |= __get_user(treg, &sc->sc_hi[2]); mthi2(treg); 2166 err |= __get_user(treg, &sc->sc_lo[2]); mthi2(treg); 2167 err |= __get_user(treg, &sc->sc_hi[3]); mthi3(treg); 2168 err |= __get_user(treg, &sc->sc_lo[3]); mthi3(treg); 2169 err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK); 2170 } 2171 #endif 2172 2173 err |= __get_user(used_math, &sc->sc_used_math); 2174 conditional_used_math(used_math); 2175 2176 preempt_disable(); 2177 2178 if (used_math()) { 2179 /* restore fpu context if we have used it before */ 2180 own_fpu(); 2181 err |= restore_fp_context(sc); 2182 } else { 2183 /* signal handler may have used FPU. Give it up. */ 2184 lose_fpu(); 2185 } 2186 2187 preempt_enable(); 2188 #endif 2189 return err; 2190 } 2191 /* 2192 * Determine which stack to use.. 2193 */ 2194 static inline void * 2195 get_sigframe(struct emulated_sigaction *ka, CPUState *regs, size_t frame_size) 2196 { 2197 unsigned long sp; 2198 2199 /* Default to using normal stack */ 2200 sp = regs->gpr[29][regs->current_tc]; 2201 2202 /* 2203 * FPU emulator may have it's own trampoline active just 2204 * above the user stack, 16-bytes before the next lowest 2205 * 16 byte boundary. Try to avoid trashing it. 2206 */ 2207 sp -= 32; 2208 2209 /* This is the X/Open sanctioned signal stack switching. */ 2210 if ((ka->sa.sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags (sp) == 0)) { 2211 sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size; 2212 } 2213 2214 return g2h((sp - frame_size) & ~7); 2215 } 2216 2217 static void setup_frame(int sig, struct emulated_sigaction * ka, 2218 target_sigset_t *set, CPUState *regs) 2219 { 2220 struct sigframe *frame; 2221 int i; 2222 2223 frame = get_sigframe(ka, regs, sizeof(*frame)); 2224 if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame))) 2225 goto give_sigsegv; 2226 2227 install_sigtramp(frame->sf_code, TARGET_NR_sigreturn); 2228 2229 if(setup_sigcontext(regs, &frame->sf_sc)) 2230 goto give_sigsegv; 2231 2232 for(i = 0; i < TARGET_NSIG_WORDS; i++) { 2233 if(__put_user(set->sig[i], &frame->sf_mask.sig[i])) 2234 goto give_sigsegv; 2235 } 2236 2237 /* 2238 * Arguments to signal handler: 2239 * 2240 * a0 = signal number 2241 * a1 = 0 (should be cause) 2242 * a2 = pointer to struct sigcontext 2243 * 2244 * $25 and PC point to the signal handler, $29 points to the 2245 * struct sigframe. 2246 */ 2247 regs->gpr[ 4][regs->current_tc] = sig; 2248 regs->gpr[ 5][regs->current_tc] = 0; 2249 regs->gpr[ 6][regs->current_tc] = h2g(&frame->sf_sc); 2250 regs->gpr[29][regs->current_tc] = h2g(frame); 2251 regs->gpr[31][regs->current_tc] = h2g(frame->sf_code); 2252 /* The original kernel code sets CP0_EPC to the handler 2253 * since it returns to userland using eret 2254 * we cannot do this here, and we must set PC directly */ 2255 regs->PC[regs->current_tc] = regs->gpr[25][regs->current_tc] = ka->sa._sa_handler; 2256 return; 2257 2258 give_sigsegv: 2259 force_sig(TARGET_SIGSEGV/*, current*/); 2260 return; 2261 } 2262 2263 long do_sigreturn(CPUState *regs) 2264 { 2265 struct sigframe *frame; 2266 sigset_t blocked; 2267 target_sigset_t target_set; 2268 int i; 2269 2270 #if defined(DEBUG_SIGNAL) 2271 fprintf(stderr, "do_sigreturn\n"); 2272 #endif 2273 frame = (struct sigframe *) regs->gpr[29][regs->current_tc]; 2274 if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) 2275 goto badframe; 2276 2277 for(i = 0; i < TARGET_NSIG_WORDS; i++) { 2278 if(__get_user(target_set.sig[i], &frame->sf_mask.sig[i])) 2279 goto badframe; 2280 } 2281 2282 target_to_host_sigset_internal(&blocked, &target_set); 2283 sigprocmask(SIG_SETMASK, &blocked, NULL); 2284 2285 if (restore_sigcontext(regs, &frame->sf_sc)) 2286 goto badframe; 2287 2288 #if 0 2289 /* 2290 * Don't let your children do this ... 2291 */ 2292 __asm__ __volatile__( 2293 "move\t$29, %0\n\t" 2294 "j\tsyscall_exit" 2295 :/* no outputs */ 2296 :"r" (®s)); 2297 /* Unreached */ 2298 #endif 2299 2300 regs->PC[regs->current_tc] = regs->CP0_EPC; 2301 /* I am not sure this is right, but it seems to work 2302 * maybe a problem with nested signals ? */ 2303 regs->CP0_EPC = 0; 2304 return 0; 2305 2306 badframe: 2307 force_sig(TARGET_SIGSEGV/*, current*/); 2308 return 0; 2309 } 2310 2311 static void setup_rt_frame(int sig, struct emulated_sigaction *ka, 2312 target_siginfo_t *info, 2313 target_sigset_t *set, CPUState *env) 2314 { 2315 fprintf(stderr, "setup_rt_frame: not implemented\n"); 2316 } 2317 2318 long do_rt_sigreturn(CPUState *env) 2319 { 2320 fprintf(stderr, "do_rt_sigreturn: not implemented\n"); 2321 return -ENOSYS; 2322 } 2323 2324 #else 2325 2326 static void setup_frame(int sig, struct emulated_sigaction *ka, 2327 target_sigset_t *set, CPUState *env) 2328 { 2329 fprintf(stderr, "setup_frame: not implemented\n"); 2330 } 2331 2332 static void setup_rt_frame(int sig, struct emulated_sigaction *ka, 2333 target_siginfo_t *info, 2334 target_sigset_t *set, CPUState *env) 2335 { 2336 fprintf(stderr, "setup_rt_frame: not implemented\n"); 2337 } 2338 2339 long do_sigreturn(CPUState *env) 2340 { 2341 fprintf(stderr, "do_sigreturn: not implemented\n"); 2342 return -ENOSYS; 2343 } 2344 2345 long do_rt_sigreturn(CPUState *env) 2346 { 2347 fprintf(stderr, "do_rt_sigreturn: not implemented\n"); 2348 return -ENOSYS; 2349 } 2350 2351 #endif 2352 2353 void process_pending_signals(void *cpu_env) 2354 { 2355 int sig; 2356 abi_ulong handler; 2357 sigset_t set, old_set; 2358 target_sigset_t target_old_set; 2359 struct emulated_sigaction *k; 2360 struct sigqueue *q; 2361 2362 if (!signal_pending) 2363 return; 2364 2365 k = sigact_table; 2366 for(sig = 1; sig <= TARGET_NSIG; sig++) { 2367 if (k->pending) 2368 goto handle_signal; 2369 k++; 2370 } 2371 /* if no signal is pending, just return */ 2372 signal_pending = 0; 2373 return; 2374 2375 handle_signal: 2376 #ifdef DEBUG_SIGNAL 2377 fprintf(stderr, "qemu: process signal %d\n", sig); 2378 #endif 2379 /* dequeue signal */ 2380 q = k->first; 2381 k->first = q->next; 2382 if (!k->first) 2383 k->pending = 0; 2384 2385 sig = gdb_handlesig (cpu_env, sig); 2386 if (!sig) { 2387 fprintf (stderr, "Lost signal\n"); 2388 abort(); 2389 } 2390 2391 handler = k->sa._sa_handler; 2392 if (handler == TARGET_SIG_DFL) { 2393 /* default handler : ignore some signal. The other are fatal */ 2394 if (sig != TARGET_SIGCHLD && 2395 sig != TARGET_SIGURG && 2396 sig != TARGET_SIGWINCH) { 2397 force_sig(sig); 2398 } 2399 } else if (handler == TARGET_SIG_IGN) { 2400 /* ignore sig */ 2401 } else if (handler == TARGET_SIG_ERR) { 2402 force_sig(sig); 2403 } else { 2404 /* compute the blocked signals during the handler execution */ 2405 target_to_host_sigset(&set, &k->sa.sa_mask); 2406 /* SA_NODEFER indicates that the current signal should not be 2407 blocked during the handler */ 2408 if (!(k->sa.sa_flags & TARGET_SA_NODEFER)) 2409 sigaddset(&set, target_to_host_signal(sig)); 2410 2411 /* block signals in the handler using Linux */ 2412 sigprocmask(SIG_BLOCK, &set, &old_set); 2413 /* save the previous blocked signal state to restore it at the 2414 end of the signal execution (see do_sigreturn) */ 2415 host_to_target_sigset_internal(&target_old_set, &old_set); 2416 2417 /* if the CPU is in VM86 mode, we restore the 32 bit values */ 2418 #if defined(TARGET_I386) && !defined(TARGET_X86_64) 2419 { 2420 CPUX86State *env = cpu_env; 2421 if (env->eflags & VM_MASK) 2422 save_v86_state(env); 2423 } 2424 #endif 2425 /* prepare the stack frame of the virtual CPU */ 2426 if (k->sa.sa_flags & TARGET_SA_SIGINFO) 2427 setup_rt_frame(sig, k, &q->info, &target_old_set, cpu_env); 2428 else 2429 setup_frame(sig, k, &target_old_set, cpu_env); 2430 if (k->sa.sa_flags & TARGET_SA_RESETHAND) 2431 k->sa._sa_handler = TARGET_SIG_DFL; 2432 } 2433 if (q != &k->info) 2434 free_sigqueue(q); 2435 } 2436