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 <[EMAIL PROTECTED]>
- *
- * 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 [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to