[PATCH 01/21] 2.6.19 perfmon2: arch-specific infrastructure changes

From: Stephane Eranian
Date: Tue Dec 05 2006 - 06:09:51 EST


This patch contains the remaining infrastructure changes required
for perfmon2 for all architectures. It is expected that this patch
will shrink as new kernel version are released.

i386:
- add idle notifier and related callback in interrupt handlers
- add BTS and PEBS detection with cpufeature bits (integrated in 2.6.20)

ia64:
- add idle notifier
- use idle notifier mechanism for SGI front panel activity LED blinking
- add some PMU related MSR definitions (integrated in 2.6.20)

x86-64:
- fix interrupt handlers to call enter_idle() (unecessary in 2.6.20)
- add BTS and PEBS detection with cpufeature bits (integrated in 2.6.20)
- add some PMU related MSR definitions (integrated in 2.6.20)

all:
- remove carta_random32.h header file (integrated in 2.6.20)





diff -urNp --exclude=.git linux-2.6.19.orig/arch/i386/kernel/apic.c linux-2.6.19.base/arch/i386/kernel/apic.c
--- linux-2.6.19.orig/arch/i386/kernel/apic.c 2006-11-29 13:57:37.000000000 -0800
+++ linux-2.6.19.base/arch/i386/kernel/apic.c 2006-12-03 14:24:40.000000000 -0800
@@ -36,6 +36,7 @@
#include <asm/hpet.h>
#include <asm/i8253.h>
#include <asm/nmi.h>
+#include <asm/idle.h>

#include <mach_apic.h>
#include <mach_apicdef.h>
@@ -1241,10 +1242,12 @@ fastcall void smp_apic_timer_interrupt(s
* Besides, if we don't timer interrupts ignore the global
* interrupt lock, which is the WrongThing (tm) to do.
*/
+ exit_idle();
irq_enter();
smp_local_timer_interrupt();
irq_exit();
set_irq_regs(old_regs);
+ enter_idle();
}

#ifndef CONFIG_SMP
@@ -1291,6 +1294,7 @@ fastcall void smp_spurious_interrupt(str
{
unsigned long v;

+ exit_idle();
irq_enter();
/*
* Check if this really is a spurious interrupt and ACK it
@@ -1305,6 +1309,7 @@ fastcall void smp_spurious_interrupt(str
printk(KERN_INFO "spurious APIC interrupt on CPU#%d, should never happen.\n",
smp_processor_id());
irq_exit();
+ enter_idle();
}

/*
@@ -1315,6 +1320,7 @@ fastcall void smp_error_interrupt(struct
{
unsigned long v, v1;

+ exit_idle();
irq_enter();
/* First tickle the hardware, only then report what went on. -- REW */
v = apic_read(APIC_ESR);
@@ -1336,6 +1342,7 @@ fastcall void smp_error_interrupt(struct
printk (KERN_DEBUG "APIC error on CPU%d: %02lx(%02lx)\n",
smp_processor_id(), v , v1);
irq_exit();
+ enter_idle();
}

/*
diff -urNp --exclude=.git linux-2.6.19.orig/arch/i386/kernel/cpu/intel.c linux-2.6.19.base/arch/i386/kernel/cpu/intel.c
--- linux-2.6.19.orig/arch/i386/kernel/cpu/intel.c 2006-11-29 13:57:37.000000000 -0800
+++ linux-2.6.19.base/arch/i386/kernel/cpu/intel.c 2006-12-03 14:24:40.000000000 -0800
@@ -97,7 +97,7 @@ static int __cpuinit num_cpu_cores(struc

static void __cpuinit init_intel(struct cpuinfo_x86 *c)
{
- unsigned int l2 = 0;
+ unsigned int l1, l2 = 0;
char *p = NULL;

#ifdef CONFIG_X86_F00F_BUG
@@ -195,6 +195,14 @@ static void __cpuinit init_intel(struct
if ((c->x86 == 0xf && c->x86_model >= 0x03) ||
(c->x86 == 0x6 && c->x86_model >= 0x0e))
set_bit(X86_FEATURE_CONSTANT_TSC, c->x86_capability);
+
+ if (cpu_has_ds) {
+ rdmsr(MSR_IA32_MISC_ENABLE, l1, l2);
+ if (!(l1 & (1<<11)))
+ set_bit(X86_FEATURE_BTS, c->x86_capability);
+ if (!(l1 & (1<<12)))
+ set_bit(X86_FEATURE_PEBS, c->x86_capability);
+ }
}


diff -urNp --exclude=.git linux-2.6.19.orig/arch/i386/kernel/cpu/mcheck/p4.c linux-2.6.19.base/arch/i386/kernel/cpu/mcheck/p4.c
--- linux-2.6.19.orig/arch/i386/kernel/cpu/mcheck/p4.c 2006-11-29 13:57:37.000000000 -0800
+++ linux-2.6.19.base/arch/i386/kernel/cpu/mcheck/p4.c 2006-12-03 14:24:40.000000000 -0800
@@ -12,6 +12,7 @@
#include <asm/system.h>
#include <asm/msr.h>
#include <asm/apic.h>
+#include <asm/idle.h>

#include <asm/therm_throt.h>

@@ -59,9 +60,11 @@ static void (*vendor_thermal_interrupt)(

fastcall void smp_thermal_interrupt(struct pt_regs *regs)
{
+ exit_idle();
irq_enter();
vendor_thermal_interrupt(regs);
irq_exit();
+ enter_idle();
}

/* P4/Xeon Thermal regulation detect and init */
diff -urNp --exclude=.git linux-2.6.19.orig/arch/i386/kernel/irq.c linux-2.6.19.base/arch/i386/kernel/irq.c
--- linux-2.6.19.orig/arch/i386/kernel/irq.c 2006-11-29 13:57:37.000000000 -0800
+++ linux-2.6.19.base/arch/i386/kernel/irq.c 2006-12-03 14:24:40.000000000 -0800
@@ -19,6 +19,8 @@
#include <linux/cpu.h>
#include <linux/delay.h>

+#include <asm/idle.h>
+
DEFINE_PER_CPU(irq_cpustat_t, irq_stat) ____cacheline_internodealigned_in_smp;
EXPORT_PER_CPU_SYMBOL(irq_stat);

@@ -61,6 +63,7 @@ fastcall unsigned int do_IRQ(struct pt_r
union irq_ctx *curctx, *irqctx;
u32 *isp;
#endif
+ exit_idle();

if (unlikely((unsigned)irq >= NR_IRQS)) {
printk(KERN_EMERG "%s: cannot handle IRQ %d\n",
@@ -127,6 +130,7 @@ fastcall unsigned int do_IRQ(struct pt_r

irq_exit();
set_irq_regs(old_regs);
+ enter_idle();
return 1;
}

diff -urNp --exclude=.git linux-2.6.19.orig/arch/i386/kernel/process.c linux-2.6.19.base/arch/i386/kernel/process.c
--- linux-2.6.19.orig/arch/i386/kernel/process.c 2006-11-29 13:57:37.000000000 -0800
+++ linux-2.6.19.base/arch/i386/kernel/process.c 2006-12-04 07:51:01.000000000 -0800
@@ -48,6 +48,7 @@
#include <asm/i387.h>
#include <asm/desc.h>
#include <asm/vm86.h>
+#include <asm/idle.h>
#ifdef CONFIG_MATH_EMULATION
#include <asm/math_emu.h>
#endif
@@ -79,6 +80,37 @@ void (*pm_idle)(void);
EXPORT_SYMBOL(pm_idle);
static DEFINE_PER_CPU(unsigned int, cpu_idle_state);

+static ATOMIC_NOTIFIER_HEAD(idle_notifier);
+
+void idle_notifier_register(struct notifier_block *n)
+{
+ atomic_notifier_chain_register(&idle_notifier, n);
+}
+EXPORT_SYMBOL_GPL(idle_notifier_register);
+
+void idle_notifier_unregister(struct notifier_block *n)
+{
+ atomic_notifier_chain_unregister(&idle_notifier, n);
+}
+EXPORT_SYMBOL(idle_notifier_unregister);
+
+static DEFINE_PER_CPU(volatile unsigned long, idle_state);
+
+void __enter_idle(void)
+{
+ /* needs to be atomic w.r.t. interrupts, not against other CPUs */
+ __set_bit(0, &__get_cpu_var(idle_state));
+ atomic_notifier_call_chain(&idle_notifier, IDLE_START, NULL);
+}
+
+void __exit_idle(void)
+{
+ /* needs to be atomic w.r.t. interrupts, not against other CPUs */
+ if (__test_and_clear_bit(0, &__get_cpu_var(idle_state)) == 0)
+ return;
+ atomic_notifier_call_chain(&idle_notifier, IDLE_END, NULL);
+}
+
void disable_hlt(void)
{
hlt_counter++;
@@ -194,7 +226,9 @@ void cpu_idle(void)
play_dead();

__get_cpu_var(irq_stat).idle_timestamp = jiffies;
+ __enter_idle();
idle();
+ __exit_idle();
}
preempt_enable_no_resched();
schedule();
diff -urNp --exclude=.git linux-2.6.19.orig/arch/i386/kernel/smp.c linux-2.6.19.base/arch/i386/kernel/smp.c
--- linux-2.6.19.orig/arch/i386/kernel/smp.c 2006-11-29 13:57:37.000000000 -0800
+++ linux-2.6.19.base/arch/i386/kernel/smp.c 2006-12-03 14:24:40.000000000 -0800
@@ -23,6 +23,7 @@

#include <asm/mtrr.h>
#include <asm/tlbflush.h>
+#include <asm/idle.h>
#include <mach_apic.h>

/*
@@ -629,6 +630,7 @@ fastcall void smp_call_function_interrup
/*
* At this point the info structure may be out of scope unless wait==1
*/
+ exit_idle();
irq_enter();
(*func)(info);
irq_exit();
@@ -638,6 +640,7 @@ fastcall void smp_call_function_interrup
atomic_inc(&call_data->finished);
}
set_irq_regs(old_regs);
+ enter_idle();
}

/*
diff -urNp --exclude=.git linux-2.6.19.orig/arch/ia64/kernel/irq_ia64.c linux-2.6.19.base/arch/ia64/kernel/irq_ia64.c
--- linux-2.6.19.orig/arch/ia64/kernel/irq_ia64.c 2006-11-29 13:57:37.000000000 -0800
+++ linux-2.6.19.base/arch/ia64/kernel/irq_ia64.c 2006-12-03 14:24:40.000000000 -0800
@@ -39,6 +39,7 @@
#include <asm/machvec.h>
#include <asm/pgtable.h>
#include <asm/system.h>
+#include <asm/idle.h>

#ifdef CONFIG_PERFMON
# include <asm/perfmon.h>
@@ -176,6 +177,7 @@ ia64_handle_irq (ia64_vector vector, str
* 16 (without this, it would be ~240, which could easily lead
* to kernel stack overflows).
*/
+ exit_idle();
irq_enter();
saved_tpr = ia64_getreg(_IA64_REG_CR_TPR);
ia64_srlz_d();
@@ -204,6 +206,7 @@ ia64_handle_irq (ia64_vector vector, str
*/
irq_exit();
set_irq_regs(old_regs);
+ enter_idle();
}

#ifdef CONFIG_HOTPLUG_CPU
@@ -218,7 +221,7 @@ void ia64_process_pending_intr(void)
extern unsigned int vectors_in_migration[NR_IRQS];

vector = ia64_get_ivr();
-
+ exit_idle();
irq_enter();
saved_tpr = ia64_getreg(_IA64_REG_CR_TPR);
ia64_srlz_d();
@@ -255,6 +258,7 @@ void ia64_process_pending_intr(void)
vector = ia64_get_ivr();
}
irq_exit();
+ enter_idle();
}
#endif

diff -urNp --exclude=.git linux-2.6.19.orig/arch/ia64/kernel/process.c linux-2.6.19.base/arch/ia64/kernel/process.c
--- linux-2.6.19.orig/arch/ia64/kernel/process.c 2006-11-29 13:57:37.000000000 -0800
+++ linux-2.6.19.base/arch/ia64/kernel/process.c 2006-12-03 14:24:40.000000000 -0800
@@ -41,6 +41,7 @@
#include <asm/uaccess.h>
#include <asm/unwind.h>
#include <asm/user.h>
+#include <asm/idle.h>

#include "entry.h"

@@ -50,11 +51,39 @@

#include "sigframe.h"

-void (*ia64_mark_idle)(int);
static DEFINE_PER_CPU(unsigned int, cpu_idle_state);

unsigned long boot_option_idle_override = 0;
EXPORT_SYMBOL(boot_option_idle_override);
+static ATOMIC_NOTIFIER_HEAD(idle_notifier);
+
+void idle_notifier_register(struct notifier_block *n)
+{
+ atomic_notifier_chain_register(&idle_notifier, n);
+}
+EXPORT_SYMBOL_GPL(idle_notifier_register);
+
+void idle_notifier_unregister(struct notifier_block *n)
+{
+ atomic_notifier_chain_unregister(&idle_notifier, n);
+}
+EXPORT_SYMBOL(idle_notifier_unregister);
+
+static DEFINE_PER_CPU(volatile unsigned long, idle_state);
+
+void __enter_idle(void)
+{
+ __get_cpu_var(idle_state) = 1;
+ atomic_notifier_call_chain(&idle_notifier, IDLE_START, NULL);
+}
+
+void __exit_idle(void)
+{
+ /* needs to be atomic w.r.t. interrupts, not against other CPUs */
+ if (cmpxchg(&__get_cpu_var(idle_state), 1, 0) == 0)
+ return;
+ atomic_notifier_call_chain(&idle_notifier, IDLE_END, NULL);
+}

void
ia64_do_show_stack (struct unw_frame_info *info, void *arg)
@@ -263,7 +292,6 @@ EXPORT_SYMBOL_GPL(cpu_idle_wait);
void __attribute__((noreturn))
cpu_idle (void)
{
- void (*mark_idle)(int) = ia64_mark_idle;
int cpu = smp_processor_id();

/* endless idle loop with no priority at all */
@@ -282,15 +310,13 @@ cpu_idle (void)
__get_cpu_var(cpu_idle_state) = 0;

rmb();
- if (mark_idle)
- (*mark_idle)(1);

idle = pm_idle;
if (!idle)
idle = default_idle;
+ __enter_idle();
(*idle)();
- if (mark_idle)
- (*mark_idle)(0);
+ __exit_idle();
#ifdef CONFIG_SMP
normal_xtp();
#endif
diff -urNp --exclude=.git linux-2.6.19.orig/arch/ia64/sn/kernel/idle.c linux-2.6.19.base/arch/ia64/sn/kernel/idle.c
--- linux-2.6.19.orig/arch/ia64/sn/kernel/idle.c 2006-11-29 13:57:37.000000000 -0800
+++ linux-2.6.19.base/arch/ia64/sn/kernel/idle.c 2006-12-03 14:24:40.000000000 -0800
@@ -5,12 +5,14 @@
*
* Copyright (c) 2001-2004 Silicon Graphics, Inc. All rights reserved.
*/
-
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <asm/idle.h>
#include <asm/sn/leds.h>

-void snidle(int state)
+int snidle(struct notifier_block *nb, unsigned long state, void *data)
{
- if (state) {
+ if (state == IDLE_START) {
if (pda->idle_flag == 0) {
/*
* Turn the activity LED off.
@@ -27,4 +29,5 @@ void snidle(int state)

pda->idle_flag = 0;
}
+ return NOTIFY_OK;
}
diff -urNp --exclude=.git linux-2.6.19.orig/arch/ia64/sn/kernel/setup.c linux-2.6.19.base/arch/ia64/sn/kernel/setup.c
--- linux-2.6.19.orig/arch/ia64/sn/kernel/setup.c 2006-11-29 13:57:37.000000000 -0800
+++ linux-2.6.19.base/arch/ia64/sn/kernel/setup.c 2006-12-03 14:24:40.000000000 -0800
@@ -53,6 +53,7 @@
#include "xtalk/xwidgetdev.h"
#include "xtalk/hubdev.h"
#include <asm/sn/klconfig.h>
+#include <asm/idle.h>


DEFINE_PER_CPU(struct pda_s, pda_percpu);
@@ -63,8 +64,7 @@ extern void bte_init_node(nodepda_t *, c

extern void sn_timer_init(void);
extern unsigned long last_time_offset;
-extern void (*ia64_mark_idle) (int);
-extern void snidle(int);
+extern int snidle(struct notifier_block *nb, unsigned long state, void *data);
extern unsigned long long (*ia64_printk_clock)(void);

unsigned long sn_rtc_cycles_per_second;
@@ -123,6 +123,10 @@ struct screen_info sn_screen_info = {
.orig_video_points = 16
};

+static struct notifier_block snidle_notifier= {
+ .notifier_call = snidle
+};
+
/*
* This routine can only be used during init, since
* smp_boot_data is an init data structure.
@@ -464,7 +468,7 @@ void __init sn_setup(char **cmdline_p)
*/
sn_init_pdas(cmdline_p);

- ia64_mark_idle = &snidle;
+ idle_notifier_register(&snidle_notifier);

/*
* For the bootcpu, we do this here. All other cpus will make the
diff -urNp --exclude=.git linux-2.6.19.orig/arch/x86_64/kernel/apic.c linux-2.6.19.base/arch/x86_64/kernel/apic.c
--- linux-2.6.19.orig/arch/x86_64/kernel/apic.c 2006-11-29 13:57:37.000000000 -0800
+++ linux-2.6.19.base/arch/x86_64/kernel/apic.c 2006-12-03 14:24:40.000000000 -0800
@@ -937,6 +937,7 @@ void smp_apic_timer_interrupt(struct pt_
smp_local_timer_interrupt();
irq_exit();
set_irq_regs(old_regs);
+ enter_idle();
}

/*
@@ -1018,6 +1019,7 @@ asmlinkage void smp_spurious_interrupt(v
}
#endif
irq_exit();
+ enter_idle();
}

/*
@@ -1050,6 +1052,7 @@ asmlinkage void smp_error_interrupt(void
printk (KERN_DEBUG "APIC error on CPU%d: %02x(%02x)\n",
smp_processor_id(), v , v1);
irq_exit();
+ enter_idle();
}

int disable_apic;
diff -urNp --exclude=.git linux-2.6.19.orig/arch/x86_64/kernel/mce_amd.c linux-2.6.19.base/arch/x86_64/kernel/mce_amd.c
--- linux-2.6.19.orig/arch/x86_64/kernel/mce_amd.c 2006-11-29 13:57:37.000000000 -0800
+++ linux-2.6.19.base/arch/x86_64/kernel/mce_amd.c 2006-12-03 14:24:40.000000000 -0800
@@ -224,6 +224,7 @@ asmlinkage void mce_threshold_interrupt(
}
out:
irq_exit();
+ enter_idle();
}

/*
diff -urNp --exclude=.git linux-2.6.19.orig/arch/x86_64/kernel/mce_intel.c linux-2.6.19.base/arch/x86_64/kernel/mce_intel.c
--- linux-2.6.19.orig/arch/x86_64/kernel/mce_intel.c 2006-11-29 13:57:37.000000000 -0800
+++ linux-2.6.19.base/arch/x86_64/kernel/mce_intel.c 2006-12-03 14:24:40.000000000 -0800
@@ -27,6 +27,7 @@ asmlinkage void smp_thermal_interrupt(vo
mce_log_therm_throt_event(smp_processor_id(), msr_val);

irq_exit();
+ enter_idle();
}

static void __cpuinit intel_init_thermal(struct cpuinfo_x86 *c)
diff -urNp --exclude=.git linux-2.6.19.orig/arch/x86_64/kernel/setup.c linux-2.6.19.base/arch/x86_64/kernel/setup.c
--- linux-2.6.19.orig/arch/x86_64/kernel/setup.c 2006-11-29 13:57:37.000000000 -0800
+++ linux-2.6.19.base/arch/x86_64/kernel/setup.c 2006-12-03 14:24:40.000000000 -0800
@@ -835,6 +835,15 @@ static void __cpuinit init_intel(struct
set_bit(X86_FEATURE_ARCH_PERFMON, &c->x86_capability);
}

+ if (cpu_has_ds) {
+ unsigned int l1, l2;
+ rdmsr(MSR_IA32_MISC_ENABLE, l1, l2);
+ if (!(l1 & (1<<11)))
+ set_bit(X86_FEATURE_BTS, c->x86_capability);
+ if (!(l1 & (1<<12)))
+ set_bit(X86_FEATURE_PEBS, c->x86_capability);
+ }
+
n = c->extended_cpuid_level;
if (n >= 0x80000008) {
unsigned eax = cpuid_eax(0x80000008);
diff -urNp --exclude=.git linux-2.6.19.orig/arch/x86_64/kernel/smp.c linux-2.6.19.base/arch/x86_64/kernel/smp.c
--- linux-2.6.19.orig/arch/x86_64/kernel/smp.c 2006-11-29 13:57:37.000000000 -0800
+++ linux-2.6.19.base/arch/x86_64/kernel/smp.c 2006-12-03 14:24:40.000000000 -0800
@@ -519,5 +519,6 @@ asmlinkage void smp_call_function_interr
mb();
atomic_inc(&call_data->finished);
}
+ enter_idle();
}

diff -urNp --exclude=.git linux-2.6.19.orig/include/asm-i386/cpufeature.h linux-2.6.19.base/include/asm-i386/cpufeature.h
--- linux-2.6.19.orig/include/asm-i386/cpufeature.h 2006-11-29 13:57:37.000000000 -0800
+++ linux-2.6.19.base/include/asm-i386/cpufeature.h 2006-12-03 14:24:40.000000000 -0800
@@ -73,6 +73,8 @@
#define X86_FEATURE_UP (3*32+ 9) /* smp kernel running on up */
#define X86_FEATURE_FXSAVE_LEAK (3*32+10) /* FXSAVE leaks FOP/FIP/FOP */
#define X86_FEATURE_ARCH_PERFMON (3*32+11) /* Intel Architectural PerfMon */
+#define X86_FEATURE_PEBS (3*32+12) /* Precise-Event Based Sampling */
+#define X86_FEATURE_BTS (3*32+13) /* Branch Trace Store */

/* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */
#define X86_FEATURE_XMM3 (4*32+ 0) /* Streaming SIMD Extensions-3 */
@@ -134,6 +136,9 @@
#define cpu_has_phe_enabled boot_cpu_has(X86_FEATURE_PHE_EN)
#define cpu_has_pmm boot_cpu_has(X86_FEATURE_PMM)
#define cpu_has_pmm_enabled boot_cpu_has(X86_FEATURE_PMM_EN)
+#define cpu_has_ds boot_cpu_has(X86_FEATURE_DTES)
+#define cpu_has_pebs boot_cpu_has(X86_FEATURE_PEBS)
+#define cpu_has_bts boot_cpu_has(X86_FEATURE_BTS)

#endif /* __ASM_I386_CPUFEATURE_H */

diff -urNp --exclude=.git linux-2.6.19.orig/include/asm-i386/idle.h linux-2.6.19.base/include/asm-i386/idle.h
--- linux-2.6.19.orig/include/asm-i386/idle.h 1969-12-31 16:00:00.000000000 -0800
+++ linux-2.6.19.base/include/asm-i386/idle.h 2006-12-03 14:24:40.000000000 -0800
@@ -0,0 +1,27 @@
+#ifndef _ASM_I386_IDLE_H
+#define _ASM_I386_IDLE_H 1
+
+#define IDLE_START 1
+#define IDLE_END 2
+
+struct notifier_block;
+void idle_notifier_register(struct notifier_block *n);
+void idle_notifier_unregister(struct notifier_block *n);
+
+void __exit_idle(void);
+void __enter_idle(void);
+
+static inline void enter_idle(void)
+{
+ if (current->pid)
+ return;
+ __enter_idle();
+}
+
+static inline void exit_idle(void)
+{
+ if (current->pid)
+ return;
+ __exit_idle();
+}
+#endif
diff -urNp --exclude=.git linux-2.6.19.orig/include/asm-i386/msr.h linux-2.6.19.base/include/asm-i386/msr.h
--- linux-2.6.19.orig/include/asm-i386/msr.h 2006-11-29 13:57:37.000000000 -0800
+++ linux-2.6.19.base/include/asm-i386/msr.h 2006-12-03 14:24:40.000000000 -0800
@@ -141,6 +141,10 @@ static inline void wrmsrl (unsigned long
#define MSR_IA32_MC0_ADDR 0x402
#define MSR_IA32_MC0_MISC 0x403

+#define MSR_IA32_PEBS_ENABLE 0x3f1
+#define MSR_IA32_DS_AREA 0x600
+#define MSR_IA32_PERF_CAPABILITIES 0x345
+
/* Pentium IV performance counter MSRs */
#define MSR_P4_BPU_PERFCTR0 0x300
#define MSR_P4_BPU_PERFCTR1 0x301
@@ -284,4 +288,13 @@ static inline void wrmsrl (unsigned long
#define MSR_TMTA_LRTI_READOUT 0x80868018
#define MSR_TMTA_LRTI_VOLT_MHZ 0x8086801a

+/* Intel Core-based CPU performance counters */
+#define MSR_CORE_PERF_FIXED_CTR0 0x309
+#define MSR_CORE_PERF_FIXED_CTR1 0x30a
+#define MSR_CORE_PERF_FIXED_CTR2 0x30b
+#define MSR_CORE_PERF_FIXED_CTR_CTRL 0x38d
+#define MSR_CORE_PERF_GLOBAL_STATUS 0x38e
+#define MSR_CORE_PERF_GLOBAL_CTRL 0x38f
+#define MSR_CORE_PERF_GLOBAL_OVF_CTRL 0x390
+
#endif /* __ASM_MSR_H */
diff -urNp --exclude=.git linux-2.6.19.orig/include/asm-ia64/idle.h linux-2.6.19.base/include/asm-ia64/idle.h
--- linux-2.6.19.orig/include/asm-ia64/idle.h 1969-12-31 16:00:00.000000000 -0800
+++ linux-2.6.19.base/include/asm-ia64/idle.h 2006-12-03 14:24:40.000000000 -0800
@@ -0,0 +1,32 @@
+#ifndef _ASM_IA64_IDLE_H
+#define _ASM_IA64_IDLE_H 1
+
+#include <linux/irq.h>
+#include <asm/ptrace.h>
+
+#define IDLE_START 1
+#define IDLE_END 2
+
+struct notifier_block;
+void idle_notifier_register(struct notifier_block *n);
+void idle_notifier_unregister(struct notifier_block *n);
+
+void __exit_idle(void);
+void __enter_idle(void);
+
+/* Called from interrupts to signify back to idle */
+static inline void enter_idle(void)
+{
+ if (current->pid)
+ return;
+ __enter_idle();
+}
+
+/* Called from interrupts to signify idle end */
+static inline void exit_idle(void)
+{
+ if (current->pid)
+ return;
+ __exit_idle();
+}
+#endif
diff -urNp --exclude=.git linux-2.6.19.orig/include/asm-x86_64/cpufeature.h linux-2.6.19.base/include/asm-x86_64/cpufeature.h
--- linux-2.6.19.orig/include/asm-x86_64/cpufeature.h 2006-11-29 13:57:37.000000000 -0800
+++ linux-2.6.19.base/include/asm-x86_64/cpufeature.h 2006-12-03 14:24:40.000000000 -0800
@@ -68,6 +68,8 @@
#define X86_FEATURE_FXSAVE_LEAK (3*32+7) /* FIP/FOP/FDP leaks through FXSAVE */
#define X86_FEATURE_UP (3*32+8) /* SMP kernel running on UP */
#define X86_FEATURE_ARCH_PERFMON (3*32+9) /* Intel Architectural PerfMon */
+#define X86_FEATURE_PEBS (3*32+10) /* Precise-Event Based Sampling */
+#define X86_FEATURE_BTS (3*32+11) /* Branch Trace Store */

/* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */
#define X86_FEATURE_XMM3 (4*32+ 0) /* Streaming SIMD Extensions-3 */
@@ -112,5 +114,8 @@
#define cpu_has_cyrix_arr 0
#define cpu_has_centaur_mcr 0
#define cpu_has_clflush boot_cpu_has(X86_FEATURE_CLFLSH)
+#define cpu_has_ds boot_cpu_has(X86_FEATURE_DTES)
+#define cpu_has_pebs boot_cpu_has(X86_FEATURE_PEBS)
+#define cpu_has_bts boot_cpu_has(X86_FEATURE_BTS)

#endif /* __ASM_X8664_CPUFEATURE_H */
diff -urNp --exclude=.git linux-2.6.19.orig/include/asm-x86_64/msr.h linux-2.6.19.base/include/asm-x86_64/msr.h
--- linux-2.6.19.orig/include/asm-x86_64/msr.h 2006-11-29 13:57:37.000000000 -0800
+++ linux-2.6.19.base/include/asm-x86_64/msr.h 2006-12-03 14:24:40.000000000 -0800
@@ -210,6 +210,10 @@ static inline unsigned int cpuid_edx(uns
#define MSR_IA32_LASTINTFROMIP 0x1dd
#define MSR_IA32_LASTINTTOIP 0x1de

+#define MSR_IA32_PEBS_ENABLE 0x3f1
+#define MSR_IA32_DS_AREA 0x600
+#define MSR_IA32_PERF_CAPABILITIES 0x345
+
#define MSR_MTRRfix64K_00000 0x250
#define MSR_MTRRfix16K_80000 0x258
#define MSR_MTRRfix16K_A0000 0x259
@@ -407,4 +411,13 @@ static inline unsigned int cpuid_edx(uns
#define MSR_P4_U2L_ESCR0 0x3b0
#define MSR_P4_U2L_ESCR1 0x3b1

+/* Intel Core-based CPU performance counters */
+#define MSR_CORE_PERF_FIXED_CTR0 0x309
+#define MSR_CORE_PERF_FIXED_CTR1 0x30a
+#define MSR_CORE_PERF_FIXED_CTR2 0x30b
+#define MSR_CORE_PERF_FIXED_CTR_CTRL 0x38d
+#define MSR_CORE_PERF_GLOBAL_STATUS 0x38e
+#define MSR_CORE_PERF_GLOBAL_CTRL 0x38f
+#define MSR_CORE_PERF_GLOBAL_OVF_CTRL 0x390
+
#endif
diff -urNp --exclude=.git linux-2.6.19.orig/include/linux/carta_random32.h linux-2.6.19.base/include/linux/carta_random32.h
--- linux-2.6.19.orig/include/linux/carta_random32.h 2006-11-29 13:57:37.000000000 -0800
+++ linux-2.6.19.base/include/linux/carta_random32.h 1969-12-31 16:00:00.000000000 -0800
@@ -1,29 +0,0 @@
-/*
- * Fast, simple, yet decent quality random number generator based on
- * a paper by David G. Carta ("Two Fast Implementations of the
- * `Minimal Standard' Random Number Generator," Communications of the
- * ACM, January, 1990).
- *
- * Copyright (c) 2002-2006 Hewlett-Packard Development Company, L.P.
- * Contributed by Stephane Eranian <eranian@xxxxxxxxxx>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- * 02111-1307 USA
- */
-#ifndef _LINUX_CARTA_RANDOM32_H_
-#define _LINUX_CARTA_RANDOM32_H_
-
-u64 carta_random32(u64 seed);
-
-#endif /* _LINUX_CARTA_RANDOM32_H_ */
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/