Blame src/perfctr-2.6.x/linux/drivers/perfctr/x86_setup.c

Packit 577717
/* $Id: x86_setup.c,v 1.47.2.9 2009/01/23 17:21:20 mikpe Exp $
Packit 577717
 * Performance-monitoring counters driver.
Packit 577717
 * x86/x86_64-specific kernel-resident code.
Packit 577717
 *
Packit 577717
 * Copyright (C) 1999-2007, 2009  Mikael Pettersson
Packit 577717
 */
Packit 577717
#include <linux/version.h>
Packit 577717
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
Packit 577717
#include <linux/config.h>
Packit 577717
#endif
Packit 577717
#include <linux/module.h>
Packit 577717
#include <linux/init.h>
Packit 577717
#include <linux/kernel.h>
Packit 577717
#include <linux/sched.h>
Packit 577717
#include <linux/interrupt.h>
Packit 577717
#include <asm/processor.h>
Packit 577717
#include <asm/perfctr.h>
Packit 577717
#include <asm/fixmap.h>
Packit 577717
#include <asm/apic.h>
Packit 577717
#include "x86_compat.h"
Packit 577717
#include "compat.h"
Packit 577717
Packit 577717
#ifdef CONFIG_X86_LOCAL_APIC
Packit 577717
static void perfctr_default_ihandler(unsigned long pc)
Packit 577717
{
Packit 577717
}
Packit 577717
Packit 577717
static perfctr_ihandler_t perfctr_ihandler = perfctr_default_ihandler;
Packit 577717
static unsigned int interrupts_masked[NR_CPUS] __cacheline_aligned;
Packit 577717
Packit 577717
void __perfctr_cpu_mask_interrupts(void)
Packit 577717
{
Packit 577717
	interrupts_masked[smp_processor_id()] = 1;
Packit 577717
}
Packit 577717
Packit 577717
void __perfctr_cpu_unmask_interrupts(void)
Packit 577717
{
Packit 577717
	interrupts_masked[smp_processor_id()] = 0;
Packit 577717
}
Packit 577717
Packit 577717
asmlinkage void smp_perfctr_interrupt(struct pt_regs *regs)
Packit 577717
{
Packit 577717
	/* PREEMPT note: invoked via an interrupt gate, which
Packit 577717
	   masks interrupts. We're still on the originating CPU. */
Packit 577717
	/* XXX: recursive interrupts? delay the ACK, mask LVTPC, or queue? */
Packit 577717
	ack_APIC_irq();
Packit 577717
	if (interrupts_masked[smp_processor_id()])
Packit 577717
		return;
Packit 577717
	irq_enter();
Packit 577717
	(*perfctr_ihandler)(instruction_pointer(regs));
Packit 577717
	irq_exit();
Packit 577717
}
Packit 577717
Packit 577717
void perfctr_cpu_set_ihandler(perfctr_ihandler_t ihandler)
Packit 577717
{
Packit 577717
	perfctr_ihandler = ihandler ? ihandler : perfctr_default_ihandler;
Packit 577717
}
Packit 577717
#endif
Packit 577717
Packit 577717
#if defined(__x86_64__) || LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,13)
Packit 577717
extern unsigned int cpu_khz;
Packit 577717
#else
Packit 577717
extern unsigned long cpu_khz;
Packit 577717
#endif
Packit 577717
Packit 577717
unsigned int perfctr_cpu_khz(void)
Packit 577717
{
Packit 577717
	return cpu_khz;
Packit 577717
}
Packit 577717
Packit 577717
#ifdef CONFIG_PERFCTR_MODULE
Packit 577717
EXPORT_SYMBOL_mmu_cr4_features;
Packit 577717
EXPORT_SYMBOL(perfctr_cpu_khz);
Packit 577717
Packit 577717
#ifdef CONFIG_X86_LOCAL_APIC
Packit 577717
Packit 577717
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
Packit 577717
#include <asm/nmi.h>
Packit 577717
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
Packit 577717
EXPORT_SYMBOL(disable_lapic_nmi_watchdog);
Packit 577717
EXPORT_SYMBOL(enable_lapic_nmi_watchdog);
Packit 577717
#else
Packit 577717
EXPORT_SYMBOL(setup_apic_nmi_watchdog);
Packit 577717
EXPORT_SYMBOL(stop_apic_nmi_watchdog);
Packit 577717
#endif
Packit 577717
#endif
Packit 577717
Packit 577717
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,6)
Packit 577717
EXPORT_SYMBOL(nmi_perfctr_msr);
Packit 577717
#endif
Packit 577717
Packit 577717
EXPORT_SYMBOL(__perfctr_cpu_mask_interrupts);
Packit 577717
EXPORT_SYMBOL(__perfctr_cpu_unmask_interrupts);
Packit 577717
EXPORT_SYMBOL(perfctr_cpu_set_ihandler);
Packit 577717
#endif /* CONFIG_X86_LOCAL_APIC */
Packit 577717
Packit 577717
#endif /* MODULE */