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
299 static int parse_trace_event_arg(char *arg, struct fetch_insn *code, in parse_trace_event_arg() argument
308 code->op = FETCH_OP_TP_ARG; in parse_trace_event_arg()
309 code->data = field; in parse_trace_event_arg()
375 struct fetch_insn *code = *pcode + 1; in check_prepare_btf_string_fetch() local
377 if (code->op == FETCH_OP_END) { in check_prepare_btf_string_fetch()
382 code->op = FETCH_OP_UDEREF; in check_prepare_btf_string_fetch()
384 code->op = FETCH_OP_DEREF; in check_prepare_btf_string_fetch()
385 code->offset = 0; in check_prepare_btf_string_fetch()
386 *pcode = code; in check_prepare_btf_string_fetch()
535 struct fetch_insn *code = *pcode; in parse_btf_field() local
596 if (++code == end) { in parse_btf_field()
600 code->op = FETCH_OP_DEREF; /* TODO: user deref support */ in parse_btf_field()
601 code->offset = bitoffs / 8; in parse_btf_field()
602 *pcode = code; in parse_btf_field()
617 struct fetch_insn *code = *pcode; in parse_btf_arg() local
638 code->op = FETCH_OP_RETVAL; in parse_btf_arg()
670 code->op = FETCH_OP_ARG; in parse_btf_arg()
672 code->param = i + 1; in parse_btf_arg()
674 code->param = i; in parse_btf_arg()
676 code->op = FETCH_OP_EDATA; in parse_btf_arg()
682 code->offset = ret; in parse_btf_arg()
723 struct fetch_insn *code = *pcode; in parse_btf_bitfield() local
728 code++; in parse_btf_bitfield()
729 if (code->op != FETCH_OP_NOP) { in parse_btf_bitfield()
733 *pcode = code; in parse_btf_bitfield()
735 code->op = FETCH_OP_MOD_BF; in parse_btf_bitfield()
736 code->lshift = 64 - (ctx->last_bitsize + ctx->last_bitoffs); in parse_btf_bitfield()
737 code->rshift = 64 - ctx->last_bitsize; in parse_btf_bitfield()
738 code->basesize = 64 / 8; in parse_btf_bitfield()
783 * Add the entry code to store the 'argnum'th parameter and return the offset
797 earg->code = kcalloc(earg->size, sizeof(struct fetch_insn), in __store_entry_arg()
799 if (!earg->code) { in __store_entry_arg()
803 /* Fill the code buffer with 'end' to simplify it */ in __store_entry_arg()
805 earg->code[i].op = FETCH_OP_END; in __store_entry_arg()
810 * The entry code array is repeating the pair of in __store_entry_arg()
815 * code array to find the FETCH_OP_ARG which already fetches the 'argnum' in __store_entry_arg()
825 switch (earg->code[i].op) { in __store_entry_arg()
827 earg->code[i].op = FETCH_OP_ARG; in __store_entry_arg()
828 earg->code[i].param = argnum; in __store_entry_arg()
829 earg->code[i + 1].op = FETCH_OP_ST_EDATA; in __store_entry_arg()
830 earg->code[i + 1].offset = offset; in __store_entry_arg()
833 match = (earg->code[i].param == argnum); in __store_entry_arg()
836 offset = earg->code[i].offset; in __store_entry_arg()
857 * earg->code[] array has an operation sequence which is run in in traceprobe_get_entry_data_size()
864 * code array. in traceprobe_get_entry_data_size()
867 switch (earg->code[i].op) { in traceprobe_get_entry_data_size()
871 size = earg->code[i].offset + sizeof(unsigned long); in traceprobe_get_entry_data_size()
891 struct fetch_insn *code = &earg->code[i]; in store_trace_entry_data() local
893 switch (code->op) { in store_trace_entry_data()
895 val = regs_get_kernel_argument(regs, code->param); in store_trace_entry_data()
898 *(unsigned long *)((unsigned long)edata + code->offset) = val; in store_trace_entry_data()
920 struct fetch_insn *code = *pcode; in NOKPROBE_SYMBOL() local
928 if (code->data) in NOKPROBE_SYMBOL()
930 ret = parse_trace_event_arg(arg, code, ctx); in NOKPROBE_SYMBOL()
934 code->op = FETCH_OP_COMM; in NOKPROBE_SYMBOL()
949 code->op = FETCH_OP_RETVAL; in NOKPROBE_SYMBOL()
959 code->op = FETCH_OP_STACKP; in NOKPROBE_SYMBOL()
973 code->op = FETCH_OP_STACK; in NOKPROBE_SYMBOL()
974 code->param = (unsigned int)param; in NOKPROBE_SYMBOL()
981 code->op = FETCH_OP_COMM; in NOKPROBE_SYMBOL()
999 code->op = FETCH_OP_ARG; in NOKPROBE_SYMBOL()
1000 code->param = (unsigned int)param; in NOKPROBE_SYMBOL()
1006 code->param++; in NOKPROBE_SYMBOL()
1013 code->op = FETCH_OP_EDATA; in NOKPROBE_SYMBOL()
1014 code->offset = ret; in NOKPROBE_SYMBOL()
1059 struct fetch_insn *code = *pcode; in parse_probe_arg() local
1079 code->op = FETCH_OP_REG; in parse_probe_arg()
1080 code->param = (unsigned int)ret; in parse_probe_arg()
1094 code->op = FETCH_OP_IMM; in parse_probe_arg()
1095 code->immediate = param; in parse_probe_arg()
1108 code->op = FETCH_OP_FOFFS; in parse_probe_arg()
1109 code->immediate = (unsigned long)offset; // imm64? in parse_probe_arg()
1117 code->op = FETCH_NOP_SYMBOL; in parse_probe_arg()
1118 code->data = kstrdup(arg + 1, GFP_KERNEL); in parse_probe_arg()
1119 if (!code->data) in parse_probe_arg()
1121 if (++code == end) { in parse_probe_arg()
1125 code->op = FETCH_OP_IMM; in parse_probe_arg()
1126 code->immediate = 0; in parse_probe_arg()
1129 if (++code == end) { in parse_probe_arg()
1133 *pcode = code; in parse_probe_arg()
1134 code->op = FETCH_OP_DEREF; in parse_probe_arg()
1135 code->offset = offset; in parse_probe_arg()
1170 ret = parse_probe_arg(arg, t2, &code, end, ctx); in parse_probe_arg()
1174 if (code->op == FETCH_OP_COMM || in parse_probe_arg()
1175 code->op == FETCH_OP_DATA) { in parse_probe_arg()
1179 if (++code == end) { in parse_probe_arg()
1183 *pcode = code; in parse_probe_arg()
1185 code->op = deref; in parse_probe_arg()
1186 code->offset = offset; in parse_probe_arg()
1196 code->op = FETCH_OP_DATA; in parse_probe_arg()
1197 code->data = tmp; in parse_probe_arg()
1199 ret = str_to_immediate(arg + 1, &code->immediate); in parse_probe_arg()
1203 code->op = FETCH_OP_IMM; in parse_probe_arg()
1217 if (!ret && code->op == FETCH_OP_NOP) { in parse_probe_arg()
1230 struct fetch_insn *code = *pcode; in __parse_bitfield_probe_arg() local
1247 code++; in __parse_bitfield_probe_arg()
1248 if (code->op != FETCH_OP_NOP) in __parse_bitfield_probe_arg()
1250 *pcode = code; in __parse_bitfield_probe_arg()
1252 code->op = FETCH_OP_MOD_BF; in __parse_bitfield_probe_arg()
1253 code->lshift = BYTES_TO_BITS(t->size) - (bw + bo); in __parse_bitfield_probe_arg()
1254 code->rshift = BYTES_TO_BITS(t->size) - bw; in __parse_bitfield_probe_arg()
1255 code->basesize = t->size; in __parse_bitfield_probe_arg()
1325 static int finalize_fetch_insn(struct fetch_insn *code, in finalize_fetch_insn() argument
1338 if (code->op != FETCH_OP_REG && code->op != FETCH_OP_STACK && in finalize_fetch_insn()
1339 code->op != FETCH_OP_RETVAL && code->op != FETCH_OP_ARG && in finalize_fetch_insn()
1340 code->op != FETCH_OP_DEREF && code->op != FETCH_OP_TP_ARG) { in finalize_fetch_insn()
1346 if (code->op != FETCH_OP_DEREF && code->op != FETCH_OP_UDEREF && 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()
1356 (code->op == FETCH_OP_IMM || code->op == FETCH_OP_COMM || in finalize_fetch_insn()
1357 code->op == FETCH_OP_DATA) || code->op == FETCH_OP_TP_ARG || in finalize_fetch_insn()
1367 code++; in finalize_fetch_insn()
1368 if (code->op != FETCH_OP_NOP) { in finalize_fetch_insn()
1376 code->op == FETCH_OP_UDEREF) in finalize_fetch_insn()
1377 code->op = FETCH_OP_ST_USTRING; in finalize_fetch_insn()
1379 code->op = FETCH_OP_ST_SYMSTR; in finalize_fetch_insn()
1381 code->op = FETCH_OP_ST_STRING; in finalize_fetch_insn()
1382 code->size = parg->type->size; in finalize_fetch_insn()
1384 } else if (code->op == FETCH_OP_DEREF) { in finalize_fetch_insn()
1385 code->op = FETCH_OP_ST_MEM; in finalize_fetch_insn()
1386 code->size = parg->type->size; in finalize_fetch_insn()
1387 } else if (code->op == FETCH_OP_UDEREF) { in finalize_fetch_insn()
1388 code->op = FETCH_OP_ST_UMEM; in finalize_fetch_insn()
1389 code->size = parg->type->size; in finalize_fetch_insn()
1391 code++; in finalize_fetch_insn()
1392 if (code->op != FETCH_OP_NOP) { in finalize_fetch_insn()
1396 code->op = FETCH_OP_ST_RAW; in finalize_fetch_insn()
1397 code->size = parg->type->size; in finalize_fetch_insn()
1401 scode = code; in finalize_fetch_insn()
1406 ret = __parse_bitfield_probe_arg(type, parg->type, &code); in finalize_fetch_insn()
1414 ret = parse_btf_bitfield(&code, ctx); in finalize_fetch_insn()
1427 code++; in finalize_fetch_insn()
1428 if (code->op != FETCH_OP_NOP) { in finalize_fetch_insn()
1432 code->op = FETCH_OP_LP_ARRAY; in finalize_fetch_insn()
1433 code->param = parg->count; in finalize_fetch_insn()
1437 code++; in finalize_fetch_insn()
1438 code->op = FETCH_OP_END; in finalize_fetch_insn()
1448 struct fetch_insn *code, *tmp = NULL; in traceprobe_parse_probe_arg_body() local
1473 code = tmp = kcalloc(FETCH_INSN_MAX, sizeof(*code), GFP_KERNEL); in traceprobe_parse_probe_arg_body()
1474 if (!code) in traceprobe_parse_probe_arg_body()
1476 code[FETCH_INSN_MAX - 1].op = FETCH_OP_END; in traceprobe_parse_probe_arg_body()
1479 ret = parse_probe_arg(arg, parg->type, &code, &code[FETCH_INSN_MAX - 1], in traceprobe_parse_probe_arg_body()
1490 ret = check_prepare_btf_string_fetch(type, &code, ctx); in traceprobe_parse_probe_arg_body()
1509 ret = finalize_fetch_insn(code, parg, type, type ? type - arg : 0, ctx); in traceprobe_parse_probe_arg_body()
1513 for (; code < tmp + FETCH_INSN_MAX; code++) in traceprobe_parse_probe_arg_body()
1514 if (code->op == FETCH_OP_END) in traceprobe_parse_probe_arg_body()
1516 /* Shrink down the code buffer */ in traceprobe_parse_probe_arg_body()
1517 parg->code = kcalloc(code - tmp + 1, sizeof(*code), GFP_KERNEL); in traceprobe_parse_probe_arg_body()
1518 if (!parg->code) in traceprobe_parse_probe_arg_body()
1521 memcpy(parg->code, tmp, sizeof(*code) * (code - tmp + 1)); in traceprobe_parse_probe_arg_body()
1525 for (code = tmp; code < tmp + FETCH_INSN_MAX; code++) in traceprobe_parse_probe_arg_body()
1526 if (code->op == FETCH_NOP_SYMBOL || in traceprobe_parse_probe_arg_body()
1527 code->op == FETCH_OP_DATA) in traceprobe_parse_probe_arg_body()
1528 kfree(code->data); in traceprobe_parse_probe_arg_body()
1619 struct fetch_insn *code = arg->code; in traceprobe_free_probe_arg() local
1621 while (code && code->op != FETCH_OP_END) { in traceprobe_free_probe_arg()
1622 if (code->op == FETCH_NOP_SYMBOL || in traceprobe_free_probe_arg()
1623 code->op == FETCH_OP_DATA) in traceprobe_free_probe_arg()
1624 kfree(code->data); in traceprobe_free_probe_arg()
1625 code++; in traceprobe_free_probe_arg()
1627 kfree(arg->code); in traceprobe_free_probe_arg()
1834 struct fetch_insn *code = arg->code; in traceprobe_update_arg() local
1840 while (code && code->op != FETCH_OP_END) { in traceprobe_update_arg()
1841 if (code->op == FETCH_NOP_SYMBOL) { in traceprobe_update_arg()
1842 if (code[1].op != FETCH_OP_IMM) in traceprobe_update_arg()
1845 tmp = strpbrk(code->data, "+-"); in traceprobe_update_arg()
1848 ret = traceprobe_split_symbol_offset(code->data, in traceprobe_update_arg()
1853 code[1].immediate = in traceprobe_update_arg()
1854 (unsigned long)kallsyms_lookup_name(code->data); in traceprobe_update_arg()
1857 if (!code[1].immediate) in traceprobe_update_arg()
1859 code[1].immediate += offset; in traceprobe_update_arg()
1861 code++; in traceprobe_update_arg()
2020 kfree(tp->entry_arg->code); in trace_probe_cleanup()