1 /** 2 * @file op_x86_model.h 3 * interface to x86 model-specific MSR operations 4 * 5 * @remark Copyright 2002 OProfile authors 6 * @remark Read the file COPYING 7 * 8 * @author Graydon Hoare 9 * @author Robert Richter <robert.richter@amd.com> 10 */ 11 12 #ifndef OP_X86_MODEL_H 13 #define OP_X86_MODEL_H 14 15 #include <asm/types.h> 16 #include <asm/perf_event.h> 17 18 struct op_msr { 19 unsigned long addr; 20 u64 saved; 21 }; 22 23 struct op_msrs { 24 struct op_msr *counters; 25 struct op_msr *controls; 26 struct op_msr *multiplex; 27 }; 28 29 struct pt_regs; 30 31 struct oprofile_operations; 32 33 /* The model vtable abstracts the differences between 34 * various x86 CPU models' perfctr support. 35 */ 36 struct op_x86_model_spec { 37 unsigned int num_counters; 38 unsigned int num_controls; 39 unsigned int num_virt_counters; 40 u64 reserved; 41 u16 event_mask; 42 int (*init)(struct oprofile_operations *ops); 43 int (*fill_in_addresses)(struct op_msrs * const msrs); 44 void (*setup_ctrs)(struct op_x86_model_spec const *model, 45 struct op_msrs const * const msrs); 46 int (*check_ctrs)(struct pt_regs * const regs, 47 struct op_msrs const * const msrs); 48 void (*start)(struct op_msrs const * const msrs); 49 void (*stop)(struct op_msrs const * const msrs); 50 void (*shutdown)(struct op_msrs const * const msrs); 51 #ifdef CONFIG_OPROFILE_EVENT_MULTIPLEX 52 void (*switch_ctrl)(struct op_x86_model_spec const *model, 53 struct op_msrs const * const msrs); 54 #endif 55 }; 56 57 struct op_counter_config; 58 op_x86_warn_in_use(int counter)59static inline void op_x86_warn_in_use(int counter) 60 { 61 /* 62 * The warning indicates an already running counter. If 63 * oprofile doesn't collect data, then try using a different 64 * performance counter on your platform to monitor the desired 65 * event. Delete counter #%d from the desired event by editing 66 * the /usr/share/oprofile/%s/<cpu>/events file. If the event 67 * cannot be monitored by any other counter, contact your 68 * hardware or BIOS vendor. 69 */ 70 pr_warning("oprofile: counter #%d on cpu #%d may already be used\n", 71 counter, smp_processor_id()); 72 } 73 op_x86_warn_reserved(int counter)74static inline void op_x86_warn_reserved(int counter) 75 { 76 pr_warning("oprofile: counter #%d is already reserved\n", counter); 77 } 78 79 extern u64 op_x86_get_ctrl(struct op_x86_model_spec const *model, 80 struct op_counter_config *counter_config); 81 extern int op_x86_phys_to_virt(int phys); 82 extern int op_x86_virt_to_phys(int virt); 83 84 extern struct op_x86_model_spec op_ppro_spec; 85 extern struct op_x86_model_spec op_p4_spec; 86 extern struct op_x86_model_spec op_p4_ht2_spec; 87 extern struct op_x86_model_spec op_amd_spec; 88 extern struct op_x86_model_spec op_arch_perfmon_spec; 89 90 #endif /* OP_X86_MODEL_H */ 91