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

Commit 51563a0e authored by Robert Richter's avatar Robert Richter
Browse files

x86/oprofile: introduce oprofile_add_data64()



The IBS implemention writes 64 bit register values to the cpu buffer
by writing two 32 values using oprofile_add_data(). This patch
introduces oprofile_add_data64() to write a single 64 bit value to the
buffer.

Signed-off-by: default avatarRobert Richter <robert.richter@amd.com>
parent c572ae4e
Loading
Loading
Loading
Loading
+9 −18
Original line number Diff line number Diff line
@@ -140,13 +140,10 @@ op_amd_handle_ibs(struct pt_regs * const regs,
			rdmsrl(MSR_AMD64_IBSFETCHLINAD, val);
			oprofile_write_reserve(&entry, regs, val,
					       IBS_FETCH_CODE, IBS_FETCH_SIZE);
			oprofile_add_data(&entry, (u32)val);
			oprofile_add_data(&entry, (u32)(val >> 32));
			oprofile_add_data(&entry, (u32)ctl);
			oprofile_add_data(&entry, (u32)(ctl >> 32));
			oprofile_add_data64(&entry, val);
			oprofile_add_data64(&entry, ctl);
			rdmsrl(MSR_AMD64_IBSFETCHPHYSAD, val);
			oprofile_add_data(&entry, (u32)val);
			oprofile_add_data(&entry, (u32)(val >> 32));
			oprofile_add_data64(&entry, val);
			oprofile_write_commit(&entry);

			/* reenable the IRQ */
@@ -162,23 +159,17 @@ op_amd_handle_ibs(struct pt_regs * const regs,
			rdmsrl(MSR_AMD64_IBSOPRIP, val);
			oprofile_write_reserve(&entry, regs, val,
					       IBS_OP_CODE, IBS_OP_SIZE);
			oprofile_add_data(&entry, (u32)val);
			oprofile_add_data(&entry, (u32)(val >> 32));
			oprofile_add_data64(&entry, val);
			rdmsrl(MSR_AMD64_IBSOPDATA, val);
			oprofile_add_data(&entry, (u32)val);
			oprofile_add_data(&entry, (u32)(val >> 32));
			oprofile_add_data64(&entry, val);
			rdmsrl(MSR_AMD64_IBSOPDATA2, val);
			oprofile_add_data(&entry, (u32)val);
			oprofile_add_data(&entry, (u32)(val >> 32));
			oprofile_add_data64(&entry, val);
			rdmsrl(MSR_AMD64_IBSOPDATA3, val);
			oprofile_add_data(&entry, (u32)val);
			oprofile_add_data(&entry, (u32)(val >> 32));
			oprofile_add_data64(&entry, val);
			rdmsrl(MSR_AMD64_IBSDCLINAD, val);
			oprofile_add_data(&entry, (u32)val);
			oprofile_add_data(&entry, (u32)(val >> 32));
			oprofile_add_data64(&entry, val);
			rdmsrl(MSR_AMD64_IBSDCPHYSAD, val);
			oprofile_add_data(&entry, (u32)val);
			oprofile_add_data(&entry, (u32)(val >> 32));
			oprofile_add_data64(&entry, val);
			oprofile_write_commit(&entry);

			/* reenable the IRQ */
+15 −0
Original line number Diff line number Diff line
@@ -406,6 +406,21 @@ int oprofile_add_data(struct op_entry *entry, unsigned long val)
	return op_cpu_buffer_add_data(entry, val);
}

int oprofile_add_data64(struct op_entry *entry, u64 val)
{
	if (!entry->event)
		return 0;
	if (op_cpu_buffer_get_size(entry) < 2)
		/*
		 * the function returns 0 to indicate a too small
		 * buffer, even if there is some space left
		 */
		return 0;
	if (!op_cpu_buffer_add_data(entry, (u32)val))
		return 0;
	return op_cpu_buffer_add_data(entry, (u32)(val >> 32));
}

int oprofile_write_commit(struct op_entry *entry)
{
	if (!entry->event)
+1 −0
Original line number Diff line number Diff line
@@ -179,6 +179,7 @@ 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_add_data64(struct op_entry *entry, u64 val);
int oprofile_write_commit(struct op_entry *entry);

#endif /* OPROFILE_H */