Commit 14f0ca8e authored by Robert Richter's avatar Robert Richter

oprofile: make new cpu buffer functions part of the api

This patch creates the new functions

 oprofile_write_reserve()
 oprofile_add_data()
 oprofile_write_commit()

and makes them part of the oprofile api.
Signed-off-by: default avatarRobert Richter <robert.richter@amd.com>
parent ebf8d974
...@@ -22,7 +22,6 @@ ...@@ -22,7 +22,6 @@
#include "op_x86_model.h" #include "op_x86_model.h"
#include "op_counter.h" #include "op_counter.h"
#include "../../../drivers/oprofile/cpu_buffer.h"
#define NUM_COUNTERS 4 #define NUM_COUNTERS 4
#define NUM_CONTROLS 4 #define NUM_CONTROLS 4
...@@ -61,14 +60,6 @@ static unsigned long reset_value[NUM_COUNTERS]; ...@@ -61,14 +60,6 @@ static unsigned long reset_value[NUM_COUNTERS];
#define IBS_OP_LOW_VALID_BIT (1ULL<<18) /* bit 18 */ #define IBS_OP_LOW_VALID_BIT (1ULL<<18) /* bit 18 */
#define IBS_OP_LOW_ENABLE (1ULL<<17) /* bit 17 */ #define IBS_OP_LOW_ENABLE (1ULL<<17) /* bit 17 */
/*
* The function interface needs to be fixed, something like add
* data. Should then be added to linux/oprofile.h.
*/
extern
void oprofile_add_data(struct op_entry *entry, struct pt_regs * const regs,
unsigned long pc, int code, int size);
#define IBS_FETCH_SIZE 6 #define IBS_FETCH_SIZE 6
#define IBS_OP_SIZE 12 #define IBS_OP_SIZE 12
...@@ -174,16 +165,16 @@ op_amd_handle_ibs(struct pt_regs * const regs, ...@@ -174,16 +165,16 @@ op_amd_handle_ibs(struct pt_regs * const regs,
rdmsr(MSR_AMD64_IBSFETCHCTL, low, high); rdmsr(MSR_AMD64_IBSFETCHCTL, low, high);
if (high & IBS_FETCH_HIGH_VALID_BIT) { if (high & IBS_FETCH_HIGH_VALID_BIT) {
rdmsrl(MSR_AMD64_IBSFETCHLINAD, msr); rdmsrl(MSR_AMD64_IBSFETCHLINAD, msr);
oprofile_add_data(&entry, regs, msr, IBS_FETCH_CODE, oprofile_write_reserve(&entry, regs, msr,
IBS_FETCH_SIZE); IBS_FETCH_CODE, IBS_FETCH_SIZE);
op_cpu_buffer_add_data(&entry, (u32)msr); oprofile_add_data(&entry, (u32)msr);
op_cpu_buffer_add_data(&entry, (u32)(msr >> 32)); oprofile_add_data(&entry, (u32)(msr >> 32));
op_cpu_buffer_add_data(&entry, low); oprofile_add_data(&entry, low);
op_cpu_buffer_add_data(&entry, high); oprofile_add_data(&entry, high);
rdmsrl(MSR_AMD64_IBSFETCHPHYSAD, msr); rdmsrl(MSR_AMD64_IBSFETCHPHYSAD, msr);
op_cpu_buffer_add_data(&entry, (u32)msr); oprofile_add_data(&entry, (u32)msr);
op_cpu_buffer_add_data(&entry, (u32)(msr >> 32)); oprofile_add_data(&entry, (u32)(msr >> 32));
op_cpu_buffer_write_commit(&entry); oprofile_write_commit(&entry);
/* reenable the IRQ */ /* reenable the IRQ */
high &= ~IBS_FETCH_HIGH_VALID_BIT; high &= ~IBS_FETCH_HIGH_VALID_BIT;
...@@ -197,26 +188,26 @@ op_amd_handle_ibs(struct pt_regs * const regs, ...@@ -197,26 +188,26 @@ op_amd_handle_ibs(struct pt_regs * const regs,
rdmsr(MSR_AMD64_IBSOPCTL, low, high); rdmsr(MSR_AMD64_IBSOPCTL, low, high);
if (low & IBS_OP_LOW_VALID_BIT) { if (low & IBS_OP_LOW_VALID_BIT) {
rdmsrl(MSR_AMD64_IBSOPRIP, msr); rdmsrl(MSR_AMD64_IBSOPRIP, msr);
oprofile_add_data(&entry, regs, msr, IBS_OP_CODE, oprofile_write_reserve(&entry, regs, msr,
IBS_OP_SIZE); IBS_OP_CODE, IBS_OP_SIZE);
op_cpu_buffer_add_data(&entry, (u32)msr); oprofile_add_data(&entry, (u32)msr);
op_cpu_buffer_add_data(&entry, (u32)(msr >> 32)); oprofile_add_data(&entry, (u32)(msr >> 32));
rdmsrl(MSR_AMD64_IBSOPDATA, msr); rdmsrl(MSR_AMD64_IBSOPDATA, msr);
op_cpu_buffer_add_data(&entry, (u32)msr); oprofile_add_data(&entry, (u32)msr);
op_cpu_buffer_add_data(&entry, (u32)(msr >> 32)); oprofile_add_data(&entry, (u32)(msr >> 32));
rdmsrl(MSR_AMD64_IBSOPDATA2, msr); rdmsrl(MSR_AMD64_IBSOPDATA2, msr);
op_cpu_buffer_add_data(&entry, (u32)msr); oprofile_add_data(&entry, (u32)msr);
op_cpu_buffer_add_data(&entry, (u32)(msr >> 32)); oprofile_add_data(&entry, (u32)(msr >> 32));
rdmsrl(MSR_AMD64_IBSOPDATA3, msr); rdmsrl(MSR_AMD64_IBSOPDATA3, msr);
op_cpu_buffer_add_data(&entry, (u32)msr); oprofile_add_data(&entry, (u32)msr);
op_cpu_buffer_add_data(&entry, (u32)(msr >> 32)); oprofile_add_data(&entry, (u32)(msr >> 32));
rdmsrl(MSR_AMD64_IBSDCLINAD, msr); rdmsrl(MSR_AMD64_IBSDCLINAD, msr);
op_cpu_buffer_add_data(&entry, (u32)msr); oprofile_add_data(&entry, (u32)msr);
op_cpu_buffer_add_data(&entry, (u32)(msr >> 32)); oprofile_add_data(&entry, (u32)(msr >> 32));
rdmsrl(MSR_AMD64_IBSDCPHYSAD, msr); rdmsrl(MSR_AMD64_IBSDCPHYSAD, msr);
op_cpu_buffer_add_data(&entry, (u32)msr); oprofile_add_data(&entry, (u32)msr);
op_cpu_buffer_add_data(&entry, (u32)(msr >> 32)); oprofile_add_data(&entry, (u32)(msr >> 32));
op_cpu_buffer_write_commit(&entry); oprofile_write_commit(&entry);
/* reenable the IRQ */ /* reenable the IRQ */
high = 0; high = 0;
......
...@@ -364,10 +364,11 @@ void oprofile_add_sample(struct pt_regs * const regs, unsigned long event) ...@@ -364,10 +364,11 @@ void oprofile_add_sample(struct pt_regs * const regs, unsigned long event)
/* /*
* Add samples with data to the ring buffer. * Add samples with data to the ring buffer.
* *
* Use op_cpu_buffer_add_data(&entry, val) to add data and * Use oprofile_add_data(&entry, val) to add data and
* op_cpu_buffer_write_commit(&entry) to commit the sample. * oprofile_write_commit(&entry) to commit the sample.
*/ */
void oprofile_add_data(struct op_entry *entry, struct pt_regs * const regs, void
oprofile_write_reserve(struct op_entry *entry, struct pt_regs * const regs,
unsigned long pc, int code, int size) unsigned long pc, int code, int size)
{ {
struct op_sample *sample; struct op_sample *sample;
...@@ -395,6 +396,16 @@ void oprofile_add_data(struct op_entry *entry, struct pt_regs * const regs, ...@@ -395,6 +396,16 @@ void oprofile_add_data(struct op_entry *entry, struct pt_regs * const regs,
cpu_buf->sample_lost_overflow++; cpu_buf->sample_lost_overflow++;
} }
int oprofile_add_data(struct op_entry *entry, unsigned long val)
{
return op_cpu_buffer_add_data(entry, val);
}
int oprofile_write_commit(struct op_entry *entry)
{
return op_cpu_buffer_write_commit(entry);
}
void oprofile_add_pc(unsigned long pc, int is_kernel, unsigned long event) void oprofile_add_pc(unsigned long pc, int is_kernel, unsigned long event)
{ {
struct oprofile_cpu_buffer *cpu_buf = &__get_cpu_var(cpu_buffer); struct oprofile_cpu_buffer *cpu_buf = &__get_cpu_var(cpu_buffer);
......
...@@ -35,13 +35,7 @@ struct op_sample { ...@@ -35,13 +35,7 @@ struct op_sample {
unsigned long data[0]; unsigned long data[0];
}; };
struct op_entry { struct op_entry;
struct ring_buffer_event *event;
struct op_sample *sample;
unsigned long irq_flags;
unsigned long size;
unsigned long *data;
};
struct oprofile_cpu_buffer { struct oprofile_cpu_buffer {
unsigned long buffer_size; unsigned long buffer_size;
......
...@@ -164,4 +164,22 @@ void oprofile_put_buff(unsigned long *buf, unsigned int start, ...@@ -164,4 +164,22 @@ void oprofile_put_buff(unsigned long *buf, unsigned int start,
unsigned long oprofile_get_cpu_buffer_size(void); unsigned long oprofile_get_cpu_buffer_size(void);
void oprofile_cpu_buffer_inc_smpl_lost(void); void oprofile_cpu_buffer_inc_smpl_lost(void);
/* cpu buffer functions */
struct op_sample;
struct op_entry {
struct ring_buffer_event *event;
struct op_sample *sample;
unsigned long irq_flags;
unsigned long size;
unsigned long *data;
};
void oprofile_write_reserve(struct op_entry *entry,
struct pt_regs * const regs,
unsigned long pc, int code, int size);
int oprofile_add_data(struct op_entry *entry, unsigned long val);
int oprofile_write_commit(struct op_entry *entry);
#endif /* OPROFILE_H */ #endif /* OPROFILE_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment