perfmon: X86 32-bit hooks (x86)
PATCH 9/24 perfmon: X86 32-bit hooks (x86)
This patch adds the necessary hooks to the X86 32-bit code to support initialization, interrupts, context switching, and termination of a perfmon session.
Signed-off-by Stephane Eranian <[email protected]>
--
arch/x86/kernel/entry_32.S +1 -1
@@ -513,7 +513,7 @@ ALIGN RING0_PTREGS_FRAME # can't unwind into user space anyway work_pending: - testb $_TIF_NEED_RESCHED, %cl + testw $(_TIF_NEED_RESCHED|_TIF_PERFMON_WORK), %cx jz work_notifysig work_resched: call schedule
arch/x86/kernel/process_32.c +10 -0
@@ -36,6 +36,7 @@#include <linux/personality.h> #include <linux/tick.h> #include <linux/percpu.h> +#include <linux/perfmon_kern.h> #include <linux/prctl.h> #include <linux/dmi.h>
@@ -258,6 +259,7 @@ ds_free(current->thread.ds_ctx); }#endif /* CONFIG_X86_DS */ +pfm_exit_thread (); }void flush_thread (void )
@@ -315,6 +317,8 @@savesegment (gs, p->thread.gs); +pfm_copy_thread (p); + tsk = current;if (unlikely (test_tsk_thread_flag (tsk,TIF_IO_BITMAP ))) { p->thread.io_bitmap_ptr = kmemdup(tsk->thread.io_bitmap_ptr,
@@ -458,11 +462,17 @@ prev = &prev_p->thread; next = &next_p->thread; +if (test_tsk_thread_flag (prev_p,TIF_PERFMON_CTXSW )) +pfm_ctxsw_out (prev_p, next_p); + debugctl =update_debugctl (prev, next, prev->debugctlmsr);if (next->debugctlmsr != debugctl)update_debugctlmsr (next->debugctlmsr); +if (test_tsk_thread_flag (next_p,TIF_PERFMON_CTXSW )) +pfm_ctxsw_in (prev_p, next_p); +if (test_tsk_thread_flag (next_p,TIF_DEBUG )) {set_debugreg (next->debugreg0,0 );set_debugreg (next->debugreg1,1 );
arch/x86/kernel/signal_32.c +5 -0
@@ -19,6 +19,7 @@#include <linux/wait.h> #include <linux/tracehook.h> #include <linux/elf.h> +#include <linux/perfmon_kern.h> #include <linux/smp.h> #include <linux/mm.h>
@@ -685,6 +686,10 @@mce_notify_user ();#endif /* CONFIG_X86_64 && CONFIG_X86_MCE */ +/* process perfmon asynchronous work (e.g. block thread or reset) */ +if (thread_info_flags & _TIF_PERFMON_WORK) +pfm_handle_work (regs); +/* deal with pending signal delivery */ if (thread_info_flags & _TIF_SIGPENDING)do_signal (regs);
arch/x86/include/asm/mach-default/entry_arch.h +4 -0
@@ -33,4 +33,8 @@ BUILD_INTERRUPT(thermal_interrupt,THERMAL_APIC_VECTOR)#endif +#ifdef CONFIG_PERFMON +BUILD_INTERRUPT(pmu_interrupt,LOCAL_PERFMON_VECTOR) +#endif +#endif