From 9fe69370405f1e345a51003bffcce73e0a66bd28 Mon Sep 17 00:00:00 2001 From: Pavel Emelyanov Date: Fri, 23 Sep 2016 18:19:50 +0300 Subject: [PATCH] abstract save regs to core Signed-off-by: Pavel Emelyanov --- criu/arch/aarch64/crtools.c | 12 +++++------- criu/arch/aarch64/include/asm/dump.h | 4 +++- criu/arch/arm/crtools.c | 13 ++++++------- criu/arch/arm/include/asm/dump.h | 4 +++- criu/arch/ppc64/crtools.c | 13 ++++++------- criu/arch/ppc64/include/asm/dump.h | 4 +++- criu/arch/x86/crtools.c | 12 +++++------- criu/arch/x86/include/asm/dump.h | 4 +++- criu/parasite-syscall.c | 4 ++-- 9 files changed, 36 insertions(+), 34 deletions(-) diff --git a/criu/arch/aarch64/crtools.c b/criu/arch/aarch64/crtools.c index b8c689320d..bd5b1eddc4 100644 --- a/criu/arch/aarch64/crtools.c +++ b/criu/arch/aarch64/crtools.c @@ -8,6 +8,7 @@ #include "compiler.h" #include "ptrace.h" #include "asm/processor-flags.h" +#include "asm/dump.h" #include "protobuf.h" #include "images/core.pb-c.h" #include "images/creds.pb-c.h" @@ -78,12 +79,9 @@ int syscall_seized(struct parasite_ctl *ctl, int nr, unsigned long *ret, return err; } -static int save_task_regs(CoreEntry *core, - user_regs_struct_t *regs, user_fpregs_struct_t *fpsimd) - #define assign_reg(dst, src, e) dst->e = (__typeof__(dst->e))(src)->e -int get_task_regs(pid_t pid, user_regs_struct_t regs, CoreEntry *core) +int get_task_regs(pid_t pid, user_regs_struct_t regs, save_regs_t save, void *arg) { struct iovec iov; user_fpregs_struct_t fpsimd; @@ -105,15 +103,15 @@ int get_task_regs(pid_t pid, user_regs_struct_t regs, CoreEntry *core) goto err; } - ret = save_task_regs(core, ®s, &fpsimd); + ret = save(arg, ®s, &fpsimd); err: return ret; } -static int save_task_regs(CoreEntry *core, - user_regs_struct_t *regs, user_fpregs_struct_t *fpsimd) +int save_task_regs(void *x, user_regs_struct_t *regs, user_fpregs_struct_t *fpsimd) { int i; + CoreEntry *core = x; // Save the Aarch64 CPU state for (i = 0; i < 31; ++i) diff --git a/criu/arch/aarch64/include/asm/dump.h b/criu/arch/aarch64/include/asm/dump.h index 671c424da9..c53f67c3d4 100644 --- a/criu/arch/aarch64/include/asm/dump.h +++ b/criu/arch/aarch64/include/asm/dump.h @@ -1,7 +1,9 @@ #ifndef __CR_ASM_DUMP_H__ #define __CR_ASM_DUMP_H__ -extern int get_task_regs(pid_t pid, user_regs_struct_t regs, CoreEntry *core); +typedef int (*save_regs_t)(void *, user_regs_struct_t *, user_fpregs_struct_t *); +extern int save_task_regs(void *, user_regs_struct_t *, user_fpregs_struct_t *); +extern int get_task_regs(pid_t pid, user_regs_struct_t regs, save_regs_t, void *); extern int arch_alloc_thread_info(CoreEntry *core); extern void arch_free_thread_info(CoreEntry *core); diff --git a/criu/arch/arm/crtools.c b/criu/arch/arm/crtools.c index c3421b9c70..c46cd7afce 100644 --- a/criu/arch/arm/crtools.c +++ b/criu/arch/arm/crtools.c @@ -3,6 +3,7 @@ #include "asm/types.h" #include "asm/restorer.h" +#include "asm/dump.h" #include "compiler.h" #include "ptrace.h" #include "asm/processor-flags.h" @@ -80,13 +81,10 @@ int syscall_seized(struct parasite_ctl *ctl, int nr, unsigned long *ret, return err; } -static int save_task_regs(CoreEntry *core, - user_regs_struct_t *regs, user_fpregs_struct_t *fpregs) - #define assign_reg(dst, src, e) dst->e = (__typeof__(dst->e))((src)->ARM_##e) #define PTRACE_GETVFPREGS 27 -int get_task_regs(pid_t pid, user_regs_struct_t regs, CoreEntry *core) +int get_task_regs(pid_t pid, user_regs_struct_t regs, save_regs_t save, void *arg) { user_fpregs_struct_t vfp; int ret = -1; @@ -115,14 +113,15 @@ int get_task_regs(pid_t pid, user_regs_struct_t regs, CoreEntry *core) } } - ret = save_task_regs(core, ®s, &vfp); + ret = save(arg, ®s, &vfp); err: return ret; } -static int save_task_regs(CoreEntry *core, - user_regs_struct_t *regs, user_fpregs_struct_t *fpregs) +int save_task_regs(void *x, user_regs_struct_t *regs, user_fpregs_struct_t *fpregs) { + CoreEntry *core = x; + // Save the ARM CPU state assign_reg(core->ti_arm->gpregs, regs, r0); diff --git a/criu/arch/arm/include/asm/dump.h b/criu/arch/arm/include/asm/dump.h index ae1588da87..fa83b82677 100644 --- a/criu/arch/arm/include/asm/dump.h +++ b/criu/arch/arm/include/asm/dump.h @@ -1,7 +1,9 @@ #ifndef __CR_ASM_DUMP_H__ #define __CR_ASM_DUMP_H__ -extern int get_task_regs(pid_t pid, user_regs_struct_t regs, CoreEntry *core); +typedef int (*save_regs_t)(void *, user_regs_struct_t *, user_fpregs_struct_t *); +extern int save_task_regs(void *, user_regs_struct_t *, user_fpregs_struct_t *); +extern int get_task_regs(pid_t pid, user_regs_struct_t regs, save_regs_t, void *); extern int arch_alloc_thread_info(CoreEntry *core); extern void arch_free_thread_info(CoreEntry *core); diff --git a/criu/arch/ppc64/crtools.c b/criu/arch/ppc64/crtools.c index 5ae8657c5b..01d6061820 100644 --- a/criu/arch/ppc64/crtools.c +++ b/criu/arch/ppc64/crtools.c @@ -8,6 +8,7 @@ #include "asm/types.h" #include "asm/fpu.h" #include "asm/restorer.h" +#include "asm/dump.h" #include "cr_options.h" #include "compiler.h" @@ -501,11 +502,8 @@ static int put_tm_regs(struct rt_sigframe *f, UserPpc64TmRegsEntry *tme) return 0; } -static int save_task_regs(CoreEntry *core, - user_regs_struct_t *regs, user_fpregs_struct_t *fpregs); - /****************************************************************************/ -int get_task_regs(pid_t pid, user_regs_struct_t regs, CoreEntry *core) +int get_task_regs(pid_t pid, user_regs_struct_t regs, save_regs_t save, void *arg) { user_fpregs_struct_t fpregs; int ret; @@ -588,12 +586,13 @@ int get_task_regs(pid_t pid, user_regs_struct_t regs, CoreEntry *core) } } - return save_task_regs(core, ®s, &fpregs); + return save(arg, ®s, &fpregs); } -static int save_task_regs(CoreEntry *core, - user_regs_struct_t *regs, user_fpregs_struct_t *fpregs) +int save_task_regs(void *x, user_regs_struct_t *regs, user_fpregs_struct_t *fpregs) { + CoreEntry *core = x; + UserPpc64RegsEntry *gpregs; UserPpc64FpstateEntry **fpstate; UserPpc64VrstateEntry **vrstate; diff --git a/criu/arch/ppc64/include/asm/dump.h b/criu/arch/ppc64/include/asm/dump.h index 1505fd2983..0c88b7a562 100644 --- a/criu/arch/ppc64/include/asm/dump.h +++ b/criu/arch/ppc64/include/asm/dump.h @@ -1,7 +1,9 @@ #ifndef __CR_ASM_DUMP_H__ #define __CR_ASM_DUMP_H__ -extern int get_task_regs(pid_t pid, user_regs_struct_t regs, CoreEntry *core); +typedef int (*save_regs_t)(void *, user_regs_struct_t *, user_fpregs_struct_t *); +extern int save_task_regs(void *, user_regs_struct_t *, user_fpregs_struct_t *); +extern int get_task_regs(pid_t pid, user_regs_struct_t regs, save_regs_t, void *); extern int arch_alloc_thread_info(CoreEntry *core); extern void arch_free_thread_info(CoreEntry *core); diff --git a/criu/arch/x86/crtools.c b/criu/arch/x86/crtools.c index 9fee84a886..e54cc5ab65 100644 --- a/criu/arch/x86/crtools.c +++ b/criu/arch/x86/crtools.c @@ -11,6 +11,7 @@ #include "asm/restorer.h" #include "asm/types.h" #include "asm/fpu.h" +#include "asm/dump.h" #include "cr_options.h" #include "compiler.h" @@ -193,10 +194,7 @@ int syscall_seized(struct parasite_ctl *ctl, int nr, unsigned long *ret, ((user_regs_native(pregs)) ? (int64_t)((pregs)->native.name) : \ (int32_t)((pregs)->compat.name)) -static int save_task_regs(CoreEntry *core, - user_regs_struct_t *regs, user_fpregs_struct_t *fpregs); - -int get_task_regs(pid_t pid, user_regs_struct_t regs, CoreEntry *core) +int get_task_regs(pid_t pid, user_regs_struct_t regs, save_regs_t save, void *arg) { user_fpregs_struct_t xsave = { }, *xs = NULL; @@ -254,14 +252,14 @@ int get_task_regs(pid_t pid, user_regs_struct_t regs, CoreEntry *core) xs = &xsave; out: - ret = save_task_regs(core, ®s, xs); + ret = save(arg, ®s, xs); err: return ret; } -static int save_task_regs(CoreEntry *core, - user_regs_struct_t *regs, user_fpregs_struct_t *fpregs) +int save_task_regs(void *x, user_regs_struct_t *regs, user_fpregs_struct_t *fpregs) { + CoreEntry *core = x; UserX86RegsEntry *gpregs = core->thread_info->gpregs; #define assign_reg(dst, src, e) do { dst->e = (__typeof__(dst->e))src.e; } while (0) diff --git a/criu/arch/x86/include/asm/dump.h b/criu/arch/x86/include/asm/dump.h index 9c3555236c..4b928a8de6 100644 --- a/criu/arch/x86/include/asm/dump.h +++ b/criu/arch/x86/include/asm/dump.h @@ -1,7 +1,9 @@ #ifndef __CR_ASM_DUMP_H__ #define __CR_ASM_DUMP_H__ -extern int get_task_regs(pid_t pid, user_regs_struct_t regs, CoreEntry *core); +typedef int (*save_regs_t)(void *, user_regs_struct_t *, user_fpregs_struct_t *); +extern int save_task_regs(void *, user_regs_struct_t *, user_fpregs_struct_t *); +extern int get_task_regs(pid_t pid, user_regs_struct_t regs, save_regs_t, void *); extern int arch_alloc_thread_info(CoreEntry *core); extern void arch_free_thread_info(CoreEntry *core); diff --git a/criu/parasite-syscall.c b/criu/parasite-syscall.c index ad33098567..46b70d8562 100644 --- a/criu/parasite-syscall.c +++ b/criu/parasite-syscall.c @@ -675,7 +675,7 @@ int parasite_dump_thread_seized(struct parasite_ctl *ctl, int id, return -1; } - ret = get_task_regs(pid, octx.regs, core); + ret = get_task_regs(pid, octx.regs, save_task_regs, core); if (ret) { pr_err("Can't obtain regs for thread %d\n", pid); return -1; @@ -1450,7 +1450,7 @@ static int parasite_start_daemon(struct parasite_ctl *ctl, struct pstree_item *i * while in daemon it is not such. */ - if (get_task_regs(pid, ctl->orig.regs, item->core[0])) { + if (get_task_regs(pid, ctl->orig.regs, save_task_regs, item->core[0])) { pr_err("Can't obtain regs for thread %d\n", pid); return -1; }