Skip to content

Commit

Permalink
ARM: 6867/1: Introduce THREAD_NOTIFY_COPY for copy_thread() hooks
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Catalin Marinas authored and Russell King committed Apr 10, 2011
1 parent 9745082 commit 2e82669
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 7 deletions.
1 change: 1 addition & 0 deletions arch/arm/include/asm/thread_notify.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ static inline void thread_notify(unsigned long rc, struct thread_info *thread)
#define THREAD_NOTIFY_FLUSH 0
#define THREAD_NOTIFY_EXIT 1
#define THREAD_NOTIFY_SWITCH 2
#define THREAD_NOTIFY_COPY 3

#endif
#endif
2 changes: 2 additions & 0 deletions arch/arm/kernel/process.c
Original file line number Diff line number Diff line change
Expand Up @@ -372,6 +372,8 @@ copy_thread(unsigned long clone_flags, unsigned long stack_start,
if (clone_flags & CLONE_SETTLS)
thread->tp_value = regs->ARM_r3;

thread_notify(THREAD_NOTIFY_COPY, thread);

return 0;
}

Expand Down
22 changes: 15 additions & 7 deletions arch/arm/vfp/vfpmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
struct thread_info *thread = v;
u32 fpexc;
#ifdef CONFIG_SMP
unsigned int cpu;
#endif

if (likely(cmd == THREAD_NOTIFY_SWITCH)) {
u32 fpexc = fmrx(FPEXC);
switch (cmd) {
case THREAD_NOTIFY_SWITCH:
fpexc = fmrx(FPEXC);

#ifdef CONFIG_SMP
unsigned int cpu = thread->cpu;
cpu = thread->cpu;

/*
* On SMP, if VFP is enabled, save the old state in
Expand All @@ -134,13 +139,16 @@ static int vfp_notifier(struct notifier_block *self, unsigned long cmd, void *v)
* old state.
*/
fmxr(FPEXC, fpexc & ~FPEXC_EN);
return NOTIFY_DONE;
}
break;

if (cmd == THREAD_NOTIFY_FLUSH)
case THREAD_NOTIFY_FLUSH:
vfp_thread_flush(thread);
else
break;

case THREAD_NOTIFY_EXIT:
vfp_thread_exit(thread);
break;
}

return NOTIFY_DONE;
}
Expand Down

0 comments on commit 2e82669

Please sign in to comment.