#include <linux/timex.h>
#include <linux/marker.h>
#include <asm/ptrace.h>
+#include <asm/system.h>
+
static void noinline test2(const struct marker *mdata,
void *call_private, ...)
{
+ unsigned char *ins = __builtin_return_address(0) - 5;
+#if 0
/* not called */
- printk("blah\n");
+ printk("ip %p\n", __builtin_return_address(0));
+ printk("prev_ins %hX %hX %hX %hX %hX\n",
+ ins[0], ins[1], ins[2], ins[3], ins[4]);
+#endif //0
+ ins[0] = 0x90;
+ ins[1] = 0x8d;
+ ins[2] = 0x74;
+ ins[3] = 0x26;
+ ins[4] = 0x00;
}
/*
//asm volatile ("");
struct proc_dir_entry *pentry = NULL;
+char temp0[8192];
+int temp[8192];
+char temp5[8192];
+
static inline void test(unsigned long arg, unsigned long arg2)
{
+#ifdef CACHEFLUSH
+ wbinvd();
+#endif
+ temp[2] = (temp[0] + 60) << 10;
+ temp[3] = (temp[2] + 60) << 10;
+ temp[4] = (temp[3] + 60) << 10;
+ temp[0] = (temp[4] + 60) << 10;
//asm volatile ("");
//__my_trace_mark(1, kernel_debug_test, NULL, "%d %d %ld %ld", 2, current->pid, arg, arg2);
+ barrier();
test2(NULL, NULL, 2, current->pid, arg, arg2);
+ barrier();
//__my_trace_mark(0, kernel_debug_test, NULL, "%d %d %ld %ld", 2, current->pid, arg, arg2);
}
unsigned long flags;
local_irq_save(flags);
+#ifdef CACHEFLUSH
+ wbinvd(); /* initial write back, without cycle count */
+#endif
rdtsc_barrier();
cycles1 = get_cycles();
rdtsc_barrier();
- for(i=0; i<20000; i++) {
+ for(i=0; i<2000; i++) {
+ test(i, i);
+ test(i, i);
+ test(i, i);
+ test(i, i);
+ test(i, i);
+ test(i, i);
+ test(i, i);
+ test(i, i);
+ test(i, i);
test(i, i);
}
rdtsc_barrier();
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Mathieu Desnoyers");
MODULE_DESCRIPTION("Marker Test");
+MODULE_VERSION("1.0");