5 #include <linux/module.h>
6 #include <linux/proc_fs.h>
7 #include <linux/sched.h>
8 #include <linux/timex.h>
9 #include <asm/atomic.h>
10 #include <asm/ptrace.h>
12 #define NR_TESTS 10000000
17 struct proc_dir_entry
*pentry
= NULL
;
20 static inline long test_nop_atomic64_add_return(long i
, atomic64_t
*v
)
23 asm volatile(".byte 0x90;"
25 : "+r" (i
), "+m" (v
->counter
)
30 static inline long test_prefix_atomic64_add_return(long i
, atomic64_t
*v
)
33 asm volatile(".byte 0x3E;"
35 : "+r" (i
), "+m" (v
->counter
)
40 static inline long test_lock_atomic64_add_return(long i
, atomic64_t
*v
)
43 asm volatile(".byte 0xf0;"
45 : "+r" (i
), "+m" (v
->counter
)
62 test_nop_atomic64_add_return(5, &atomicval
);
70 test_prefix_atomic64_add_return(5, &atomicval
);
78 test_lock_atomic64_add_return(5, &atomicval
);
86 void perform_test(const char *name
, void (*callback
)(void))
89 cycles_t cycles1
, cycles2
;
92 local_irq_save(flags
);
94 cycles1
= get_cycles();
96 for(i
=0; i
<NR_TESTS
; i
++) {
100 cycles2
= get_cycles();
102 local_irq_restore(flags
);
103 printk("test %s cycles : %llu\n", name
, cycles2
-cycles1
);
106 static int my_open(struct inode
*inode
, struct file
*file
)
108 printk("NR_TESTS %d\n", NR_TESTS
);
110 perform_test("empty", empty
);
111 printk("value : %ld\n", atomic64_read(&atomicval
));
112 perform_test("test 1-byte nop xadd", testnop
);
113 printk("value : %ld\n", atomic64_read(&atomicval
));
114 perform_test("test DS override prefix xadd", testprefix
);
115 printk("value : %ld\n", atomic64_read(&atomicval
));
116 perform_test("test LOCK xadd", testlock
);
117 printk("value : %ld\n", atomic64_read(&atomicval
));
123 static struct file_operations my_operations
= {
127 int init_module(void)
129 pentry
= create_proc_entry("testprefix", 0444, NULL
);
131 pentry
->proc_fops
= &my_operations
;
136 void cleanup_module(void)
138 remove_proc_entry("testprefix", NULL
);
141 MODULE_LICENSE("GPL");
142 MODULE_AUTHOR("Mathieu Desnoyers");
143 MODULE_DESCRIPTION("prefix test");