Commit | Line | Data |
---|---|---|
85c51c51 RB |
1 | #include <linux/cpumask.h> |
2 | #include <linux/debugfs.h> | |
3 | #include <linux/fs.h> | |
4 | #include <linux/init.h> | |
5 | #include <linux/percpu.h> | |
6 | #include <linux/types.h> | |
75dcfc1d | 7 | #include <asm/debug.h> |
85c51c51 RB |
8 | #include <asm/fpu_emulator.h> |
9 | #include <asm/local.h> | |
10 | ||
11 | DEFINE_PER_CPU(struct mips_fpu_emulator_stats, fpuemustats); | |
12 | ||
13 | static int fpuemu_stat_get(void *data, u64 *val) | |
14 | { | |
15 | int cpu; | |
16 | unsigned long sum = 0; | |
17 | ||
18 | for_each_online_cpu(cpu) { | |
19 | struct mips_fpu_emulator_stats *ps; | |
20 | local_t *pv; | |
21 | ||
22 | ps = &per_cpu(fpuemustats, cpu); | |
23 | pv = (void *)ps + (unsigned long)data; | |
24 | sum += local_read(pv); | |
25 | } | |
26 | *val = sum; | |
27 | return 0; | |
28 | } | |
29 | DEFINE_SIMPLE_ATTRIBUTE(fops_fpuemu_stat, fpuemu_stat_get, NULL, "%llu\n"); | |
30 | ||
85c51c51 RB |
31 | static int __init debugfs_fpuemu(void) |
32 | { | |
33 | struct dentry *d, *dir; | |
34 | ||
35 | if (!mips_debugfs_dir) | |
36 | return -ENODEV; | |
37 | dir = debugfs_create_dir("fpuemustats", mips_debugfs_dir); | |
38 | if (!dir) | |
39 | return -ENOMEM; | |
40 | ||
47fa0c02 RB |
41 | #define FPU_EMU_STAT_OFFSET(m) \ |
42 | offsetof(struct mips_fpu_emulator_stats, m) | |
43 | ||
44 | #define FPU_STAT_CREATE(m) \ | |
45 | do { \ | |
46 | d = debugfs_create_file(#m , S_IRUGO, dir, \ | |
47 | (void *)FPU_EMU_STAT_OFFSET(m), \ | |
48 | &fops_fpuemu_stat); \ | |
49 | if (!d) \ | |
50 | return -ENOMEM; \ | |
51 | } while (0) | |
85c51c51 RB |
52 | |
53 | FPU_STAT_CREATE(emulated); | |
54 | FPU_STAT_CREATE(loads); | |
55 | FPU_STAT_CREATE(stores); | |
56 | FPU_STAT_CREATE(cp1ops); | |
57 | FPU_STAT_CREATE(cp1xops); | |
58 | FPU_STAT_CREATE(errors); | |
c4103526 DCZ |
59 | FPU_STAT_CREATE(ieee754_inexact); |
60 | FPU_STAT_CREATE(ieee754_underflow); | |
61 | FPU_STAT_CREATE(ieee754_overflow); | |
62 | FPU_STAT_CREATE(ieee754_zerodiv); | |
63 | FPU_STAT_CREATE(ieee754_invalidop); | |
2707cd29 | 64 | FPU_STAT_CREATE(ds_emul); |
85c51c51 RB |
65 | |
66 | return 0; | |
67 | } | |
1249ed35 | 68 | arch_initcall(debugfs_fpuemu); |