Skip to content

Commit

Permalink
abstract save regs to core
Browse files Browse the repository at this point in the history
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
  • Loading branch information
xemul committed Sep 23, 2016
1 parent 8ea3280 commit 9fe6937
Show file tree
Hide file tree
Showing 9 changed files with 36 additions and 34 deletions.
12 changes: 5 additions & 7 deletions criu/arch/aarch64/crtools.c
Expand Up @@ -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"
Expand Down Expand Up @@ -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;
Expand All @@ -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, &regs, &fpsimd);
ret = save(arg, &regs, &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)
Expand Down
4 changes: 3 additions & 1 deletion 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);

Expand Down
13 changes: 6 additions & 7 deletions criu/arch/arm/crtools.c
Expand Up @@ -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"
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -115,14 +113,15 @@ int get_task_regs(pid_t pid, user_regs_struct_t regs, CoreEntry *core)
}
}

ret = save_task_regs(core, &regs, &vfp);
ret = save(arg, &regs, &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);
Expand Down
4 changes: 3 additions & 1 deletion 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);

Expand Down
13 changes: 6 additions & 7 deletions criu/arch/ppc64/crtools.c
Expand Up @@ -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"
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -588,12 +586,13 @@ int get_task_regs(pid_t pid, user_regs_struct_t regs, CoreEntry *core)
}
}

return save_task_regs(core, &regs, &fpregs);
return save(arg, &regs, &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;
Expand Down
4 changes: 3 additions & 1 deletion 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);

Expand Down
12 changes: 5 additions & 7 deletions criu/arch/x86/crtools.c
Expand Up @@ -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"
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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, &regs, xs);
ret = save(arg, &regs, 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)
Expand Down
4 changes: 3 additions & 1 deletion 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);

Expand Down
4 changes: 2 additions & 2 deletions criu/parasite-syscall.c
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down

0 comments on commit 9fe6937

Please sign in to comment.