Commit ea6ab14d authored by Alexander Kartashov's avatar Alexander Kartashov Committed by Pavel Emelyanov

restorer: moved the routine restore_gpregs() to the file arch/x86/restorer.c.

Signed-off-by: 's avatarAlexander Kartashov <alekskartashov@parallels.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent c074dc58
...@@ -71,4 +71,6 @@ struct rt_sigframe { ...@@ -71,4 +71,6 @@ struct rt_sigframe {
/* fp state follows here */ /* fp state follows here */
}; };
int restore_gpregs(struct rt_sigframe *f, UserX86RegsEntry *r);
#endif #endif
#include <unistd.h>
#include "restorer.h"
#include "asm/restorer.h"
#include "syscall.h"
#include "log.h"
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 CPREG2(d, s) f->uc.uc_mcontext.d = r->s
CPREG1(r8);
CPREG1(r9);
CPREG1(r10);
CPREG1(r11);
CPREG1(r12);
CPREG1(r13);
CPREG1(r14);
CPREG1(r15);
CPREG2(rdi, di);
CPREG2(rsi, si);
CPREG2(rbp, bp);
CPREG2(rbx, bx);
CPREG2(rdx, dx);
CPREG2(rax, ax);
CPREG2(rcx, cx);
CPREG2(rsp, sp);
CPREG2(rip, ip);
CPREG2(eflags, flags);
CPREG1(cs);
CPREG1(gs);
CPREG1(fs);
fsgs_base = r->fs_base;
ret = sys_arch_prctl(ARCH_SET_FS, fsgs_base);
if (ret) {
pr_info("SET_FS fail %ld\n", ret);
return -1;
}
fsgs_base = r->gs_base;
ret = sys_arch_prctl(ARCH_SET_GS, fsgs_base);
if (ret) {
pr_info("SET_GS fail %ld\n", ret);
return -1;
}
return 0;
}
...@@ -4,6 +4,7 @@ CFLAGS += -fpie -Wa,--noexecstack -fno-strict-aliasing ...@@ -4,6 +4,7 @@ CFLAGS += -fpie -Wa,--noexecstack -fno-strict-aliasing
GEN-OFFSETS := gen-offsets.sh GEN-OFFSETS := gen-offsets.sh
PASM-OBJS += $(ARCH_DIR)/parasite-head.o PASM-OBJS += $(ARCH_DIR)/parasite-head.o
RESTORER-ARCH-OBJS := $(ARCH_DIR)/restorer.o
PARASITE += parasite.bin.o parasite.bin PARASITE += parasite.bin.o parasite.bin
RESTORER := restorer.bin.o restorer.bin RESTORER := restorer.bin.o restorer.bin
...@@ -16,7 +17,7 @@ ASMFLAGS := -D__ASSEMBLY__ ...@@ -16,7 +17,7 @@ ASMFLAGS := -D__ASSEMBLY__
LIB-OBJS = log-simple.o blob-util-net.o $(SYSCALL-LIB) LIB-OBJS = log-simple.o blob-util-net.o $(SYSCALL-LIB)
$(PARASITE): $(LIB-OBJS) $(PASM-OBJS) $(PIELDS) $(PARASITE): $(LIB-OBJS) $(PASM-OBJS) $(PIELDS)
$(RESTORER): $(LIB-OBJS) $(PIELDS) $(RESTORER): $(LIB-OBJS) $(RESTORER-ARCH-OBJS) $(PIELDS)
$(PIELDS): $(PIELDS).in $(PIELDS): $(PIELDS).in
$(E) " GEN " $@ $(E) " GEN " $@
......
...@@ -159,53 +159,6 @@ static int restore_fpu(struct rt_sigframe *sigframe, struct thread_restore_args ...@@ -159,53 +159,6 @@ static int restore_fpu(struct rt_sigframe *sigframe, struct thread_restore_args
return 0; return 0;
} }
static 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 CPREG2(d, s) f->uc.uc_mcontext.d = r->s
CPREG1(r8);
CPREG1(r9);
CPREG1(r10);
CPREG1(r11);
CPREG1(r12);
CPREG1(r13);
CPREG1(r14);
CPREG1(r15);
CPREG2(rdi, di);
CPREG2(rsi, si);
CPREG2(rbp, bp);
CPREG2(rbx, bx);
CPREG2(rdx, dx);
CPREG2(rax, ax);
CPREG2(rcx, cx);
CPREG2(rsp, sp);
CPREG2(rip, ip);
CPREG2(eflags, flags);
CPREG1(cs);
CPREG1(gs);
CPREG1(fs);
fsgs_base = r->fs_base;
ret = sys_arch_prctl(ARCH_SET_FS, fsgs_base);
if (ret) {
pr_info("SET_FS fail %ld\n", ret);
return -1;
}
fsgs_base = r->gs_base;
ret = sys_arch_prctl(ARCH_SET_GS, fsgs_base);
if (ret) {
pr_info("SET_GS fail %ld\n", ret);
return -1;
}
return 0;
}
static int restore_thread_common(struct rt_sigframe *sigframe, static int restore_thread_common(struct rt_sigframe *sigframe,
struct thread_restore_args *args) struct thread_restore_args *args)
{ {
......
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