summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCatalin Marinas <catalin.marinas@arm.com>2011-04-06 16:17:17 +0100
committerNicolas Pitre <nicolas.pitre@linaro.org>2011-04-12 14:31:12 -0400
commit7b4af25469a8a4b19feb2549777fed3120a4978f (patch)
tree05235cd21ab52baeb213470ce33d0b3ec1e282f5
parent5038273786d348f0c89998cd03f9707341ae2dc1 (diff)
ARM: 6868/1: Preserve the VFP state during fork
VFP registers d16-d31 are callee saved registers and must be preserved during function calls, including fork(). The VFP configuration should also be preserved. The patch copies the full VFP state to the child process. Reported-by: Paul Wright <paul.wright@arm.com> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> (cherry picked from commit c98c09773d80db93cae349f0496fef109feab54d)
-rw-r--r--arch/arm/vfp/vfpmodule.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c
index 1c88bbdfd34..f74695075e6 100644
--- a/arch/arm/vfp/vfpmodule.c
+++ b/arch/arm/vfp/vfpmodule.c
@@ -78,6 +78,14 @@ static void vfp_thread_exit(struct thread_info *thread)
put_cpu();
}
+static void vfp_thread_copy(struct thread_info *thread)
+{
+ struct thread_info *parent = current_thread_info();
+
+ vfp_sync_hwstate(parent);
+ thread->vfpstate = parent->vfpstate;
+}
+
/*
* When this function is called with the following 'cmd's, the following
* is true while this function is being run:
@@ -148,6 +156,10 @@ static int vfp_notifier(struct notifier_block *self, unsigned long cmd, void *v)
case THREAD_NOTIFY_EXIT:
vfp_thread_exit(thread);
break;
+
+ case THREAD_NOTIFY_COPY:
+ vfp_thread_copy(thread);
+ break;
}
return NOTIFY_DONE;