Commit ed2dcdf68e73348764850251443fd0c32dd33e81

Authored by bellard
1 parent 4304763b

save FPU state in signal handler


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@201 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 11 additions and 32 deletions
linux-user/signal.c
... ... @@ -536,15 +536,12 @@ setup_sigcontext(struct target_sigcontext *sc, struct target_fpstate *fpstate,
536 536 err |= __put_user(env->eflags, &sc->eflags);
537 537 err |= __put_user(env->regs[R_ESP], &sc->esp_at_signal);
538 538 err |= __put_user(env->segs[R_SS], (unsigned int *)&sc->ss);
539   -#if 0
540   - tmp = save_i387(fpstate);
541   - if (tmp < 0)
542   - err = 1;
543   - else
544   - err |= __put_user(tmp ? fpstate : NULL, &sc->fpstate);
545   -#else
546   - err |= __put_user(0, &sc->fpstate);
547   -#endif
  539 +
  540 + cpu_x86_fsave(env, (void *)fpstate, 1);
  541 + fpstate->status = fpstate->sw;
  542 + err |= __put_user(0xffff, &fpstate->magic);
  543 + err |= __put_user(fpstate, &sc->fpstate);
  544 +
548 545 /* non-iBCS2 extensions.. */
549 546 err |= __put_user(mask, &sc->oldmask);
550 547 err |= __put_user(env->cr2, &sc->cr2);
... ... @@ -721,25 +718,6 @@ restore_sigcontext(CPUX86State *env, struct target_sigcontext *sc, int *peax)
721 718 {
722 719 unsigned int err = 0;
723 720  
724   -
725   -
726   -#define COPY(x) err |= __get_user(regs->x, &sc->x)
727   -
728   -#define COPY_SEG(seg) \
729   - { unsigned short tmp; \
730   - err |= __get_user(tmp, &sc->seg); \
731   - regs->x##seg = tmp; }
732   -
733   -#define COPY_SEG_STRICT(seg) \
734   - { unsigned short tmp; \
735   - err |= __get_user(tmp, &sc->seg); \
736   - regs->x##seg = tmp|3; }
737   -
738   -#define GET_SEG(seg) \
739   - { unsigned short tmp; \
740   - err |= __get_user(tmp, &sc->seg); \
741   - loadsegment(seg,tmp); }
742   -
743 721 cpu_x86_load_seg(env, R_GS, lduw(&sc->gs));
744 722 cpu_x86_load_seg(env, R_FS, lduw(&sc->fs));
745 723 cpu_x86_load_seg(env, R_ES, lduw(&sc->es));
... ... @@ -764,17 +742,18 @@ restore_sigcontext(CPUX86State *env, struct target_sigcontext *sc, int *peax)
764 742 // regs->orig_eax = -1; /* disable syscall checks */
765 743 }
766 744  
767   -#if 0
768 745 {
769 746 struct _fpstate * buf;
770   - err |= __get_user(buf, &sc->fpstate);
  747 + buf = (void *)ldl(&sc->fpstate);
771 748 if (buf) {
  749 +#if 0
772 750 if (verify_area(VERIFY_READ, buf, sizeof(*buf)))
773 751 goto badframe;
774   - err |= restore_i387(buf);
  752 +#endif
  753 + cpu_x86_frstor(env, (void *)buf, 1);
775 754 }
776 755 }
777   -#endif
  756 +
778 757 *peax = ldl(&sc->eax);
779 758 return err;
780 759 #if 0
... ...