Messages in this thread Patch in this message | | | Subject | [patch 08/19] perfmon2 minimal v3: X86 32-bit hooks | From | eranian@googlema ... | Date | Mon, 30 Jun 2008 06:14:01 -0700 (PDT) |
| |
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 <eranian@gmail.com> --
Index: linux-next/arch/x86/kernel/apic_32.c =================================================================== --- linux-next.orig/arch/x86/kernel/apic_32.c 2008-06-26 17:46:24.000000000 +0200 +++ linux-next/arch/x86/kernel/apic_32.c 2008-06-26 20:06:27.000000000 +0200 @@ -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 } /** Index: linux-next/arch/x86/kernel/entry_32.S =================================================================== --- linux-next.orig/arch/x86/kernel/entry_32.S 2008-06-26 17:46:24.000000000 +0200 +++ linux-next/arch/x86/kernel/entry_32.S 2008-06-26 20:06:27.000000000 +0200 @@ -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 Index: linux-next/arch/x86/kernel/process_32.c =================================================================== --- linux-next.orig/arch/x86/kernel/process_32.c 2008-06-26 17:46:24.000000000 +0200 +++ linux-next/arch/x86/kernel/process_32.c 2008-06-26 20:06:27.000000000 +0200 @@ -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); Index: linux-next/arch/x86/kernel/signal_32.c =================================================================== --- linux-next.orig/arch/x86/kernel/signal_32.c 2008-06-26 17:46:24.000000000 +0200 +++ linux-next/arch/x86/kernel/signal_32.c 2008-06-26 20:06:27.000000000 +0200 @@ -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); Index: linux-next/include/asm-x86/mach-default/entry_arch.h =================================================================== --- linux-next.orig/include/asm-x86/mach-default/entry_arch.h 2008-06-26 17:46:27.000000000 +0200 +++ linux-next/include/asm-x86/mach-default/entry_arch.h 2008-06-26 20:06:27.000000000 +0200 @@ -32,4 +32,8 @@ BUILD_INTERRUPT(thermal_interrupt,THERMAL_APIC_VECTOR) #endif +#ifdef CONFIG_PERFMON +BUILD_INTERRUPT(pmu_interrupt,LOCAL_PERFMON_VECTOR) +#endif + #endif --
| |