00001
00011 void dlog (const char *fmt, ...)
00012 {
00013 va_list args;
00014 printk("STP: ");
00015 va_start(args, fmt);
00016 vprintk(fmt, args);
00017 va_end(args);
00018 }
00019
00020
00021 static const char * (*_stp_kallsyms_lookup)(unsigned long addr,
00022 unsigned long *symbolsize,
00023 unsigned long *offset,
00024 char **modname, char *namebuf)=(void *)KALLSYMS_LOOKUP;
00025
00026
00027 #define STP_BUF_LEN 8191
00028
00029
00030 static char _stp_pbuf[STP_BUF_LEN+1];
00031 static int _stp_pbuf_len = STP_BUF_LEN;
00032
00033 void _stp_print_buf (const char *fmt, ...)
00034 {
00035 int num;
00036 va_list args;
00037 char *buf = _stp_pbuf + STP_BUF_LEN - _stp_pbuf_len;
00038 va_start(args, fmt);
00039 num = vscnprintf(buf, _stp_pbuf_len, fmt, args);
00040 va_end(args);
00041 if (num > 0)
00042 _stp_pbuf_len -= num;
00043 }
00044
00045 void _stp_print_buf_init (void)
00046 {
00047 _stp_pbuf_len = STP_BUF_LEN;
00048 _stp_pbuf[0] = 0;
00049 }
00050
00051 void _stp_print_symbol(const char *fmt, unsigned long address)
00052 {
00053 char *modname;
00054 const char *name;
00055 unsigned long offset, size;
00056 char namebuf[KSYM_NAME_LEN+1];
00057
00058 name = _stp_kallsyms_lookup(address, &size, &offset, &modname, namebuf);
00059
00060 if (!name)
00061 _stp_print_buf("0x%lx", address);
00062 else {
00063 if (modname)
00064 _stp_print_buf("%s+%#lx/%#lx [%s]", name, offset,
00065 size, modname);
00066 else
00067 _stp_print_buf("%s+%#lx/%#lx", name, offset, size);
00068 }
00069 }
00070
00071
00072 unsigned long cur_ret_addr (struct pt_regs *regs)
00073 {
00074 #ifdef __x86_64__
00075 unsigned long *ra = (unsigned long *)regs->rsp;
00076 #else
00077 unsigned long *ra = (unsigned long *)regs->esp;
00078 #endif
00079 if (ra)
00080 return *ra;
00081 else
00082 return 0;
00083 }