perfmon2 minimal v3: X86 32-bit hooks
PATCH 8/19 perfmon2 minimal v3: X86 32-bit hooks
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/apic_32.c +4 -0
@@ -28,6 +28,7 @@#include <linux/acpi_pmtmr.h> #include <linux/module.h> #include <linux/dmi.h> +#include <linux/perfmon_kern.h> #include <asm/atomic.h> #include <asm/smp.h>
@@ -1390,6 +1391,9 @@#ifdef CONFIG_X86_MCE_P4THERMAL alloc_intr_gate (THERMAL_APIC_VECTOR , thermal_interrupt);#endif +#ifdef CONFIG_PERFMON +set_intr_gate (LOCAL_PERFMON_VECTOR , pmu_interrupt); +#endif }/**
arch/x86/kernel/entry_32.S +1 -1
@@ -466,7 +466,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 <asm/uaccess.h>
@@ -276,6 +277,7 @@ tss->x86_tss.io_bitmap_base =INVALID_IO_BITMAP_OFFSET ;put_cpu (); } +pfm_exit_thread (); }void flush_thread (void )
@@ -333,6 +335,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,
@@ -447,6 +451,9 @@ 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 = prev->debugctlmsr;if (next->ds_area_msr != prev->ds_area_msr) {/* we clear debugctl to make sure DS
@@ -459,6 +466,9 @@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
@@ -18,6 +18,7 @@#include <linux/sched.h> #include <linux/wait.h> #include <linux/elf.h> +#include <linux/perfmon_kern.h> #include <linux/smp.h> #include <linux/mm.h>
@@ -663,6 +664,10 @@clear_thread_flag (TIF_SINGLESTEP ); } +/* 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);
include/asm-x86/mach-default/entry_arch.h +4 -0
@@ -32,4 +32,8 @@ BUILD_INTERRUPT(thermal_interrupt,THERMAL_APIC_VECTOR)#endif +#ifdef CONFIG_PERFMON +BUILD_INTERRUPT(pmu_interrupt,LOCAL_PERFMON_VECTOR) +#endif +#endif