extern void dtrace_stacktrace(stacktrace_state_t *);
-#define FBT_PUSHL_EBP 0x55
-#define FBT_RET 0xc3
-#define FBT_RET_IMM16 0xc2
-
-typedef void *(fbt_provide_fn)(struct module *, char *, uint8_t,
- uint8_t *, void *);
-
-extern void dtrace_fbt_init(fbt_provide_fn);
-
#endif /* _DTRACE_OS_H_ */
return rc;
}
-
-/*---------------------------------------------------------------------------*\
-(* FUNCTION BOUNDARY TRACING (FBT) SUPPORT *)
-\*---------------------------------------------------------------------------*/
-
-void dtrace_fbt_init(fbt_provide_fn *pfn)
-{
- loff_t pos = 0;
- struct kallsym_iter iter, sym;
-
- kallsyms_iter_update(&iter, 0);
- if (!kallsyms_iter_update(&iter, pos++))
- return;
-
- while (pos > 0) {
- sym = iter;
- if (!kallsyms_iter_update(&iter, pos++))
- pos = 0;
-
- if (sym.module_name[0] != '\0')
- break;
-
- if (sym.type == 'T' || sym.type == 't' || sym.type == 'W') {
- uint8_t *addr, *end;
-
- addr = (uint8_t *)sym.value;
- end = (uint8_t *)iter.value;
-
- if (*addr == FBT_PUSHL_EBP) {
- struct insn insn;
- void *pfbt = NULL;
-
- (*pfn)(dtrace_kmod, sym.name, FBT_PUSHL_EBP,
- addr, NULL);
-
- while (addr < end) {
- uint8_t opc;
-
- insn_init(&insn, addr, 1);
- insn_get_opcode(&insn);
-
- opc = insn.opcode.bytes[0];
-
- if (opc == FBT_RET ||
- opc == FBT_RET_IMM16) {
- pfbt = (*pfn)(dtrace_kmod,
- sym.name, opc,
- addr, pfbt);
- }
-
- insn_get_length(&insn);
-
- addr += insn.length;
- }
- }
- }
- }
-}
-EXPORT_SYMBOL(dtrace_fbt_init);