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 int test_nop_atomic_add_return(int i
, atomic_t
*v
)
23 asm volatile(".byte 0x90;"
25 : "+r" (i
), "+m" (v
->counter
)
30 static inline int test_prefix_atomic_add_return(int i
, atomic_t
*v
)
33 asm volatile(".byte 0x3E;"
35 : "+r" (i
), "+m" (v
->counter
)
40 static inline int test_lock_atomic_add_return(int i
, atomic_t
*v
)
43 asm volatile(".byte 0xf0;"
45 : "+r" (i
), "+m" (v
->counter
)
62 test_nop_atomic_add_return(5, &atomicval
);
70 test_prefix_atomic_add_return(5, &atomicval
);
78 test_lock_atomic_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 perform_test("test 1-byte nop xadd", testnop
);
112 perform_test("test DS override prefix xadd", testprefix
);
113 perform_test("test LOCK xadd", testlock
);
119 static struct file_operations my_operations
= {
123 int init_module(void)
125 pentry
= create_proc_entry("testprefix", 0444, NULL
);
127 pentry
->proc_fops
= &my_operations
;
132 void cleanup_module(void)
134 remove_proc_entry("testprefix", NULL
);
137 MODULE_LICENSE("GPL");
138 MODULE_AUTHOR("Mathieu Desnoyers");
139 MODULE_DESCRIPTION("prefix test");