Revision d8714436

b/linux-user/signal.c
2812 2812
			    CPUState *regs, unsigned long mask)
2813 2813
{
2814 2814
    int err = 0;
2815
    int i;
2815 2816

  
2816 2817
#define COPY(x)         err |= __put_user(regs->x, &sc->sc_##x)
2817 2818
    COPY(gregs[0]); COPY(gregs[1]);
......
2827 2828
    COPY(sr); COPY(pc);
2828 2829
#undef COPY
2829 2830

  
2830
    /* todo: save FPU registers here */
2831
    for (i=0; i<16; i++) {
2832
        err |= __put_user(regs->fregs[i], &sc->sc_fpregs[i]);
2833
    }
2834
    err |= __put_user(regs->fpscr, &sc->sc_fpscr);
2835
    err |= __put_user(regs->fpul, &sc->sc_fpul);
2831 2836

  
2832 2837
    /* non-iBCS2 extensions.. */
2833 2838
    err |= __put_user(mask, &sc->oldmask);
......
2835 2840
    return err;
2836 2841
}
2837 2842

  
2838
static int restore_sigcontext(CPUState *regs,
2839
			      struct target_sigcontext *sc)
2843
static int restore_sigcontext(CPUState *regs, struct target_sigcontext *sc,
2844
                              target_ulong *r0_p)
2840 2845
{
2841 2846
    unsigned int err = 0;
2847
    int i;
2842 2848

  
2843 2849
#define COPY(x)         err |= __get_user(regs->x, &sc->sc_##x)
2844 2850
    COPY(gregs[1]);
......
2854 2860
    COPY(sr); COPY(pc);
2855 2861
#undef COPY
2856 2862

  
2857
    /* todo: restore FPU registers here */
2863
    for (i=0; i<16; i++) {
2864
        err |= __get_user(regs->fregs[i], &sc->sc_fpregs[i]);
2865
    }
2866
    err |= __get_user(regs->fpscr, &sc->sc_fpscr);
2867
    err |= __get_user(regs->fpul, &sc->sc_fpul);
2858 2868

  
2859 2869
    regs->tra = -1;         /* disable syscall checks */
2870
    err |= __get_user(*r0_p, &sc->sc_gregs[0]);
2860 2871
    return err;
2861 2872
}
2862 2873

  
......
2980 2991
    abi_ulong frame_addr;
2981 2992
    sigset_t blocked;
2982 2993
    target_sigset_t target_set;
2994
    target_ulong r0;
2983 2995
    int i;
2984 2996
    int err = 0;
2985 2997

  
......
3001 3013
    target_to_host_sigset_internal(&blocked, &target_set);
3002 3014
    sigprocmask(SIG_SETMASK, &blocked, NULL);
3003 3015

  
3004
    if (restore_sigcontext(regs, &frame->sc))
3016
    if (restore_sigcontext(regs, &frame->sc, &r0))
3005 3017
        goto badframe;
3006 3018

  
3007 3019
    unlock_user_struct(frame, frame_addr, 0);
3008
    return regs->gregs[0];
3020
    return r0;
3009 3021

  
3010 3022
badframe:
3011 3023
    unlock_user_struct(frame, frame_addr, 0);
......
3018 3030
    struct target_rt_sigframe *frame;
3019 3031
    abi_ulong frame_addr;
3020 3032
    sigset_t blocked;
3033
    target_ulong r0;
3021 3034

  
3022 3035
#if defined(DEBUG_SIGNAL)
3023 3036
    fprintf(stderr, "do_rt_sigreturn\n");
......
3029 3042
    target_to_host_sigset(&blocked, &frame->uc.uc_sigmask);
3030 3043
    sigprocmask(SIG_SETMASK, &blocked, NULL);
3031 3044

  
3032
    if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
3045
    if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &r0))
3033 3046
        goto badframe;
3034 3047

  
3035 3048
    if (do_sigaltstack(frame_addr +
......
3038 3051
        goto badframe;
3039 3052

  
3040 3053
    unlock_user_struct(frame, frame_addr, 0);
3041
    return regs->gregs[0];
3054
    return r0;
3042 3055

  
3043 3056
badframe:
3044 3057
    unlock_user_struct(frame, frame_addr, 0);

Also available in: Unified diff