Lines Matching full:code
3 * Common code for probe-based Dynamic events.
5 * This code was copied from kernel/trace/trace_kprobe.c written by
290 static int parse_trace_event_arg(char *arg, struct fetch_insn *code, in parse_trace_event_arg() argument
299 code->op = FETCH_OP_TP_ARG; in parse_trace_event_arg()
300 code->data = field; in parse_trace_event_arg()
366 struct fetch_insn *code = *pcode + 1; in check_prepare_btf_string_fetch() local
368 if (code->op == FETCH_OP_END) { in check_prepare_btf_string_fetch()
373 code->op = FETCH_OP_UDEREF; in check_prepare_btf_string_fetch()
375 code->op = FETCH_OP_DEREF; in check_prepare_btf_string_fetch()
376 code->offset = 0; in check_prepare_btf_string_fetch()
377 *pcode = code; in check_prepare_btf_string_fetch()
526 struct fetch_insn *code = *pcode; in parse_btf_field() local
587 if (++code == end) { in parse_btf_field()
591 code->op = FETCH_OP_DEREF; /* TODO: user deref support */ in parse_btf_field()
592 code->offset = bitoffs / 8; in parse_btf_field()
593 *pcode = code; in parse_btf_field()
608 struct fetch_insn *code = *pcode; in parse_btf_arg() local
629 code->op = FETCH_OP_RETVAL; in parse_btf_arg()
661 code->op = FETCH_OP_ARG; in parse_btf_arg()
663 code->param = i + 1; in parse_btf_arg()
665 code->param = i; in parse_btf_arg()
667 code->op = FETCH_OP_EDATA; in parse_btf_arg()
673 code->offset = ret; in parse_btf_arg()
714 struct fetch_insn *code = *pcode; in parse_btf_bitfield() local
719 code++; in parse_btf_bitfield()
720 if (code->op != FETCH_OP_NOP) { in parse_btf_bitfield()
724 *pcode = code; in parse_btf_bitfield()
726 code->op = FETCH_OP_MOD_BF; in parse_btf_bitfield()
727 code->lshift = 64 - (ctx->last_bitsize + ctx->last_bitoffs); in parse_btf_bitfield()
728 code->rshift = 64 - ctx->last_bitsize; in parse_btf_bitfield()
729 code->basesize = 64 / 8; in parse_btf_bitfield()
774 * Add the entry code to store the 'argnum'th parameter and return the offset
788 earg->code = kcalloc(earg->size, sizeof(struct fetch_insn), in __store_entry_arg()
790 if (!earg->code) { in __store_entry_arg()
794 /* Fill the code buffer with 'end' to simplify it */ in __store_entry_arg()
796 earg->code[i].op = FETCH_OP_END; in __store_entry_arg()
801 * The entry code array is repeating the pair of in __store_entry_arg()
806 * code array to find the FETCH_OP_ARG which already fetches the 'argnum' in __store_entry_arg()
816 switch (earg->code[i].op) { in __store_entry_arg()
818 earg->code[i].op = FETCH_OP_ARG; in __store_entry_arg()
819 earg->code[i].param = argnum; in __store_entry_arg()
820 earg->code[i + 1].op = FETCH_OP_ST_EDATA; in __store_entry_arg()
821 earg->code[i + 1].offset = offset; in __store_entry_arg()
824 match = (earg->code[i].param == argnum); in __store_entry_arg()
827 offset = earg->code[i].offset; in __store_entry_arg()
848 * earg->code[] array has an operation sequence which is run in in traceprobe_get_entry_data_size()
855 * code array. in traceprobe_get_entry_data_size()
858 switch (earg->code[i].op) { in traceprobe_get_entry_data_size()
862 size = earg->code[i].offset + sizeof(unsigned long); in traceprobe_get_entry_data_size()
882 struct fetch_insn *code = &earg->code[i]; in store_trace_entry_data() local
884 switch (code->op) { in store_trace_entry_data()
886 val = regs_get_kernel_argument(regs, code->param); in store_trace_entry_data()
889 *(unsigned long *)((unsigned long)edata + code->offset) = val; in store_trace_entry_data()
911 struct fetch_insn *code = *pcode; in NOKPROBE_SYMBOL() local
919 if (code->data) in NOKPROBE_SYMBOL()
921 ret = parse_trace_event_arg(arg, code, ctx); in NOKPROBE_SYMBOL()
925 code->op = FETCH_OP_COMM; in NOKPROBE_SYMBOL()
940 code->op = FETCH_OP_RETVAL; in NOKPROBE_SYMBOL()
950 code->op = FETCH_OP_STACKP; in NOKPROBE_SYMBOL()
964 code->op = FETCH_OP_STACK; in NOKPROBE_SYMBOL()
965 code->param = (unsigned int)param; in NOKPROBE_SYMBOL()
972 code->op = FETCH_OP_COMM; in NOKPROBE_SYMBOL()
990 code->op = FETCH_OP_ARG; in NOKPROBE_SYMBOL()
991 code->param = (unsigned int)param; in NOKPROBE_SYMBOL()
997 code->param++; in NOKPROBE_SYMBOL()
1004 code->op = FETCH_OP_EDATA; in NOKPROBE_SYMBOL()
1005 code->offset = ret; in NOKPROBE_SYMBOL()
1050 struct fetch_insn *code = *pcode; in parse_probe_arg() local
1070 code->op = FETCH_OP_REG; in parse_probe_arg()
1071 code->param = (unsigned int)ret; in parse_probe_arg()
1085 code->op = FETCH_OP_IMM; in parse_probe_arg()
1086 code->immediate = param; in parse_probe_arg()
1099 code->op = FETCH_OP_FOFFS; in parse_probe_arg()
1100 code->immediate = (unsigned long)offset; // imm64? in parse_probe_arg()
1108 code->op = FETCH_NOP_SYMBOL; in parse_probe_arg()
1109 code->data = kstrdup(arg + 1, GFP_KERNEL); in parse_probe_arg()
1110 if (!code->data) in parse_probe_arg()
1112 if (++code == end) { in parse_probe_arg()
1116 code->op = FETCH_OP_IMM; in parse_probe_arg()
1117 code->immediate = 0; in parse_probe_arg()
1120 if (++code == end) { in parse_probe_arg()
1124 *pcode = code; in parse_probe_arg()
1125 code->op = FETCH_OP_DEREF; in parse_probe_arg()
1126 code->offset = offset; in parse_probe_arg()
1161 ret = parse_probe_arg(arg, t2, &code, end, ctx); in parse_probe_arg()
1165 if (code->op == FETCH_OP_COMM || in parse_probe_arg()
1166 code->op == FETCH_OP_DATA) { in parse_probe_arg()
1170 if (++code == end) { in parse_probe_arg()
1174 *pcode = code; in parse_probe_arg()
1176 code->op = deref; in parse_probe_arg()
1177 code->offset = offset; in parse_probe_arg()
1187 code->op = FETCH_OP_DATA; in parse_probe_arg()
1188 code->data = tmp; in parse_probe_arg()
1190 ret = str_to_immediate(arg + 1, &code->immediate); in parse_probe_arg()
1194 code->op = FETCH_OP_IMM; in parse_probe_arg()
1208 if (!ret && code->op == FETCH_OP_NOP) { in parse_probe_arg()
1221 struct fetch_insn *code = *pcode; in __parse_bitfield_probe_arg() local
1238 code++; in __parse_bitfield_probe_arg()
1239 if (code->op != FETCH_OP_NOP) in __parse_bitfield_probe_arg()
1241 *pcode = code; in __parse_bitfield_probe_arg()
1243 code->op = FETCH_OP_MOD_BF; in __parse_bitfield_probe_arg()
1244 code->lshift = BYTES_TO_BITS(t->size) - (bw + bo); in __parse_bitfield_probe_arg()
1245 code->rshift = BYTES_TO_BITS(t->size) - bw; in __parse_bitfield_probe_arg()
1246 code->basesize = t->size; in __parse_bitfield_probe_arg()
1316 static int finalize_fetch_insn(struct fetch_insn *code, in finalize_fetch_insn() argument
1329 if (code->op != FETCH_OP_REG && code->op != FETCH_OP_STACK && in finalize_fetch_insn()
1330 code->op != FETCH_OP_RETVAL && code->op != FETCH_OP_ARG && in finalize_fetch_insn()
1331 code->op != FETCH_OP_DEREF && code->op != FETCH_OP_TP_ARG) { in finalize_fetch_insn()
1337 if (code->op != FETCH_OP_DEREF && code->op != FETCH_OP_UDEREF && in finalize_fetch_insn()
1338 code->op != FETCH_OP_IMM && code->op != FETCH_OP_COMM && in finalize_fetch_insn()
1339 code->op != FETCH_OP_DATA && code->op != FETCH_OP_TP_ARG) { in finalize_fetch_insn()
1347 (code->op == FETCH_OP_IMM || code->op == FETCH_OP_COMM || in finalize_fetch_insn()
1348 code->op == FETCH_OP_DATA) || code->op == FETCH_OP_TP_ARG || in finalize_fetch_insn()
1358 code++; in finalize_fetch_insn()
1359 if (code->op != FETCH_OP_NOP) { in finalize_fetch_insn()
1367 code->op == FETCH_OP_UDEREF) in finalize_fetch_insn()
1368 code->op = FETCH_OP_ST_USTRING; in finalize_fetch_insn()
1370 code->op = FETCH_OP_ST_SYMSTR; in finalize_fetch_insn()
1372 code->op = FETCH_OP_ST_STRING; in finalize_fetch_insn()
1373 code->size = parg->type->size; in finalize_fetch_insn()
1375 } else if (code->op == FETCH_OP_DEREF) { in finalize_fetch_insn()
1376 code->op = FETCH_OP_ST_MEM; in finalize_fetch_insn()
1377 code->size = parg->type->size; in finalize_fetch_insn()
1378 } else if (code->op == FETCH_OP_UDEREF) { in finalize_fetch_insn()
1379 code->op = FETCH_OP_ST_UMEM; in finalize_fetch_insn()
1380 code->size = parg->type->size; in finalize_fetch_insn()
1382 code++; in finalize_fetch_insn()
1383 if (code->op != FETCH_OP_NOP) { in finalize_fetch_insn()
1387 code->op = FETCH_OP_ST_RAW; in finalize_fetch_insn()
1388 code->size = parg->type->size; in finalize_fetch_insn()
1392 scode = code; in finalize_fetch_insn()
1397 ret = __parse_bitfield_probe_arg(type, parg->type, &code); in finalize_fetch_insn()
1405 ret = parse_btf_bitfield(&code, ctx); in finalize_fetch_insn()
1418 code++; in finalize_fetch_insn()
1419 if (code->op != FETCH_OP_NOP) { in finalize_fetch_insn()
1423 code->op = FETCH_OP_LP_ARRAY; in finalize_fetch_insn()
1424 code->param = parg->count; in finalize_fetch_insn()
1428 code++; in finalize_fetch_insn()
1429 code->op = FETCH_OP_END; in finalize_fetch_insn()
1439 struct fetch_insn *code, *tmp = NULL; in traceprobe_parse_probe_arg_body() local
1464 code = tmp = kcalloc(FETCH_INSN_MAX, sizeof(*code), GFP_KERNEL); in traceprobe_parse_probe_arg_body()
1465 if (!code) in traceprobe_parse_probe_arg_body()
1467 code[FETCH_INSN_MAX - 1].op = FETCH_OP_END; in traceprobe_parse_probe_arg_body()
1470 ret = parse_probe_arg(arg, parg->type, &code, &code[FETCH_INSN_MAX - 1], in traceprobe_parse_probe_arg_body()
1481 ret = check_prepare_btf_string_fetch(type, &code, ctx); in traceprobe_parse_probe_arg_body()
1500 ret = finalize_fetch_insn(code, parg, type, type ? type - arg : 0, ctx); in traceprobe_parse_probe_arg_body()
1504 for (; code < tmp + FETCH_INSN_MAX; code++) in traceprobe_parse_probe_arg_body()
1505 if (code->op == FETCH_OP_END) in traceprobe_parse_probe_arg_body()
1507 /* Shrink down the code buffer */ in traceprobe_parse_probe_arg_body()
1508 parg->code = kcalloc(code - tmp + 1, sizeof(*code), GFP_KERNEL); in traceprobe_parse_probe_arg_body()
1509 if (!parg->code) in traceprobe_parse_probe_arg_body()
1512 memcpy(parg->code, tmp, sizeof(*code) * (code - tmp + 1)); in traceprobe_parse_probe_arg_body()
1516 for (code = tmp; code < tmp + FETCH_INSN_MAX; code++) in traceprobe_parse_probe_arg_body()
1517 if (code->op == FETCH_NOP_SYMBOL || in traceprobe_parse_probe_arg_body()
1518 code->op == FETCH_OP_DATA) in traceprobe_parse_probe_arg_body()
1519 kfree(code->data); in traceprobe_parse_probe_arg_body()
1610 struct fetch_insn *code = arg->code; in traceprobe_free_probe_arg() local
1612 while (code && code->op != FETCH_OP_END) { in traceprobe_free_probe_arg()
1613 if (code->op == FETCH_NOP_SYMBOL || in traceprobe_free_probe_arg()
1614 code->op == FETCH_OP_DATA) in traceprobe_free_probe_arg()
1615 kfree(code->data); in traceprobe_free_probe_arg()
1616 code++; in traceprobe_free_probe_arg()
1618 kfree(arg->code); in traceprobe_free_probe_arg()
1825 struct fetch_insn *code = arg->code; in traceprobe_update_arg() local
1831 while (code && code->op != FETCH_OP_END) { in traceprobe_update_arg()
1832 if (code->op == FETCH_NOP_SYMBOL) { in traceprobe_update_arg()
1833 if (code[1].op != FETCH_OP_IMM) in traceprobe_update_arg()
1836 tmp = strpbrk(code->data, "+-"); in traceprobe_update_arg()
1839 ret = traceprobe_split_symbol_offset(code->data, in traceprobe_update_arg()
1844 code[1].immediate = in traceprobe_update_arg()
1845 (unsigned long)kallsyms_lookup_name(code->data); in traceprobe_update_arg()
1848 if (!code[1].immediate) in traceprobe_update_arg()
1850 code[1].immediate += offset; in traceprobe_update_arg()
1852 code++; in traceprobe_update_arg()
2011 kfree(tp->entry_arg->code); in trace_probe_cleanup()