Segment registers are stored in the uc_mcontext member of the struct

l_ucontext. To restore the registers content, trampoline needs to
dereference uc_mcontext instead of taking some undefined values from
l_ucontext.

Submitted by:	Dmitry Chagin <dchagin@>
MFC after:	1 week
This commit is contained in:
kib 2008-09-07 16:39:21 +00:00
parent 3988a6e0e0
commit a568a3185e
4 changed files with 7 additions and 5 deletions

View File

@ -9,9 +9,8 @@ __FBSDID("$FreeBSD$");
ASSYM(LINUX_SIGF_HANDLER, offsetof(struct l_sigframe, sf_handler));
ASSYM(LINUX_SIGF_SC, offsetof(struct l_sigframe, sf_sc));
ASSYM(LINUX_SC_GS, offsetof(struct l_sigcontext, sc_gs));
ASSYM(LINUX_SC_FS, offsetof(struct l_sigcontext, sc_fs));
ASSYM(LINUX_SC_ES, offsetof(struct l_sigcontext, sc_es));
ASSYM(LINUX_SC_DS, offsetof(struct l_sigcontext, sc_ds));
ASSYM(LINUX_RT_SIGF_HANDLER, offsetof(struct l_rt_sigframe, sf_handler));
ASSYM(LINUX_RT_SIGF_UC, offsetof(struct l_rt_sigframe, sf_sc));
ASSYM(LINUX_RT_SIGF_SC, offsetof(struct l_ucontext, uc_mcontext));

View File

@ -23,8 +23,9 @@ NON_GPROF_ENTRY(linux_sigcode)
linux_rt_sigcode:
call *LINUX_RT_SIGF_HANDLER(%esp)
leal LINUX_RT_SIGF_UC(%esp),%ebx /* linux ucp */
movl LINUX_SC_ES(%ebx),%es
movl LINUX_SC_DS(%ebx),%ds
leal LINUX_RT_SIGF_SC(%ebx),%ecx /* linux sigcontext */
movl LINUX_SC_ES(%ecx),%es
movl LINUX_SC_DS(%ecx),%ds
push %eax /* fake ret addr */
movl $LINUX_SYS_linux_rt_sigreturn,%eax /* linux_rt_sigreturn() */
int $0x80 /* enter kernel with args */

View File

@ -13,3 +13,4 @@ ASSYM(LINUX_SC_GS, offsetof(struct l_sigcontext, sc_gs));
ASSYM(LINUX_SC_EFLAGS, offsetof(struct l_sigcontext, sc_eflags));
ASSYM(LINUX_RT_SIGF_HANDLER, offsetof(struct l_rt_sigframe, sf_handler));
ASSYM(LINUX_RT_SIGF_UC, offsetof(struct l_rt_sigframe, sf_sc));
ASSYM(LINUX_RT_SIGF_SC, offsetof(struct l_ucontext, uc_mcontext));

View File

@ -19,7 +19,8 @@ NON_GPROF_ENTRY(linux_sigcode)
linux_rt_sigcode:
call *LINUX_RT_SIGF_HANDLER(%esp)
leal LINUX_RT_SIGF_UC(%esp),%ebx /* linux ucp */
movl LINUX_SC_GS(%ebx),%gs
leal LINUX_RT_SIGF_SC(%ebx),%ecx /* linux sigcontext */
movl LINUX_SC_GS(%ecx),%gs
push %eax /* fake ret addr */
movl $LINUX_SYS_linux_rt_sigreturn,%eax /* linux_rt_sigreturn() */
int $0x80 /* enter kernel with args */