diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-06 12:30:52 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-06 12:30:52 -0400 |
| commit | 4aed2fd8e3181fea7c09ba79cf64e7e3f4413bf9 (patch) | |
| tree | 1f69733e5daab4915a76a41de0e4d1dc61e12cfb /arch/x86/include | |
| parent | 3a3527b6461b1298cc53ce72f336346739297ac8 (diff) | |
| parent | fc9ea5a1e53ee54f681e226d735008e2a6f8f470 (diff) | |
Merge branch 'perf-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'perf-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (162 commits)
tracing/kprobes: unregister_trace_probe needs to be called under mutex
perf: expose event__process function
perf events: Fix mmap offset determination
perf, powerpc: fsl_emb: Restore setting perf_sample_data.period
perf, powerpc: Convert the FSL driver to use local64_t
perf tools: Don't keep unreferenced maps when unmaps are detected
perf session: Invalidate last_match when removing threads from rb_tree
perf session: Free the ref_reloc_sym memory at the right place
x86,mmiotrace: Add support for tracing STOS instruction
perf, sched migration: Librarize task states and event headers helpers
perf, sched migration: Librarize the GUI class
perf, sched migration: Make the GUI class client agnostic
perf, sched migration: Make it vertically scrollable
perf, sched migration: Parameterize cpu height and spacing
perf, sched migration: Fix key bindings
perf, sched migration: Ignore unhandled task states
perf, sched migration: Handle ignored migrate out events
perf: New migration tool overview
tracing: Drop cpparg() macro
perf: Use tracepoint_synchronize_unregister() to flush any pending tracepoint call
...
Fix up trivial conflicts in Makefile and drivers/cpufreq/cpufreq.c
Diffstat (limited to 'arch/x86/include')
| -rw-r--r-- | arch/x86/include/asm/hw_breakpoint.h | 2 | ||||
| -rw-r--r-- | arch/x86/include/asm/local64.h | 1 | ||||
| -rw-r--r-- | arch/x86/include/asm/nmi.h | 2 | ||||
| -rw-r--r-- | arch/x86/include/asm/perf_event.h | 18 | ||||
| -rw-r--r-- | arch/x86/include/asm/perf_event_p4.h | 99 | ||||
| -rw-r--r-- | arch/x86/include/asm/stacktrace.h | 49 |
6 files changed, 121 insertions, 50 deletions
diff --git a/arch/x86/include/asm/hw_breakpoint.h b/arch/x86/include/asm/hw_breakpoint.h index 942255310e6a..528a11e8d3e3 100644 --- a/arch/x86/include/asm/hw_breakpoint.h +++ b/arch/x86/include/asm/hw_breakpoint.h | |||
| @@ -20,10 +20,10 @@ struct arch_hw_breakpoint { | |||
| 20 | #include <linux/list.h> | 20 | #include <linux/list.h> |
| 21 | 21 | ||
| 22 | /* Available HW breakpoint length encodings */ | 22 | /* Available HW breakpoint length encodings */ |
| 23 | #define X86_BREAKPOINT_LEN_X 0x00 | ||
| 23 | #define X86_BREAKPOINT_LEN_1 0x40 | 24 | #define X86_BREAKPOINT_LEN_1 0x40 |
| 24 | #define X86_BREAKPOINT_LEN_2 0x44 | 25 | #define X86_BREAKPOINT_LEN_2 0x44 |
| 25 | #define X86_BREAKPOINT_LEN_4 0x4c | 26 | #define X86_BREAKPOINT_LEN_4 0x4c |
| 26 | #define X86_BREAKPOINT_LEN_EXECUTE 0x40 | ||
| 27 | 27 | ||
| 28 | #ifdef CONFIG_X86_64 | 28 | #ifdef CONFIG_X86_64 |
| 29 | #define X86_BREAKPOINT_LEN_8 0x48 | 29 | #define X86_BREAKPOINT_LEN_8 0x48 |
diff --git a/arch/x86/include/asm/local64.h b/arch/x86/include/asm/local64.h new file mode 100644 index 000000000000..36c93b5cc239 --- /dev/null +++ b/arch/x86/include/asm/local64.h | |||
| @@ -0,0 +1 @@ | |||
| #include <asm-generic/local64.h> | |||
diff --git a/arch/x86/include/asm/nmi.h b/arch/x86/include/asm/nmi.h index 93da9c3f3341..932f0f86b4b7 100644 --- a/arch/x86/include/asm/nmi.h +++ b/arch/x86/include/asm/nmi.h | |||
| @@ -17,7 +17,9 @@ int do_nmi_callback(struct pt_regs *regs, int cpu); | |||
| 17 | 17 | ||
| 18 | extern void die_nmi(char *str, struct pt_regs *regs, int do_panic); | 18 | extern void die_nmi(char *str, struct pt_regs *regs, int do_panic); |
| 19 | extern int check_nmi_watchdog(void); | 19 | extern int check_nmi_watchdog(void); |
| 20 | #if !defined(CONFIG_LOCKUP_DETECTOR) | ||
| 20 | extern int nmi_watchdog_enabled; | 21 | extern int nmi_watchdog_enabled; |
| 22 | #endif | ||
| 21 | extern int avail_to_resrv_perfctr_nmi_bit(unsigned int); | 23 | extern int avail_to_resrv_perfctr_nmi_bit(unsigned int); |
| 22 | extern int reserve_perfctr_nmi(unsigned int); | 24 | extern int reserve_perfctr_nmi(unsigned int); |
| 23 | extern void release_perfctr_nmi(unsigned int); | 25 | extern void release_perfctr_nmi(unsigned int); |
diff --git a/arch/x86/include/asm/perf_event.h b/arch/x86/include/asm/perf_event.h index 254883d0c7e0..6e742cc4251b 100644 --- a/arch/x86/include/asm/perf_event.h +++ b/arch/x86/include/asm/perf_event.h | |||
| @@ -68,8 +68,9 @@ union cpuid10_eax { | |||
| 68 | 68 | ||
| 69 | union cpuid10_edx { | 69 | union cpuid10_edx { |
| 70 | struct { | 70 | struct { |
| 71 | unsigned int num_counters_fixed:4; | 71 | unsigned int num_counters_fixed:5; |
| 72 | unsigned int reserved:28; | 72 | unsigned int bit_width_fixed:8; |
| 73 | unsigned int reserved:19; | ||
| 73 | } split; | 74 | } split; |
| 74 | unsigned int full; | 75 | unsigned int full; |
| 75 | }; | 76 | }; |
| @@ -140,6 +141,19 @@ extern unsigned long perf_instruction_pointer(struct pt_regs *regs); | |||
| 140 | extern unsigned long perf_misc_flags(struct pt_regs *regs); | 141 | extern unsigned long perf_misc_flags(struct pt_regs *regs); |
| 141 | #define perf_misc_flags(regs) perf_misc_flags(regs) | 142 | #define perf_misc_flags(regs) perf_misc_flags(regs) |
| 142 | 143 | ||
| 144 | #include <asm/stacktrace.h> | ||
| 145 | |||
| 146 | /* | ||
| 147 | * We abuse bit 3 from flags to pass exact information, see perf_misc_flags | ||
| 148 | * and the comment with PERF_EFLAGS_EXACT. | ||
| 149 | */ | ||
| 150 | #define perf_arch_fetch_caller_regs(regs, __ip) { \ | ||
| 151 | (regs)->ip = (__ip); \ | ||
| 152 | (regs)->bp = caller_frame_pointer(); \ | ||
| 153 | (regs)->cs = __KERNEL_CS; \ | ||
| 154 | regs->flags = 0; \ | ||
| 155 | } | ||
| 156 | |||
| 143 | #else | 157 | #else |
| 144 | static inline void init_hw_perf_events(void) { } | 158 | static inline void init_hw_perf_events(void) { } |
| 145 | static inline void perf_events_lapic_init(void) { } | 159 | static inline void perf_events_lapic_init(void) { } |
diff --git a/arch/x86/include/asm/perf_event_p4.h b/arch/x86/include/asm/perf_event_p4.h index 64a8ebff06fc..def500776b16 100644 --- a/arch/x86/include/asm/perf_event_p4.h +++ b/arch/x86/include/asm/perf_event_p4.h | |||
| @@ -19,7 +19,6 @@ | |||
| 19 | #define ARCH_P4_RESERVED_ESCR (2) /* IQ_ESCR(0,1) not always present */ | 19 | #define ARCH_P4_RESERVED_ESCR (2) /* IQ_ESCR(0,1) not always present */ |
| 20 | #define ARCH_P4_MAX_ESCR (ARCH_P4_TOTAL_ESCR - ARCH_P4_RESERVED_ESCR) | 20 | #define ARCH_P4_MAX_ESCR (ARCH_P4_TOTAL_ESCR - ARCH_P4_RESERVED_ESCR) |
| 21 | #define ARCH_P4_MAX_CCCR (18) | 21 | #define ARCH_P4_MAX_CCCR (18) |
| 22 | #define ARCH_P4_MAX_COUNTER (ARCH_P4_MAX_CCCR / 2) | ||
| 23 | 22 | ||
| 24 | #define P4_ESCR_EVENT_MASK 0x7e000000U | 23 | #define P4_ESCR_EVENT_MASK 0x7e000000U |
| 25 | #define P4_ESCR_EVENT_SHIFT 25 | 24 | #define P4_ESCR_EVENT_SHIFT 25 |
| @@ -71,10 +70,6 @@ | |||
| 71 | #define P4_CCCR_THRESHOLD(v) ((v) << P4_CCCR_THRESHOLD_SHIFT) | 70 | #define P4_CCCR_THRESHOLD(v) ((v) << P4_CCCR_THRESHOLD_SHIFT) |
| 72 | #define P4_CCCR_ESEL(v) ((v) << P4_CCCR_ESCR_SELECT_SHIFT) | 71 | #define P4_CCCR_ESEL(v) ((v) << P4_CCCR_ESCR_SELECT_SHIFT) |
| 73 | 72 | ||
| 74 | /* Custom bits in reerved CCCR area */ | ||
| 75 | #define P4_CCCR_CACHE_OPS_MASK 0x0000003fU | ||
| 76 | |||
| 77 | |||
| 78 | /* Non HT mask */ | 73 | /* Non HT mask */ |
| 79 | #define P4_CCCR_MASK \ | 74 | #define P4_CCCR_MASK \ |
| 80 | (P4_CCCR_OVF | \ | 75 | (P4_CCCR_OVF | \ |
| @@ -106,8 +101,7 @@ | |||
| 106 | * ESCR and CCCR but rather an only packed value should | 101 | * ESCR and CCCR but rather an only packed value should |
| 107 | * be unpacked and written to a proper addresses | 102 | * be unpacked and written to a proper addresses |
| 108 | * | 103 | * |
| 109 | * the base idea is to pack as much info as | 104 | * the base idea is to pack as much info as possible |
| 110 | * possible | ||
| 111 | */ | 105 | */ |
| 112 | #define p4_config_pack_escr(v) (((u64)(v)) << 32) | 106 | #define p4_config_pack_escr(v) (((u64)(v)) << 32) |
| 113 | #define p4_config_pack_cccr(v) (((u64)(v)) & 0xffffffffULL) | 107 | #define p4_config_pack_cccr(v) (((u64)(v)) & 0xffffffffULL) |
| @@ -130,8 +124,6 @@ | |||
| 130 | t; \ | 124 | t; \ |
| 131 | }) | 125 | }) |
| 132 | 126 | ||
| 133 | #define p4_config_unpack_cache_event(v) (((u64)(v)) & P4_CCCR_CACHE_OPS_MASK) | ||
| 134 | |||
| 135 | #define P4_CONFIG_HT_SHIFT 63 | 127 | #define P4_CONFIG_HT_SHIFT 63 |
| 136 | #define P4_CONFIG_HT (1ULL << P4_CONFIG_HT_SHIFT) | 128 | #define P4_CONFIG_HT (1ULL << P4_CONFIG_HT_SHIFT) |
| 137 | 129 | ||
| @@ -214,6 +206,12 @@ static inline u32 p4_default_escr_conf(int cpu, int exclude_os, int exclude_usr) | |||
| 214 | return escr; | 206 | return escr; |
| 215 | } | 207 | } |
| 216 | 208 | ||
| 209 | /* | ||
| 210 | * This are the events which should be used in "Event Select" | ||
| 211 | * field of ESCR register, they are like unique keys which allow | ||
| 212 | * the kernel to determinate which CCCR and COUNTER should be | ||
| 213 | * used to track an event | ||
| 214 | */ | ||
| 217 | enum P4_EVENTS { | 215 | enum P4_EVENTS { |
| 218 | P4_EVENT_TC_DELIVER_MODE, | 216 | P4_EVENT_TC_DELIVER_MODE, |
| 219 | P4_EVENT_BPU_FETCH_REQUEST, | 217 | P4_EVENT_BPU_FETCH_REQUEST, |
| @@ -561,7 +559,7 @@ enum P4_EVENT_OPCODES { | |||
| 561 | * a caller should use P4_ESCR_EMASK_NAME helper to | 559 | * a caller should use P4_ESCR_EMASK_NAME helper to |
| 562 | * pick the EventMask needed, for example | 560 | * pick the EventMask needed, for example |
| 563 | * | 561 | * |
| 564 | * P4_ESCR_EMASK_NAME(P4_EVENT_TC_DELIVER_MODE, DD) | 562 | * P4_ESCR_EMASK_BIT(P4_EVENT_TC_DELIVER_MODE, DD) |
| 565 | */ | 563 | */ |
| 566 | enum P4_ESCR_EMASKS { | 564 | enum P4_ESCR_EMASKS { |
| 567 | P4_GEN_ESCR_EMASK(P4_EVENT_TC_DELIVER_MODE, DD, 0), | 565 | P4_GEN_ESCR_EMASK(P4_EVENT_TC_DELIVER_MODE, DD, 0), |
| @@ -753,43 +751,50 @@ enum P4_ESCR_EMASKS { | |||
| 753 | P4_GEN_ESCR_EMASK(P4_EVENT_INSTR_COMPLETED, BOGUS, 1), | 751 | P4_GEN_ESCR_EMASK(P4_EVENT_INSTR_COMPLETED, BOGUS, 1), |
| 754 | }; | 752 | }; |
| 755 | 753 | ||
| 756 | /* P4 PEBS: stale for a while */ | 754 | /* |
| 757 | #define P4_PEBS_METRIC_MASK 0x00001fffU | 755 | * P4 PEBS specifics (Replay Event only) |
| 758 | #define P4_PEBS_UOB_TAG 0x01000000U | 756 | * |
| 759 | #define P4_PEBS_ENABLE 0x02000000U | 757 | * Format (bits): |
| 760 | 758 | * 0-6: metric from P4_PEBS_METRIC enum | |
| 761 | /* Replay metrics for MSR_IA32_PEBS_ENABLE and MSR_P4_PEBS_MATRIX_VERT */ | 759 | * 7 : reserved |
| 762 | #define P4_PEBS__1stl_cache_load_miss_retired 0x3000001 | 760 | * 8 : reserved |
| 763 | #define P4_PEBS__2ndl_cache_load_miss_retired 0x3000002 | 761 | * 9-11 : reserved |
| 764 | #define P4_PEBS__dtlb_load_miss_retired 0x3000004 | 762 | * |
| 765 | #define P4_PEBS__dtlb_store_miss_retired 0x3000004 | 763 | * Note we have UOP and PEBS bits reserved for now |
| 766 | #define P4_PEBS__dtlb_all_miss_retired 0x3000004 | 764 | * just in case if we will need them once |
| 767 | #define P4_PEBS__tagged_mispred_branch 0x3018000 | 765 | */ |
| 768 | #define P4_PEBS__mob_load_replay_retired 0x3000200 | 766 | #define P4_PEBS_CONFIG_ENABLE (1 << 7) |
| 769 | #define P4_PEBS__split_load_retired 0x3000400 | 767 | #define P4_PEBS_CONFIG_UOP_TAG (1 << 8) |
| 770 | #define P4_PEBS__split_store_retired 0x3000400 | 768 | #define P4_PEBS_CONFIG_METRIC_MASK 0x3f |
| 771 | 769 | #define P4_PEBS_CONFIG_MASK 0xff | |
| 772 | #define P4_VERT__1stl_cache_load_miss_retired 0x0000001 | 770 | |
| 773 | #define P4_VERT__2ndl_cache_load_miss_retired 0x0000001 | 771 | /* |
| 774 | #define P4_VERT__dtlb_load_miss_retired 0x0000001 | 772 | * mem: Only counters MSR_IQ_COUNTER4 (16) and |
| 775 | #define P4_VERT__dtlb_store_miss_retired 0x0000002 | 773 | * MSR_IQ_COUNTER5 (17) are allowed for PEBS sampling |
| 776 | #define P4_VERT__dtlb_all_miss_retired 0x0000003 | 774 | */ |
| 777 | #define P4_VERT__tagged_mispred_branch 0x0000010 | 775 | #define P4_PEBS_ENABLE 0x02000000U |
| 778 | #define P4_VERT__mob_load_replay_retired 0x0000001 | 776 | #define P4_PEBS_ENABLE_UOP_TAG 0x01000000U |
| 779 | #define P4_VERT__split_load_retired 0x0000001 | 777 | |
| 780 | #define P4_VERT__split_store_retired 0x0000002 | 778 | #define p4_config_unpack_metric(v) (((u64)(v)) & P4_PEBS_CONFIG_METRIC_MASK) |
| 781 | 779 | #define p4_config_unpack_pebs(v) (((u64)(v)) & P4_PEBS_CONFIG_MASK) | |
| 782 | enum P4_CACHE_EVENTS { | 780 | |
| 783 | P4_CACHE__NONE, | 781 | #define p4_config_pebs_has(v, mask) (p4_config_unpack_pebs(v) & (mask)) |
| 784 | 782 | ||
| 785 | P4_CACHE__1stl_cache_load_miss_retired, | 783 | enum P4_PEBS_METRIC { |
| 786 | P4_CACHE__2ndl_cache_load_miss_retired, | 784 | P4_PEBS_METRIC__none, |
| 787 | P4_CACHE__dtlb_load_miss_retired, | 785 | |
| 788 | P4_CACHE__dtlb_store_miss_retired, | 786 | P4_PEBS_METRIC__1stl_cache_load_miss_retired, |
| 789 | P4_CACHE__itlb_reference_hit, | 787 | P4_PEBS_METRIC__2ndl_cache_load_miss_retired, |
| 790 | P4_CACHE__itlb_reference_miss, | 788 | P4_PEBS_METRIC__dtlb_load_miss_retired, |
| 791 | 789 | P4_PEBS_METRIC__dtlb_store_miss_retired, | |
| 792 | P4_CACHE__MAX | 790 | P4_PEBS_METRIC__dtlb_all_miss_retired, |
| 791 | P4_PEBS_METRIC__tagged_mispred_branch, | ||
| 792 | P4_PEBS_METRIC__mob_load_replay_retired, | ||
| 793 | P4_PEBS_METRIC__split_load_retired, | ||
| 794 | P4_PEBS_METRIC__split_store_retired, | ||
| 795 | |||
| 796 | P4_PEBS_METRIC__max | ||
| 793 | }; | 797 | }; |
| 794 | 798 | ||
| 795 | #endif /* PERF_EVENT_P4_H */ | 799 | #endif /* PERF_EVENT_P4_H */ |
| 800 | |||
diff --git a/arch/x86/include/asm/stacktrace.h b/arch/x86/include/asm/stacktrace.h index 4dab78edbad9..2b16a2ad23dc 100644 --- a/arch/x86/include/asm/stacktrace.h +++ b/arch/x86/include/asm/stacktrace.h | |||
| @@ -1,6 +1,13 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 1991, 1992 Linus Torvalds | ||
| 3 | * Copyright (C) 2000, 2001, 2002 Andi Kleen, SuSE Labs | ||
| 4 | */ | ||
| 5 | |||
| 1 | #ifndef _ASM_X86_STACKTRACE_H | 6 | #ifndef _ASM_X86_STACKTRACE_H |
| 2 | #define _ASM_X86_STACKTRACE_H | 7 | #define _ASM_X86_STACKTRACE_H |
| 3 | 8 | ||
| 9 | #include <linux/uaccess.h> | ||
| 10 | |||
| 4 | extern int kstack_depth_to_print; | 11 | extern int kstack_depth_to_print; |
| 5 | 12 | ||
| 6 | struct thread_info; | 13 | struct thread_info; |
| @@ -42,4 +49,46 @@ void dump_trace(struct task_struct *tsk, struct pt_regs *regs, | |||
| 42 | unsigned long *stack, unsigned long bp, | 49 | unsigned long *stack, unsigned long bp, |
| 43 | const struct stacktrace_ops *ops, void *data); | 50 | const struct stacktrace_ops *ops, void *data); |
| 44 | 51 | ||
| 52 | #ifdef CONFIG_X86_32 | ||
| 53 | #define STACKSLOTS_PER_LINE 8 | ||
| 54 | #define get_bp(bp) asm("movl %%ebp, %0" : "=r" (bp) :) | ||
| 55 | #else | ||
| 56 | #define STACKSLOTS_PER_LINE 4 | ||
| 57 | #define get_bp(bp) asm("movq %%rbp, %0" : "=r" (bp) :) | ||
| 58 | #endif | ||
| 59 | |||
| 60 | extern void | ||
| 61 | show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs, | ||
| 62 | unsigned long *stack, unsigned long bp, char *log_lvl); | ||
| 63 | |||
| 64 | extern void | ||
| 65 | show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs, | ||
| 66 | unsigned long *sp, unsigned long bp, char *log_lvl); | ||
| 67 | |||
| 68 | extern unsigned int code_bytes; | ||
| 69 | |||
| 70 | /* The form of the top of the frame on the stack */ | ||
| 71 | struct stack_frame { | ||
| 72 | struct stack_frame *next_frame; | ||
| 73 | unsigned long return_address; | ||
| 74 | }; | ||
| 75 | |||
| 76 | struct stack_frame_ia32 { | ||
| 77 | u32 next_frame; | ||
| 78 | u32 return_address; | ||
| 79 | }; | ||
| 80 | |||
| 81 | static inline unsigned long caller_frame_pointer(void) | ||
| 82 | { | ||
| 83 | struct stack_frame *frame; | ||
| 84 | |||
| 85 | get_bp(frame); | ||
| 86 | |||
| 87 | #ifdef CONFIG_FRAME_POINTER | ||
| 88 | frame = frame->next_frame; | ||
| 89 | #endif | ||
| 90 | |||
| 91 | return (unsigned long)frame; | ||
| 92 | } | ||
| 93 | |||
| 45 | #endif /* _ASM_X86_STACKTRACE_H */ | 94 | #endif /* _ASM_X86_STACKTRACE_H */ |
