#ifndef _TEST_TRACE_C_H_ #define _TEST_TRACE_C_H_ /* the base address of trace device */ #define TRACE_DEV_BASE_ADDR 0x21000000 /*the register addresses of the trace device */ #define TRACE_DEV_REG_SWITCH 0 #define TRACE_DEV_REG_FORK 1 #define TRACE_DEV_REG_EXECVE_PID 2 #define TRACE_DEV_REG_EXECVE_VMSTART 3 #define TRACE_DEV_REG_EXECVE_VMEND 4 #define TRACE_DEV_REG_EXECVE_OFFSET 5 #define TRACE_DEV_REG_EXECVE_EXEPATH 6 #define TRACE_DEV_REG_EXIT 7 #define TRACE_DEV_REG_CMDLINE 8 #define TRACE_DEV_REG_CMDLINE_LEN 9 #define TRACE_DEV_REG_MMAP_EXEPATH 10 #define TRACE_DEV_REG_INIT_PID 11 #define TRACE_DEV_REG_INIT_NAME 12 #define TRACE_DEV_REG_CLONE 13 #define TRACE_DEV_REG_DYN_SYM 50 #define TRACE_DEV_REG_DYN_SYM_ADDR 51 #define TRACE_DEV_REG_PRINT_STR 60 #define TRACE_DEV_REG_PRINT_NUM_DEC 61 #define TRACE_DEV_REG_PRINT_NUM_HEX 62 #define TRACE_DEV_REG_STOP_EMU 90 #define TRACE_DEV_REG_ENABLE 100 #define TRACE_DEV_REG_DISABLE 101 /* write a word to a trace device register */ #define DEV_WRITE_WORD(addr,value)\ (*(volatile unsigned long *)(TRACE_DEV_BASE_ADDR + ((addr) << 2)) = (value)) /*************************************************************/ /* generates test events */ /* context switch */ #define TRACE_SWITCH(pid) DEV_WRITE_WORD(TRACE_DEV_REG_SWITCH, (pid)) /* fork */ #define TRACE_FORK(pid) DEV_WRITE_WORD(TRACE_DEV_REG_FORK, (pid)) /* clone */ #define TRACE_CLONE(pid) DEV_WRITE_WORD(TRACE_DEV_REG_CLONE, (pid)) /* dump name and path of threads executed before trace device created */ #define TRACE_INIT_NAME(pid,path)\ do {\ DEV_WRITE_WORD(TRACE_DEV_REG_INIT_PID, (pid));\ DEV_WRITE_WORD(TRACE_DEV_REG_INIT_NAME, (unsigned long)(path));\ }while(0) /* dump exec mapping of threads executed before trace device created */ #define TRACE_INIT_EXEC(vstart,vend,eoff,path)\ do {\ DEV_WRITE_WORD(TRACE_DEV_REG_EXECVE_VMSTART, (vstart));\ DEV_WRITE_WORD(TRACE_DEV_REG_EXECVE_VMEND, (vend));\ DEV_WRITE_WORD(TRACE_DEV_REG_EXECVE_OFFSET, (eoff));\ DEV_WRITE_WORD(TRACE_DEV_REG_EXECVE_EXEPATH, (unsigned long)(path));\ }while(0) /* mmap */ #define TRACE_MMAP(vstart,vend,eoff,path)\ do {\ DEV_WRITE_WORD(TRACE_DEV_REG_EXECVE_VMSTART, (vstart));\ DEV_WRITE_WORD(TRACE_DEV_REG_EXECVE_VMEND, (vend));\ DEV_WRITE_WORD(TRACE_DEV_REG_EXECVE_OFFSET, (eoff));\ DEV_WRITE_WORD(TRACE_DEV_REG_MMAP_EXEPATH, (unsigned long)(path));\ }while(0) /* execve */ #define TRACE_EXECVE(cmdlen,cmd)\ do {\ DEV_WRITE_WORD(TRACE_DEV_REG_CMDLINE_LEN, (cmdlen));\ DEV_WRITE_WORD(TRACE_DEV_REG_CMDLINE, (unsigned long)(cmd));\ }while(0) /* exit */ #define TRACE_EXIT(retv) DEV_WRITE_WORD(TRACE_DEV_REG_EXIT, (retv)) /* other commands */ /* stop emulation */ #define TRACE_STOP_EMU() DEV_WRITE_WORD(TRACE_DEV_REG_STOP_EMU, 1) /* enable/disable tracing */ #define TRACE_ENABLE_TRACING() DEV_WRITE_WORD(TRACE_DEV_REG_ENABLE, 1) #define TRACE_DISABLE_TRACING() DEV_WRITE_WORD(TRACE_DEV_REG_DISABLE, 1) /* dynamic symbols */ #define TRACE_DYN_SYM(addr,sym)\ do {\ DEV_WRITE_WORD(TRACE_DEV_REG_DYN_SYM_ADDR, (addr));\ DEV_WRITE_WORD(TRACE_DEV_REG_DYN_SYM, (unsigned long)(sym));\ }while(0) /* prints */ #define PRINT_STR(str) DEV_WRITE_WORD(TRACE_DEV_REG_PRINT_STR, (unsigned long)(str)) #define PRINT_NUM_DEC(num) DEV_WRITE_WORD(TRACE_DEV_REG_PRINT_NUM_DEC, (num)) #define PRINT_NUM_HEX(num) DEV_WRITE_WORD(TRACE_DEV_REG_PRINT_NUM_HEX, (num)) #endif