Commit 478bd99b authored by Andrey Vagin's avatar Andrey Vagin Committed by Pavel Emelyanov

restore: split restore_gpregs on two parts

The first one fills sigframe and the second one restores another
registers.
Signed-off-by: 's avatarAndrey Vagin <avagin@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 5978380b
...@@ -129,6 +129,7 @@ struct rt_sigframe { ...@@ -129,6 +129,7 @@ struct rt_sigframe {
int restore_gpregs(struct rt_sigframe *f, UserArmRegsEntry *r); int restore_gpregs(struct rt_sigframe *f, UserArmRegsEntry *r);
int restore_nonsigframe_gpregs(UserArmRegsEntry *r);
int restore_fpu(struct rt_sigframe *sigframe, fpu_state_t *fpu_state); int restore_fpu(struct rt_sigframe *sigframe, fpu_state_t *fpu_state);
......
...@@ -38,6 +38,11 @@ int restore_gpregs(struct rt_sigframe *f, UserArmRegsEntry *r) ...@@ -38,6 +38,11 @@ int restore_gpregs(struct rt_sigframe *f, UserArmRegsEntry *r)
return 0; return 0;
} }
int restore_nonsigframe_gpregs(UserArmRegsEntry *r)
{
return 0;
}
int restore_fpu(struct rt_sigframe *sigframe, fpu_state_t *fpu_state) int restore_fpu(struct rt_sigframe *sigframe, fpu_state_t *fpu_state)
{ {
struct aux_sigframe *aux = (struct aux_sigframe *)&sigframe->sig.uc.uc_regspace; struct aux_sigframe *aux = (struct aux_sigframe *)&sigframe->sig.uc.uc_regspace;
......
...@@ -135,6 +135,7 @@ struct rt_sigframe { ...@@ -135,6 +135,7 @@ struct rt_sigframe {
int restore_gpregs(struct rt_sigframe *f, UserX86RegsEntry *r); int restore_gpregs(struct rt_sigframe *f, UserX86RegsEntry *r);
int restore_nonsigframe_gpregs(UserX86RegsEntry *r);
int restore_fpu(struct rt_sigframe *sigframe, fpu_state_t *fpu_state); int restore_fpu(struct rt_sigframe *sigframe, fpu_state_t *fpu_state);
......
...@@ -10,9 +10,6 @@ ...@@ -10,9 +10,6 @@
int restore_gpregs(struct rt_sigframe *f, UserX86RegsEntry *r) int restore_gpregs(struct rt_sigframe *f, UserX86RegsEntry *r)
{ {
long ret;
unsigned long fsgs_base;
#define CPREG1(d) f->uc.uc_mcontext.d = r->d #define CPREG1(d) f->uc.uc_mcontext.d = r->d
#define CPREG2(d, s) f->uc.uc_mcontext.d = r->s #define CPREG2(d, s) f->uc.uc_mcontext.d = r->s
...@@ -38,6 +35,14 @@ int restore_gpregs(struct rt_sigframe *f, UserX86RegsEntry *r) ...@@ -38,6 +35,14 @@ int restore_gpregs(struct rt_sigframe *f, UserX86RegsEntry *r)
CPREG1(gs); CPREG1(gs);
CPREG1(fs); CPREG1(fs);
return 0;
}
int restore_nonsigframe_gpregs(UserX86RegsEntry *r)
{
long ret;
unsigned long fsgs_base;
fsgs_base = r->fs_base; fsgs_base = r->fs_base;
ret = sys_arch_prctl(ARCH_SET_FS, fsgs_base); ret = sys_arch_prctl(ARCH_SET_FS, fsgs_base);
if (ret) { if (ret) {
......
...@@ -269,6 +269,9 @@ static int restore_thread_common(struct rt_sigframe *sigframe, ...@@ -269,6 +269,9 @@ static int restore_thread_common(struct rt_sigframe *sigframe,
if (restore_gpregs(sigframe, &args->gpregs)) if (restore_gpregs(sigframe, &args->gpregs))
return -1; return -1;
if (restore_nonsigframe_gpregs(&args->gpregs))
return -1;
restore_tls(args->tls); restore_tls(args->tls);
return 0; return 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment