Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+24 −33
Original line number Diff line number Diff line
@@ -22,7 +22,6 @@

#include "op_x86_model.h"
#include "op_counter.h"
#include "../../../drivers/oprofile/cpu_buffer.h"

#define NUM_COUNTERS 4
#define NUM_CONTROLS 4
@@ -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_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_OP_SIZE	12

@@ -174,16 +165,16 @@ op_amd_handle_ibs(struct pt_regs * const regs,
		rdmsr(MSR_AMD64_IBSFETCHCTL, low, high);
		if (high & IBS_FETCH_HIGH_VALID_BIT) {
			rdmsrl(MSR_AMD64_IBSFETCHLINAD, msr);
			oprofile_add_data(&entry, regs, msr, IBS_FETCH_CODE,
					  IBS_FETCH_SIZE);
			op_cpu_buffer_add_data(&entry, (u32)msr);
			op_cpu_buffer_add_data(&entry, (u32)(msr >> 32));
			op_cpu_buffer_add_data(&entry, low);
			op_cpu_buffer_add_data(&entry, high);
			oprofile_write_reserve(&entry, regs, msr,
					       IBS_FETCH_CODE, IBS_FETCH_SIZE);
			oprofile_add_data(&entry, (u32)msr);
			oprofile_add_data(&entry, (u32)(msr >> 32));
			oprofile_add_data(&entry, low);
			oprofile_add_data(&entry, high);
			rdmsrl(MSR_AMD64_IBSFETCHPHYSAD, msr);
			op_cpu_buffer_add_data(&entry, (u32)msr);
			op_cpu_buffer_add_data(&entry, (u32)(msr >> 32));
			op_cpu_buffer_write_commit(&entry);
			oprofile_add_data(&entry, (u32)msr);
			oprofile_add_data(&entry, (u32)(msr >> 32));
			oprofile_write_commit(&entry);

			/* reenable the IRQ */
			high &= ~IBS_FETCH_HIGH_VALID_BIT;
@@ -197,26 +188,26 @@ op_amd_handle_ibs(struct pt_regs * const regs,
		rdmsr(MSR_AMD64_IBSOPCTL, low, high);
		if (low & IBS_OP_LOW_VALID_BIT) {
			rdmsrl(MSR_AMD64_IBSOPRIP, msr);
			oprofile_add_data(&entry, regs, msr, IBS_OP_CODE,
					  IBS_OP_SIZE);
			op_cpu_buffer_add_data(&entry, (u32)msr);
			op_cpu_buffer_add_data(&entry, (u32)(msr >> 32));
			oprofile_write_reserve(&entry, regs, msr,
					       IBS_OP_CODE, IBS_OP_SIZE);
			oprofile_add_data(&entry, (u32)msr);
			oprofile_add_data(&entry, (u32)(msr >> 32));
			rdmsrl(MSR_AMD64_IBSOPDATA, msr);
			op_cpu_buffer_add_data(&entry, (u32)msr);
			op_cpu_buffer_add_data(&entry, (u32)(msr >> 32));
			oprofile_add_data(&entry, (u32)msr);
			oprofile_add_data(&entry, (u32)(msr >> 32));
			rdmsrl(MSR_AMD64_IBSOPDATA2, msr);
			op_cpu_buffer_add_data(&entry, (u32)msr);
			op_cpu_buffer_add_data(&entry, (u32)(msr >> 32));
			oprofile_add_data(&entry, (u32)msr);
			oprofile_add_data(&entry, (u32)(msr >> 32));
			rdmsrl(MSR_AMD64_IBSOPDATA3, msr);
			op_cpu_buffer_add_data(&entry, (u32)msr);
			op_cpu_buffer_add_data(&entry, (u32)(msr >> 32));
			oprofile_add_data(&entry, (u32)msr);
			oprofile_add_data(&entry, (u32)(msr >> 32));
			rdmsrl(MSR_AMD64_IBSDCLINAD, msr);
			op_cpu_buffer_add_data(&entry, (u32)msr);
			op_cpu_buffer_add_data(&entry, (u32)(msr >> 32));
			oprofile_add_data(&entry, (u32)msr);
			oprofile_add_data(&entry, (u32)(msr >> 32));
			rdmsrl(MSR_AMD64_IBSDCPHYSAD, msr);
			op_cpu_buffer_add_data(&entry, (u32)msr);
			op_cpu_buffer_add_data(&entry, (u32)(msr >> 32));
			op_cpu_buffer_write_commit(&entry);
			oprofile_add_data(&entry, (u32)msr);
			oprofile_add_data(&entry, (u32)(msr >> 32));
			oprofile_write_commit(&entry);

			/* reenable the IRQ */
			high = 0;
+14 −3
Original line number Diff line number Diff line
@@ -364,10 +364,11 @@ void oprofile_add_sample(struct pt_regs * const regs, unsigned long event)
/*
 * Add samples with data to the ring buffer.
 *
 * Use op_cpu_buffer_add_data(&entry, val) to add data and
 * op_cpu_buffer_write_commit(&entry) to commit the sample.
 * Use oprofile_add_data(&entry, val) to add data and
 * 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)
{
	struct op_sample *sample;
@@ -395,6 +396,16 @@ fail:
	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)
{
	struct oprofile_cpu_buffer *cpu_buf = &__get_cpu_var(cpu_buffer);
+1 −7
Original line number Diff line number Diff line
@@ -35,13 +35,7 @@ struct op_sample {
	unsigned long data[0];
};

struct op_entry {
	struct ring_buffer_event *event;
	struct op_sample *sample;
	unsigned long irq_flags;
	unsigned long size;
	unsigned long *data;
};
struct op_entry;

struct oprofile_cpu_buffer {
	unsigned long buffer_size;
+18 −0
Original line number Diff line number Diff line
@@ -164,4 +164,22 @@ void oprofile_put_buff(unsigned long *buf, unsigned int start,
unsigned long oprofile_get_cpu_buffer_size(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 */