#pragma once #include "types.h" #include "hw/sh4/dyna/shil.h" void prof_init(); void prof_periodical(); inline void print_array(const char* name, u32* arr,u32 size) { printf("%s = [",name); for(u32 i=0; i\n",name); } struct profiler_cfg { bool enable; struct { struct { u32 executed[shop_max]; u32 host_ops[shop_max]; u32 readm_const; u32 readm_reg; u32 readm_reg_imm; u32 readm_reg_reg; u32 pref_same; u32 writem_const[4]; u32 writem_reg[4]; u32 writem_reg_imm[4]; /* other statistics about opcodes */ void print() { print_head("shil"); print_array("executed",executed,shop_max); print_array("host_ops",host_ops,shop_max); print_elem("readm_const",readm_const); print_elem("readm_reg",readm_reg); print_elem("readm_reg_imm",readm_reg_imm); print_elem("readm_reg_reg",readm_reg_reg); } } shil; struct { //mem,reg || r,w,rw u32 reg_r[sh4_reg_count]; u32 reg_w[sh4_reg_count]; u32 reg_rw[sh4_reg_count]; void print() { print_head("ralloc"); print_array("reg_r",reg_r,sh4_reg_count); print_array("reg_w",reg_w,sh4_reg_count); print_array("reg_rw",reg_rw,sh4_reg_count); } } ralloc; struct { u32 cached; u32 linked_cond; //cond, direct, indirect u32 linked_direct; u32 linked_indirect; u32 callstack_hit; u32 callstack_miss; u32 slowpath; void print() { print_head("bm"); print_elem("bm_cache",cached); print_elem("linked_cond",linked_cond); print_elem("linked_direct",linked_direct); print_elem("linked_indirect",linked_indirect); print_elem("callstack_hit",callstack_hit); print_elem("callstack_miss",callstack_miss); print_elem("slowpath",slowpath); } } bm; struct { u32 call_direct; u32 call_indirect; u32 jump_direct; u32 jump_indirect; u32 cond[2]; //conditional false, true u32 ret; //only indirect u32 force_check; u32 cycles[512]; void print() { print_head("blkrun"); print_elem("call_direct",call_direct); print_elem("call_indirect",call_indirect); print_elem("jump_direct",jump_direct); print_elem("jump_indirect",jump_indirect); print_elem("cond0",cond[0]); print_elem("cond1",cond[1]); print_elem("ret",ret); print_elem("force_check",force_check); print_array("cycles",cycles,512); } } blkrun; void print() { shil.print(); ralloc.print(); bm.print(); blkrun.print(); } } counters; }; extern profiler_cfg prof; void install_prof_handler(int id); void sample_Start(int freq); void sample_Stop(); void sample_Syms(u8* data,u32 len);