x86/oprofile: introduce oprofile_add_data64()
Robert Richter [Wed, 3 Jun 2009 18:54:56 +0000 (20:54 +0200)]
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: Robert Richter <robert.richter@amd.com>

arch/x86/oprofile/op_model_amd.c
drivers/oprofile/cpu_buffer.c
include/linux/oprofile.h

index 6493ef7..cc93046 100644 (file)
@@ -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 */
index 50640cc..a7aae24 100644 (file)
@@ -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)
index dbbe2db..d68d2ed 100644 (file)
@@ -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 */