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:
parent
3988a6e0e0
commit
a568a3185e
@ -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));
|
||||
|
@ -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 */
|
||||
|
@ -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));
|
||||
|
@ -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 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user