📄 pmla.h
字号:
/* poor mans logic analyzer header file *//* poor mans logic analyzer uses a fast counter (mftb instruction [via get_tbl] in ppc) (OSCR in arm) (rdtscl in i386) that gets saved into a circular buffer for later analysis by a perl script (~/scripts/gdb.pmla.pl) from gdb output from a macro in ~/.gdbinit (dmp)NOTE: this is self initializing AS LONG as the PMLA struct is cleared upon first use *//* #define pmla_cntr() get_tbl() */ /* for __ppc__ */#define pmla_cntr() \({ \ unsigned long temp; \ do { \ temp = *AT91C_TC0_CV | (*AT91C_TC1_CV << 16); \ } while ((temp ^ (*AT91C_TC1_CV << 16)) & 0xffff0000); \ temp; \})/* #define pmla_cntr() rdtscl() */ /* for __i386__ */#define pmla_save(ptr, pmlaid, pmlaparam1, pmlaparam2) \do { \ PMLA_TRACE *pmla_trace; \ if (!ptr->pmla.pmla_stop || (ptr->pmla.pmla_hd != ptr->pmla.pmla_stop)) \ { \ if (ptr->pmla.pmla_hd <= &ptr->pmla.pmla_buf[0]) \ ptr->pmla.pmla_hd = &ptr->pmla.pmla_buf[PMLA_TRACE_SZ]; \ pmla_trace = --ptr->pmla.pmla_hd; \ pmla_trace->id = pmlaid; \ pmla_trace->param1 = pmlaparam1; \ pmla_trace->param2 = pmlaparam2; \ pmla_trace->time = pmla_cntr(); \ } \ } while (0)/* using this one first requires initialization of pmla_hd */#define pmla_mult(ptr, pmlaid, pmlaparam1, pmlaparam2) \do { \ PMLA_TRACE *pmla_trace; \ if (!ptr->pmla.pmla_stop || (ptr->pmla.pmla_hd != ptr->pmla.pmla_stop)) \ { \ if (ptr->pmla.pmla_hd->id != pmlaid) \ { \ if (ptr->pmla.pmla_hd <= &ptr->pmla.pmla_buf[0]) \ ptr->pmla.pmla_hd = &ptr->pmla.pmla_buf[PMLA_TRACE_SZ]; \ ptr->pmla.pmla_hd--; \ } \ pmla_trace = ptr->pmla.pmla_hd; \ pmla_trace->id = pmlaid; \ pmla_trace->param1 = pmlaparam1; \ pmla_trace->param2 = pmlaparam2; \ pmla_trace->time = pmla_cntr(); \ } \ } while (0)#define pmla_trig_center(ptr, pmlaid, pmlaparam1, pmlaparam2) \do { \ PMLA_TRACE *pmla_trace; \ if (ptr->pmla.pmla_hd != ptr->pmla.pmla_stop) \ { \ if (!ptr->pmla.pmla_stop) \ { \ ptr->pmla.pmla_stop = ptr->pmla.pmla_hd - (PMLA_TRACE_SZ / 2); \ if (ptr->pmla.pmla_stop < &ptr->pmla.pmla_buf[0]) \ ptr->pmla.pmla_stop += PMLA_TRACE_SZ; \ } \ if (ptr->pmla.pmla_hd <= &ptr->pmla.pmla_buf[0]) \ ptr->pmla.pmla_hd = &ptr->pmla.pmla_buf[PMLA_TRACE_SZ]; \ pmla_trace = --ptr->pmla.pmla_hd; \ pmla_trace->id = pmlaid; \ pmla_trace->param1 = pmlaparam1; \ pmla_trace->param2 = pmlaparam2; \ pmla_trace->time = pmla_cntr(); \ } \ } while (0)typedef struct pmla_trace { ulong id; /* id number of this timing save */ ulong param1; /* 1st parameter */ ulong param2; /* 2nd parameter */ ulong time; /* where the time get's saved */ }PMLA_TRACE;typedef struct pmla { PMLA_TRACE *pmla_hd; PMLA_TRACE *pmla_stop;#define PMLA_TRACE_SZ 200 PMLA_TRACE pmla_buf[PMLA_TRACE_SZ]; }PMLA;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -