Commit 2e82669a authored by Catalin Marinas's avatar Catalin Marinas Committed by Russell King

ARM: 6867/1: Introduce THREAD_NOTIFY_COPY for copy_thread() hooks

This patch adds THREAD_NOTIFY_COPY for calling registered handlers
during the copy_thread() function call. It also changes the VFP handler
to use a switch statement rather than if..else and ignore this event.
Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 97450826
...@@ -43,6 +43,7 @@ static inline void thread_notify(unsigned long rc, struct thread_info *thread) ...@@ -43,6 +43,7 @@ static inline void thread_notify(unsigned long rc, struct thread_info *thread)
#define THREAD_NOTIFY_FLUSH 0 #define THREAD_NOTIFY_FLUSH 0
#define THREAD_NOTIFY_EXIT 1 #define THREAD_NOTIFY_EXIT 1
#define THREAD_NOTIFY_SWITCH 2 #define THREAD_NOTIFY_SWITCH 2
#define THREAD_NOTIFY_COPY 3
#endif #endif
#endif #endif
...@@ -372,6 +372,8 @@ copy_thread(unsigned long clone_flags, unsigned long stack_start, ...@@ -372,6 +372,8 @@ copy_thread(unsigned long clone_flags, unsigned long stack_start,
if (clone_flags & CLONE_SETTLS) if (clone_flags & CLONE_SETTLS)
thread->tp_value = regs->ARM_r3; thread->tp_value = regs->ARM_r3;
thread_notify(THREAD_NOTIFY_COPY, thread);
return 0; return 0;
} }
......
...@@ -104,12 +104,17 @@ static void vfp_thread_exit(struct thread_info *thread) ...@@ -104,12 +104,17 @@ static void vfp_thread_exit(struct thread_info *thread)
static int vfp_notifier(struct notifier_block *self, unsigned long cmd, void *v) static int vfp_notifier(struct notifier_block *self, unsigned long cmd, void *v)
{ {
struct thread_info *thread = v; struct thread_info *thread = v;
u32 fpexc;
#ifdef CONFIG_SMP
unsigned int cpu;
#endif
if (likely(cmd == THREAD_NOTIFY_SWITCH)) { switch (cmd) {
u32 fpexc = fmrx(FPEXC); case THREAD_NOTIFY_SWITCH:
fpexc = fmrx(FPEXC);
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
unsigned int cpu = thread->cpu; cpu = thread->cpu;
/* /*
* On SMP, if VFP is enabled, save the old state in * On SMP, if VFP is enabled, save the old state in
...@@ -134,13 +139,16 @@ static int vfp_notifier(struct notifier_block *self, unsigned long cmd, void *v) ...@@ -134,13 +139,16 @@ static int vfp_notifier(struct notifier_block *self, unsigned long cmd, void *v)
* old state. * old state.
*/ */
fmxr(FPEXC, fpexc & ~FPEXC_EN); fmxr(FPEXC, fpexc & ~FPEXC_EN);
return NOTIFY_DONE; break;
}
if (cmd == THREAD_NOTIFY_FLUSH) case THREAD_NOTIFY_FLUSH:
vfp_thread_flush(thread); vfp_thread_flush(thread);
else break;
case THREAD_NOTIFY_EXIT:
vfp_thread_exit(thread); vfp_thread_exit(thread);
break;
}
return NOTIFY_DONE; return NOTIFY_DONE;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment