1*387f9dfdSAndroid Build Coastguard Worker #include "BPF.h" 2*387f9dfdSAndroid Build Coastguard Worker #include "catch.hpp" 3*387f9dfdSAndroid Build Coastguard Worker #include "common.h" 4*387f9dfdSAndroid Build Coastguard Worker 5*387f9dfdSAndroid Build Coastguard Worker TEST_CASE("test tracepoint parser", "[TracepointParser]") { 6*387f9dfdSAndroid Build Coastguard Worker std::string format = 7*387f9dfdSAndroid Build Coastguard Worker "name: sys_enter_read\n" 8*387f9dfdSAndroid Build Coastguard Worker "ID: 650\n" 9*387f9dfdSAndroid Build Coastguard Worker "format:\n" 10*387f9dfdSAndroid Build Coastguard Worker " field:unsigned short common_type; offset:0; size:2; signed:0;\n" 11*387f9dfdSAndroid Build Coastguard Worker " field:unsigned char common_flags; offset:2; size:1; signed:0;\n" 12*387f9dfdSAndroid Build Coastguard Worker " field:unsigned char common_preempt_count; offset:3; size:1; signed:0;\n" 13*387f9dfdSAndroid Build Coastguard Worker " field:int common_pid; offset:4; size:4; signed:1;\n" 14*387f9dfdSAndroid Build Coastguard Worker "\n" 15*387f9dfdSAndroid Build Coastguard Worker " field:int __syscall_nr; offset:8; size:4; signed:1;\n" 16*387f9dfdSAndroid Build Coastguard Worker " field:unsigned int fd; offset:16; size:8; signed:0;\n" 17*387f9dfdSAndroid Build Coastguard Worker " field:char * buf; offset:24; size:8; signed:0;\n" 18*387f9dfdSAndroid Build Coastguard Worker " field:size_t count; offset:32; size:8; signed:0;\n" 19*387f9dfdSAndroid Build Coastguard Worker "\n" 20*387f9dfdSAndroid Build Coastguard Worker "print fmt: \"fd: 0x%08lx, buf: 0x%08lx, count: 0x%08lx\", ((unsigned long)(REC->fd)), ((unsigned long)(REC->buf)), ((unsigned long)(REC->count))\n"; 21*387f9dfdSAndroid Build Coastguard Worker 22*387f9dfdSAndroid Build Coastguard Worker std::string expected = 23*387f9dfdSAndroid Build Coastguard Worker "struct tracepoint__syscalls__sys_enter_read {\n" 24*387f9dfdSAndroid Build Coastguard Worker "\tu64 __do_not_use__;\n" 25*387f9dfdSAndroid Build Coastguard Worker "\tint __syscall_nr;\n" 26*387f9dfdSAndroid Build Coastguard Worker "\tchar __pad_12;\n" 27*387f9dfdSAndroid Build Coastguard Worker "\tchar __pad_13;\n" 28*387f9dfdSAndroid Build Coastguard Worker "\tchar __pad_14;\n" 29*387f9dfdSAndroid Build Coastguard Worker "\tchar __pad_15;\n" 30*387f9dfdSAndroid Build Coastguard Worker "\tu64 fd;\n" 31*387f9dfdSAndroid Build Coastguard Worker "\tchar * buf;\n" 32*387f9dfdSAndroid Build Coastguard Worker "\tsize_t count;\n" 33*387f9dfdSAndroid Build Coastguard Worker "};\n"; 34*387f9dfdSAndroid Build Coastguard Worker 35*387f9dfdSAndroid Build Coastguard Worker { 36*387f9dfdSAndroid Build Coastguard Worker std::istringstream input(format); 37*387f9dfdSAndroid Build Coastguard Worker std::string result = ebpf::parse_tracepoint(input, "syscalls", "sys_enter_read"); 38*387f9dfdSAndroid Build Coastguard Worker REQUIRE(expected == result); 39*387f9dfdSAndroid Build Coastguard Worker } 40*387f9dfdSAndroid Build Coastguard Worker 41*387f9dfdSAndroid Build Coastguard Worker format = 42*387f9dfdSAndroid Build Coastguard Worker "name: signal_deliver\n" 43*387f9dfdSAndroid Build Coastguard Worker "ID: 114\n" 44*387f9dfdSAndroid Build Coastguard Worker "format:\n" 45*387f9dfdSAndroid Build Coastguard Worker " field:unsigned short common_type; offset:0; size:2; signed:0;\n" 46*387f9dfdSAndroid Build Coastguard Worker " field:unsigned char common_flags; offset:2; size:1; signed:0;\n" 47*387f9dfdSAndroid Build Coastguard Worker " field:unsigned char common_preempt_count; offset:3; size:1; signed:0;\n" 48*387f9dfdSAndroid Build Coastguard Worker " field:int common_pid; offset:4; size:4; signed:1;\n" 49*387f9dfdSAndroid Build Coastguard Worker "\n" 50*387f9dfdSAndroid Build Coastguard Worker " field:int sig; offset:8; size:4; signed:1;\n" 51*387f9dfdSAndroid Build Coastguard Worker " field:int errno; offset:12; size:4; signed:1;\n" 52*387f9dfdSAndroid Build Coastguard Worker " field:int code; offset:16; size:4; signed:1;\n" 53*387f9dfdSAndroid Build Coastguard Worker " field:unsigned long sa_handler; offset:24; size:8; signed:0;\n" 54*387f9dfdSAndroid Build Coastguard Worker " field:unsigned long sa_flags; offset:32; size:8; signed:0;\n" 55*387f9dfdSAndroid Build Coastguard Worker "\n" 56*387f9dfdSAndroid Build Coastguard Worker "print fmt: \"sig=%d errno=%d code=%d sa_handler=%lx sa_flags=%lx\", REC->sig, REC->errno, REC->code, REC->sa_handler, REC->sa_flags\n"; 57*387f9dfdSAndroid Build Coastguard Worker 58*387f9dfdSAndroid Build Coastguard Worker expected = 59*387f9dfdSAndroid Build Coastguard Worker "struct tracepoint__signal__signal_deliver {\n" 60*387f9dfdSAndroid Build Coastguard Worker "\tu64 __do_not_use__;\n" 61*387f9dfdSAndroid Build Coastguard Worker "\tint sig;\n" 62*387f9dfdSAndroid Build Coastguard Worker "\tint errno;\n" 63*387f9dfdSAndroid Build Coastguard Worker "\tint code;\n" 64*387f9dfdSAndroid Build Coastguard Worker "\tchar __pad_20;\n" 65*387f9dfdSAndroid Build Coastguard Worker "\tchar __pad_21;\n" 66*387f9dfdSAndroid Build Coastguard Worker "\tchar __pad_22;\n" 67*387f9dfdSAndroid Build Coastguard Worker "\tchar __pad_23;\n" 68*387f9dfdSAndroid Build Coastguard Worker "\tunsigned long sa_handler;\n" 69*387f9dfdSAndroid Build Coastguard Worker "\tunsigned long sa_flags;\n" 70*387f9dfdSAndroid Build Coastguard Worker "};\n"; 71*387f9dfdSAndroid Build Coastguard Worker 72*387f9dfdSAndroid Build Coastguard Worker { 73*387f9dfdSAndroid Build Coastguard Worker std::istringstream input(format); 74*387f9dfdSAndroid Build Coastguard Worker std::string result = ebpf::parse_tracepoint(input, "signal", "signal_deliver"); 75*387f9dfdSAndroid Build Coastguard Worker REQUIRE(expected == result); 76*387f9dfdSAndroid Build Coastguard Worker } 77*387f9dfdSAndroid Build Coastguard Worker 78*387f9dfdSAndroid Build Coastguard Worker format = 79*387f9dfdSAndroid Build Coastguard Worker " field:unsigned short common_type; offset:0; size:2; signed:0;\n" 80*387f9dfdSAndroid Build Coastguard Worker " field:unsigned char common_flags; offset:2; size:1; signed:0;\n" 81*387f9dfdSAndroid Build Coastguard Worker " field:unsigned char common_preempt_count; offset:3; size:1; signed:0;\n" 82*387f9dfdSAndroid Build Coastguard Worker " field:int common_pid; offset:4; size:4; signed:1;\n" 83*387f9dfdSAndroid Build Coastguard Worker " field:unsigned char common_migrate_disable; offset:8; size:1; signed:0;\n" 84*387f9dfdSAndroid Build Coastguard Worker " field:unsigned char common_preempt_lazy_count; offset:9; size:1; signed:0;\n" 85*387f9dfdSAndroid Build Coastguard Worker 86*387f9dfdSAndroid Build Coastguard Worker " field:char comm[16]; offset:12; size:16; signed:1;\n" 87*387f9dfdSAndroid Build Coastguard Worker " field:pid_t pid; offset:28; size:4; signed:1;\n" 88*387f9dfdSAndroid Build Coastguard Worker " field:int prio; offset:32; size:4; signed:1;\n" 89*387f9dfdSAndroid Build Coastguard Worker " field:int success; offset:36; size:4; signed:1;\n" 90*387f9dfdSAndroid Build Coastguard Worker " field:int target_cpu; offset:40; size:4; signed:1;\n"; 91*387f9dfdSAndroid Build Coastguard Worker 92*387f9dfdSAndroid Build Coastguard Worker expected = 93*387f9dfdSAndroid Build Coastguard Worker "struct tracepoint__sched__sched_wakeup {\n" 94*387f9dfdSAndroid Build Coastguard Worker "\tu64 __do_not_use__;\n" 95*387f9dfdSAndroid Build Coastguard Worker "\tchar __do_not_use__8;\n" 96*387f9dfdSAndroid Build Coastguard Worker "\tchar __do_not_use__9;\n" 97*387f9dfdSAndroid Build Coastguard Worker "\tchar __pad_10;\n" 98*387f9dfdSAndroid Build Coastguard Worker "\tchar __pad_11;\n" 99*387f9dfdSAndroid Build Coastguard Worker "\tchar comm[16];\n" 100*387f9dfdSAndroid Build Coastguard Worker "\tpid_t pid;\n" 101*387f9dfdSAndroid Build Coastguard Worker "\tint prio;\n" 102*387f9dfdSAndroid Build Coastguard Worker "\tint success;\n" 103*387f9dfdSAndroid Build Coastguard Worker "\tint target_cpu;\n" 104*387f9dfdSAndroid Build Coastguard Worker "};\n"; 105*387f9dfdSAndroid Build Coastguard Worker 106*387f9dfdSAndroid Build Coastguard Worker { 107*387f9dfdSAndroid Build Coastguard Worker std::istringstream input(format); 108*387f9dfdSAndroid Build Coastguard Worker std::string result = ebpf::parse_tracepoint(input, "sched", "sched_wakeup"); 109*387f9dfdSAndroid Build Coastguard Worker REQUIRE(expected == result); 110*387f9dfdSAndroid Build Coastguard Worker } 111*387f9dfdSAndroid Build Coastguard Worker } 112