|
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 */
|