ARM: 6868/1: Preserve the VFP state during fork
authorCatalin Marinas <catalin.marinas@arm.com>
Wed, 6 Apr 2011 15:17:17 +0000 (16:17 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Sun, 10 Apr 2011 20:13:37 +0000 (21:13 +0100)
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>
arch/arm/vfp/vfpmodule.c

index 1c88bbdfd34d05e026b2a0e64cee7decb852920a..f74695075e641ec72562e1c8194a8220327e8bc8 100644 (file)
@@ -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;