1 /* The kernel call that is implemented in this file:
2 * m_type: SYS_SIGRETURN
4 * The parameters for this kernel call are:
5 * m2_i1: SIG_ENDPT # process returning from handler
6 * m2_p1: SIG_CTXT_PTR # pointer to sigcontext structure
10 #include "kernel/system.h"
12 #include <machine/cpu.h>
16 /*===========================================================================*
18 *===========================================================================*/
19 int do_sigreturn(struct proc
* caller
, message
* m_ptr
)
21 /* POSIX style signals require sys_sigreturn to put things in order before
22 * the signalled process can resume execution
25 register struct proc
*rp
;
28 if (! isokendpt(m_ptr
->SIG_ENDPT
, &proc_nr
)) return(EINVAL
);
29 if (iskerneln(proc_nr
)) return(EPERM
);
30 rp
= proc_addr(proc_nr
);
32 /* Copy in the sigcontext structure. */
33 if((r
=data_copy(m_ptr
->SIG_ENDPT
, (vir_bytes
) m_ptr
->SIG_CTXT_PTR
,
34 KERNEL
, (vir_bytes
) &sc
, sizeof(struct sigcontext
))) != OK
)
37 /* Restore user bits of psw from sc, maintain system bits from proc. */
38 sc
.sc_psw
= (sc
.sc_psw
& X86_FLAGS_USER
) |
39 (rp
->p_reg
.psw
& ~X86_FLAGS_USER
);
42 /* Don't panic kernel if user gave bad selectors. */
43 sc
.sc_cs
= rp
->p_reg
.cs
;
44 sc
.sc_ds
= rp
->p_reg
.ds
;
45 sc
.sc_es
= rp
->p_reg
.es
;
46 sc
.sc_ss
= rp
->p_reg
.ss
;
47 sc
.sc_fs
= rp
->p_reg
.fs
;
48 sc
.sc_gs
= rp
->p_reg
.gs
;
51 /* Restore the registers. */
52 memcpy(&rp
->p_reg
, &sc
.sc_regs
, sizeof(sigregs
));
54 if(sc
.sc_flags
& MF_FPU_INITIALIZED
)
56 memcpy(rp
->p_seg
.fpu_state
, &sc
.sc_fpu_state
, FPU_XFP_SIZE
);
57 rp
->p_misc_flags
|= MF_FPU_INITIALIZED
; /* Restore math usage flag. */
58 /* force reloading FPU */
63 rp
->p_misc_flags
|= MF_CONTEXT_SET
;
67 #endif /* USE_SIGRETURN */