2014-04-16 04:46:11 +04:00
# include <linux/cpumask.h>
# include <linux/debugfs.h>
# include <linux/fs.h>
# include <linux/init.h>
# include <linux/percpu.h>
# include <linux/types.h>
2015-09-22 20:10:55 +03:00
# include <asm/debug.h>
2014-04-16 04:46:11 +04:00
# include <asm/fpu_emulator.h>
# include <asm/local.h>
DEFINE_PER_CPU ( struct mips_fpu_emulator_stats , fpuemustats ) ;
static int fpuemu_stat_get ( void * data , u64 * val )
{
int cpu ;
unsigned long sum = 0 ;
for_each_online_cpu ( cpu ) {
struct mips_fpu_emulator_stats * ps ;
local_t * pv ;
ps = & per_cpu ( fpuemustats , cpu ) ;
pv = ( void * ) ps + ( unsigned long ) data ;
sum + = local_read ( pv ) ;
}
* val = sum ;
return 0 ;
}
DEFINE_SIMPLE_ATTRIBUTE ( fops_fpuemu_stat , fpuemu_stat_get , NULL , " %llu \n " ) ;
static int __init debugfs_fpuemu ( void )
{
struct dentry * d , * dir ;
if ( ! mips_debugfs_dir )
return - ENODEV ;
dir = debugfs_create_dir ( " fpuemustats " , mips_debugfs_dir ) ;
if ( ! dir )
return - ENOMEM ;
2014-04-16 13:00:12 +04:00
# define FPU_EMU_STAT_OFFSET(m) \
offsetof ( struct mips_fpu_emulator_stats , m )
# define FPU_STAT_CREATE(m) \
do { \
d = debugfs_create_file ( # m , S_IRUGO , dir , \
( void * ) FPU_EMU_STAT_OFFSET ( m ) , \
& fops_fpuemu_stat ) ; \
if ( ! d ) \
return - ENOMEM ; \
} while ( 0 )
2014-04-16 04:46:11 +04:00
FPU_STAT_CREATE ( emulated ) ;
FPU_STAT_CREATE ( loads ) ;
FPU_STAT_CREATE ( stores ) ;
FPU_STAT_CREATE ( cp1ops ) ;
FPU_STAT_CREATE ( cp1xops ) ;
FPU_STAT_CREATE ( errors ) ;
2014-05-29 23:26:45 +04:00
FPU_STAT_CREATE ( ieee754_inexact ) ;
FPU_STAT_CREATE ( ieee754_underflow ) ;
FPU_STAT_CREATE ( ieee754_overflow ) ;
FPU_STAT_CREATE ( ieee754_zerodiv ) ;
FPU_STAT_CREATE ( ieee754_invalidop ) ;
2014-12-03 22:12:23 +03:00
FPU_STAT_CREATE ( ds_emul ) ;
2014-04-16 04:46:11 +04:00
return 0 ;
}
2015-07-20 10:10:20 +03:00
arch_initcall ( debugfs_fpuemu ) ;