[CRIU] [PATCH 5/7] arm: don't copy the FPU frame to/from CoreEntry with a single memcpy()

Alexander Kartashov alekskartashov at parallels.com
Wed Oct 9 10:23:03 PDT 2013


Signed-off-by: Alexander Kartashov <alekskartashov at parallels.com>
---
 arch/arm/crtools.c |   13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/arch/arm/crtools.c b/arch/arm/crtools.c
index db02fce..cf9b016 100644
--- a/arch/arm/crtools.c
+++ b/arch/arm/crtools.c
@@ -86,6 +86,7 @@ int get_task_regs(pid_t pid, user_regs_struct_t regs, CoreEntry *core)
 {
 	struct user_vfp vfp;
 	int ret = -1;
+	int i;
 
 	pr_info("Dumping GP/FPU registers for %d\n", pid);
 
@@ -136,7 +137,8 @@ int get_task_regs(pid_t pid, user_regs_struct_t regs, CoreEntry *core)
 
 	// Save the VFP state
 
-	memcpy(CORE_THREAD_ARCH_INFO(core)->fpstate->vfp_regs, &vfp.fpregs, sizeof(vfp.fpregs));
+	for (i = 0; i < ARRAY_SIZE(vfp.fpregs); ++i)
+		CORE_THREAD_ARCH_INFO(core)->fpstate->vfp_regs[i] = vfp.fpregs[i];
 	CORE_THREAD_ARCH_INFO(core)->fpstate->fpscr = vfp.fpscr;
 
 	ret = 0;
@@ -192,11 +194,12 @@ void arch_free_thread_info(CoreEntry *core)
 int restore_fpu(struct rt_sigframe *sigframe, CoreEntry *core)
 {
 	struct aux_sigframe *aux = (struct aux_sigframe *)&sigframe->sig.uc.uc_regspace;
-	fpu_state_t *fpu_state = &sigframe->fpu_state;
-
-	memcpy(&aux->vfp.ufp, CORE_THREAD_ARCH_INFO(core)->fpstate->vfp_regs, sizeof(aux->vfp.ufp));
-	fpu_state->ufp.fpscr = CORE_THREAD_ARCH_INFO(core)->fpstate->fpscr;
+	struct vfp_sigframe *vfp = &aux->vfp;
+	int i;
 
+	for (i = 0; i < ARRAY_SIZE(vfp->ufp.fpregs); ++i)
+		vfp->ufp.fpregs[i] = CORE_THREAD_ARCH_INFO(core)->fpstate->vfp_regs[i];
+	vfp->ufp.fpscr = CORE_THREAD_ARCH_INFO(core)->fpstate->fpscr;
 	return 0;
 }
 
-- 
1.7.9.5



More information about the CRIU mailing list