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