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: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
974508262e
commit
2e82669acf
|
@ -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,
|
||||||
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)
|
||||||
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)
|
||||||
* 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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue