Revision: 984 Author: teawater Date: Mon Mar 19 01:02:54 2012 Log: Update version to 20120319 http://code.google.com/p/kgtp/source/detail?r=984 Modified: /trunk/Makefile /trunk/UPDATE /trunk/add-ons/hotcode.py /trunk/dkms.conf /trunk/gtp_2.6.33_to_2.6.38.patch /trunk/gtp_2.6.39.patch /trunk/gtp_3.0_to_upstream.patch /trunk/gtp_for_review.patch /trunk/gtp_older_to_2.6.32.patch /wiki/UPDATE.wiki ======================================= --- /trunk/Makefile Sun Mar 18 20:45:19 2012 +++ /trunk/Makefile Mon Mar 19 01:02:54 2012 @@ -1,6 +1,6 @@ obj-m := gtp.o -MODULEVERSION := 20120224+ +MODULEVERSION := 20120319 KERNELVERSION := $(shell uname -r) KERNELDIR := /lib/modules/$(KERNELVERSION)/build/ ======================================= --- /trunk/UPDATE Sun Mar 18 20:45:19 2012 +++ /trunk/UPDATE Mon Mar 19 01:02:54 2012 @@ -1,4 +1,7 @@ -*** 20120224+ +*** 20120319 + +* http://kgtp.googlecode.com/files/kgtp_20120319.tar.bz2 + svn checkout https://kgtp.googlecode.com/svn/tags/20120319 * Fix bug with GDB RSP package sum check. ======================================= --- /trunk/add-ons/hotcode.py Mon Mar 19 00:09:24 2012 +++ /trunk/add-ons/hotcode.py Mon Mar 19 01:02:54 2012 @@ -426,7 +426,7 @@ # GDB have bug with long conditon so close them #ignore_str += get_ignore_str("__do_softirq") #ignore_str += get_ignore_str("_raw_spin_unlock_irqrestore") - + for i in range(0, cpu_number): tempfile.write("tvariable $pc_ip"+str(i)+"\n") tempfile.write("tvariable $pc_cs"+str(i)+"\n") ======================================= --- /trunk/dkms.conf Wed Feb 29 04:28:19 2012 +++ /trunk/dkms.conf Mon Mar 19 01:02:54 2012 @@ -1,5 +1,5 @@ PACKAGE_NAME="gtp" -PACKAGE_VERSION="20120224+" +PACKAGE_VERSION="20120319" CLEAN="make clean" MAKE[0]="make gtp.ko KERNELVERSION=$kernelver" BUILT_MODULE_NAME[0]="gtp" ======================================= --- /trunk/gtp_2.6.33_to_2.6.38.patch Sat Feb 25 02:36:54 2012 +++ /trunk/gtp_2.6.33_to_2.6.38.patch Mon Mar 19 01:02:54 2012 @@ -5,12 +5,13 @@ kernel/perf_event.c | 26 lib/Kconfig.debug | 10 lib/Makefile | 2- lib/gtp.c | 9210 +++++++++++++++++++++++++++++++++++++++
- lib/gtp_rb.c | 495 ++ - scripts/gtp/add-ons/pe.py | 729 ++++ lib/gtp.c | 9519 +++++++++++++++++++++++++++++++++++++++
+ lib/gtp_rb.c | 498 ++ + scripts/gtp/add-ons/hotcode.py | 588 ++ + scripts/gtp/add-ons/pe.py | 729 ++ scripts/gtp/getgtprsp.pl | 137 scripts/gtp/getmod.py | 132 - 11 files changed, 12511 insertions(+), 2 deletions(-) + 12 files changed, 13411 insertions(+), 2 deletions(-) --- /dev/null +++ b/Documentation/gtp/howto.txt @@ -1908,7 +1909,7 @@ --- /dev/null +++ b/lib/gtp.c -@@ -0,0 +1,9210 @@ +@@ -0,0 +1,9519 @@ +/* + * Kernel GDB tracepoint module. + * @@ -1930,8 +1931,8 @@ + * + */ + -+/* If *10 means that this is not a release version. */ -+#define GTP_VERSION (20120224) ++/* If "* 10" means that this is not a release version. */ ++#define GTP_VERSION (20120319) + +#include <linux/version.h> +#ifndef RHEL_RELEASE_VERSION @@ -2115,6 +2116,8 @@ +#define GTP_DEBUG KERN_WARNING +#endif + ++/* #define GTP_DEBUG_V */ ++ +#define GTP_RW_MAX 16384 +#define GTP_RW_BUFP_MAX (GTP_RW_MAX - 4 - gtp_rw_size) + @@ -2158,7 +2161,39 @@ +#define GTP_FRAME_VAR_SIZE (FID_SIZE + sizeof(struct gtp_frame_var)) +#endif + -+#define TOHEX(h) ((h) > 9 ? (h) + 'a' - 10 : (h) + '0') ++#define INT2CHAR(h) ((h) > 9 ? (h) + 'a' - 10 : (h) + '0') ++ ++enum { ++ op_check_add = 0xe5, ++ op_check_sub, ++ op_check_mul, ++ op_check_div_signed, ++ op_check_div_unsigned, ++ op_check_rem_signed, ++ op_check_rem_unsigned, ++ op_check_lsh, ++ op_check_rsh_signed, ++ op_check_rsh_unsigned, ++ op_check_trace, ++ op_check_bit_and, ++ op_check_bit_or, ++ op_check_bit_xor, ++ op_check_equal, ++ op_check_less_signed, ++ op_check_less_unsigned, ++ op_check_pop, ++ op_check_swap, ++ op_check_if_goto, ++ op_check_printf, /* XXX: still not used. */ ++ ++ op_special_getv = 0xfa, ++ op_special_setv, ++ op_special_tracev, ++ ++ op_trace_printk = 0xfd, ++ op_trace_quick_printk, ++ op_tracev_printk, ++}; + +struct action_agent_exp { + unsigned int size; @@ -2345,7 +2380,7 @@ + GTP_VAR_IRQ_COUNT_ID, + GTP_VAR_PIPE_TRACE_ID, + GTP_VAR_CURRENT_TASK_PID_ID, -+ GTP_VAR_SPECIAL_MAX = GTP_VAR_PIPE_TRACE_ID, ++ GTP_VAR_SPECIAL_MAX = GTP_VAR_CURRENT_TASK_PID_ID, +}; + +#define PREV_VAR NULL @@ -3157,38 +3192,38 @@ +gtp_regs2ascii(struct pt_regs *regs, char *buf) +{ +#ifdef CONFIG_X86_32 -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_regs2ascii: ax = 0x%x\n", ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ax = 0x%x\n", + (unsigned int) regs->ax); -+ printk(GTP_DEBUG "gtp_regs2ascii: cx = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cx = 0x%x\n", + (unsigned int) regs->cx); -+ printk(GTP_DEBUG "gtp_regs2ascii: dx = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: dx = 0x%x\n", + (unsigned int) regs->dx); -+ printk(GTP_DEBUG "gtp_regs2ascii: bx = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bx = 0x%x\n", + (unsigned int) regs->bx); -+ printk(GTP_DEBUG "gtp_regs2ascii: sp = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: sp = 0x%x\n", + (unsigned int) regs->sp); -+ printk(GTP_DEBUG "gtp_regs2ascii: bp = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bp = 0x%x\n", + (unsigned int) regs->bp); -+ printk(GTP_DEBUG "gtp_regs2ascii: si = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: si = 0x%x\n", + (unsigned int) regs->si); -+ printk(GTP_DEBUG "gtp_regs2ascii: di = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: di = 0x%x\n", + (unsigned int) regs->di); -+ printk(GTP_DEBUG "gtp_regs2ascii: ip = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ip = 0x%x\n", + (unsigned int) regs->ip); -+ printk(GTP_DEBUG "gtp_regs2ascii: flags = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: flags = 0x%x\n", + (unsigned int) regs->flags); -+ printk(GTP_DEBUG "gtp_regs2ascii: cs = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cs = 0x%x\n", + (unsigned int) regs->cs); -+ printk(GTP_DEBUG "gtp_regs2ascii: ss = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ss = 0x%x\n", + (unsigned int) regs->ss); -+ printk(GTP_DEBUG "gtp_regs2ascii: ds = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ds = 0x%x\n", + (unsigned int) regs->ds); -+ printk(GTP_DEBUG "gtp_regs2ascii: es = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: es = 0x%x\n", + (unsigned int) regs->es); -+ printk(GTP_DEBUG "gtp_regs2ascii: fs = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: fs = 0x%x\n", + (unsigned int) regs->fs); -+ printk(GTP_DEBUG "gtp_regs2ascii: gs = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: gs = 0x%x\n", + (unsigned int) regs->gs); +#endif +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,24)) @@ -3261,27 +3296,27 @@ + buf += 8; +#endif +#else -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_regs2ascii: ax = 0x%lx\n", regs->ax); -+ printk(GTP_DEBUG "gtp_regs2ascii: bx = 0x%lx\n", regs->bx); -+ printk(GTP_DEBUG "gtp_regs2ascii: cx = 0x%lx\n", regs->cx); -+ printk(GTP_DEBUG "gtp_regs2ascii: dx = 0x%lx\n", regs->dx); -+ printk(GTP_DEBUG "gtp_regs2ascii: si = 0x%lx\n", regs->si); -+ printk(GTP_DEBUG "gtp_regs2ascii: di = 0x%lx\n", regs->di); -+ printk(GTP_DEBUG "gtp_regs2ascii: bp = 0x%lx\n", regs->bp); -+ printk(GTP_DEBUG "gtp_regs2ascii: sp = 0x%lx\n", regs->sp); -+ printk(GTP_DEBUG "gtp_regs2ascii: r8 = 0x%lx\n", regs->r8); -+ printk(GTP_DEBUG "gtp_regs2ascii: r9 = 0x%lx\n", regs->r9); -+ printk(GTP_DEBUG "gtp_regs2ascii: r10 = 0x%lx\n", regs->r10); -+ printk(GTP_DEBUG "gtp_regs2ascii: r11 = 0x%lx\n", regs->r11); -+ printk(GTP_DEBUG "gtp_regs2ascii: r12 = 0x%lx\n", regs->r12); -+ printk(GTP_DEBUG "gtp_regs2ascii: r13 = 0x%lx\n", regs->r13); -+ printk(GTP_DEBUG "gtp_regs2ascii: r14 = 0x%lx\n", regs->r14); -+ printk(GTP_DEBUG "gtp_regs2ascii: r15 = 0x%lx\n", regs->r15); -+ printk(GTP_DEBUG "gtp_regs2ascii: ip = 0x%lx\n", regs->ip); -+ printk(GTP_DEBUG "gtp_regs2ascii: flags = 0x%lx\n", regs->flags); -+ printk(GTP_DEBUG "gtp_regs2ascii: cs = 0x%lx\n", regs->cs); -+ printk(GTP_DEBUG "gtp_regs2ascii: ss = 0x%lx\n", regs->ss); ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ax = 0x%lx\n", regs->ax); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bx = 0x%lx\n", regs->bx); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cx = 0x%lx\n", regs->cx); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: dx = 0x%lx\n", regs->dx); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: si = 0x%lx\n", regs->si); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: di = 0x%lx\n", regs->di); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bp = 0x%lx\n", regs->bp); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: sp = 0x%lx\n", regs->sp); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r8 = 0x%lx\n", regs->r8); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r9 = 0x%lx\n", regs->r9); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r10 = 0x%lx\n", regs->r10); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r11 = 0x%lx\n", regs->r11); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r12 = 0x%lx\n", regs->r12); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r13 = 0x%lx\n", regs->r13); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r14 = 0x%lx\n", regs->r14); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r15 = 0x%lx\n", regs->r15); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ip = 0x%lx\n", regs->ip); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: flags = 0x%lx\n", regs->flags); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cs = 0x%lx\n", regs->cs); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ss = 0x%lx\n", regs->ss); +#endif +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,24)) + sprintf(buf, "%016lx", (unsigned long) swab64(regs->ax)); @@ -3360,38 +3395,38 @@ +gtp_regs2bin(struct pt_regs *regs, char *buf) +{ +#ifdef CONFIG_X86_32 -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_regs2ascii: ax = 0x%x\n", ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ax = 0x%x\n", + (unsigned int) regs->ax); -+ printk(GTP_DEBUG "gtp_regs2ascii: cx = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cx = 0x%x\n", + (unsigned int) regs->cx); -+ printk(GTP_DEBUG "gtp_regs2ascii: dx = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: dx = 0x%x\n", + (unsigned int) regs->dx); -+ printk(GTP_DEBUG "gtp_regs2ascii: bx = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bx = 0x%x\n", + (unsigned int) regs->bx); -+ printk(GTP_DEBUG "gtp_regs2ascii: sp = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: sp = 0x%x\n", + (unsigned int) regs->sp); -+ printk(GTP_DEBUG "gtp_regs2ascii: bp = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bp = 0x%x\n", + (unsigned int) regs->bp); -+ printk(GTP_DEBUG "gtp_regs2ascii: si = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: si = 0x%x\n", + (unsigned int) regs->si); -+ printk(GTP_DEBUG "gtp_regs2ascii: di = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: di = 0x%x\n", + (unsigned int) regs->di); -+ printk(GTP_DEBUG "gtp_regs2ascii: ip = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ip = 0x%x\n", + (unsigned int) regs->ip); -+ printk(GTP_DEBUG "gtp_regs2ascii: flags = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: flags = 0x%x\n", + (unsigned int) regs->flags); -+ printk(GTP_DEBUG "gtp_regs2ascii: cs = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cs = 0x%x\n", + (unsigned int) regs->cs); -+ printk(GTP_DEBUG "gtp_regs2ascii: ss = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ss = 0x%x\n", + (unsigned int) regs->ss); -+ printk(GTP_DEBUG "gtp_regs2ascii: ds = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ds = 0x%x\n", + (unsigned int) regs->ds); -+ printk(GTP_DEBUG "gtp_regs2ascii: es = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: es = 0x%x\n", + (unsigned int) regs->es); -+ printk(GTP_DEBUG "gtp_regs2ascii: fs = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: fs = 0x%x\n", + (unsigned int) regs->fs); -+ printk(GTP_DEBUG "gtp_regs2ascii: gs = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: gs = 0x%x\n", + (unsigned int) regs->gs); +#endif +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,24)) @@ -3464,27 +3499,27 @@ + buf += 4; +#endif +#else -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_regs2ascii: ax = 0x%lx\n", regs->ax); -+ printk(GTP_DEBUG "gtp_regs2ascii: bx = 0x%lx\n", regs->bx); -+ printk(GTP_DEBUG "gtp_regs2ascii: cx = 0x%lx\n", regs->cx); -+ printk(GTP_DEBUG "gtp_regs2ascii: dx = 0x%lx\n", regs->dx); -+ printk(GTP_DEBUG "gtp_regs2ascii: si = 0x%lx\n", regs->si); -+ printk(GTP_DEBUG "gtp_regs2ascii: di = 0x%lx\n", regs->di); -+ printk(GTP_DEBUG "gtp_regs2ascii: bp = 0x%lx\n", regs->bp); -+ printk(GTP_DEBUG "gtp_regs2ascii: sp = 0x%lx\n", regs->sp); -+ printk(GTP_DEBUG "gtp_regs2ascii: r8 = 0x%lx\n", regs->r8); -+ printk(GTP_DEBUG "gtp_regs2ascii: r9 = 0x%lx\n", regs->r9); -+ printk(GTP_DEBUG "gtp_regs2ascii: r10 = 0x%lx\n", regs->r10); -+ printk(GTP_DEBUG "gtp_regs2ascii: r11 = 0x%lx\n", regs->r11); -+ printk(GTP_DEBUG "gtp_regs2ascii: r12 = 0x%lx\n", regs->r12); -+ printk(GTP_DEBUG "gtp_regs2ascii: r13 = 0x%lx\n", regs->r13); -+ printk(GTP_DEBUG "gtp_regs2ascii: r14 = 0x%lx\n", regs->r14); -+ printk(GTP_DEBUG "gtp_regs2ascii: r15 = 0x%lx\n", regs->r15); -+ printk(GTP_DEBUG "gtp_regs2ascii: ip = 0x%lx\n", regs->ip); -+ printk(GTP_DEBUG "gtp_regs2ascii: flags = 0x%lx\n", regs->flags); -+ printk(GTP_DEBUG "gtp_regs2ascii: cs = 0x%lx\n", regs->cs); -+ printk(GTP_DEBUG "gtp_regs2ascii: ss = 0x%lx\n", regs->ss); ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ax = 0x%lx\n", regs->ax); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bx = 0x%lx\n", regs->bx); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cx = 0x%lx\n", regs->cx); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: dx = 0x%lx\n", regs->dx); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: si = 0x%lx\n", regs->si); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: di = 0x%lx\n", regs->di); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bp = 0x%lx\n", regs->bp); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: sp = 0x%lx\n", regs->sp); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r8 = 0x%lx\n", regs->r8); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r9 = 0x%lx\n", regs->r9); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r10 = 0x%lx\n", regs->r10); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r11 = 0x%lx\n", regs->r11); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r12 = 0x%lx\n", regs->r12); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r13 = 0x%lx\n", regs->r13); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r14 = 0x%lx\n", regs->r14); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r15 = 0x%lx\n", regs->r15); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ip = 0x%lx\n", regs->ip); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: flags = 0x%lx\n", regs->flags); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cs = 0x%lx\n", regs->cs); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ss = 0x%lx\n", regs->ss); +#endif +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,24)) + memcpy(buf, ®s->ax, 8); @@ -3604,22 +3639,22 @@ +static void +gtp_regs2ascii(struct pt_regs *regs, char *buf) +{ -+#ifdef GTP_DEBUG ++#ifdef GTP_DEBUG_V + { + int i; + + for (i = 0; i < 32; i++) -+ printk(GTP_DEBUG "gtp_gdbrsp_g: r%d = 0x%lx\n", i, ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: r%d = 0x%lx\n", i, + regs->regs[i]); + } -+ printk(GTP_DEBUG "gtp_gdbrsp_g: status = 0x%lx\n", ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: status = 0x%lx\n", + regs->cp0_status); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: lo = 0x%lx\n", regs->lo); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: hi = 0x%lx\n", regs->hi); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: badvaddr = 0x%lx\n", ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: lo = 0x%lx\n", regs->lo); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: hi = 0x%lx\n", regs->hi); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: badvaddr = 0x%lx\n", + regs->cp0_badvaddr); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: cause = 0x%lx\n", regs->cp0_cause); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: pc = 0x%lx\n", regs->cp0_epc); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: cause = 0x%lx\n", regs->cp0_cause); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: pc = 0x%lx\n", regs->cp0_epc); +#endif + +#ifdef CONFIG_32BIT @@ -3675,22 +3710,22 @@ +static void +gtp_regs2bin(struct pt_regs *regs, char *buf) +{ -+#ifdef GTP_DEBUG ++#ifdef GTP_DEBUG_V + { + int i; + + for (i = 0; i < 32; i++) -+ printk(GTP_DEBUG "gtp_gdbrsp_g: r%d = 0x%lx\n", i, ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: r%d = 0x%lx\n", i, + regs->regs[i]); + } -+ printk(GTP_DEBUG "gtp_gdbrsp_g: status = 0x%lx\n", ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: status = 0x%lx\n", + regs->cp0_status); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: lo = 0x%lx\n", regs->lo); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: hi = 0x%lx\n", regs->hi); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: badvaddr = 0x%lx\n", ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: lo = 0x%lx\n", regs->lo); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: hi = 0x%lx\n", regs->hi); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: badvaddr = 0x%lx\n", + regs->cp0_badvaddr); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: cause = 0x%lx\n", regs->cp0_cause); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: pc = 0x%lx\n", regs->cp0_epc); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: cause = 0x%lx\n", regs->cp0_cause); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: pc = 0x%lx\n", regs->cp0_epc); +#endif + +#ifdef CONFIG_32BIT @@ -3746,8 +3781,8 @@ + int i; + + for (i = 0; i < 16; i++) { -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_gdbrsp_g: r%d = 0x%lx\n", ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: r%d = 0x%lx\n", + i, regs->uregs[i]); +#endif + sprintf(buf, "%08lx", (unsigned long) SWAB(regs->uregs[i])); @@ -3758,8 +3793,8 @@ + memset(buf, '0', 200); + buf += 200; + -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_gdbrsp_g: cpsr = 0x%lx\n", regs->uregs[16]); ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: cpsr = 0x%lx\n", regs->uregs[16]); +#endif + sprintf(buf, "%08lx", + (unsigned long) SWAB(regs->uregs[16])); @@ -3773,8 +3808,8 @@ + int i; + + for (i = 0; i < 16; i++) { -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_gdbrsp_g: r%d = 0x%lx\n", ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: r%d = 0x%lx\n", + i, regs->uregs[i]); +#endif + memcpy(buf, ®s->uregs[i], 4); @@ -3785,8 +3820,8 @@ + memset(buf, '\0', 100); + buf += 100; + -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_gdbrsp_g: cpsr = 0x%lx\n", regs->uregs[16]); ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: cpsr = 0x%lx\n", regs->uregs[16]); +#endif + memcpy(buf, ®s->uregs[16], 4); + buf += 4; @@ -4307,8 +4342,8 @@ + fm->size = size; + tmp += sizeof(struct gtp_frame_mem); + -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_action_memory_read: id:%d addr:%p %p %u\n", ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_action_memory_read: id:%d addr:%p %p %u\n", + (int)gts->tpe->num, (void *)(CORE_ADDR)gts->tpe->addr, + (void *)addr, (unsigned int)size); +#endif @@ -4410,8 +4445,8 @@ +{ + struct gtp_var *ret; + -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_gtp_var_array_find: num:%u %u %u\n", ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_gtp_var_array_find: num:%u %u %u\n", + gtp_var_head, gtp_var_tail, num); +#endif + @@ -4425,30 +4460,32 @@ + return ret; +} + -+uint64_t -+gtp_get_var(struct gtp_trace_s *gts, struct gtp_var *tve) ++static uint64_t ++gtp_get_var_special(struct gtp_trace_s *gts, unsigned int num) +{ -+ switch (tve->num) { ++ uint64_t ret; ++ ++ switch (num) { + case GTP_VAR_CURRENT_TASK_ID: + if (gts->ri) -+ return (uint64_t)(CORE_ADDR)gts->ri->task; ++ ret = (uint64_t)(CORE_ADDR)gts->ri->task; + else -+ return (uint64_t)(CORE_ADDR)get_current(); ++ ret = (uint64_t)(CORE_ADDR)get_current(); + break; + case GTP_VAR_CURRENT_TASK_PID_ID: + if (gts->ri) -+ return (uint64_t)(CORE_ADDR)gts->ri->task->pid; ++ ret = (uint64_t)(CORE_ADDR)gts->ri->task->pid; + else -+ return (uint64_t)(CORE_ADDR)get_current()->pid; ++ ret = (uint64_t)(CORE_ADDR)get_current()->pid; + break; + case GTP_VAR_CURRENT_THREAD_INFO_ID: -+ return (uint64_t)(CORE_ADDR)current_thread_info(); ++ ret = (uint64_t)(CORE_ADDR)current_thread_info(); + break; + case GTP_VAR_CLOCK_ID: -+ return (uint64_t)GTP_LOCAL_CLOCK; ++ ret = (uint64_t)GTP_LOCAL_CLOCK; + break; + case GTP_VAR_COOKED_CLOCK_ID: -+ return (uint64_t)(__get_cpu_var(local_clock_current) ++ ret = (uint64_t)(__get_cpu_var(local_clock_current) + - __get_cpu_var(local_clock_offset)); + break; +#ifdef CONFIG_X86 @@ -4456,50 +4493,134 @@ + { + unsigned long long a; + rdtscll(a); -+ return (uint64_t)a; ++ ret = (uint64_t)a; + } + break; + case GTP_VAR_COOKED_RDTSC_ID: -+ return (uint64_t)(__get_cpu_var(rdtsc_current) ++ ret = (uint64_t)(__get_cpu_var(rdtsc_current) + - __get_cpu_var(rdtsc_offset)); + break; +#endif + case GTP_VAR_CPU_ID: -+ return (uint64_t)(CORE_ADDR)smp_processor_id(); ++ ret = (uint64_t)(CORE_ADDR)smp_processor_id(); + break; + case GTP_VAR_CPU_NUMBER_ID: -+ return (uint64_t)gtp_cpu_number; ++ ret = (uint64_t)gtp_cpu_number; + break; + case GTP_VAR_PRINTK_TMP_ID: -+ return gts->printk_tmp; ++ ret = gts->printk_tmp; + break; + case GTP_VAR_DUMP_STACK_ID: + printk(KERN_NULL "gtp %d %p:", (int)gts->tpe->num, + (void *)(CORE_ADDR)gts->tpe->addr); + dump_stack(); -+ return 0; ++ ret = 0; + break; + case GTP_VAR_XTIME_SEC_ID: + if (gts->xtime.tv_sec == 0 && gts->xtime.tv_nsec == 0) + getnstimeofday(>s->xtime); -+ return (uint64_t)gts->xtime.tv_sec; ++ ret = (uint64_t)gts->xtime.tv_sec; + break; + case GTP_VAR_XTIME_NSEC_ID: + if (gts->xtime.tv_sec == 0 && gts->xtime.tv_nsec == 0) + getnstimeofday(>s->xtime); -+ return (uint64_t)gts->xtime.tv_nsec; ++ ret = (uint64_t)gts->xtime.tv_nsec; + break; + case GTP_VAR_HARDIRQ_COUNT_ID: -+ return (uint64_t)hardirq_count(); ++ ret = (uint64_t)hardirq_count(); + break; + case GTP_VAR_SOFTIRQ_COUNT_ID: -+ return (uint64_t)softirq_count(); ++ ret = (uint64_t)softirq_count(); + break; + case GTP_VAR_IRQ_COUNT_ID: -+ return (uint64_t)irq_count(); ++ ret = (uint64_t)irq_count(); + break; ++ default: ++ ret = 0; ++ break; + } + ++ return ret; ++} ++ ++static void++gtp_set_var_special(struct gtp_trace_s *gts, unsigned int num, ULONGEST val)
++{ ++ switch (num) { ++ case GTP_VAR_PRINTK_TMP_ID: ++ gts->printk_tmp = val; ++ break; ++ case GTP_VAR_PRINTK_LEVEL_ID: ++ gts->printk_level = (unsigned int)val; ++ break; ++ case GTP_VAR_PRINTK_FORMAT_ID: ++ gts->printk_format = (unsigned int)val; ++ break; ++ case GTP_VAR_PC_PE_EN_ID: ++ gtp_pc_pe_en((int)val); ++ break; ++ } ++} ++ ++static int ++gtp_collect_var_special(struct gtp_trace_s *gts, unsigned int num) ++{ ++ struct gtp_frame_var *fvar; ++ char *tmp; ++#ifdef GTP_FTRACE_RING_BUFFER ++ struct ring_buffer_event *rbe; ++#endif ++ ++ if (gts->next == NULL) { ++ if (gtp_action_head(gts)) ++ return -1; ++ } ++ ++ if (GTP_VAR_AUTO_TRACEV(num)) ++ return 0; ++ ++#ifdef GTP_FTRACE_RING_BUFFER ++ GTP_FRAME_RINGBUFFER_ALLOC(GTP_FRAME_VAR_SIZE); ++#endif ++#if defined(GTP_FRAME_SIMPLE) || defined(GTP_RB) ++#ifdef GTP_RB ++ tmp = gtp_rb_alloc(gts->next, GTP_FRAME_VAR_SIZE, gts->id); ++#endif ++#ifdef GTP_FRAME_SIMPLE ++ tmp = gtp_frame_alloc(GTP_FRAME_VAR_SIZE); ++#endif ++ if (!tmp) { ++ gts->tpe->reason = gtp_stop_frame_full; ++ return -1; ++ } ++#ifdef GTP_FRAME_SIMPLE ++ *gts->next = tmp; ++#endif ++#endif ++ ++ FID(tmp) = FID_VAR; ++ tmp += FID_SIZE; ++ ++#ifdef GTP_FRAME_SIMPLE ++ gts->next = (char **)tmp; ++ *gts->next = NULL; ++ tmp += sizeof(char *); ++#endif ++ ++ fvar = (struct gtp_frame_var *) tmp; ++ fvar->num = num; ++ fvar->val = gtp_get_var_special(gts, num); ++ ++#ifdef GTP_FTRACE_RING_BUFFER ++ ring_buffer_unlock_commit(gtp_frame, rbe); ++#endif ++ ++ return 0; ++} ++ ++uint64_t ++gtp_get_var(struct gtp_trace_s *gts, struct gtp_var *tve) ++{ +#ifdef GTP_PERF_EVENTS + if (tve->ptid == pe_tv_val || tve->ptid == pe_tv_enabled + || tve->ptid == pe_tv_running) { @@ -4578,118 +4699,6 @@ + + return 0; +} -+ -+#define gtp_action_x_getv \ -+ do { \ -+ struct gtp_var *tve; \ -+ \ -+ tve = gtp_gtp_var_array_find(arg); \ -+ if (!tve) \ -+ goto code_error_out; \ -+ \ -+ stack[sp++] = top; \ -+ \ -+ top = gtp_get_var(gts, tve); \ -+ } while (0) -+ -+#ifdef GTP_PERF_EVENTS -+#define gtp_action_x_setv_pe \ -+ do { \ -+ if (tve->ptid == pe_tv_en) \ -+ gtp_pe_set_en(tve->pts, (int)top); \ -+ else if (tve->ptid == pe_tv_val) \ -+ perf_event_set(tve->pts->event, (u64)top); \ -+ } while (0) -+#else -+#define gtp_action_x_setv_pe -+#endif -+ -+#define gtp_action_x_setv \ -+ do { \ -+ switch (arg) { \ -+ case GTP_VAR_PRINTK_TMP_ID: \ -+ gts->printk_tmp = top; \ -+ break; \ -+ case GTP_VAR_PRINTK_LEVEL_ID: \ -+ gts->printk_level = (unsigned int)top; \ -+ break; \ -+ case GTP_VAR_PRINTK_FORMAT_ID: \ -+ gts->printk_format = (unsigned int)top; \ -+ break; \ -+ case GTP_VAR_PC_PE_EN_ID: \ -+ gtp_pc_pe_en((int)top); \ -+ break; \ -+ default: { \ -+ struct gtp_var *tve; \ -+ \ -+ tve = gtp_gtp_var_array_find(arg); \ -+ if (!tve) \ -+ goto code_error_out; \ -+ gtp_action_x_setv_pe; \ -+ /* Not check the other special \ -+ trace state variables. \ -+ Because set in tve->val doesn't \ -+ affect anything. */ \ -+ tve->val = (uint64_t)top; \ -+ } \ -+ break; \ -+ } \ -+ } while (0) -+ -+#define gtp_action_x_tracev \ -+ do { \ -+ if (!gts->tpe->have_printk \ -+ || !GTP_VAR_AUTO_TRACEV(arg)) { \ -+ struct gtp_var *tve; \ -+ \ -+ tve = gtp_gtp_var_array_find(arg); \ -+ if (!tve) \ -+ goto code_error_out; \ -+ \ -+ if (gtp_collect_var(gts, tve)) { \ -+ /* gtp_collect_var will set error \ -+ status with itself if it got \ -+ error. */ \ -+ goto out; \ -+ } \ -+ } \ -+ } while (0) -+ -+#define gtp_action_x_tracev_printk \ -+ do { \ -+ struct gtp_var *tve; \ -+ \ -+ tve = gtp_gtp_var_array_find(arg); \ -+ if (!tve) \ -+ goto code_error_out; \ -+ \ -+ if (gtp_action_printk(gts, gtp_get_var(gts, tve), 0)) { \ -+ /* gtp_collect_var will set error status with \ -+ itself if it got error. */ \ -+ goto out; \ -+ } \ -+ } while (0) -+ -+#define gtp_action_x_printf \ -+ do { \ -+ if (strstr((char *)(ebuf + pc), "%s")) { \ -+ int i; \ -+ char buf[50]; \ -+ \ -+ for (i = 0; i < 50; i++) { \ -+ if (probe_kernel_read(buf + i, \ -+ argv + i, 1)) \ -+ goto code_error_out; \ -+ if (!buf[i]) \ -+ break; \ -+ } \ -+ snprintf(pbuf, psize, (char *)(ebuf + pc), \ -+ buf); \ -+ } else { \ -+ snprintf(pbuf, psize, (char *)(ebuf + pc), \ -+ argv); \ -+ } \ -+ } while (0) + +#define STACK_MAX 32 +static DEFINE_PER_CPU(ULONGEST[STACK_MAX], action_x_stack); @@ -4727,657 +4736,558 @@ + if (unlikely(ae->u.exp.need_var_lock)) + spin_lock(>p_var_lock); + -+ if (ae->type == 'X') { -+ while (pc < ae->u.exp.size) { -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_parse_x: cmd %x\n", ebuf[pc]); ++ while (1) { ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_parse_x: cmd %x\n", ebuf[pc]); +#endif + -+ switch (ebuf[pc++]) { -+ /* add */ -+ case 0x02: ++ switch (ebuf[pc++]) { ++ /* add */ ++ case 0x02: ++ top += stack[--sp]; ++ break; ++ ++ case op_check_add: ++ if (sp) + top += stack[--sp]; -+ break; -+ /* sub */ -+ case 0x03: ++ else ++ goto code_error_out; ++ break; ++ ++ /* sub */ ++ case 0x03: ++ top = stack[--sp] - top; ++ break; ++ ++ case op_check_sub: ++ if (sp) + top = stack[--sp] - top; -+ break; -+ /* mul */ -+ case 0x04: ++ else ++ goto code_error_out; ++ break; ++ ++ /* mul */ ++ case 0x04: ++ top *= stack[--sp]; ++ break; ++ ++ case op_check_mul: ++ if (sp) + top *= stack[--sp]; -+ break; ++ else ++ goto code_error_out; ++ break; ++ +#ifndef CONFIG_MIPS -+ /* div_signed */ -+ case 0x05: -+ if (top) { -+ LONGEST l = (LONGEST) stack[--sp]; -+ do_div(l, (LONGEST) top); -+ top = l; -+ } else -+ goto code_error_out; -+ break; -+ /* div_unsigned */ -+ case 0x06: -+ if (top) { -+ ULONGEST ul = stack[--sp]; -+ do_div(ul, top); -+ top = ul; -+ } else -+ goto code_error_out; -+ break; -+ /* rem_signed */ -+ case 0x07: -+ if (top) { -+ LONGEST l1 = (LONGEST) stack[--sp]; -+ LONGEST l2 = (LONGEST) top; -+ top = do_div(l1, l2); -+ } else -+ goto code_error_out; -+ break; -+ /* rem_unsigned */ -+ case 0x08: -+ if (top) { -+ ULONGEST ul1 = stack[--sp]; -+ ULONGEST ul2 = top; -+ top = do_div(ul1, ul2); -+ } else -+ goto code_error_out; -+ break; ++ /* div_signed */ ++ case 0x05: ++ if (top) { ++ LONGEST l = (LONGEST) stack[--sp]; ++ do_div(l, (LONGEST) top); ++ top = l; ++ } else ++ goto code_error_out; ++ break; ++ ++ case op_check_div_signed: ++ if (top && sp) { ++ LONGEST l = (LONGEST) stack[--sp]; ++ do_div(l, (LONGEST) top); ++ top = l; ++ } else ++ goto code_error_out; ++ break; ++ ++ /* div_unsigned */ ++ case 0x06: ++ if (top) { ++ ULONGEST ul = stack[--sp]; ++ do_div(ul, top); ++ top = ul; ++ } else ++ goto code_error_out; ++ break; ++ ++ case op_check_div_unsigned: ++ if (top && sp) { ++ ULONGEST ul = stack[--sp]; ++ do_div(ul, top); ++ top = ul; ++ } else ++ goto code_error_out; ++ break; ++ ++ /* rem_signed */ ++ case 0x07: ++ if (top) { ++ LONGEST l1 = (LONGEST) stack[--sp]; ++ LONGEST l2 = (LONGEST) top; ++ top = do_div(l1, l2); ++ } else ++ goto code_error_out; ++ break; ++ ++ case op_check_rem_signed: ++ if (top && sp) { ++ LONGEST l1 = (LONGEST) stack[--sp]; ++ LONGEST l2 = (LONGEST) top; ++ top = do_div(l1, l2); ++ } else ++ goto code_error_out; ++ break; ++ ++ /* rem_unsigned */ ++ case 0x08: ++ if (top) { ++ ULONGEST ul1 = stack[--sp]; ++ ULONGEST ul2 = top; ++ top = do_div(ul1, ul2); ++ } else ++ goto code_error_out; ++ break; ++ ++ case op_check_rem_unsigned: ++ if (top && sp) { ++ ULONGEST ul1 = stack[--sp]; ++ ULONGEST ul2 = top; ++ top = do_div(ul1, ul2); ++ } else ++ goto code_error_out; ++ break; +#endif -+ /* lsh */ -+ case 0x09: ++ ++ /* lsh */ ++ case 0x09: ++ top = stack[--sp] << top; ++ break; ++ ++ case op_check_lsh: ++ if (sp) + top = stack[--sp] << top; -+ break; -+ /* rsh_signed */ -+ case 0x0a: ++ else ++ goto code_error_out; ++ break; ++ ++ /* rsh_signed */ ++ case 0x0a: ++ top = ((LONGEST) stack[--sp]) >> top; ++ break; ++ ++ case op_check_rsh_signed: ++ if (sp) + top = ((LONGEST) stack[--sp]) >> top; -+ break; -+ /* rsh_unsigned */ -+ case 0x0b: ++ else ++ goto code_error_out; ++ break; ++ ++ /* rsh_unsigned */ ++ case 0x0b: ++ top = stack[--sp] >> top; ++ break; ++ ++ case op_check_rsh_unsigned: ++ if (sp) + top = stack[--sp] >> top; -+ break; -+ /* trace */ -+ case 0x0c: -+ --sp; -+ if (!gts->tpe->have_printk) { -+ if (gtp_action_memory_read -+ (gts, -1, -+ (CORE_ADDR) stack[sp], -+ (size_t) top)) -+ goto out; ++ else ++ goto code_error_out; ++ break; ++ ++ /* trace */ ++ case 0x0c: ++ --sp; ++ if (!gts->tpe->have_printk) { ++ if (gtp_action_memory_read ++ (gts, -1, ++ (CORE_ADDR) stack[sp], ++ (size_t) top)) ++ goto out; ++ } ++ top = stack[--sp]; ++ break; ++ ++ case op_check_trace: ++ if (sp > 1) { ++ if (gtp_action_memory_read ++ (gts, -1, (CORE_ADDR) stack[--sp], ++ (size_t) top)) { ++ /* gtp_action_memory_read will ++ set error status with itself ++ if it got error. */ ++ goto out; + } + top = stack[--sp]; -+ break; -+ /* trace_printk */ -+ case 0xfd: -+ if (gtp_action_printk(gts, ***The diff for this file has been truncated for email.*** ======================================= --- /trunk/gtp_2.6.39.patch Sat Feb 25 02:36:54 2012 +++ /trunk/gtp_2.6.39.patch Mon Mar 19 01:02:54 2012 @@ -5,12 +5,13 @@ kernel/perf_event.c | 16 lib/Kconfig.debug | 10 lib/Makefile | 2- lib/gtp.c | 9210 +++++++++++++++++++++++++++++++++++++++
- lib/gtp_rb.c | 495 ++ - scripts/gtp/add-ons/pe.py | 729 ++++ lib/gtp.c | 9519 +++++++++++++++++++++++++++++++++++++++
+ lib/gtp_rb.c | 498 ++ + scripts/gtp/add-ons/hotcode.py | 588 ++ + scripts/gtp/add-ons/pe.py | 729 ++ scripts/gtp/getgtprsp.pl | 137 scripts/gtp/getmod.py | 132 - 11 files changed, 12501 insertions(+), 2 deletions(-) + 12 files changed, 13401 insertions(+), 2 deletions(-) --- /dev/null +++ b/Documentation/gtp/howto.txt @@ -1901,7 +1902,7 @@ --- /dev/null +++ b/lib/gtp.c -@@ -0,0 +1,9210 @@ +@@ -0,0 +1,9519 @@ +/* + * Kernel GDB tracepoint module. + * @@ -1923,8 +1924,8 @@ + * + */ + -+/* If *10 means that this is not a release version. */ -+#define GTP_VERSION (20120224) ++/* If "* 10" means that this is not a release version. */ ++#define GTP_VERSION (20120319) + +#include <linux/version.h> +#ifndef RHEL_RELEASE_VERSION @@ -2108,6 +2109,8 @@ +#define GTP_DEBUG KERN_WARNING +#endif + ++/* #define GTP_DEBUG_V */ ++ +#define GTP_RW_MAX 16384 +#define GTP_RW_BUFP_MAX (GTP_RW_MAX - 4 - gtp_rw_size) + @@ -2151,7 +2154,39 @@ +#define GTP_FRAME_VAR_SIZE (FID_SIZE + sizeof(struct gtp_frame_var)) +#endif + -+#define TOHEX(h) ((h) > 9 ? (h) + 'a' - 10 : (h) + '0') ++#define INT2CHAR(h) ((h) > 9 ? (h) + 'a' - 10 : (h) + '0') ++ ++enum { ++ op_check_add = 0xe5, ++ op_check_sub, ++ op_check_mul, ++ op_check_div_signed, ++ op_check_div_unsigned, ++ op_check_rem_signed, ++ op_check_rem_unsigned, ++ op_check_lsh, ++ op_check_rsh_signed, ++ op_check_rsh_unsigned, ++ op_check_trace, ++ op_check_bit_and, ++ op_check_bit_or, ++ op_check_bit_xor, ++ op_check_equal, ++ op_check_less_signed, ++ op_check_less_unsigned, ++ op_check_pop, ++ op_check_swap, ++ op_check_if_goto, ++ op_check_printf, /* XXX: still not used. */ ++ ++ op_special_getv = 0xfa, ++ op_special_setv, ++ op_special_tracev, ++ ++ op_trace_printk = 0xfd, ++ op_trace_quick_printk, ++ op_tracev_printk, ++}; + +struct action_agent_exp { + unsigned int size; @@ -2338,7 +2373,7 @@ + GTP_VAR_IRQ_COUNT_ID, + GTP_VAR_PIPE_TRACE_ID, + GTP_VAR_CURRENT_TASK_PID_ID, -+ GTP_VAR_SPECIAL_MAX = GTP_VAR_PIPE_TRACE_ID, ++ GTP_VAR_SPECIAL_MAX = GTP_VAR_CURRENT_TASK_PID_ID, +}; + +#define PREV_VAR NULL @@ -3150,38 +3185,38 @@ +gtp_regs2ascii(struct pt_regs *regs, char *buf) +{ +#ifdef CONFIG_X86_32 -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_regs2ascii: ax = 0x%x\n", ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ax = 0x%x\n", + (unsigned int) regs->ax); -+ printk(GTP_DEBUG "gtp_regs2ascii: cx = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cx = 0x%x\n", + (unsigned int) regs->cx); -+ printk(GTP_DEBUG "gtp_regs2ascii: dx = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: dx = 0x%x\n", + (unsigned int) regs->dx); -+ printk(GTP_DEBUG "gtp_regs2ascii: bx = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bx = 0x%x\n", + (unsigned int) regs->bx); -+ printk(GTP_DEBUG "gtp_regs2ascii: sp = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: sp = 0x%x\n", + (unsigned int) regs->sp); -+ printk(GTP_DEBUG "gtp_regs2ascii: bp = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bp = 0x%x\n", + (unsigned int) regs->bp); -+ printk(GTP_DEBUG "gtp_regs2ascii: si = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: si = 0x%x\n", + (unsigned int) regs->si); -+ printk(GTP_DEBUG "gtp_regs2ascii: di = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: di = 0x%x\n", + (unsigned int) regs->di); -+ printk(GTP_DEBUG "gtp_regs2ascii: ip = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ip = 0x%x\n", + (unsigned int) regs->ip); -+ printk(GTP_DEBUG "gtp_regs2ascii: flags = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: flags = 0x%x\n", + (unsigned int) regs->flags); -+ printk(GTP_DEBUG "gtp_regs2ascii: cs = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cs = 0x%x\n", + (unsigned int) regs->cs); -+ printk(GTP_DEBUG "gtp_regs2ascii: ss = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ss = 0x%x\n", + (unsigned int) regs->ss); -+ printk(GTP_DEBUG "gtp_regs2ascii: ds = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ds = 0x%x\n", + (unsigned int) regs->ds); -+ printk(GTP_DEBUG "gtp_regs2ascii: es = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: es = 0x%x\n", + (unsigned int) regs->es); -+ printk(GTP_DEBUG "gtp_regs2ascii: fs = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: fs = 0x%x\n", + (unsigned int) regs->fs); -+ printk(GTP_DEBUG "gtp_regs2ascii: gs = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: gs = 0x%x\n", + (unsigned int) regs->gs); +#endif +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,24)) @@ -3254,27 +3289,27 @@ + buf += 8; +#endif +#else -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_regs2ascii: ax = 0x%lx\n", regs->ax); -+ printk(GTP_DEBUG "gtp_regs2ascii: bx = 0x%lx\n", regs->bx); -+ printk(GTP_DEBUG "gtp_regs2ascii: cx = 0x%lx\n", regs->cx); -+ printk(GTP_DEBUG "gtp_regs2ascii: dx = 0x%lx\n", regs->dx); -+ printk(GTP_DEBUG "gtp_regs2ascii: si = 0x%lx\n", regs->si); -+ printk(GTP_DEBUG "gtp_regs2ascii: di = 0x%lx\n", regs->di); -+ printk(GTP_DEBUG "gtp_regs2ascii: bp = 0x%lx\n", regs->bp); -+ printk(GTP_DEBUG "gtp_regs2ascii: sp = 0x%lx\n", regs->sp); -+ printk(GTP_DEBUG "gtp_regs2ascii: r8 = 0x%lx\n", regs->r8); -+ printk(GTP_DEBUG "gtp_regs2ascii: r9 = 0x%lx\n", regs->r9); -+ printk(GTP_DEBUG "gtp_regs2ascii: r10 = 0x%lx\n", regs->r10); -+ printk(GTP_DEBUG "gtp_regs2ascii: r11 = 0x%lx\n", regs->r11); -+ printk(GTP_DEBUG "gtp_regs2ascii: r12 = 0x%lx\n", regs->r12); -+ printk(GTP_DEBUG "gtp_regs2ascii: r13 = 0x%lx\n", regs->r13); -+ printk(GTP_DEBUG "gtp_regs2ascii: r14 = 0x%lx\n", regs->r14); -+ printk(GTP_DEBUG "gtp_regs2ascii: r15 = 0x%lx\n", regs->r15); -+ printk(GTP_DEBUG "gtp_regs2ascii: ip = 0x%lx\n", regs->ip); -+ printk(GTP_DEBUG "gtp_regs2ascii: flags = 0x%lx\n", regs->flags); -+ printk(GTP_DEBUG "gtp_regs2ascii: cs = 0x%lx\n", regs->cs); -+ printk(GTP_DEBUG "gtp_regs2ascii: ss = 0x%lx\n", regs->ss); ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ax = 0x%lx\n", regs->ax); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bx = 0x%lx\n", regs->bx); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cx = 0x%lx\n", regs->cx); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: dx = 0x%lx\n", regs->dx); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: si = 0x%lx\n", regs->si); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: di = 0x%lx\n", regs->di); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bp = 0x%lx\n", regs->bp); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: sp = 0x%lx\n", regs->sp); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r8 = 0x%lx\n", regs->r8); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r9 = 0x%lx\n", regs->r9); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r10 = 0x%lx\n", regs->r10); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r11 = 0x%lx\n", regs->r11); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r12 = 0x%lx\n", regs->r12); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r13 = 0x%lx\n", regs->r13); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r14 = 0x%lx\n", regs->r14); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r15 = 0x%lx\n", regs->r15); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ip = 0x%lx\n", regs->ip); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: flags = 0x%lx\n", regs->flags); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cs = 0x%lx\n", regs->cs); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ss = 0x%lx\n", regs->ss); +#endif +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,24)) + sprintf(buf, "%016lx", (unsigned long) swab64(regs->ax)); @@ -3353,38 +3388,38 @@ +gtp_regs2bin(struct pt_regs *regs, char *buf) +{ +#ifdef CONFIG_X86_32 -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_regs2ascii: ax = 0x%x\n", ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ax = 0x%x\n", + (unsigned int) regs->ax); -+ printk(GTP_DEBUG "gtp_regs2ascii: cx = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cx = 0x%x\n", + (unsigned int) regs->cx); -+ printk(GTP_DEBUG "gtp_regs2ascii: dx = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: dx = 0x%x\n", + (unsigned int) regs->dx); -+ printk(GTP_DEBUG "gtp_regs2ascii: bx = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bx = 0x%x\n", + (unsigned int) regs->bx); -+ printk(GTP_DEBUG "gtp_regs2ascii: sp = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: sp = 0x%x\n", + (unsigned int) regs->sp); -+ printk(GTP_DEBUG "gtp_regs2ascii: bp = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bp = 0x%x\n", + (unsigned int) regs->bp); -+ printk(GTP_DEBUG "gtp_regs2ascii: si = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: si = 0x%x\n", + (unsigned int) regs->si); -+ printk(GTP_DEBUG "gtp_regs2ascii: di = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: di = 0x%x\n", + (unsigned int) regs->di); -+ printk(GTP_DEBUG "gtp_regs2ascii: ip = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ip = 0x%x\n", + (unsigned int) regs->ip); -+ printk(GTP_DEBUG "gtp_regs2ascii: flags = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: flags = 0x%x\n", + (unsigned int) regs->flags); -+ printk(GTP_DEBUG "gtp_regs2ascii: cs = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cs = 0x%x\n", + (unsigned int) regs->cs); -+ printk(GTP_DEBUG "gtp_regs2ascii: ss = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ss = 0x%x\n", + (unsigned int) regs->ss); -+ printk(GTP_DEBUG "gtp_regs2ascii: ds = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ds = 0x%x\n", + (unsigned int) regs->ds); -+ printk(GTP_DEBUG "gtp_regs2ascii: es = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: es = 0x%x\n", + (unsigned int) regs->es); -+ printk(GTP_DEBUG "gtp_regs2ascii: fs = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: fs = 0x%x\n", + (unsigned int) regs->fs); -+ printk(GTP_DEBUG "gtp_regs2ascii: gs = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: gs = 0x%x\n", + (unsigned int) regs->gs); +#endif +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,24)) @@ -3457,27 +3492,27 @@ + buf += 4; +#endif +#else -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_regs2ascii: ax = 0x%lx\n", regs->ax); -+ printk(GTP_DEBUG "gtp_regs2ascii: bx = 0x%lx\n", regs->bx); -+ printk(GTP_DEBUG "gtp_regs2ascii: cx = 0x%lx\n", regs->cx); -+ printk(GTP_DEBUG "gtp_regs2ascii: dx = 0x%lx\n", regs->dx); -+ printk(GTP_DEBUG "gtp_regs2ascii: si = 0x%lx\n", regs->si); -+ printk(GTP_DEBUG "gtp_regs2ascii: di = 0x%lx\n", regs->di); -+ printk(GTP_DEBUG "gtp_regs2ascii: bp = 0x%lx\n", regs->bp); -+ printk(GTP_DEBUG "gtp_regs2ascii: sp = 0x%lx\n", regs->sp); -+ printk(GTP_DEBUG "gtp_regs2ascii: r8 = 0x%lx\n", regs->r8); -+ printk(GTP_DEBUG "gtp_regs2ascii: r9 = 0x%lx\n", regs->r9); -+ printk(GTP_DEBUG "gtp_regs2ascii: r10 = 0x%lx\n", regs->r10); -+ printk(GTP_DEBUG "gtp_regs2ascii: r11 = 0x%lx\n", regs->r11); -+ printk(GTP_DEBUG "gtp_regs2ascii: r12 = 0x%lx\n", regs->r12); -+ printk(GTP_DEBUG "gtp_regs2ascii: r13 = 0x%lx\n", regs->r13); -+ printk(GTP_DEBUG "gtp_regs2ascii: r14 = 0x%lx\n", regs->r14); -+ printk(GTP_DEBUG "gtp_regs2ascii: r15 = 0x%lx\n", regs->r15); -+ printk(GTP_DEBUG "gtp_regs2ascii: ip = 0x%lx\n", regs->ip); -+ printk(GTP_DEBUG "gtp_regs2ascii: flags = 0x%lx\n", regs->flags); -+ printk(GTP_DEBUG "gtp_regs2ascii: cs = 0x%lx\n", regs->cs); -+ printk(GTP_DEBUG "gtp_regs2ascii: ss = 0x%lx\n", regs->ss); ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ax = 0x%lx\n", regs->ax); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bx = 0x%lx\n", regs->bx); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cx = 0x%lx\n", regs->cx); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: dx = 0x%lx\n", regs->dx); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: si = 0x%lx\n", regs->si); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: di = 0x%lx\n", regs->di); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bp = 0x%lx\n", regs->bp); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: sp = 0x%lx\n", regs->sp); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r8 = 0x%lx\n", regs->r8); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r9 = 0x%lx\n", regs->r9); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r10 = 0x%lx\n", regs->r10); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r11 = 0x%lx\n", regs->r11); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r12 = 0x%lx\n", regs->r12); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r13 = 0x%lx\n", regs->r13); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r14 = 0x%lx\n", regs->r14); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r15 = 0x%lx\n", regs->r15); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ip = 0x%lx\n", regs->ip); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: flags = 0x%lx\n", regs->flags); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cs = 0x%lx\n", regs->cs); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ss = 0x%lx\n", regs->ss); +#endif +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,24)) + memcpy(buf, ®s->ax, 8); @@ -3597,22 +3632,22 @@ +static void +gtp_regs2ascii(struct pt_regs *regs, char *buf) +{ -+#ifdef GTP_DEBUG ++#ifdef GTP_DEBUG_V + { + int i; + + for (i = 0; i < 32; i++) -+ printk(GTP_DEBUG "gtp_gdbrsp_g: r%d = 0x%lx\n", i, ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: r%d = 0x%lx\n", i, + regs->regs[i]); + } -+ printk(GTP_DEBUG "gtp_gdbrsp_g: status = 0x%lx\n", ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: status = 0x%lx\n", + regs->cp0_status); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: lo = 0x%lx\n", regs->lo); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: hi = 0x%lx\n", regs->hi); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: badvaddr = 0x%lx\n", ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: lo = 0x%lx\n", regs->lo); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: hi = 0x%lx\n", regs->hi); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: badvaddr = 0x%lx\n", + regs->cp0_badvaddr); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: cause = 0x%lx\n", regs->cp0_cause); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: pc = 0x%lx\n", regs->cp0_epc); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: cause = 0x%lx\n", regs->cp0_cause); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: pc = 0x%lx\n", regs->cp0_epc); +#endif + +#ifdef CONFIG_32BIT @@ -3668,22 +3703,22 @@ +static void +gtp_regs2bin(struct pt_regs *regs, char *buf) +{ -+#ifdef GTP_DEBUG ++#ifdef GTP_DEBUG_V + { + int i; + + for (i = 0; i < 32; i++) -+ printk(GTP_DEBUG "gtp_gdbrsp_g: r%d = 0x%lx\n", i, ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: r%d = 0x%lx\n", i, + regs->regs[i]); + } -+ printk(GTP_DEBUG "gtp_gdbrsp_g: status = 0x%lx\n", ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: status = 0x%lx\n", + regs->cp0_status); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: lo = 0x%lx\n", regs->lo); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: hi = 0x%lx\n", regs->hi); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: badvaddr = 0x%lx\n", ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: lo = 0x%lx\n", regs->lo); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: hi = 0x%lx\n", regs->hi); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: badvaddr = 0x%lx\n", + regs->cp0_badvaddr); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: cause = 0x%lx\n", regs->cp0_cause); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: pc = 0x%lx\n", regs->cp0_epc); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: cause = 0x%lx\n", regs->cp0_cause); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: pc = 0x%lx\n", regs->cp0_epc); +#endif + +#ifdef CONFIG_32BIT @@ -3739,8 +3774,8 @@ + int i; + + for (i = 0; i < 16; i++) { -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_gdbrsp_g: r%d = 0x%lx\n", ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: r%d = 0x%lx\n", + i, regs->uregs[i]); +#endif + sprintf(buf, "%08lx", (unsigned long) SWAB(regs->uregs[i])); @@ -3751,8 +3786,8 @@ + memset(buf, '0', 200); + buf += 200; + -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_gdbrsp_g: cpsr = 0x%lx\n", regs->uregs[16]); ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: cpsr = 0x%lx\n", regs->uregs[16]); +#endif + sprintf(buf, "%08lx", + (unsigned long) SWAB(regs->uregs[16])); @@ -3766,8 +3801,8 @@ + int i; + + for (i = 0; i < 16; i++) { -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_gdbrsp_g: r%d = 0x%lx\n", ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: r%d = 0x%lx\n", + i, regs->uregs[i]); +#endif + memcpy(buf, ®s->uregs[i], 4); @@ -3778,8 +3813,8 @@ + memset(buf, '\0', 100); + buf += 100; + -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_gdbrsp_g: cpsr = 0x%lx\n", regs->uregs[16]); ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: cpsr = 0x%lx\n", regs->uregs[16]); +#endif + memcpy(buf, ®s->uregs[16], 4); + buf += 4; @@ -4300,8 +4335,8 @@ + fm->size = size; + tmp += sizeof(struct gtp_frame_mem); + -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_action_memory_read: id:%d addr:%p %p %u\n", ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_action_memory_read: id:%d addr:%p %p %u\n", + (int)gts->tpe->num, (void *)(CORE_ADDR)gts->tpe->addr, + (void *)addr, (unsigned int)size); +#endif @@ -4403,8 +4438,8 @@ +{ + struct gtp_var *ret; + -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_gtp_var_array_find: num:%u %u %u\n", ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_gtp_var_array_find: num:%u %u %u\n", + gtp_var_head, gtp_var_tail, num); +#endif + @@ -4418,30 +4453,32 @@ + return ret; +} + -+uint64_t -+gtp_get_var(struct gtp_trace_s *gts, struct gtp_var *tve) ++static uint64_t ++gtp_get_var_special(struct gtp_trace_s *gts, unsigned int num) +{ -+ switch (tve->num) { ++ uint64_t ret; ++ ++ switch (num) { + case GTP_VAR_CURRENT_TASK_ID: + if (gts->ri) -+ return (uint64_t)(CORE_ADDR)gts->ri->task; ++ ret = (uint64_t)(CORE_ADDR)gts->ri->task; + else -+ return (uint64_t)(CORE_ADDR)get_current(); ++ ret = (uint64_t)(CORE_ADDR)get_current(); + break; + case GTP_VAR_CURRENT_TASK_PID_ID: + if (gts->ri) -+ return (uint64_t)(CORE_ADDR)gts->ri->task->pid; ++ ret = (uint64_t)(CORE_ADDR)gts->ri->task->pid; + else -+ return (uint64_t)(CORE_ADDR)get_current()->pid; ++ ret = (uint64_t)(CORE_ADDR)get_current()->pid; + break; + case GTP_VAR_CURRENT_THREAD_INFO_ID: -+ return (uint64_t)(CORE_ADDR)current_thread_info(); ++ ret = (uint64_t)(CORE_ADDR)current_thread_info(); + break; + case GTP_VAR_CLOCK_ID: -+ return (uint64_t)GTP_LOCAL_CLOCK; ++ ret = (uint64_t)GTP_LOCAL_CLOCK; + break; + case GTP_VAR_COOKED_CLOCK_ID: -+ return (uint64_t)(__get_cpu_var(local_clock_current) ++ ret = (uint64_t)(__get_cpu_var(local_clock_current) + - __get_cpu_var(local_clock_offset)); + break; +#ifdef CONFIG_X86 @@ -4449,50 +4486,134 @@ + { + unsigned long long a; + rdtscll(a); -+ return (uint64_t)a; ++ ret = (uint64_t)a; + } + break; + case GTP_VAR_COOKED_RDTSC_ID: -+ return (uint64_t)(__get_cpu_var(rdtsc_current) ++ ret = (uint64_t)(__get_cpu_var(rdtsc_current) + - __get_cpu_var(rdtsc_offset)); + break; +#endif + case GTP_VAR_CPU_ID: -+ return (uint64_t)(CORE_ADDR)smp_processor_id(); ++ ret = (uint64_t)(CORE_ADDR)smp_processor_id(); + break; + case GTP_VAR_CPU_NUMBER_ID: -+ return (uint64_t)gtp_cpu_number; ++ ret = (uint64_t)gtp_cpu_number; + break; + case GTP_VAR_PRINTK_TMP_ID: -+ return gts->printk_tmp; ++ ret = gts->printk_tmp; + break; + case GTP_VAR_DUMP_STACK_ID: + printk(KERN_NULL "gtp %d %p:", (int)gts->tpe->num, + (void *)(CORE_ADDR)gts->tpe->addr); + dump_stack(); -+ return 0; ++ ret = 0; + break; + case GTP_VAR_XTIME_SEC_ID: + if (gts->xtime.tv_sec == 0 && gts->xtime.tv_nsec == 0) + getnstimeofday(>s->xtime); -+ return (uint64_t)gts->xtime.tv_sec; ++ ret = (uint64_t)gts->xtime.tv_sec; + break; + case GTP_VAR_XTIME_NSEC_ID: + if (gts->xtime.tv_sec == 0 && gts->xtime.tv_nsec == 0) + getnstimeofday(>s->xtime); -+ return (uint64_t)gts->xtime.tv_nsec; ++ ret = (uint64_t)gts->xtime.tv_nsec; + break; + case GTP_VAR_HARDIRQ_COUNT_ID: -+ return (uint64_t)hardirq_count(); ++ ret = (uint64_t)hardirq_count(); + break; + case GTP_VAR_SOFTIRQ_COUNT_ID: -+ return (uint64_t)softirq_count(); ++ ret = (uint64_t)softirq_count(); + break; + case GTP_VAR_IRQ_COUNT_ID: -+ return (uint64_t)irq_count(); ++ ret = (uint64_t)irq_count(); + break; ++ default: ++ ret = 0; ++ break; + } + ++ return ret; ++} ++ ++static void++gtp_set_var_special(struct gtp_trace_s *gts, unsigned int num, ULONGEST val)
++{ ++ switch (num) { ++ case GTP_VAR_PRINTK_TMP_ID: ++ gts->printk_tmp = val; ++ break; ++ case GTP_VAR_PRINTK_LEVEL_ID: ++ gts->printk_level = (unsigned int)val; ++ break; ++ case GTP_VAR_PRINTK_FORMAT_ID: ++ gts->printk_format = (unsigned int)val; ++ break; ++ case GTP_VAR_PC_PE_EN_ID: ++ gtp_pc_pe_en((int)val); ++ break; ++ } ++} ++ ++static int ++gtp_collect_var_special(struct gtp_trace_s *gts, unsigned int num) ++{ ++ struct gtp_frame_var *fvar; ++ char *tmp; ++#ifdef GTP_FTRACE_RING_BUFFER ++ struct ring_buffer_event *rbe; ++#endif ++ ++ if (gts->next == NULL) { ++ if (gtp_action_head(gts)) ++ return -1; ++ } ++ ++ if (GTP_VAR_AUTO_TRACEV(num)) ++ return 0; ++ ++#ifdef GTP_FTRACE_RING_BUFFER ++ GTP_FRAME_RINGBUFFER_ALLOC(GTP_FRAME_VAR_SIZE); ++#endif ++#if defined(GTP_FRAME_SIMPLE) || defined(GTP_RB) ++#ifdef GTP_RB ++ tmp = gtp_rb_alloc(gts->next, GTP_FRAME_VAR_SIZE, gts->id); ++#endif ++#ifdef GTP_FRAME_SIMPLE ++ tmp = gtp_frame_alloc(GTP_FRAME_VAR_SIZE); ++#endif ++ if (!tmp) { ++ gts->tpe->reason = gtp_stop_frame_full; ++ return -1; ++ } ++#ifdef GTP_FRAME_SIMPLE ++ *gts->next = tmp; ++#endif ++#endif ++ ++ FID(tmp) = FID_VAR; ++ tmp += FID_SIZE; ++ ++#ifdef GTP_FRAME_SIMPLE ++ gts->next = (char **)tmp; ++ *gts->next = NULL; ++ tmp += sizeof(char *); ++#endif ++ ++ fvar = (struct gtp_frame_var *) tmp; ++ fvar->num = num; ++ fvar->val = gtp_get_var_special(gts, num); ++ ++#ifdef GTP_FTRACE_RING_BUFFER ++ ring_buffer_unlock_commit(gtp_frame, rbe); ++#endif ++ ++ return 0; ++} ++ ++uint64_t ++gtp_get_var(struct gtp_trace_s *gts, struct gtp_var *tve) ++{ +#ifdef GTP_PERF_EVENTS + if (tve->ptid == pe_tv_val || tve->ptid == pe_tv_enabled + || tve->ptid == pe_tv_running) { @@ -4571,118 +4692,6 @@ + + return 0; +} -+ -+#define gtp_action_x_getv \ -+ do { \ -+ struct gtp_var *tve; \ -+ \ -+ tve = gtp_gtp_var_array_find(arg); \ -+ if (!tve) \ -+ goto code_error_out; \ -+ \ -+ stack[sp++] = top; \ -+ \ -+ top = gtp_get_var(gts, tve); \ -+ } while (0) -+ -+#ifdef GTP_PERF_EVENTS -+#define gtp_action_x_setv_pe \ -+ do { \ -+ if (tve->ptid == pe_tv_en) \ -+ gtp_pe_set_en(tve->pts, (int)top); \ -+ else if (tve->ptid == pe_tv_val) \ -+ perf_event_set(tve->pts->event, (u64)top); \ -+ } while (0) -+#else -+#define gtp_action_x_setv_pe -+#endif -+ -+#define gtp_action_x_setv \ -+ do { \ -+ switch (arg) { \ -+ case GTP_VAR_PRINTK_TMP_ID: \ -+ gts->printk_tmp = top; \ -+ break; \ -+ case GTP_VAR_PRINTK_LEVEL_ID: \ -+ gts->printk_level = (unsigned int)top; \ -+ break; \ -+ case GTP_VAR_PRINTK_FORMAT_ID: \ -+ gts->printk_format = (unsigned int)top; \ -+ break; \ -+ case GTP_VAR_PC_PE_EN_ID: \ -+ gtp_pc_pe_en((int)top); \ -+ break; \ -+ default: { \ -+ struct gtp_var *tve; \ -+ \ -+ tve = gtp_gtp_var_array_find(arg); \ -+ if (!tve) \ -+ goto code_error_out; \ -+ gtp_action_x_setv_pe; \ -+ /* Not check the other special \ -+ trace state variables. \ -+ Because set in tve->val doesn't \ -+ affect anything. */ \ -+ tve->val = (uint64_t)top; \ -+ } \ -+ break; \ -+ } \ -+ } while (0) -+ -+#define gtp_action_x_tracev \ -+ do { \ -+ if (!gts->tpe->have_printk \ -+ || !GTP_VAR_AUTO_TRACEV(arg)) { \ -+ struct gtp_var *tve; \ -+ \ -+ tve = gtp_gtp_var_array_find(arg); \ -+ if (!tve) \ -+ goto code_error_out; \ -+ \ -+ if (gtp_collect_var(gts, tve)) { \ -+ /* gtp_collect_var will set error \ -+ status with itself if it got \ -+ error. */ \ -+ goto out; \ -+ } \ -+ } \ -+ } while (0) -+ -+#define gtp_action_x_tracev_printk \ -+ do { \ -+ struct gtp_var *tve; \ -+ \ -+ tve = gtp_gtp_var_array_find(arg); \ -+ if (!tve) \ -+ goto code_error_out; \ -+ \ -+ if (gtp_action_printk(gts, gtp_get_var(gts, tve), 0)) { \ -+ /* gtp_collect_var will set error status with \ -+ itself if it got error. */ \ -+ goto out; \ -+ } \ -+ } while (0) -+ -+#define gtp_action_x_printf \ -+ do { \ -+ if (strstr((char *)(ebuf + pc), "%s")) { \ -+ int i; \ -+ char buf[50]; \ -+ \ -+ for (i = 0; i < 50; i++) { \ -+ if (probe_kernel_read(buf + i, \ -+ argv + i, 1)) \ -+ goto code_error_out; \ -+ if (!buf[i]) \ -+ break; \ -+ } \ -+ snprintf(pbuf, psize, (char *)(ebuf + pc), \ -+ buf); \ -+ } else { \ -+ snprintf(pbuf, psize, (char *)(ebuf + pc), \ -+ argv); \ -+ } \ -+ } while (0) + +#define STACK_MAX 32 +static DEFINE_PER_CPU(ULONGEST[STACK_MAX], action_x_stack); @@ -4720,657 +4729,558 @@ + if (unlikely(ae->u.exp.need_var_lock)) + spin_lock(>p_var_lock); + -+ if (ae->type == 'X') { -+ while (pc < ae->u.exp.size) { -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_parse_x: cmd %x\n", ebuf[pc]); ++ while (1) { ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_parse_x: cmd %x\n", ebuf[pc]); +#endif + -+ switch (ebuf[pc++]) { -+ /* add */ -+ case 0x02: ++ switch (ebuf[pc++]) { ++ /* add */ ++ case 0x02: ++ top += stack[--sp]; ++ break; ++ ++ case op_check_add: ++ if (sp) + top += stack[--sp]; -+ break; -+ /* sub */ -+ case 0x03: ++ else ++ goto code_error_out; ++ break; ++ ++ /* sub */ ++ case 0x03: ++ top = stack[--sp] - top; ++ break; ++ ++ case op_check_sub: ++ if (sp) + top = stack[--sp] - top; -+ break; -+ /* mul */ -+ case 0x04: ++ else ++ goto code_error_out; ++ break; ++ ++ /* mul */ ++ case 0x04: ++ top *= stack[--sp]; ++ break; ++ ++ case op_check_mul: ++ if (sp) + top *= stack[--sp]; -+ break; ++ else ++ goto code_error_out; ++ break; ++ +#ifndef CONFIG_MIPS -+ /* div_signed */ -+ case 0x05: -+ if (top) { -+ LONGEST l = (LONGEST) stack[--sp]; -+ do_div(l, (LONGEST) top); -+ top = l; -+ } else -+ goto code_error_out; -+ break; -+ /* div_unsigned */ -+ case 0x06: -+ if (top) { -+ ULONGEST ul = stack[--sp]; -+ do_div(ul, top); -+ top = ul; -+ } else -+ goto code_error_out; -+ break; -+ /* rem_signed */ -+ case 0x07: -+ if (top) { -+ LONGEST l1 = (LONGEST) stack[--sp]; -+ LONGEST l2 = (LONGEST) top; -+ top = do_div(l1, l2); -+ } else -+ goto code_error_out; -+ break; -+ /* rem_unsigned */ -+ case 0x08: -+ if (top) { -+ ULONGEST ul1 = stack[--sp]; -+ ULONGEST ul2 = top; -+ top = do_div(ul1, ul2); -+ } else -+ goto code_error_out; -+ break; ++ /* div_signed */ ++ case 0x05: ++ if (top) { ++ LONGEST l = (LONGEST) stack[--sp]; ++ do_div(l, (LONGEST) top); ++ top = l; ++ } else ++ goto code_error_out; ++ break; ++ ++ case op_check_div_signed: ++ if (top && sp) { ++ LONGEST l = (LONGEST) stack[--sp]; ++ do_div(l, (LONGEST) top); ++ top = l; ++ } else ++ goto code_error_out; ++ break; ++ ++ /* div_unsigned */ ++ case 0x06: ++ if (top) { ++ ULONGEST ul = stack[--sp]; ++ do_div(ul, top); ++ top = ul; ++ } else ++ goto code_error_out; ++ break; ++ ++ case op_check_div_unsigned: ++ if (top && sp) { ++ ULONGEST ul = stack[--sp]; ++ do_div(ul, top); ++ top = ul; ++ } else ++ goto code_error_out; ++ break; ++ ++ /* rem_signed */ ++ case 0x07: ++ if (top) { ++ LONGEST l1 = (LONGEST) stack[--sp]; ++ LONGEST l2 = (LONGEST) top; ++ top = do_div(l1, l2); ++ } else ++ goto code_error_out; ++ break; ++ ++ case op_check_rem_signed: ++ if (top && sp) { ++ LONGEST l1 = (LONGEST) stack[--sp]; ++ LONGEST l2 = (LONGEST) top; ++ top = do_div(l1, l2); ++ } else ++ goto code_error_out; ++ break; ++ ++ /* rem_unsigned */ ++ case 0x08: ++ if (top) { ++ ULONGEST ul1 = stack[--sp]; ++ ULONGEST ul2 = top; ++ top = do_div(ul1, ul2); ++ } else ++ goto code_error_out; ++ break; ++ ++ case op_check_rem_unsigned: ++ if (top && sp) { ++ ULONGEST ul1 = stack[--sp]; ++ ULONGEST ul2 = top; ++ top = do_div(ul1, ul2); ++ } else ++ goto code_error_out; ++ break; +#endif -+ /* lsh */ -+ case 0x09: ++ ++ /* lsh */ ++ case 0x09: ++ top = stack[--sp] << top; ++ break; ++ ++ case op_check_lsh: ++ if (sp) + top = stack[--sp] << top; -+ break; -+ /* rsh_signed */ -+ case 0x0a: ++ else ++ goto code_error_out; ++ break; ++ ++ /* rsh_signed */ ++ case 0x0a: ++ top = ((LONGEST) stack[--sp]) >> top; ++ break; ++ ++ case op_check_rsh_signed: ++ if (sp) + top = ((LONGEST) stack[--sp]) >> top; -+ break; -+ /* rsh_unsigned */ -+ case 0x0b: ++ else ++ goto code_error_out; ++ break; ++ ++ /* rsh_unsigned */ ++ case 0x0b: ++ top = stack[--sp] >> top; ++ break; ++ ++ case op_check_rsh_unsigned: ++ if (sp) + top = stack[--sp] >> top; -+ break; -+ /* trace */ -+ case 0x0c: -+ --sp; -+ if (!gts->tpe->have_printk) { -+ if (gtp_action_memory_read -+ (gts, -1, -+ (CORE_ADDR) stack[sp], -+ (size_t) top)) -+ goto out; ++ else ++ goto code_error_out; ++ break; ++ ++ /* trace */ ++ case 0x0c: ++ --sp; ++ if (!gts->tpe->have_printk) { ++ if (gtp_action_memory_read ++ (gts, -1, ++ (CORE_ADDR) stack[sp], ++ (size_t) top)) ++ goto out; ++ } ++ top = stack[--sp]; ++ break; ++ ++ case op_check_trace: ++ if (sp > 1) { ++ if (gtp_action_memory_read ++ (gts, -1, (CORE_ADDR) stack[--sp], ++ (size_t) top)) { ++ /* gtp_action_memory_read will ++ set error status with itself ++ if it got error. */ ++ goto out; + } + top = stack[--sp]; -+ break; -+ /* trace_printk */ -+ case 0xfd: -+ if (gtp_action_printk(gts, ***The diff for this file has been truncated for email.*** ======================================= --- /trunk/gtp_3.0_to_upstream.patch Sat Feb 25 02:36:54 2012 +++ /trunk/gtp_3.0_to_upstream.patch Mon Mar 19 01:02:54 2012 @@ -5,12 +5,13 @@ kernel/events/core.c | 26 lib/Kconfig.debug | 10 lib/Makefile | 2- lib/gtp.c | 9210 +++++++++++++++++++++++++++++++++++++++
- lib/gtp_rb.c | 495 ++ - scripts/gtp/add-ons/pe.py | 729 ++++ lib/gtp.c | 9519 +++++++++++++++++++++++++++++++++++++++
+ lib/gtp_rb.c | 498 ++ + scripts/gtp/add-ons/hotcode.py | 588 ++ + scripts/gtp/add-ons/pe.py | 729 ++ scripts/gtp/getgtprsp.pl | 137 scripts/gtp/getmod.py | 132 - 11 files changed, 12511 insertions(+), 2 deletions(-) + 12 files changed, 13411 insertions(+), 2 deletions(-) --- /dev/null +++ b/Documentation/gtp/howto.txt @@ -1918,7 +1919,7 @@ --- /dev/null +++ b/lib/gtp.c -@@ -0,0 +1,9210 @@ +@@ -0,0 +1,9519 @@ +/* + * Kernel GDB tracepoint module. + * @@ -1940,8 +1941,8 @@ + * + */ + -+/* If *10 means that this is not a release version. */ -+#define GTP_VERSION (20120224) ++/* If "* 10" means that this is not a release version. */ ++#define GTP_VERSION (20120319) + +#include <linux/version.h> +#ifndef RHEL_RELEASE_VERSION @@ -2125,6 +2126,8 @@ +#define GTP_DEBUG KERN_WARNING +#endif + ++/* #define GTP_DEBUG_V */ ++ +#define GTP_RW_MAX 16384 +#define GTP_RW_BUFP_MAX (GTP_RW_MAX - 4 - gtp_rw_size) + @@ -2168,7 +2171,39 @@ +#define GTP_FRAME_VAR_SIZE (FID_SIZE + sizeof(struct gtp_frame_var)) +#endif + -+#define TOHEX(h) ((h) > 9 ? (h) + 'a' - 10 : (h) + '0') ++#define INT2CHAR(h) ((h) > 9 ? (h) + 'a' - 10 : (h) + '0') ++ ++enum { ++ op_check_add = 0xe5, ++ op_check_sub, ++ op_check_mul, ++ op_check_div_signed, ++ op_check_div_unsigned, ++ op_check_rem_signed, ++ op_check_rem_unsigned, ++ op_check_lsh, ++ op_check_rsh_signed, ++ op_check_rsh_unsigned, ++ op_check_trace, ++ op_check_bit_and, ++ op_check_bit_or, ++ op_check_bit_xor, ++ op_check_equal, ++ op_check_less_signed, ++ op_check_less_unsigned, ++ op_check_pop, ++ op_check_swap, ++ op_check_if_goto, ++ op_check_printf, /* XXX: still not used. */ ++ ++ op_special_getv = 0xfa, ++ op_special_setv, ++ op_special_tracev, ++ ++ op_trace_printk = 0xfd, ++ op_trace_quick_printk, ++ op_tracev_printk, ++}; + +struct action_agent_exp { + unsigned int size; @@ -2355,7 +2390,7 @@ + GTP_VAR_IRQ_COUNT_ID, + GTP_VAR_PIPE_TRACE_ID, + GTP_VAR_CURRENT_TASK_PID_ID, -+ GTP_VAR_SPECIAL_MAX = GTP_VAR_PIPE_TRACE_ID, ++ GTP_VAR_SPECIAL_MAX = GTP_VAR_CURRENT_TASK_PID_ID, +}; + +#define PREV_VAR NULL @@ -3167,38 +3202,38 @@ +gtp_regs2ascii(struct pt_regs *regs, char *buf) +{ +#ifdef CONFIG_X86_32 -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_regs2ascii: ax = 0x%x\n", ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ax = 0x%x\n", + (unsigned int) regs->ax); -+ printk(GTP_DEBUG "gtp_regs2ascii: cx = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cx = 0x%x\n", + (unsigned int) regs->cx); -+ printk(GTP_DEBUG "gtp_regs2ascii: dx = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: dx = 0x%x\n", + (unsigned int) regs->dx); -+ printk(GTP_DEBUG "gtp_regs2ascii: bx = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bx = 0x%x\n", + (unsigned int) regs->bx); -+ printk(GTP_DEBUG "gtp_regs2ascii: sp = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: sp = 0x%x\n", + (unsigned int) regs->sp); -+ printk(GTP_DEBUG "gtp_regs2ascii: bp = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bp = 0x%x\n", + (unsigned int) regs->bp); -+ printk(GTP_DEBUG "gtp_regs2ascii: si = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: si = 0x%x\n", + (unsigned int) regs->si); -+ printk(GTP_DEBUG "gtp_regs2ascii: di = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: di = 0x%x\n", + (unsigned int) regs->di); -+ printk(GTP_DEBUG "gtp_regs2ascii: ip = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ip = 0x%x\n", + (unsigned int) regs->ip); -+ printk(GTP_DEBUG "gtp_regs2ascii: flags = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: flags = 0x%x\n", + (unsigned int) regs->flags); -+ printk(GTP_DEBUG "gtp_regs2ascii: cs = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cs = 0x%x\n", + (unsigned int) regs->cs); -+ printk(GTP_DEBUG "gtp_regs2ascii: ss = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ss = 0x%x\n", + (unsigned int) regs->ss); -+ printk(GTP_DEBUG "gtp_regs2ascii: ds = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ds = 0x%x\n", + (unsigned int) regs->ds); -+ printk(GTP_DEBUG "gtp_regs2ascii: es = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: es = 0x%x\n", + (unsigned int) regs->es); -+ printk(GTP_DEBUG "gtp_regs2ascii: fs = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: fs = 0x%x\n", + (unsigned int) regs->fs); -+ printk(GTP_DEBUG "gtp_regs2ascii: gs = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: gs = 0x%x\n", + (unsigned int) regs->gs); +#endif +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,24)) @@ -3271,27 +3306,27 @@ + buf += 8; +#endif +#else -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_regs2ascii: ax = 0x%lx\n", regs->ax); -+ printk(GTP_DEBUG "gtp_regs2ascii: bx = 0x%lx\n", regs->bx); -+ printk(GTP_DEBUG "gtp_regs2ascii: cx = 0x%lx\n", regs->cx); -+ printk(GTP_DEBUG "gtp_regs2ascii: dx = 0x%lx\n", regs->dx); -+ printk(GTP_DEBUG "gtp_regs2ascii: si = 0x%lx\n", regs->si); -+ printk(GTP_DEBUG "gtp_regs2ascii: di = 0x%lx\n", regs->di); -+ printk(GTP_DEBUG "gtp_regs2ascii: bp = 0x%lx\n", regs->bp); -+ printk(GTP_DEBUG "gtp_regs2ascii: sp = 0x%lx\n", regs->sp); -+ printk(GTP_DEBUG "gtp_regs2ascii: r8 = 0x%lx\n", regs->r8); -+ printk(GTP_DEBUG "gtp_regs2ascii: r9 = 0x%lx\n", regs->r9); -+ printk(GTP_DEBUG "gtp_regs2ascii: r10 = 0x%lx\n", regs->r10); -+ printk(GTP_DEBUG "gtp_regs2ascii: r11 = 0x%lx\n", regs->r11); -+ printk(GTP_DEBUG "gtp_regs2ascii: r12 = 0x%lx\n", regs->r12); -+ printk(GTP_DEBUG "gtp_regs2ascii: r13 = 0x%lx\n", regs->r13); -+ printk(GTP_DEBUG "gtp_regs2ascii: r14 = 0x%lx\n", regs->r14); -+ printk(GTP_DEBUG "gtp_regs2ascii: r15 = 0x%lx\n", regs->r15); -+ printk(GTP_DEBUG "gtp_regs2ascii: ip = 0x%lx\n", regs->ip); -+ printk(GTP_DEBUG "gtp_regs2ascii: flags = 0x%lx\n", regs->flags); -+ printk(GTP_DEBUG "gtp_regs2ascii: cs = 0x%lx\n", regs->cs); -+ printk(GTP_DEBUG "gtp_regs2ascii: ss = 0x%lx\n", regs->ss); ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ax = 0x%lx\n", regs->ax); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bx = 0x%lx\n", regs->bx); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cx = 0x%lx\n", regs->cx); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: dx = 0x%lx\n", regs->dx); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: si = 0x%lx\n", regs->si); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: di = 0x%lx\n", regs->di); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bp = 0x%lx\n", regs->bp); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: sp = 0x%lx\n", regs->sp); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r8 = 0x%lx\n", regs->r8); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r9 = 0x%lx\n", regs->r9); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r10 = 0x%lx\n", regs->r10); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r11 = 0x%lx\n", regs->r11); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r12 = 0x%lx\n", regs->r12); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r13 = 0x%lx\n", regs->r13); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r14 = 0x%lx\n", regs->r14); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r15 = 0x%lx\n", regs->r15); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ip = 0x%lx\n", regs->ip); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: flags = 0x%lx\n", regs->flags); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cs = 0x%lx\n", regs->cs); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ss = 0x%lx\n", regs->ss); +#endif +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,24)) + sprintf(buf, "%016lx", (unsigned long) swab64(regs->ax)); @@ -3370,38 +3405,38 @@ +gtp_regs2bin(struct pt_regs *regs, char *buf) +{ +#ifdef CONFIG_X86_32 -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_regs2ascii: ax = 0x%x\n", ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ax = 0x%x\n", + (unsigned int) regs->ax); -+ printk(GTP_DEBUG "gtp_regs2ascii: cx = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cx = 0x%x\n", + (unsigned int) regs->cx); -+ printk(GTP_DEBUG "gtp_regs2ascii: dx = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: dx = 0x%x\n", + (unsigned int) regs->dx); -+ printk(GTP_DEBUG "gtp_regs2ascii: bx = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bx = 0x%x\n", + (unsigned int) regs->bx); -+ printk(GTP_DEBUG "gtp_regs2ascii: sp = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: sp = 0x%x\n", + (unsigned int) regs->sp); -+ printk(GTP_DEBUG "gtp_regs2ascii: bp = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bp = 0x%x\n", + (unsigned int) regs->bp); -+ printk(GTP_DEBUG "gtp_regs2ascii: si = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: si = 0x%x\n", + (unsigned int) regs->si); -+ printk(GTP_DEBUG "gtp_regs2ascii: di = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: di = 0x%x\n", + (unsigned int) regs->di); -+ printk(GTP_DEBUG "gtp_regs2ascii: ip = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ip = 0x%x\n", + (unsigned int) regs->ip); -+ printk(GTP_DEBUG "gtp_regs2ascii: flags = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: flags = 0x%x\n", + (unsigned int) regs->flags); -+ printk(GTP_DEBUG "gtp_regs2ascii: cs = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cs = 0x%x\n", + (unsigned int) regs->cs); -+ printk(GTP_DEBUG "gtp_regs2ascii: ss = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ss = 0x%x\n", + (unsigned int) regs->ss); -+ printk(GTP_DEBUG "gtp_regs2ascii: ds = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ds = 0x%x\n", + (unsigned int) regs->ds); -+ printk(GTP_DEBUG "gtp_regs2ascii: es = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: es = 0x%x\n", + (unsigned int) regs->es); -+ printk(GTP_DEBUG "gtp_regs2ascii: fs = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: fs = 0x%x\n", + (unsigned int) regs->fs); -+ printk(GTP_DEBUG "gtp_regs2ascii: gs = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: gs = 0x%x\n", + (unsigned int) regs->gs); +#endif +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,24)) @@ -3474,27 +3509,27 @@ + buf += 4; +#endif +#else -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_regs2ascii: ax = 0x%lx\n", regs->ax); -+ printk(GTP_DEBUG "gtp_regs2ascii: bx = 0x%lx\n", regs->bx); -+ printk(GTP_DEBUG "gtp_regs2ascii: cx = 0x%lx\n", regs->cx); -+ printk(GTP_DEBUG "gtp_regs2ascii: dx = 0x%lx\n", regs->dx); -+ printk(GTP_DEBUG "gtp_regs2ascii: si = 0x%lx\n", regs->si); -+ printk(GTP_DEBUG "gtp_regs2ascii: di = 0x%lx\n", regs->di); -+ printk(GTP_DEBUG "gtp_regs2ascii: bp = 0x%lx\n", regs->bp); -+ printk(GTP_DEBUG "gtp_regs2ascii: sp = 0x%lx\n", regs->sp); -+ printk(GTP_DEBUG "gtp_regs2ascii: r8 = 0x%lx\n", regs->r8); -+ printk(GTP_DEBUG "gtp_regs2ascii: r9 = 0x%lx\n", regs->r9); -+ printk(GTP_DEBUG "gtp_regs2ascii: r10 = 0x%lx\n", regs->r10); -+ printk(GTP_DEBUG "gtp_regs2ascii: r11 = 0x%lx\n", regs->r11); -+ printk(GTP_DEBUG "gtp_regs2ascii: r12 = 0x%lx\n", regs->r12); -+ printk(GTP_DEBUG "gtp_regs2ascii: r13 = 0x%lx\n", regs->r13); -+ printk(GTP_DEBUG "gtp_regs2ascii: r14 = 0x%lx\n", regs->r14); -+ printk(GTP_DEBUG "gtp_regs2ascii: r15 = 0x%lx\n", regs->r15); -+ printk(GTP_DEBUG "gtp_regs2ascii: ip = 0x%lx\n", regs->ip); -+ printk(GTP_DEBUG "gtp_regs2ascii: flags = 0x%lx\n", regs->flags); -+ printk(GTP_DEBUG "gtp_regs2ascii: cs = 0x%lx\n", regs->cs); -+ printk(GTP_DEBUG "gtp_regs2ascii: ss = 0x%lx\n", regs->ss); ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ax = 0x%lx\n", regs->ax); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bx = 0x%lx\n", regs->bx); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cx = 0x%lx\n", regs->cx); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: dx = 0x%lx\n", regs->dx); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: si = 0x%lx\n", regs->si); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: di = 0x%lx\n", regs->di); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bp = 0x%lx\n", regs->bp); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: sp = 0x%lx\n", regs->sp); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r8 = 0x%lx\n", regs->r8); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r9 = 0x%lx\n", regs->r9); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r10 = 0x%lx\n", regs->r10); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r11 = 0x%lx\n", regs->r11); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r12 = 0x%lx\n", regs->r12); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r13 = 0x%lx\n", regs->r13); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r14 = 0x%lx\n", regs->r14); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r15 = 0x%lx\n", regs->r15); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ip = 0x%lx\n", regs->ip); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: flags = 0x%lx\n", regs->flags); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cs = 0x%lx\n", regs->cs); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ss = 0x%lx\n", regs->ss); +#endif +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,24)) + memcpy(buf, ®s->ax, 8); @@ -3614,22 +3649,22 @@ +static void +gtp_regs2ascii(struct pt_regs *regs, char *buf) +{ -+#ifdef GTP_DEBUG ++#ifdef GTP_DEBUG_V + { + int i; + + for (i = 0; i < 32; i++) -+ printk(GTP_DEBUG "gtp_gdbrsp_g: r%d = 0x%lx\n", i, ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: r%d = 0x%lx\n", i, + regs->regs[i]); + } -+ printk(GTP_DEBUG "gtp_gdbrsp_g: status = 0x%lx\n", ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: status = 0x%lx\n", + regs->cp0_status); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: lo = 0x%lx\n", regs->lo); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: hi = 0x%lx\n", regs->hi); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: badvaddr = 0x%lx\n", ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: lo = 0x%lx\n", regs->lo); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: hi = 0x%lx\n", regs->hi); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: badvaddr = 0x%lx\n", + regs->cp0_badvaddr); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: cause = 0x%lx\n", regs->cp0_cause); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: pc = 0x%lx\n", regs->cp0_epc); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: cause = 0x%lx\n", regs->cp0_cause); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: pc = 0x%lx\n", regs->cp0_epc); +#endif + +#ifdef CONFIG_32BIT @@ -3685,22 +3720,22 @@ +static void +gtp_regs2bin(struct pt_regs *regs, char *buf) +{ -+#ifdef GTP_DEBUG ++#ifdef GTP_DEBUG_V + { + int i; + + for (i = 0; i < 32; i++) -+ printk(GTP_DEBUG "gtp_gdbrsp_g: r%d = 0x%lx\n", i, ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: r%d = 0x%lx\n", i, + regs->regs[i]); + } -+ printk(GTP_DEBUG "gtp_gdbrsp_g: status = 0x%lx\n", ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: status = 0x%lx\n", + regs->cp0_status); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: lo = 0x%lx\n", regs->lo); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: hi = 0x%lx\n", regs->hi); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: badvaddr = 0x%lx\n", ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: lo = 0x%lx\n", regs->lo); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: hi = 0x%lx\n", regs->hi); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: badvaddr = 0x%lx\n", + regs->cp0_badvaddr); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: cause = 0x%lx\n", regs->cp0_cause); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: pc = 0x%lx\n", regs->cp0_epc); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: cause = 0x%lx\n", regs->cp0_cause); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: pc = 0x%lx\n", regs->cp0_epc); +#endif + +#ifdef CONFIG_32BIT @@ -3756,8 +3791,8 @@ + int i; + + for (i = 0; i < 16; i++) { -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_gdbrsp_g: r%d = 0x%lx\n", ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: r%d = 0x%lx\n", + i, regs->uregs[i]); +#endif + sprintf(buf, "%08lx", (unsigned long) SWAB(regs->uregs[i])); @@ -3768,8 +3803,8 @@ + memset(buf, '0', 200); + buf += 200; + -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_gdbrsp_g: cpsr = 0x%lx\n", regs->uregs[16]); ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: cpsr = 0x%lx\n", regs->uregs[16]); +#endif + sprintf(buf, "%08lx", + (unsigned long) SWAB(regs->uregs[16])); @@ -3783,8 +3818,8 @@ + int i; + + for (i = 0; i < 16; i++) { -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_gdbrsp_g: r%d = 0x%lx\n", ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: r%d = 0x%lx\n", + i, regs->uregs[i]); +#endif + memcpy(buf, ®s->uregs[i], 4); @@ -3795,8 +3830,8 @@ + memset(buf, '\0', 100); + buf += 100; + -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_gdbrsp_g: cpsr = 0x%lx\n", regs->uregs[16]); ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: cpsr = 0x%lx\n", regs->uregs[16]); +#endif + memcpy(buf, ®s->uregs[16], 4); + buf += 4; @@ -4317,8 +4352,8 @@ + fm->size = size; + tmp += sizeof(struct gtp_frame_mem); + -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_action_memory_read: id:%d addr:%p %p %u\n", ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_action_memory_read: id:%d addr:%p %p %u\n", + (int)gts->tpe->num, (void *)(CORE_ADDR)gts->tpe->addr, + (void *)addr, (unsigned int)size); +#endif @@ -4420,8 +4455,8 @@ +{ + struct gtp_var *ret; + -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_gtp_var_array_find: num:%u %u %u\n", ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_gtp_var_array_find: num:%u %u %u\n", + gtp_var_head, gtp_var_tail, num); +#endif + @@ -4435,30 +4470,32 @@ + return ret; +} + -+uint64_t -+gtp_get_var(struct gtp_trace_s *gts, struct gtp_var *tve) ++static uint64_t ++gtp_get_var_special(struct gtp_trace_s *gts, unsigned int num) +{ -+ switch (tve->num) { ++ uint64_t ret; ++ ++ switch (num) { + case GTP_VAR_CURRENT_TASK_ID: + if (gts->ri) -+ return (uint64_t)(CORE_ADDR)gts->ri->task; ++ ret = (uint64_t)(CORE_ADDR)gts->ri->task; + else -+ return (uint64_t)(CORE_ADDR)get_current(); ++ ret = (uint64_t)(CORE_ADDR)get_current(); + break; + case GTP_VAR_CURRENT_TASK_PID_ID: + if (gts->ri) -+ return (uint64_t)(CORE_ADDR)gts->ri->task->pid; ++ ret = (uint64_t)(CORE_ADDR)gts->ri->task->pid; + else -+ return (uint64_t)(CORE_ADDR)get_current()->pid; ++ ret = (uint64_t)(CORE_ADDR)get_current()->pid; + break; + case GTP_VAR_CURRENT_THREAD_INFO_ID: -+ return (uint64_t)(CORE_ADDR)current_thread_info(); ++ ret = (uint64_t)(CORE_ADDR)current_thread_info(); + break; + case GTP_VAR_CLOCK_ID: -+ return (uint64_t)GTP_LOCAL_CLOCK; ++ ret = (uint64_t)GTP_LOCAL_CLOCK; + break; + case GTP_VAR_COOKED_CLOCK_ID: -+ return (uint64_t)(__get_cpu_var(local_clock_current) ++ ret = (uint64_t)(__get_cpu_var(local_clock_current) + - __get_cpu_var(local_clock_offset)); + break; +#ifdef CONFIG_X86 @@ -4466,50 +4503,134 @@ + { + unsigned long long a; + rdtscll(a); -+ return (uint64_t)a; ++ ret = (uint64_t)a; + } + break; + case GTP_VAR_COOKED_RDTSC_ID: -+ return (uint64_t)(__get_cpu_var(rdtsc_current) ++ ret = (uint64_t)(__get_cpu_var(rdtsc_current) + - __get_cpu_var(rdtsc_offset)); + break; +#endif + case GTP_VAR_CPU_ID: -+ return (uint64_t)(CORE_ADDR)smp_processor_id(); ++ ret = (uint64_t)(CORE_ADDR)smp_processor_id(); + break; + case GTP_VAR_CPU_NUMBER_ID: -+ return (uint64_t)gtp_cpu_number; ++ ret = (uint64_t)gtp_cpu_number; + break; + case GTP_VAR_PRINTK_TMP_ID: -+ return gts->printk_tmp; ++ ret = gts->printk_tmp; + break; + case GTP_VAR_DUMP_STACK_ID: + printk(KERN_NULL "gtp %d %p:", (int)gts->tpe->num, + (void *)(CORE_ADDR)gts->tpe->addr); + dump_stack(); -+ return 0; ++ ret = 0; + break; + case GTP_VAR_XTIME_SEC_ID: + if (gts->xtime.tv_sec == 0 && gts->xtime.tv_nsec == 0) + getnstimeofday(>s->xtime); -+ return (uint64_t)gts->xtime.tv_sec; ++ ret = (uint64_t)gts->xtime.tv_sec; + break; + case GTP_VAR_XTIME_NSEC_ID: + if (gts->xtime.tv_sec == 0 && gts->xtime.tv_nsec == 0) + getnstimeofday(>s->xtime); -+ return (uint64_t)gts->xtime.tv_nsec; ++ ret = (uint64_t)gts->xtime.tv_nsec; + break; + case GTP_VAR_HARDIRQ_COUNT_ID: -+ return (uint64_t)hardirq_count(); ++ ret = (uint64_t)hardirq_count(); + break; + case GTP_VAR_SOFTIRQ_COUNT_ID: -+ return (uint64_t)softirq_count(); ++ ret = (uint64_t)softirq_count(); + break; + case GTP_VAR_IRQ_COUNT_ID: -+ return (uint64_t)irq_count(); ++ ret = (uint64_t)irq_count(); + break; ++ default: ++ ret = 0; ++ break; + } + ++ return ret; ++} ++ ++static void++gtp_set_var_special(struct gtp_trace_s *gts, unsigned int num, ULONGEST val)
++{ ++ switch (num) { ++ case GTP_VAR_PRINTK_TMP_ID: ++ gts->printk_tmp = val; ++ break; ++ case GTP_VAR_PRINTK_LEVEL_ID: ++ gts->printk_level = (unsigned int)val; ++ break; ++ case GTP_VAR_PRINTK_FORMAT_ID: ++ gts->printk_format = (unsigned int)val; ++ break; ++ case GTP_VAR_PC_PE_EN_ID: ++ gtp_pc_pe_en((int)val); ++ break; ++ } ++} ++ ++static int ++gtp_collect_var_special(struct gtp_trace_s *gts, unsigned int num) ++{ ++ struct gtp_frame_var *fvar; ++ char *tmp; ++#ifdef GTP_FTRACE_RING_BUFFER ++ struct ring_buffer_event *rbe; ++#endif ++ ++ if (gts->next == NULL) { ++ if (gtp_action_head(gts)) ++ return -1; ++ } ++ ++ if (GTP_VAR_AUTO_TRACEV(num)) ++ return 0; ++ ++#ifdef GTP_FTRACE_RING_BUFFER ++ GTP_FRAME_RINGBUFFER_ALLOC(GTP_FRAME_VAR_SIZE); ++#endif ++#if defined(GTP_FRAME_SIMPLE) || defined(GTP_RB) ++#ifdef GTP_RB ++ tmp = gtp_rb_alloc(gts->next, GTP_FRAME_VAR_SIZE, gts->id); ++#endif ++#ifdef GTP_FRAME_SIMPLE ++ tmp = gtp_frame_alloc(GTP_FRAME_VAR_SIZE); ++#endif ++ if (!tmp) { ++ gts->tpe->reason = gtp_stop_frame_full; ++ return -1; ++ } ++#ifdef GTP_FRAME_SIMPLE ++ *gts->next = tmp; ++#endif ++#endif ++ ++ FID(tmp) = FID_VAR; ++ tmp += FID_SIZE; ++ ++#ifdef GTP_FRAME_SIMPLE ++ gts->next = (char **)tmp; ++ *gts->next = NULL; ++ tmp += sizeof(char *); ++#endif ++ ++ fvar = (struct gtp_frame_var *) tmp; ++ fvar->num = num; ++ fvar->val = gtp_get_var_special(gts, num); ++ ++#ifdef GTP_FTRACE_RING_BUFFER ++ ring_buffer_unlock_commit(gtp_frame, rbe); ++#endif ++ ++ return 0; ++} ++ ++uint64_t ++gtp_get_var(struct gtp_trace_s *gts, struct gtp_var *tve) ++{ +#ifdef GTP_PERF_EVENTS + if (tve->ptid == pe_tv_val || tve->ptid == pe_tv_enabled + || tve->ptid == pe_tv_running) { @@ -4588,118 +4709,6 @@ + + return 0; +} -+ -+#define gtp_action_x_getv \ -+ do { \ -+ struct gtp_var *tve; \ -+ \ -+ tve = gtp_gtp_var_array_find(arg); \ -+ if (!tve) \ -+ goto code_error_out; \ -+ \ -+ stack[sp++] = top; \ -+ \ -+ top = gtp_get_var(gts, tve); \ -+ } while (0) -+ -+#ifdef GTP_PERF_EVENTS -+#define gtp_action_x_setv_pe \ -+ do { \ -+ if (tve->ptid == pe_tv_en) \ -+ gtp_pe_set_en(tve->pts, (int)top); \ -+ else if (tve->ptid == pe_tv_val) \ -+ perf_event_set(tve->pts->event, (u64)top); \ -+ } while (0) -+#else -+#define gtp_action_x_setv_pe -+#endif -+ -+#define gtp_action_x_setv \ -+ do { \ -+ switch (arg) { \ -+ case GTP_VAR_PRINTK_TMP_ID: \ -+ gts->printk_tmp = top; \ -+ break; \ -+ case GTP_VAR_PRINTK_LEVEL_ID: \ -+ gts->printk_level = (unsigned int)top; \ -+ break; \ -+ case GTP_VAR_PRINTK_FORMAT_ID: \ -+ gts->printk_format = (unsigned int)top; \ -+ break; \ -+ case GTP_VAR_PC_PE_EN_ID: \ -+ gtp_pc_pe_en((int)top); \ -+ break; \ -+ default: { \ -+ struct gtp_var *tve; \ -+ \ -+ tve = gtp_gtp_var_array_find(arg); \ -+ if (!tve) \ -+ goto code_error_out; \ -+ gtp_action_x_setv_pe; \ -+ /* Not check the other special \ -+ trace state variables. \ -+ Because set in tve->val doesn't \ -+ affect anything. */ \ -+ tve->val = (uint64_t)top; \ -+ } \ -+ break; \ -+ } \ -+ } while (0) -+ -+#define gtp_action_x_tracev \ -+ do { \ -+ if (!gts->tpe->have_printk \ -+ || !GTP_VAR_AUTO_TRACEV(arg)) { \ -+ struct gtp_var *tve; \ -+ \ -+ tve = gtp_gtp_var_array_find(arg); \ -+ if (!tve) \ -+ goto code_error_out; \ -+ \ -+ if (gtp_collect_var(gts, tve)) { \ -+ /* gtp_collect_var will set error \ -+ status with itself if it got \ -+ error. */ \ -+ goto out; \ -+ } \ -+ } \ -+ } while (0) -+ -+#define gtp_action_x_tracev_printk \ -+ do { \ -+ struct gtp_var *tve; \ -+ \ -+ tve = gtp_gtp_var_array_find(arg); \ -+ if (!tve) \ -+ goto code_error_out; \ -+ \ -+ if (gtp_action_printk(gts, gtp_get_var(gts, tve), 0)) { \ -+ /* gtp_collect_var will set error status with \ -+ itself if it got error. */ \ -+ goto out; \ -+ } \ -+ } while (0) -+ -+#define gtp_action_x_printf \ -+ do { \ -+ if (strstr((char *)(ebuf + pc), "%s")) { \ -+ int i; \ -+ char buf[50]; \ -+ \ -+ for (i = 0; i < 50; i++) { \ -+ if (probe_kernel_read(buf + i, \ -+ argv + i, 1)) \ -+ goto code_error_out; \ -+ if (!buf[i]) \ -+ break; \ -+ } \ -+ snprintf(pbuf, psize, (char *)(ebuf + pc), \ -+ buf); \ -+ } else { \ -+ snprintf(pbuf, psize, (char *)(ebuf + pc), \ -+ argv); \ -+ } \ -+ } while (0) + +#define STACK_MAX 32 +static DEFINE_PER_CPU(ULONGEST[STACK_MAX], action_x_stack); @@ -4737,657 +4746,558 @@ + if (unlikely(ae->u.exp.need_var_lock)) + spin_lock(>p_var_lock); + -+ if (ae->type == 'X') { -+ while (pc < ae->u.exp.size) { -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_parse_x: cmd %x\n", ebuf[pc]); ++ while (1) { ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_parse_x: cmd %x\n", ebuf[pc]); +#endif + -+ switch (ebuf[pc++]) { -+ /* add */ -+ case 0x02: ++ switch (ebuf[pc++]) { ++ /* add */ ++ case 0x02: ++ top += stack[--sp]; ++ break; ++ ++ case op_check_add: ++ if (sp) + top += stack[--sp]; -+ break; -+ /* sub */ -+ case 0x03: ++ else ++ goto code_error_out; ++ break; ++ ++ /* sub */ ++ case 0x03: ++ top = stack[--sp] - top; ++ break; ++ ++ case op_check_sub: ++ if (sp) + top = stack[--sp] - top; -+ break; -+ /* mul */ -+ case 0x04: ++ else ++ goto code_error_out; ++ break; ++ ++ /* mul */ ++ case 0x04: ++ top *= stack[--sp]; ++ break; ++ ++ case op_check_mul: ++ if (sp) + top *= stack[--sp]; -+ break; ++ else ++ goto code_error_out; ++ break; ++ +#ifndef CONFIG_MIPS -+ /* div_signed */ -+ case 0x05: -+ if (top) { -+ LONGEST l = (LONGEST) stack[--sp]; -+ do_div(l, (LONGEST) top); -+ top = l; -+ } else -+ goto code_error_out; -+ break; -+ /* div_unsigned */ -+ case 0x06: -+ if (top) { -+ ULONGEST ul = stack[--sp]; -+ do_div(ul, top); -+ top = ul; -+ } else -+ goto code_error_out; -+ break; -+ /* rem_signed */ -+ case 0x07: -+ if (top) { -+ LONGEST l1 = (LONGEST) stack[--sp]; -+ LONGEST l2 = (LONGEST) top; -+ top = do_div(l1, l2); -+ } else -+ goto code_error_out; -+ break; -+ /* rem_unsigned */ -+ case 0x08: -+ if (top) { -+ ULONGEST ul1 = stack[--sp]; -+ ULONGEST ul2 = top; -+ top = do_div(ul1, ul2); -+ } else -+ goto code_error_out; -+ break; ++ /* div_signed */ ++ case 0x05: ++ if (top) { ++ LONGEST l = (LONGEST) stack[--sp]; ++ do_div(l, (LONGEST) top); ++ top = l; ++ } else ++ goto code_error_out; ++ break; ++ ++ case op_check_div_signed: ++ if (top && sp) { ++ LONGEST l = (LONGEST) stack[--sp]; ++ do_div(l, (LONGEST) top); ++ top = l; ++ } else ++ goto code_error_out; ++ break; ++ ++ /* div_unsigned */ ++ case 0x06: ++ if (top) { ++ ULONGEST ul = stack[--sp]; ++ do_div(ul, top); ++ top = ul; ++ } else ++ goto code_error_out; ++ break; ++ ++ case op_check_div_unsigned: ++ if (top && sp) { ++ ULONGEST ul = stack[--sp]; ++ do_div(ul, top); ++ top = ul; ++ } else ++ goto code_error_out; ++ break; ++ ++ /* rem_signed */ ++ case 0x07: ++ if (top) { ++ LONGEST l1 = (LONGEST) stack[--sp]; ++ LONGEST l2 = (LONGEST) top; ++ top = do_div(l1, l2); ++ } else ++ goto code_error_out; ++ break; ++ ++ case op_check_rem_signed: ++ if (top && sp) { ++ LONGEST l1 = (LONGEST) stack[--sp]; ++ LONGEST l2 = (LONGEST) top; ++ top = do_div(l1, l2); ++ } else ++ goto code_error_out; ++ break; ++ ++ /* rem_unsigned */ ++ case 0x08: ++ if (top) { ++ ULONGEST ul1 = stack[--sp]; ++ ULONGEST ul2 = top; ++ top = do_div(ul1, ul2); ++ } else ++ goto code_error_out; ++ break; ++ ++ case op_check_rem_unsigned: ++ if (top && sp) { ++ ULONGEST ul1 = stack[--sp]; ++ ULONGEST ul2 = top; ++ top = do_div(ul1, ul2); ++ } else ++ goto code_error_out; ++ break; +#endif -+ /* lsh */ -+ case 0x09: ++ ++ /* lsh */ ++ case 0x09: ++ top = stack[--sp] << top; ++ break; ++ ++ case op_check_lsh: ++ if (sp) + top = stack[--sp] << top; -+ break; -+ /* rsh_signed */ -+ case 0x0a: ++ else ++ goto code_error_out; ++ break; ++ ++ /* rsh_signed */ ++ case 0x0a: ++ top = ((LONGEST) stack[--sp]) >> top; ++ break; ++ ++ case op_check_rsh_signed: ++ if (sp) + top = ((LONGEST) stack[--sp]) >> top; -+ break; -+ /* rsh_unsigned */ -+ case 0x0b: ++ else ++ goto code_error_out; ++ break; ++ ++ /* rsh_unsigned */ ++ case 0x0b: ++ top = stack[--sp] >> top; ++ break; ++ ++ case op_check_rsh_unsigned: ++ if (sp) + top = stack[--sp] >> top; -+ break; -+ /* trace */ -+ case 0x0c: -+ --sp; -+ if (!gts->tpe->have_printk) { -+ if (gtp_action_memory_read -+ (gts, -1, -+ (CORE_ADDR) stack[sp], -+ (size_t) top)) -+ goto out; ++ else ++ goto code_error_out; ++ break; ++ ++ /* trace */ ++ case 0x0c: ++ --sp; ++ if (!gts->tpe->have_printk) { ++ if (gtp_action_memory_read ++ (gts, -1, ++ (CORE_ADDR) stack[sp], ++ (size_t) top)) ++ goto out; ++ } ++ top = stack[--sp]; ++ break; ++ ++ case op_check_trace: ++ if (sp > 1) { ++ if (gtp_action_memory_read ++ (gts, -1, (CORE_ADDR) stack[--sp], ++ (size_t) top)) { ++ /* gtp_action_memory_read will ++ set error status with itself ++ if it got error. */ ++ goto out; + } + top = stack[--sp]; -+ break; -+ /* trace_printk */ -+ case 0xfd: -+ if (gtp_action_printk(gts, ***The diff for this file has been truncated for email.*** ======================================= --- /trunk/gtp_for_review.patch Mon Mar 19 00:46:07 2012 +++ /trunk/gtp_for_review.patch Mon Mar 19 01:02:54 2012 @@ -10,10 +10,11 @@ lib/Makefile | 4lib/gtp.c | 8916 +++++++++++++++++++++++++++++++++++++++
lib/gtp_rb.c | 498 ++ + scripts/gtp/add-ons/hotcode.py | 588 ++ scripts/gtp/add-ons/pe.py | 729 +++ scripts/gtp/getgtprsp.pl | 137 scripts/gtp/getmod.py | 132 - 14 files changed, 12259 insertions(+), 2 deletions(-) + 15 files changed, 12847 insertions(+), 2 deletions(-) --- /dev/null +++ b/Documentation/gtp/howto.txt @@ -11370,6 +11371,597 @@ + + GTP_RB_UNLOCK_IRQ(rb, flags); +} +--- /dev/null ++++ b/scripts/gtp/add-ons/hotcode.py +@@ -0,0 +1,588 @@ ++#!/usr/bin/python ++ ++# This script is used to find the hotcode in some tasks ++# GPL ++# Copyright(C) Hui Zhu (teawater@xxxxxxxxx), 2012 ++ ++import gdb ++import tempfile ++import os ++import signal ++ ++debug_dir = "/usr/lib/debug/" ++ ++from operator import itemgetter ++def dict_sort(d, reverse=False): ++ #proposed in PEP 265, using the itemgetter ++ return sorted(d.iteritems(), key=itemgetter(1), reverse=True) ++ ++def sigint_handler(num, e): ++ hotcode_show() ++ try: ++ s = raw_input('Continue? (yes)') ++ except: ++ s = 'y' ++ finally: ++ if s[0:1] != 'n' and s[0:1] != 'N': ++ return; ++ #gdb.execute("inferior 1") ++ try: ++ gdb.execute("tfind -1", True, False) ++ gdb.execute("target remote /sys/kernel/debug/gtp", True, False) ++ gdb.execute("set disconnected-tracing off", True, False) ++ except:++ print "Try to stop GTP got error, please use command \"sudo rmmod gtp.ko\" stop it."
++ exit(1); ++ ++def add_inferior(): ++ fid = gdb.execute("add-inferior", False, True) ++ if fid.find("Added inferior ") != 0: ++ return -1 ++ fid = int(fid[len("Added inferior "):]) ++ return fid ++ ++def get_addr_range_list(fun): ++ buf = gdb.execute("info line "+fun, False, True) ++ line_list = buf.split(os.linesep) ++ ret = [] ++ begin = -1 ++ end = -1 ++ for line in line_list: ++ addr_begin = line.find("starts at address ") ++ if addr_begin >= 0: ++ line = line[addr_begin + len("starts at address "):] ++ addr_end = line.find(" <"+fun) ++ if addr_end >= 0: ++ begin = int(line[:addr_end], 0) ++ line = line[addr_end + len(" <"+fun):] ++ addr_begin = line.find("ends at ") ++ if addr_begin >= 0: ++ line = line[addr_begin + len("ends at "):] ++ addr_end = line.find(" <"+fun) ++ if addr_end > 0: ++ end = int(line[:addr_end], 0) ++ if begin != -1: ++ ret.append([begin, end]) ++ begin = -1 ++ end = -1 ++ ++ if len(ret) > 0: ++ buf = gdb.execute("disassemble "+fun, False, True) ++ line_list = buf.split(os.linesep) ++ line_list.reverse() ++ end = 0 ++ for line in line_list: ++ addr_begin = line.find("0x") ++ if addr_begin >= 0: ++ line = line[addr_begin:] ++ addr_end = line.find(" <+") ++ if addr_end > 0: ++ end = int(line[:addr_end], 0) + 1 ++ break ++ if end != 0: ++ offset = 0 ++ for c in ret: ++ if c[1] < end: ++ if offset == 0 or offset > (end - c[1]): ++ offset = end - c[1] ++ for c in ret: ++ c[1] += offset ++ ++ return ret ++ ++#0 inferior_id 1 dir_name 2 kernel_list 3 user_list ++#list 0 function_list 1 file_list 2 line_list ++task_list = {} ++no_task = False ++kernel_hotcode_list = ({},{},{}) ++ ++#info[0] line_num, info[1] file_name, info[2] function_name ++def add_info_to_code_list(info, code_list): ++ #function_list ++ if info[2] in code_list[0]: ++ code_list[0][info[2]] += 1 ++ else: ++ code_list[0][info[2]] = 1 ++ #file_list ++ if info[1] in code_list[1]: ++ code_list[1][info[1]] += 1 ++ else: ++ code_list[1][info[1]] = 1 ++ #line_list ++ line = str(info[1]) + ":" + str(info[0]) ++ if line in code_list[2]: ++ code_list[2][line] += 1 ++ else: ++ code_list[2][line] = 1 ++ ++def task_list_add_line(is_user, pid, info): ++ if no_task: ++ #function_list ++ add_info_to_code_list (info, kernel_hotcode_list) ++ else: ++ if is_user: ++ add_info_to_code_list (info, task_list[pid][3]) ++ else: ++ add_info_to_code_list (info, task_list[pid][2]) ++ ++show_line_number = 20 ++ ++def hotcode_show_code_list(string, code_list): ++ if len(code_list) > 0: ++ print "\t", string ++ i = 1 ++ for c in dict_sort(code_list): ++ print "\t", c[0], "\t\t", c[1] ++ i += 1 ++ if i > show_line_number: ++ break ++ print ++ ++def hotcode_show(): ++ if no_task: ++ hotcode_show_code_list("Hotest function", kernel_hotcode_list[0]) ++ hotcode_show_code_list("Hotest file", kernel_hotcode_list[1]) ++ hotcode_show_code_list("Hotest line", kernel_hotcode_list[2]) ++ else: ++ for pid in task_list: ++ print "task", str(pid), task_list[pid][1] ++ print "Kernel hotcode:" ++ hotcode_show_code_list("Hotest function", task_list[pid][2][0]) ++ hotcode_show_code_list("Hotest file", task_list[pid][2][1]) ++ hotcode_show_code_list("Hotest line", task_list[pid][2][2]) ++ print "User hotcode:" ++ hotcode_show_code_list("Hotest function", task_list[pid][3][0]) ++ hotcode_show_code_list("Hotest file", task_list[pid][3][1]) ++ hotcode_show_code_list("Hotest line", task_list[pid][3][2]) ++ print ++ ++gdb.execute("set target-async on", True, False) ++gdb.execute("set pagination off", True, False) ++gdb.execute("set confirm off", True, False) ++gdb.execute("set circular-trace-buffer on", True, False) ++gdb.execute("set debug-file-directory "+debug_dir, True, False) ++try: ++ gdb.execute("kill", True, False) ++except: ++ pass ++ ++trace_user = True ++trace_kernel = True ++while 1: ++ tmp = "Both" ++ try:++ tmp = raw_input('Which part of code you want trace?(User/Kernel/[Both])')
++ except: ++ continue ++ if tmp[0:1] == 'U' or tmp[0:1] == 'u': ++ trace_kernel = False ++ elif tmp[0:1] == 'K' or tmp[0:1] == 'k': ++ trace_user = False ++ break ++ ++#Get which task pid why want to trace++print("Please input the pid of tasks that you want to trace - one per line (use empty to end input).")
++print("If not set any task, will trace all code in the Kernel.") ++while 1: ++ pid = -1 ++ try: ++ pid = input('id:') ++ except: ++ pass ++ if pid <= 0: ++ break ++ if pid in task_list: ++ print("This pid already in the list.") ++ continue ++ user_dir = "" ++ fid = 0 ++ if trace_user: ++ try: ++ orig_user_dir = user_dir = os.path.realpath("/proc/"+str(pid)+"/exe") ++ except: ++ #maybe this is the kernel task++ print "Cannot get the user code info of this pid, will not parse the user level code symbol"
++ task_list[pid] = (fid, user_dir, {}, {}) ++ continue ++ if os.path.exists(debug_dir+user_dir): ++ user_dir = debug_dir+user_dir ++ while 1: ++ tmp = "" ++ try:++ tmp = raw_input('Please input the debug binary of task if you want to change it:['+user_dir+']')
++ except: ++ continue ++ if tmp != "": ++ user_dir = os.path.realpath(tmp) ++ break ++ if not os.path.exists(user_dir):++ print "Cannot get the user code info of this pid, will not parse the user level code symbol"
++ task_list[pid] = (fid, user_dir, {}, {}) ++ continue ++ print "Use "+user_dir+" as debug binary." ++ fid = add_inferior() ++ if fid < 0: ++ print "Try to load task got error." ++ continue ++ gdb.execute("inferior "+str(fid)) ++ pfile = open("/proc/"+str(pid)+"/maps", "r") ++ tmplist = pfile.read().split(os.linesep) ++ pfile.close() ++ for c in tmplist: ++ c_list = c.split(" ") ++ filename = c_list[-1].strip()++ if filename != orig_user_dir and os.path.exists(filename) and len(c_list) > 2 and len(c_list[1]) > 3 and c_list[1][2] == 'x':
++ addr = "0x"+c_list[0][0:c.find('-')] ++ gdb.execute("file "+filename) ++ info_files = gdb.execute("info files", True, True) ++ info_files_list = info_files.split(os.linesep) ++ text_offset = "0x0" ++ for line in info_files_list: ++ line_list = line.split(" is ") ++ if len(line_list) == 2 and line_list[1].strip() == ".text": ++ line_list[0] = line_list[0].strip() ++ text_offset = line_list[0][0:line_list[0].find(' - ')] ++ print ("add-symbol-file "+filename+" ("+addr+"+"+text_offset+")") ++ gdb.execute("add-symbol-file "+filename+" ("+addr+"+"+text_offset+")") ++ gdb.execute("file "+user_dir) ++ gdb.execute("inferior 1") ++ task_list[pid] = (fid, user_dir, ({},{},{}), ({},{},{})) ++ ++def get_ignore_str(function): ++ ret = "" ++ try: ++ s = raw_input('Do you want to ignore function \"'+function+'\"? (yes)') ++ except: ++ s = 'y' ++ if s[0:1] != 'n' and s[0:1] != 'N': ++ r_list = get_addr_range_list(function) ++ for r in r_list: ++ if ret != "": ++ ret += " && " ++ else: ++ ret += "&& (" ++ #(regs->ip < r[0] || regs->ip > r[1]) ++ ret += "($pc_ip0 < "+str(r[0])+" || $pc_ip0 > "+str(r[1])+")" ++ if ret != "": ++ ret += ")" ++ return ret ++ ++ignore_str = "" ++if len(task_list) == 0: ++ trace_user = False ++ trace_kernel = True ++ no_task = True ++ ++try:++ show_line_number = input('Show line number (0 meas all)?['+str(show_line_number)+']')
++except: ++ show_line_number = 20 ++ ++#Set tracepoint ++gdb.execute("target remote /sys/kernel/debug/gtp", True, False) ++ ++try: ++ gdb.execute("tstop", True, False) ++ gdb.execute("delete", True, False) ++except: ++ pass ++ ++ ++def getmod(): ++ #following code is get from ../getmod.py ++ #use the code directly because sys.argv = [''] inside GDB ++ def format_file(name): ++ tmp = "" ++ for c in name: ++ if c == "_": ++ c = "-" ++ tmp += c ++ return tmp ++ ++ #Check if the target is available ++ if str(gdb.selected_thread()) == "None": ++ raise gdb.error("Please connect to Linux Kernel before use the script.") ++ ++ #Output the help++ print "Use GDB command \"set $mod_search_dir=dir\" to set an directory for search the modules."
++ ++ ignore_gtp_ko = gdb.parse_and_eval("$ignore_gtp_ko") ++ if ignore_gtp_ko.type.code == gdb.TYPE_CODE_INT: ++ ignore_gtp_ko = int(ignore_gtp_ko) ++ else: ++ ignore_gtp_ko = 1 ++ ++ #Get the mod_search_dir ++ mod_search_dir_list = [] ++ #Get dir from $mod_search_dir ++ tmp_dir = gdb.parse_and_eval("$mod_search_dir") ++ if tmp_dir.type.code == gdb.TYPE_CODE_ARRAY: ++ tmp_dir = str(tmp_dir) ++ tmp_dir = tmp_dir[1:len(tmp_dir)] ++ tmp_dir = tmp_dir[0:tmp_dir.index("\"")] ++ mod_search_dir_list.append(tmp_dir) ++ #Get dir that same with current vmlinux ++ tmp_dir = str(gdb.execute("info files", False, True))++ tmp_dir = tmp_dir[tmp_dir.index("Symbols from \"")+len("Symbols from \""):len(tmp_dir)]
++ tmp_dir = tmp_dir[0:tmp_dir.index("\"")] ++ tmp_dir = tmp_dir[0:tmp_dir.rindex("/")] ++ mod_search_dir_list.append(tmp_dir) ++ #Get the dir of current Kernel ++ tmp_dir = "/lib/modules/" + str(os.uname()[2]) ++ if os.path.isdir(tmp_dir): ++ mod_search_dir_list.append(tmp_dir) ++ #Let user choice dir ++ mod_search_dir = "" ++ while mod_search_dir == "": ++ for i in range(0, len(mod_search_dir_list)): ++ print str(i)+". "+mod_search_dir_list[i] ++ try: ++ s = input('Select a directory for search the modules [0]:') ++ except SyntaxError: ++ s = 0 ++ except: ++ continue ++ if s < 0 or s >= len(mod_search_dir_list): ++ continue ++ mod_search_dir = mod_search_dir_list[s] ++++ mod_list_offset = long(gdb.parse_and_eval("((size_t) &(((struct module *)0)->list))"))
++ mod_list = long(gdb.parse_and_eval("(&modules)")) ++ mod_list_current = mod_list ++ ++ while 1:++ mod_list_current = long(gdb.parse_and_eval("((struct list_head *) "+str(mod_list_current)+")->next"))
++ ++ #check if need break the loop ++ if mod_list == mod_list_current: ++ break ++ ++ mod = mod_list_current - mod_list_offset ++ ++ #get mod_name++ mod_name = str(gdb.parse_and_eval("((struct module *)"+str(mod)+")->name"))
++ mod_name = mod_name[mod_name.index("\"")+1:len(mod_name)] ++ mod_name = mod_name[0:mod_name.index("\"")] ++ if mod_name == "fglrx": ++ contiue ++ mod_name += ".ko" ++ mod_name = format_file(mod_name) ++ ++ #get mod_dir_name ++ mod_dir_name = "" ++ for root, dirs, files in os.walk(mod_search_dir): ++ for afile in files: ++ tmp_file = format_file(afile) ++ if tmp_file == mod_name: ++ mod_dir_name = os.path.join(root,afile) ++ break ++ if mod_dir_name != "": ++ break ++ ++ command = " " ++ ++ #Add module_core to command++ command += str(gdb.parse_and_eval("((struct module *)"+str(mod)+")->module_core"))
++ ++ #Add each sect_attrs->attrs to command ++ #get nsections++ nsections = int(gdb.parse_and_eval("((struct module *)"+str(mod)+")->sect_attrs->nsections")) ++ sect_attrs = long(gdb.parse_and_eval("(u64)((struct module *)"+str(mod)+")->sect_attrs"))
++ for i in range(0, nsections): ++ command += " -s"++ tmp = str(gdb.parse_and_eval("((struct module_sect_attrs *)"+str(sect_attrs)+")->attrs["+str(i)+"].name"))
++ tmp = tmp[tmp.index("\"")+1:len(tmp)] ++ tmp = tmp[0:tmp.index("\"")] ++ command += " "+tmp++ tmp = str(gdb.parse_and_eval("((struct module_sect_attrs *)"+str(sect_attrs)+")->attrs["+str(i)+"].address"))
++ command += " "+tmp ++ ++ if mod_dir_name == "": ++ print "Cannot find out",mod_name,"from directory." ++ print "Please use following command load the symbols from it:" ++ print "add-symbol-file some_dir/"+mod_name+command ++ else: ++ if ignore_gtp_ko and mod_name == "gtp.ko": ++ pass ++ else: ++ #print "add-symbol-file "+mod_dir_name+command ++ gdb.execute("add-symbol-file "+mod_dir_name+command, False, False) ++ ++if trace_kernel: ++ try: ++ s = raw_input('Do you load the symbol from LKM? [no]') ++ except: ++ s = 'n' ++ if s[0:1] == 'y' or s[0:1] == 'Y': ++ getmod() ++ ++cpu_number = int(gdb.parse_and_eval("$cpu_number")) ++tempfilename = tempfile.mktemp() ++tempfile = open(tempfilename, "w") ++if no_task: ++ #Setup first tracepoint ++ ignore_str += get_ignore_str("arch_local_irq_enable") ++ ignore_str += get_ignore_str("intel_idle") ++ # GDB have bug with long conditon so close them ++ #ignore_str += get_ignore_str("__do_softirq") ++ #ignore_str += get_ignore_str("_raw_spin_unlock_irqrestore") ++ ++ for i in range(0, cpu_number): ++ tempfile.write("tvariable $pc_ip"+str(i)+"\n") ++ tempfile.write("tvariable $pc_cs"+str(i)+"\n") ++ tempfile.write("trace handle_irq\n") ++ tempfile.write("commands\n") ++ tempfile.write("teval $pc_ip0=(u64)regs->ip\n") ++ tempfile.write("teval $pc_cs0=(u64)regs->cs\n") ++ tempfile.write("end\n") ++ #Setup second tracepoint ++ tempfile.write("trace handle_irq\n") ++ cond_str = " (($pc_cs0 & 3) == 0)" ++ tempfile.write("condition $bpnum "+cond_str+ignore_str+"\n") ++ tempfile.write("commands\n") ++ tempfile.write("collect $no_self_trace\n") ++ tempfile.write("collect $pc_ip0\n") ++ tempfile.write("end\n") ++ tempfile.write("trace smp_apic_timer_interrupt\n") ++ tempfile.write("commands\n") ++ tempfile.write("teval $pc_ip0=(u64)regs->ip\n") ++ tempfile.write("teval $pc_cs0=(u64)regs->cs\n") ++ tempfile.write("end\n") ++ #Setup second tracepoint ++ tempfile.write("trace smp_apic_timer_interrupt\n") ++ cond_str = " (($pc_cs0 & 3) == 0)" ++ tempfile.write("condition $bpnum "+cond_str+ignore_str+"\n") ++ tempfile.write("commands\n") ++ tempfile.write("collect $no_self_trace\n") ++ tempfile.write("collect $pc_ip0\n") ++ tempfile.write("end\n") ++else: ++ pid_str = "" ++ for pid in task_list: ++ if pid_str != "": ++ pid_str += " || " ++ else: ++ pid_str += "(" ++ pid_str += "($current_task_pid == "+str(pid)+") " ++ if pid_str != "": ++ pid_str += ")" ++ cond_str = "" ++ if not trace_user: ++ if pid_str != "": ++ cond_str += " && " ++ cond_str += " ((regs->cs & 3) == 0)" ++ elif not trace_kernel: ++ if pid_str != "": ++ cond_str += "&&" ++ cond_str += " ((regs->cs & 3) == 3)" ++ tempfile.write("trace handle_irq\n") ++ tempfile.write("condition $bpnum "+pid_str+cond_str+"\n") ++ tempfile.write("commands\n") ++ tempfile.write("collect regs->ip\n") ++ if trace_user and trace_kernel: ++ tempfile.write("collect regs->cs\n") ++ tempfile.write("collect $current_task_pid\n") ++ tempfile.write("end\n") ++ tempfile.write("trace smp_apic_timer_interrupt\n") ++ tempfile.write("condition $bpnum "+pid_str+cond_str+"\n") ++ tempfile.write("commands\n") ++ tempfile.write("collect regs->ip\n") ++ if trace_user and trace_kernel: ++ tempfile.write("collect regs->cs\n") ++ tempfile.write("collect $current_task_pid\n") ++ tempfile.write("end\n") ++tempfile.close() ++tempfile = open(tempfilename, "r") ++print "Tracepoint command:" ++print tempfile.read() ++tempfile.close() ++gdb.execute("source "+tempfilename, True, False) ++os.remove(tempfilename) ++gdb.execute("set disconnected-tracing on", True, False) ++gdb.execute("tstart") ++gdb.execute("kill", True, False) ++ ++signal.signal(signal.SIGINT, sigint_handler); ++signal.siginterrupt(signal.SIGINT, False); ++ ++#Connect to pipe ++gdb.execute("target tfile /sys/kernel/debug/gtpframe_pipe") ++ ++def get_line_from_sym(sym): ++ sym = sym.rstrip(os.linesep) ++ ++ #Get line_num and file_name ++ begin = sym.find("Line ") ++ end = sym.find("\" starts at address") ++ line_num = None ++ file_name = None ++ if begin >= 0 and end > 0 and begin + len("Line ") < end: ++ line = sym[begin + len("Line "):end] ++ line = line.split(" of \"") ++ if len(line) == 2: ++ line_num = line[0] ++ file_name = line[1] ++ sym = sym[end:] ++ ++ #Get function_name ++ begin = sym.find("<") ++ end = sym.find(">") ++ if begin >= 0 and end > 0 and begin + 1 < end: ++ function_name = sym[begin + 1:end] ++ end = function_name.rfind("+") ++ if end > 0: ++ function_name = function_name[:end]++ sym = gdb.execute("info symbol "+function_name, True, True).rstrip(os.linesep)
++ begin = sym.rfind(" of ") ++ if begin > 0: ++ begin += len(" of ") ++ function_name = sym[begin:] + ":" + function_name ++ else: ++ function_name = None ++ return (line_num, file_name, function_name) ++ ++if no_task: ++ while 1: ++ try: ++ gdb.execute("tfind 0", False, True) ++ cpu_id = long(gdb.parse_and_eval("$cpu_id")); ++ sym = gdb.execute("info line *($pc_ip"+str(cpu_id)+" - 1)", True, True) ++ line = get_line_from_sym(sym) ++ task_list_add_line(False, 0, line) ++ except gdb.error, x: ++ print("Drop one entry because", x) ++ except gdb.MemoryError, x: ++ print("Drop one entry because", x) ++ try: ++ gdb.execute("tfind 1", False, True) ++ except: ++ pass ++else: ++ while 1: ++ try: ++ gdb.execute("tfind 0", False, True) ++ is_user = False ++ pid = long(gdb.parse_and_eval("$current_task_pid")) ++ if not pid in task_list:++ raise gdb.error ("Cannot find inferior for pid "+ str(pid) +", drop one entry.")
++ if trace_user and long(gdb.parse_and_eval("regs->cs & 3")) == 3: ++ is_user = True ++ ip = long(gdb.parse_and_eval("regs->ip - 1")) ++ gdb.execute("inferior "+str(task_list[pid][0]), False, True) ++ sym = gdb.execute("info line *"+str(ip), True, True) ++ else: ++ sym = gdb.execute("info line *(regs->ip - 1)", True, True) ++ line = get_line_from_sym(sym) ++ if is_user: ++ gdb.execute("inferior 1", False, True) ++ task_list_add_line(is_user, pid, line) ++ except gdb.error, x: ++ print("Drop one entry because", x) ++ gdb.execute("inferior 1", False, True) ++ except gdb.MemoryError, x: ++ print("Drop one entry because", x) ++ gdb.execute("inferior 1", False, True) ++ try: ++ gdb.execute("tfind 1", False, True) ++ except: ++ pass --- /dev/null +++ b/scripts/gtp/add-ons/pe.py @@ -0,0 +1,729 @@ @@ -12258,122 +12850,122 @@ +#Not ignore gtp.ko +#set $ignore_gtp_ko=0 + -+import gdb; -+import os; ++import gdb ++import os + +def format_file(name): -+ tmp = ""; ++ tmp = "" + for c in name: + if c == "_": -+ c = "-"; -+ tmp += c; -+ return tmp; ++ c = "-" ++ tmp += c ++ return tmp + +#Check if the target is available +if str(gdb.selected_thread()) == "None": -+ raise gdb.error("Please connect to Linux Kernel before use the script."); ++ raise gdb.error("Please connect to Linux Kernel before use the script.") + +#Output the help+print "Use GDB command \"set $mod_search_dir=dir\" to set an directory for search the modules."
+ -+ignore_gtp_ko = gdb.parse_and_eval("$ignore_gtp_ko"); ++ignore_gtp_ko = gdb.parse_and_eval("$ignore_gtp_ko") +if ignore_gtp_ko.type.code == gdb.TYPE_CODE_INT: -+ ignore_gtp_ko = int(ignore_gtp_ko); ++ ignore_gtp_ko = int(ignore_gtp_ko) +else: -+ ignore_gtp_ko = 1; ++ ignore_gtp_ko = 1 + +#Get the mod_search_dir -+mod_search_dir_list = []; ++mod_search_dir_list = [] +#Get dir from $mod_search_dir -+tmp_dir = gdb.parse_and_eval("$mod_search_dir"); ++tmp_dir = gdb.parse_and_eval("$mod_search_dir") +if tmp_dir.type.code == gdb.TYPE_CODE_ARRAY: -+ tmp_dir = str(tmp_dir); -+ tmp_dir = tmp_dir[1:len(tmp_dir)]; -+ tmp_dir = tmp_dir[0:tmp_dir.index("\"")]; -+ mod_search_dir_list.append(tmp_dir); ++ tmp_dir = str(tmp_dir) ++ tmp_dir = tmp_dir[1:len(tmp_dir)] ++ tmp_dir = tmp_dir[0:tmp_dir.index("\"")] ++ mod_search_dir_list.append(tmp_dir) +#Get dir that same with current vmlinux -+tmp_dir = str(gdb.execute("info files", False, True));-+tmp_dir = tmp_dir[tmp_dir.index("Symbols from \"")+len("Symbols from \""):len(tmp_dir)];
-+tmp_dir = tmp_dir[0:tmp_dir.index("\"")]; -+tmp_dir = tmp_dir[0:tmp_dir.rindex("/")]; -+mod_search_dir_list.append(tmp_dir); ++tmp_dir = str(gdb.execute("info files", False, True))++tmp_dir = tmp_dir[tmp_dir.index("Symbols from \"")+len("Symbols from \""):len(tmp_dir)]
++tmp_dir = tmp_dir[0:tmp_dir.index("\"")] ++tmp_dir = tmp_dir[0:tmp_dir.rindex("/")] ++mod_search_dir_list.append(tmp_dir) +#Get the dir of current Kernel -+tmp_dir = "/lib/modules/" + str(os.uname()[2]); ++tmp_dir = "/lib/modules/" + str(os.uname()[2]) +if os.path.isdir(tmp_dir): -+ mod_search_dir_list.append(tmp_dir); ++ mod_search_dir_list.append(tmp_dir) +#Let user choice dir -+mod_search_dir = ""; ++mod_search_dir = "" +while mod_search_dir == "": + for i in range(0, len(mod_search_dir_list)): -+ print str(i)+". "+mod_search_dir_list[i]; ++ print str(i)+". "+mod_search_dir_list[i] + try: -+ s = input('Select a directory for search the modules [0]:'); ++ s = input('Select a directory for search the modules [0]:') + except SyntaxError: -+ s = 0; ++ s = 0 + except: -+ continue; ++ continue + if s < 0 or s >= len(mod_search_dir_list): -+ continue; -+ mod_search_dir = mod_search_dir_list[s]; ++ continue ++ mod_search_dir = mod_search_dir_list[s] +-+mod_list_offset = long(gdb.parse_and_eval("((size_t) &(((struct module *)0)->list))"));
-+mod_list = long(gdb.parse_and_eval("(&modules)")); -+mod_list_current = mod_list;++mod_list_offset = long(gdb.parse_and_eval("((size_t) &(((struct module *)0)->list))"))
++mod_list = long(gdb.parse_and_eval("(&modules)")) ++mod_list_current = mod_list + +while 1:-+ mod_list_current = long(gdb.parse_and_eval("((struct list_head *) "+str(mod_list_current)+")->next")); ++ mod_list_current = long(gdb.parse_and_eval("((struct list_head *) "+str(mod_list_current)+")->next"))
+ + #check if need break the loop + if mod_list == mod_list_current: -+ break; ++ break + -+ mod = mod_list_current - mod_list_offset; ++ mod = mod_list_current - mod_list_offset + + #get mod_name-+ mod_name = str(gdb.parse_and_eval("((struct module *)"+str(mod)+")->name"));
-+ mod_name = mod_name[mod_name.index("\"")+1:len(mod_name)]; -+ mod_name = mod_name[0:mod_name.index("\"")];++ mod_name = str(gdb.parse_and_eval("((struct module *)"+str(mod)+")->name"))
++ mod_name = mod_name[mod_name.index("\"")+1:len(mod_name)] ++ mod_name = mod_name[0:mod_name.index("\"")] + mod_name += ".ko" -+ mod_name = format_file(mod_name); ++ mod_name = format_file(mod_name) + + #get mod_dir_name -+ mod_dir_name = ""; ++ mod_dir_name = "" + for root, dirs, files in os.walk(mod_search_dir): + for afile in files: -+ tmp_file = format_file(afile); ++ tmp_file = format_file(afile) + if tmp_file == mod_name: -+ mod_dir_name = os.path.join(root,afile); -+ break; ++ mod_dir_name = os.path.join(root,afile) ++ break + if mod_dir_name != "": -+ break; ++ break + -+ command = " "; ++ command = " " + + #Add module_core to command-+ command += str(gdb.parse_and_eval("((struct module *)"+str(mod)+")->module_core")); ++ command += str(gdb.parse_and_eval("((struct module *)"+str(mod)+")->module_core"))
+ + #Add each sect_attrs->attrs to command + #get nsections-+ nsections = int(gdb.parse_and_eval("((struct module *)"+str(mod)+")->sect_attrs->nsections")); -+ sect_attrs = long(gdb.parse_and_eval("(u64)((struct module *)"+str(mod)+")->sect_attrs")); ++ nsections = int(gdb.parse_and_eval("((struct module *)"+str(mod)+")->sect_attrs->nsections")) ++ sect_attrs = long(gdb.parse_and_eval("(u64)((struct module *)"+str(mod)+")->sect_attrs"))
+ for i in range(0, nsections): -+ command += " -s";-+ tmp = str(gdb.parse_and_eval("((struct module_sect_attrs *)"+str(sect_attrs)+")->attrs["+str(i)+"].name"));
-+ tmp = tmp[tmp.index("\"")+1:len(tmp)]; -+ tmp = tmp[0:tmp.index("\"")]; -+ command += " "+tmp;-+ tmp = str(gdb.parse_and_eval("((struct module_sect_attrs *)"+str(sect_attrs)+")->attrs["+str(i)+"].address"));
-+ command += " "+tmp; ++ command += " -s"++ tmp = str(gdb.parse_and_eval("((struct module_sect_attrs *)"+str(sect_attrs)+")->attrs["+str(i)+"].name"))
++ tmp = tmp[tmp.index("\"")+1:len(tmp)] ++ tmp = tmp[0:tmp.index("\"")] ++ command += " "+tmp++ tmp = str(gdb.parse_and_eval("((struct module_sect_attrs *)"+str(sect_attrs)+")->attrs["+str(i)+"].address"))
++ command += " "+tmp + + if mod_dir_name == "": -+ print "Cannot find out",mod_name,"from directory."; ++ print "Cannot find out",mod_name,"from directory." + print "Please use following command load the symbols from it:" -+ print "add-symbol-file some_dir/"+mod_name+command; ++ print "add-symbol-file some_dir/"+mod_name+command + else: + if ignore_gtp_ko and mod_name == "gtp.ko":-+ print "gtp.ko is ignored. You can use command \"set $ignore_gtp_ko=0\" to close this ignore."; ++ print "gtp.ko is ignored. You can use command \"set $ignore_gtp_ko=0\" to close this ignore."
+ print "Or you can use following command load the symbols from it:" -+ print "add-symbol-file "+mod_dir_name+command; ++ print "add-symbol-file "+mod_dir_name+command + else: -+ #print "add-symbol-file "+mod_dir_name+command; -+ gdb.execute("add-symbol-file "+mod_dir_name+command, False, False); ++ #print "add-symbol-file "+mod_dir_name+command ++ gdb.execute("add-symbol-file "+mod_dir_name+command, False, False) ======================================= --- /trunk/gtp_older_to_2.6.32.patch Sat Feb 25 02:36:54 2012 +++ /trunk/gtp_older_to_2.6.32.patch Mon Mar 19 01:02:54 2012 @@ -3,12 +3,13 @@ Documentation/gtp/quickstart.txt | 250 + lib/Kconfig.debug | 10 lib/Makefile | 2- lib/gtp.c | 9210 +++++++++++++++++++++++++++++++++++++++
- lib/gtp_rb.c | 495 ++ - scripts/gtp/add-ons/pe.py | 729 ++++ lib/gtp.c | 9519 +++++++++++++++++++++++++++++++++++++++
+ lib/gtp_rb.c | 498 ++ + scripts/gtp/add-ons/hotcode.py | 588 ++ + scripts/gtp/add-ons/pe.py | 729 ++ scripts/gtp/getgtprsp.pl | 137 scripts/gtp/getmod.py | 132 - 9 files changed, 12484 insertions(+) + 10 files changed, 13384 insertions(+) --- /dev/null +++ b/Documentation/gtp/howto.txt @@ -1817,7 +1818,7 @@ --- /dev/null +++ b/lib/gtp.c -@@ -0,0 +1,9210 @@ +@@ -0,0 +1,9519 @@ +/* + * Kernel GDB tracepoint module. + * @@ -1839,8 +1840,8 @@ + * + */ + -+/* If *10 means that this is not a release version. */ -+#define GTP_VERSION (20120224) ++/* If "* 10" means that this is not a release version. */ ++#define GTP_VERSION (20120319) + +#include <linux/version.h> +#ifndef RHEL_RELEASE_VERSION @@ -2024,6 +2025,8 @@ +#define GTP_DEBUG KERN_WARNING +#endif + ++/* #define GTP_DEBUG_V */ ++ +#define GTP_RW_MAX 16384 +#define GTP_RW_BUFP_MAX (GTP_RW_MAX - 4 - gtp_rw_size) + @@ -2067,7 +2070,39 @@ +#define GTP_FRAME_VAR_SIZE (FID_SIZE + sizeof(struct gtp_frame_var)) +#endif + -+#define TOHEX(h) ((h) > 9 ? (h) + 'a' - 10 : (h) + '0') ++#define INT2CHAR(h) ((h) > 9 ? (h) + 'a' - 10 : (h) + '0') ++ ++enum { ++ op_check_add = 0xe5, ++ op_check_sub, ++ op_check_mul, ++ op_check_div_signed, ++ op_check_div_unsigned, ++ op_check_rem_signed, ++ op_check_rem_unsigned, ++ op_check_lsh, ++ op_check_rsh_signed, ++ op_check_rsh_unsigned, ++ op_check_trace, ++ op_check_bit_and, ++ op_check_bit_or, ++ op_check_bit_xor, ++ op_check_equal, ++ op_check_less_signed, ++ op_check_less_unsigned, ++ op_check_pop, ++ op_check_swap, ++ op_check_if_goto, ++ op_check_printf, /* XXX: still not used. */ ++ ++ op_special_getv = 0xfa, ++ op_special_setv, ++ op_special_tracev, ++ ++ op_trace_printk = 0xfd, ++ op_trace_quick_printk, ++ op_tracev_printk, ++}; + +struct action_agent_exp { + unsigned int size; @@ -2254,7 +2289,7 @@ + GTP_VAR_IRQ_COUNT_ID, + GTP_VAR_PIPE_TRACE_ID, + GTP_VAR_CURRENT_TASK_PID_ID, -+ GTP_VAR_SPECIAL_MAX = GTP_VAR_PIPE_TRACE_ID, ++ GTP_VAR_SPECIAL_MAX = GTP_VAR_CURRENT_TASK_PID_ID, +}; + +#define PREV_VAR NULL @@ -3066,38 +3101,38 @@ +gtp_regs2ascii(struct pt_regs *regs, char *buf) +{ +#ifdef CONFIG_X86_32 -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_regs2ascii: ax = 0x%x\n", ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ax = 0x%x\n", + (unsigned int) regs->ax); -+ printk(GTP_DEBUG "gtp_regs2ascii: cx = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cx = 0x%x\n", + (unsigned int) regs->cx); -+ printk(GTP_DEBUG "gtp_regs2ascii: dx = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: dx = 0x%x\n", + (unsigned int) regs->dx); -+ printk(GTP_DEBUG "gtp_regs2ascii: bx = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bx = 0x%x\n", + (unsigned int) regs->bx); -+ printk(GTP_DEBUG "gtp_regs2ascii: sp = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: sp = 0x%x\n", + (unsigned int) regs->sp); -+ printk(GTP_DEBUG "gtp_regs2ascii: bp = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bp = 0x%x\n", + (unsigned int) regs->bp); -+ printk(GTP_DEBUG "gtp_regs2ascii: si = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: si = 0x%x\n", + (unsigned int) regs->si); -+ printk(GTP_DEBUG "gtp_regs2ascii: di = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: di = 0x%x\n", + (unsigned int) regs->di); -+ printk(GTP_DEBUG "gtp_regs2ascii: ip = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ip = 0x%x\n", + (unsigned int) regs->ip); -+ printk(GTP_DEBUG "gtp_regs2ascii: flags = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: flags = 0x%x\n", + (unsigned int) regs->flags); -+ printk(GTP_DEBUG "gtp_regs2ascii: cs = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cs = 0x%x\n", + (unsigned int) regs->cs); -+ printk(GTP_DEBUG "gtp_regs2ascii: ss = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ss = 0x%x\n", + (unsigned int) regs->ss); -+ printk(GTP_DEBUG "gtp_regs2ascii: ds = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ds = 0x%x\n", + (unsigned int) regs->ds); -+ printk(GTP_DEBUG "gtp_regs2ascii: es = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: es = 0x%x\n", + (unsigned int) regs->es); -+ printk(GTP_DEBUG "gtp_regs2ascii: fs = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: fs = 0x%x\n", + (unsigned int) regs->fs); -+ printk(GTP_DEBUG "gtp_regs2ascii: gs = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: gs = 0x%x\n", + (unsigned int) regs->gs); +#endif +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,24)) @@ -3170,27 +3205,27 @@ + buf += 8; +#endif +#else -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_regs2ascii: ax = 0x%lx\n", regs->ax); -+ printk(GTP_DEBUG "gtp_regs2ascii: bx = 0x%lx\n", regs->bx); -+ printk(GTP_DEBUG "gtp_regs2ascii: cx = 0x%lx\n", regs->cx); -+ printk(GTP_DEBUG "gtp_regs2ascii: dx = 0x%lx\n", regs->dx); -+ printk(GTP_DEBUG "gtp_regs2ascii: si = 0x%lx\n", regs->si); -+ printk(GTP_DEBUG "gtp_regs2ascii: di = 0x%lx\n", regs->di); -+ printk(GTP_DEBUG "gtp_regs2ascii: bp = 0x%lx\n", regs->bp); -+ printk(GTP_DEBUG "gtp_regs2ascii: sp = 0x%lx\n", regs->sp); -+ printk(GTP_DEBUG "gtp_regs2ascii: r8 = 0x%lx\n", regs->r8); -+ printk(GTP_DEBUG "gtp_regs2ascii: r9 = 0x%lx\n", regs->r9); -+ printk(GTP_DEBUG "gtp_regs2ascii: r10 = 0x%lx\n", regs->r10); -+ printk(GTP_DEBUG "gtp_regs2ascii: r11 = 0x%lx\n", regs->r11); -+ printk(GTP_DEBUG "gtp_regs2ascii: r12 = 0x%lx\n", regs->r12); -+ printk(GTP_DEBUG "gtp_regs2ascii: r13 = 0x%lx\n", regs->r13); -+ printk(GTP_DEBUG "gtp_regs2ascii: r14 = 0x%lx\n", regs->r14); -+ printk(GTP_DEBUG "gtp_regs2ascii: r15 = 0x%lx\n", regs->r15); -+ printk(GTP_DEBUG "gtp_regs2ascii: ip = 0x%lx\n", regs->ip); -+ printk(GTP_DEBUG "gtp_regs2ascii: flags = 0x%lx\n", regs->flags); -+ printk(GTP_DEBUG "gtp_regs2ascii: cs = 0x%lx\n", regs->cs); -+ printk(GTP_DEBUG "gtp_regs2ascii: ss = 0x%lx\n", regs->ss); ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ax = 0x%lx\n", regs->ax); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bx = 0x%lx\n", regs->bx); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cx = 0x%lx\n", regs->cx); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: dx = 0x%lx\n", regs->dx); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: si = 0x%lx\n", regs->si); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: di = 0x%lx\n", regs->di); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bp = 0x%lx\n", regs->bp); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: sp = 0x%lx\n", regs->sp); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r8 = 0x%lx\n", regs->r8); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r9 = 0x%lx\n", regs->r9); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r10 = 0x%lx\n", regs->r10); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r11 = 0x%lx\n", regs->r11); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r12 = 0x%lx\n", regs->r12); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r13 = 0x%lx\n", regs->r13); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r14 = 0x%lx\n", regs->r14); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r15 = 0x%lx\n", regs->r15); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ip = 0x%lx\n", regs->ip); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: flags = 0x%lx\n", regs->flags); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cs = 0x%lx\n", regs->cs); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ss = 0x%lx\n", regs->ss); +#endif +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,24)) + sprintf(buf, "%016lx", (unsigned long) swab64(regs->ax)); @@ -3269,38 +3304,38 @@ +gtp_regs2bin(struct pt_regs *regs, char *buf) +{ +#ifdef CONFIG_X86_32 -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_regs2ascii: ax = 0x%x\n", ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ax = 0x%x\n", + (unsigned int) regs->ax); -+ printk(GTP_DEBUG "gtp_regs2ascii: cx = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cx = 0x%x\n", + (unsigned int) regs->cx); -+ printk(GTP_DEBUG "gtp_regs2ascii: dx = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: dx = 0x%x\n", + (unsigned int) regs->dx); -+ printk(GTP_DEBUG "gtp_regs2ascii: bx = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bx = 0x%x\n", + (unsigned int) regs->bx); -+ printk(GTP_DEBUG "gtp_regs2ascii: sp = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: sp = 0x%x\n", + (unsigned int) regs->sp); -+ printk(GTP_DEBUG "gtp_regs2ascii: bp = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bp = 0x%x\n", + (unsigned int) regs->bp); -+ printk(GTP_DEBUG "gtp_regs2ascii: si = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: si = 0x%x\n", + (unsigned int) regs->si); -+ printk(GTP_DEBUG "gtp_regs2ascii: di = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: di = 0x%x\n", + (unsigned int) regs->di); -+ printk(GTP_DEBUG "gtp_regs2ascii: ip = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ip = 0x%x\n", + (unsigned int) regs->ip); -+ printk(GTP_DEBUG "gtp_regs2ascii: flags = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: flags = 0x%x\n", + (unsigned int) regs->flags); -+ printk(GTP_DEBUG "gtp_regs2ascii: cs = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cs = 0x%x\n", + (unsigned int) regs->cs); -+ printk(GTP_DEBUG "gtp_regs2ascii: ss = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ss = 0x%x\n", + (unsigned int) regs->ss); -+ printk(GTP_DEBUG "gtp_regs2ascii: ds = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ds = 0x%x\n", + (unsigned int) regs->ds); -+ printk(GTP_DEBUG "gtp_regs2ascii: es = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: es = 0x%x\n", + (unsigned int) regs->es); -+ printk(GTP_DEBUG "gtp_regs2ascii: fs = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: fs = 0x%x\n", + (unsigned int) regs->fs); -+ printk(GTP_DEBUG "gtp_regs2ascii: gs = 0x%x\n", ++ printk(GTP_DEBUG_V "gtp_regs2ascii: gs = 0x%x\n", + (unsigned int) regs->gs); +#endif +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,24)) @@ -3373,27 +3408,27 @@ + buf += 4; +#endif +#else -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_regs2ascii: ax = 0x%lx\n", regs->ax); -+ printk(GTP_DEBUG "gtp_regs2ascii: bx = 0x%lx\n", regs->bx); -+ printk(GTP_DEBUG "gtp_regs2ascii: cx = 0x%lx\n", regs->cx); -+ printk(GTP_DEBUG "gtp_regs2ascii: dx = 0x%lx\n", regs->dx); -+ printk(GTP_DEBUG "gtp_regs2ascii: si = 0x%lx\n", regs->si); -+ printk(GTP_DEBUG "gtp_regs2ascii: di = 0x%lx\n", regs->di); -+ printk(GTP_DEBUG "gtp_regs2ascii: bp = 0x%lx\n", regs->bp); -+ printk(GTP_DEBUG "gtp_regs2ascii: sp = 0x%lx\n", regs->sp); -+ printk(GTP_DEBUG "gtp_regs2ascii: r8 = 0x%lx\n", regs->r8); -+ printk(GTP_DEBUG "gtp_regs2ascii: r9 = 0x%lx\n", regs->r9); -+ printk(GTP_DEBUG "gtp_regs2ascii: r10 = 0x%lx\n", regs->r10); -+ printk(GTP_DEBUG "gtp_regs2ascii: r11 = 0x%lx\n", regs->r11); -+ printk(GTP_DEBUG "gtp_regs2ascii: r12 = 0x%lx\n", regs->r12); -+ printk(GTP_DEBUG "gtp_regs2ascii: r13 = 0x%lx\n", regs->r13); -+ printk(GTP_DEBUG "gtp_regs2ascii: r14 = 0x%lx\n", regs->r14); -+ printk(GTP_DEBUG "gtp_regs2ascii: r15 = 0x%lx\n", regs->r15); -+ printk(GTP_DEBUG "gtp_regs2ascii: ip = 0x%lx\n", regs->ip); -+ printk(GTP_DEBUG "gtp_regs2ascii: flags = 0x%lx\n", regs->flags); -+ printk(GTP_DEBUG "gtp_regs2ascii: cs = 0x%lx\n", regs->cs); -+ printk(GTP_DEBUG "gtp_regs2ascii: ss = 0x%lx\n", regs->ss); ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ax = 0x%lx\n", regs->ax); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bx = 0x%lx\n", regs->bx); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cx = 0x%lx\n", regs->cx); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: dx = 0x%lx\n", regs->dx); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: si = 0x%lx\n", regs->si); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: di = 0x%lx\n", regs->di); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: bp = 0x%lx\n", regs->bp); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: sp = 0x%lx\n", regs->sp); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r8 = 0x%lx\n", regs->r8); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r9 = 0x%lx\n", regs->r9); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r10 = 0x%lx\n", regs->r10); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r11 = 0x%lx\n", regs->r11); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r12 = 0x%lx\n", regs->r12); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r13 = 0x%lx\n", regs->r13); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r14 = 0x%lx\n", regs->r14); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: r15 = 0x%lx\n", regs->r15); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ip = 0x%lx\n", regs->ip); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: flags = 0x%lx\n", regs->flags); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: cs = 0x%lx\n", regs->cs); ++ printk(GTP_DEBUG_V "gtp_regs2ascii: ss = 0x%lx\n", regs->ss); +#endif +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,24)) + memcpy(buf, ®s->ax, 8); @@ -3513,22 +3548,22 @@ +static void +gtp_regs2ascii(struct pt_regs *regs, char *buf) +{ -+#ifdef GTP_DEBUG ++#ifdef GTP_DEBUG_V + { + int i; + + for (i = 0; i < 32; i++) -+ printk(GTP_DEBUG "gtp_gdbrsp_g: r%d = 0x%lx\n", i, ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: r%d = 0x%lx\n", i, + regs->regs[i]); + } -+ printk(GTP_DEBUG "gtp_gdbrsp_g: status = 0x%lx\n", ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: status = 0x%lx\n", + regs->cp0_status); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: lo = 0x%lx\n", regs->lo); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: hi = 0x%lx\n", regs->hi); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: badvaddr = 0x%lx\n", ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: lo = 0x%lx\n", regs->lo); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: hi = 0x%lx\n", regs->hi); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: badvaddr = 0x%lx\n", + regs->cp0_badvaddr); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: cause = 0x%lx\n", regs->cp0_cause); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: pc = 0x%lx\n", regs->cp0_epc); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: cause = 0x%lx\n", regs->cp0_cause); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: pc = 0x%lx\n", regs->cp0_epc); +#endif + +#ifdef CONFIG_32BIT @@ -3584,22 +3619,22 @@ +static void +gtp_regs2bin(struct pt_regs *regs, char *buf) +{ -+#ifdef GTP_DEBUG ++#ifdef GTP_DEBUG_V + { + int i; + + for (i = 0; i < 32; i++) -+ printk(GTP_DEBUG "gtp_gdbrsp_g: r%d = 0x%lx\n", i, ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: r%d = 0x%lx\n", i, + regs->regs[i]); + } -+ printk(GTP_DEBUG "gtp_gdbrsp_g: status = 0x%lx\n", ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: status = 0x%lx\n", + regs->cp0_status); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: lo = 0x%lx\n", regs->lo); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: hi = 0x%lx\n", regs->hi); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: badvaddr = 0x%lx\n", ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: lo = 0x%lx\n", regs->lo); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: hi = 0x%lx\n", regs->hi); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: badvaddr = 0x%lx\n", + regs->cp0_badvaddr); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: cause = 0x%lx\n", regs->cp0_cause); -+ printk(GTP_DEBUG "gtp_gdbrsp_g: pc = 0x%lx\n", regs->cp0_epc); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: cause = 0x%lx\n", regs->cp0_cause); ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: pc = 0x%lx\n", regs->cp0_epc); +#endif + +#ifdef CONFIG_32BIT @@ -3655,8 +3690,8 @@ + int i; + + for (i = 0; i < 16; i++) { -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_gdbrsp_g: r%d = 0x%lx\n", ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: r%d = 0x%lx\n", + i, regs->uregs[i]); +#endif + sprintf(buf, "%08lx", (unsigned long) SWAB(regs->uregs[i])); @@ -3667,8 +3702,8 @@ + memset(buf, '0', 200); + buf += 200; + -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_gdbrsp_g: cpsr = 0x%lx\n", regs->uregs[16]); ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: cpsr = 0x%lx\n", regs->uregs[16]); +#endif + sprintf(buf, "%08lx", + (unsigned long) SWAB(regs->uregs[16])); @@ -3682,8 +3717,8 @@ + int i; + + for (i = 0; i < 16; i++) { -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_gdbrsp_g: r%d = 0x%lx\n", ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: r%d = 0x%lx\n", + i, regs->uregs[i]); +#endif + memcpy(buf, ®s->uregs[i], 4); @@ -3694,8 +3729,8 @@ + memset(buf, '\0', 100); + buf += 100; + -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_gdbrsp_g: cpsr = 0x%lx\n", regs->uregs[16]); ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_gdbrsp_g: cpsr = 0x%lx\n", regs->uregs[16]); +#endif + memcpy(buf, ®s->uregs[16], 4); + buf += 4; @@ -4216,8 +4251,8 @@ + fm->size = size; + tmp += sizeof(struct gtp_frame_mem); + -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_action_memory_read: id:%d addr:%p %p %u\n", ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_action_memory_read: id:%d addr:%p %p %u\n", + (int)gts->tpe->num, (void *)(CORE_ADDR)gts->tpe->addr, + (void *)addr, (unsigned int)size); +#endif @@ -4319,8 +4354,8 @@ +{ + struct gtp_var *ret; + -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_gtp_var_array_find: num:%u %u %u\n", ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_gtp_var_array_find: num:%u %u %u\n", + gtp_var_head, gtp_var_tail, num); +#endif + @@ -4334,30 +4369,32 @@ + return ret; +} + -+uint64_t -+gtp_get_var(struct gtp_trace_s *gts, struct gtp_var *tve) ++static uint64_t ++gtp_get_var_special(struct gtp_trace_s *gts, unsigned int num) +{ -+ switch (tve->num) { ++ uint64_t ret; ++ ++ switch (num) { + case GTP_VAR_CURRENT_TASK_ID: + if (gts->ri) -+ return (uint64_t)(CORE_ADDR)gts->ri->task; ++ ret = (uint64_t)(CORE_ADDR)gts->ri->task; + else -+ return (uint64_t)(CORE_ADDR)get_current(); ++ ret = (uint64_t)(CORE_ADDR)get_current(); + break; + case GTP_VAR_CURRENT_TASK_PID_ID: + if (gts->ri) -+ return (uint64_t)(CORE_ADDR)gts->ri->task->pid; ++ ret = (uint64_t)(CORE_ADDR)gts->ri->task->pid; + else -+ return (uint64_t)(CORE_ADDR)get_current()->pid; ++ ret = (uint64_t)(CORE_ADDR)get_current()->pid; + break; + case GTP_VAR_CURRENT_THREAD_INFO_ID: -+ return (uint64_t)(CORE_ADDR)current_thread_info(); ++ ret = (uint64_t)(CORE_ADDR)current_thread_info(); + break; + case GTP_VAR_CLOCK_ID: -+ return (uint64_t)GTP_LOCAL_CLOCK; ++ ret = (uint64_t)GTP_LOCAL_CLOCK; + break; + case GTP_VAR_COOKED_CLOCK_ID: -+ return (uint64_t)(__get_cpu_var(local_clock_current) ++ ret = (uint64_t)(__get_cpu_var(local_clock_current) + - __get_cpu_var(local_clock_offset)); + break; +#ifdef CONFIG_X86 @@ -4365,50 +4402,134 @@ + { + unsigned long long a; + rdtscll(a); -+ return (uint64_t)a; ++ ret = (uint64_t)a; + } + break; + case GTP_VAR_COOKED_RDTSC_ID: -+ return (uint64_t)(__get_cpu_var(rdtsc_current) ++ ret = (uint64_t)(__get_cpu_var(rdtsc_current) + - __get_cpu_var(rdtsc_offset)); + break; +#endif + case GTP_VAR_CPU_ID: -+ return (uint64_t)(CORE_ADDR)smp_processor_id(); ++ ret = (uint64_t)(CORE_ADDR)smp_processor_id(); + break; + case GTP_VAR_CPU_NUMBER_ID: -+ return (uint64_t)gtp_cpu_number; ++ ret = (uint64_t)gtp_cpu_number; + break; + case GTP_VAR_PRINTK_TMP_ID: -+ return gts->printk_tmp; ++ ret = gts->printk_tmp; + break; + case GTP_VAR_DUMP_STACK_ID: + printk(KERN_NULL "gtp %d %p:", (int)gts->tpe->num, + (void *)(CORE_ADDR)gts->tpe->addr); + dump_stack(); -+ return 0; ++ ret = 0; + break; + case GTP_VAR_XTIME_SEC_ID: + if (gts->xtime.tv_sec == 0 && gts->xtime.tv_nsec == 0) + getnstimeofday(>s->xtime); -+ return (uint64_t)gts->xtime.tv_sec; ++ ret = (uint64_t)gts->xtime.tv_sec; + break; + case GTP_VAR_XTIME_NSEC_ID: + if (gts->xtime.tv_sec == 0 && gts->xtime.tv_nsec == 0) + getnstimeofday(>s->xtime); -+ return (uint64_t)gts->xtime.tv_nsec; ++ ret = (uint64_t)gts->xtime.tv_nsec; + break; + case GTP_VAR_HARDIRQ_COUNT_ID: -+ return (uint64_t)hardirq_count(); ++ ret = (uint64_t)hardirq_count(); + break; + case GTP_VAR_SOFTIRQ_COUNT_ID: -+ return (uint64_t)softirq_count(); ++ ret = (uint64_t)softirq_count(); + break; + case GTP_VAR_IRQ_COUNT_ID: -+ return (uint64_t)irq_count(); ++ ret = (uint64_t)irq_count(); + break; ++ default: ++ ret = 0; ++ break; + } + ++ return ret; ++} ++ ++static void++gtp_set_var_special(struct gtp_trace_s *gts, unsigned int num, ULONGEST val)
++{ ++ switch (num) { ++ case GTP_VAR_PRINTK_TMP_ID: ++ gts->printk_tmp = val; ++ break; ++ case GTP_VAR_PRINTK_LEVEL_ID: ++ gts->printk_level = (unsigned int)val; ++ break; ++ case GTP_VAR_PRINTK_FORMAT_ID: ++ gts->printk_format = (unsigned int)val; ++ break; ++ case GTP_VAR_PC_PE_EN_ID: ++ gtp_pc_pe_en((int)val); ++ break; ++ } ++} ++ ++static int ++gtp_collect_var_special(struct gtp_trace_s *gts, unsigned int num) ++{ ++ struct gtp_frame_var *fvar; ++ char *tmp; ++#ifdef GTP_FTRACE_RING_BUFFER ++ struct ring_buffer_event *rbe; ++#endif ++ ++ if (gts->next == NULL) { ++ if (gtp_action_head(gts)) ++ return -1; ++ } ++ ++ if (GTP_VAR_AUTO_TRACEV(num)) ++ return 0; ++ ++#ifdef GTP_FTRACE_RING_BUFFER ++ GTP_FRAME_RINGBUFFER_ALLOC(GTP_FRAME_VAR_SIZE); ++#endif ++#if defined(GTP_FRAME_SIMPLE) || defined(GTP_RB) ++#ifdef GTP_RB ++ tmp = gtp_rb_alloc(gts->next, GTP_FRAME_VAR_SIZE, gts->id); ++#endif ++#ifdef GTP_FRAME_SIMPLE ++ tmp = gtp_frame_alloc(GTP_FRAME_VAR_SIZE); ++#endif ++ if (!tmp) { ++ gts->tpe->reason = gtp_stop_frame_full; ++ return -1; ++ } ++#ifdef GTP_FRAME_SIMPLE ++ *gts->next = tmp; ++#endif ++#endif ++ ++ FID(tmp) = FID_VAR; ++ tmp += FID_SIZE; ++ ++#ifdef GTP_FRAME_SIMPLE ++ gts->next = (char **)tmp; ++ *gts->next = NULL; ++ tmp += sizeof(char *); ++#endif ++ ++ fvar = (struct gtp_frame_var *) tmp; ++ fvar->num = num; ++ fvar->val = gtp_get_var_special(gts, num); ++ ++#ifdef GTP_FTRACE_RING_BUFFER ++ ring_buffer_unlock_commit(gtp_frame, rbe); ++#endif ++ ++ return 0; ++} ++ ++uint64_t ++gtp_get_var(struct gtp_trace_s *gts, struct gtp_var *tve) ++{ +#ifdef GTP_PERF_EVENTS + if (tve->ptid == pe_tv_val || tve->ptid == pe_tv_enabled + || tve->ptid == pe_tv_running) { @@ -4487,118 +4608,6 @@ + + return 0; +} -+ -+#define gtp_action_x_getv \ -+ do { \ -+ struct gtp_var *tve; \ -+ \ -+ tve = gtp_gtp_var_array_find(arg); \ -+ if (!tve) \ -+ goto code_error_out; \ -+ \ -+ stack[sp++] = top; \ -+ \ -+ top = gtp_get_var(gts, tve); \ -+ } while (0) -+ -+#ifdef GTP_PERF_EVENTS -+#define gtp_action_x_setv_pe \ -+ do { \ -+ if (tve->ptid == pe_tv_en) \ -+ gtp_pe_set_en(tve->pts, (int)top); \ -+ else if (tve->ptid == pe_tv_val) \ -+ perf_event_set(tve->pts->event, (u64)top); \ -+ } while (0) -+#else -+#define gtp_action_x_setv_pe -+#endif -+ -+#define gtp_action_x_setv \ -+ do { \ -+ switch (arg) { \ -+ case GTP_VAR_PRINTK_TMP_ID: \ -+ gts->printk_tmp = top; \ -+ break; \ -+ case GTP_VAR_PRINTK_LEVEL_ID: \ -+ gts->printk_level = (unsigned int)top; \ -+ break; \ -+ case GTP_VAR_PRINTK_FORMAT_ID: \ -+ gts->printk_format = (unsigned int)top; \ -+ break; \ -+ case GTP_VAR_PC_PE_EN_ID: \ -+ gtp_pc_pe_en((int)top); \ -+ break; \ -+ default: { \ -+ struct gtp_var *tve; \ -+ \ -+ tve = gtp_gtp_var_array_find(arg); \ -+ if (!tve) \ -+ goto code_error_out; \ -+ gtp_action_x_setv_pe; \ -+ /* Not check the other special \ -+ trace state variables. \ -+ Because set in tve->val doesn't \ -+ affect anything. */ \ -+ tve->val = (uint64_t)top; \ -+ } \ -+ break; \ -+ } \ -+ } while (0) -+ -+#define gtp_action_x_tracev \ -+ do { \ -+ if (!gts->tpe->have_printk \ -+ || !GTP_VAR_AUTO_TRACEV(arg)) { \ -+ struct gtp_var *tve; \ -+ \ -+ tve = gtp_gtp_var_array_find(arg); \ -+ if (!tve) \ -+ goto code_error_out; \ -+ \ -+ if (gtp_collect_var(gts, tve)) { \ -+ /* gtp_collect_var will set error \ -+ status with itself if it got \ -+ error. */ \ -+ goto out; \ -+ } \ -+ } \ -+ } while (0) -+ -+#define gtp_action_x_tracev_printk \ -+ do { \ -+ struct gtp_var *tve; \ -+ \ -+ tve = gtp_gtp_var_array_find(arg); \ -+ if (!tve) \ -+ goto code_error_out; \ -+ \ -+ if (gtp_action_printk(gts, gtp_get_var(gts, tve), 0)) { \ -+ /* gtp_collect_var will set error status with \ -+ itself if it got error. */ \ -+ goto out; \ -+ } \ -+ } while (0) -+ -+#define gtp_action_x_printf \ -+ do { \ -+ if (strstr((char *)(ebuf + pc), "%s")) { \ -+ int i; \ -+ char buf[50]; \ -+ \ -+ for (i = 0; i < 50; i++) { \ -+ if (probe_kernel_read(buf + i, \ -+ argv + i, 1)) \ -+ goto code_error_out; \ -+ if (!buf[i]) \ -+ break; \ -+ } \ -+ snprintf(pbuf, psize, (char *)(ebuf + pc), \ -+ buf); \ -+ } else { \ -+ snprintf(pbuf, psize, (char *)(ebuf + pc), \ -+ argv); \ -+ } \ -+ } while (0) + +#define STACK_MAX 32 +static DEFINE_PER_CPU(ULONGEST[STACK_MAX], action_x_stack); @@ -4636,657 +4645,558 @@ + if (unlikely(ae->u.exp.need_var_lock)) + spin_lock(>p_var_lock); + -+ if (ae->type == 'X') { -+ while (pc < ae->u.exp.size) { -+#ifdef GTP_DEBUG -+ printk(GTP_DEBUG "gtp_parse_x: cmd %x\n", ebuf[pc]); ++ while (1) { ++#ifdef GTP_DEBUG_V ++ printk(GTP_DEBUG_V "gtp_parse_x: cmd %x\n", ebuf[pc]); +#endif + -+ switch (ebuf[pc++]) { -+ /* add */ -+ case 0x02: ++ switch (ebuf[pc++]) { ++ /* add */ ++ case 0x02: ++ top += stack[--sp]; ++ break; ++ ++ case op_check_add: ++ if (sp) + top += stack[--sp]; -+ break; -+ /* sub */ -+ case 0x03: ++ else ++ goto code_error_out; ++ break; ++ ++ /* sub */ ++ case 0x03: ++ top = stack[--sp] - top; ++ break; ++ ++ case op_check_sub: ++ if (sp) + top = stack[--sp] - top; -+ break; -+ /* mul */ -+ case 0x04: ++ else ++ goto code_error_out; ++ break; ++ ++ /* mul */ ++ case 0x04: ++ top *= stack[--sp]; ++ break; ++ ++ case op_check_mul: ++ if (sp) + top *= stack[--sp]; -+ break; ++ else ++ goto code_error_out; ++ break; ++ +#ifndef CONFIG_MIPS -+ /* div_signed */ -+ case 0x05: -+ if (top) { -+ LONGEST l = (LONGEST) stack[--sp]; -+ do_div(l, (LONGEST) top); -+ top = l; -+ } else -+ goto code_error_out; -+ break; -+ /* div_unsigned */ -+ case 0x06: -+ if (top) { -+ ULONGEST ul = stack[--sp]; -+ do_div(ul, top); -+ top = ul; -+ } else -+ goto code_error_out; -+ break; -+ /* rem_signed */ -+ case 0x07: -+ if (top) { -+ LONGEST l1 = (LONGEST) stack[--sp]; -+ LONGEST l2 = (LONGEST) top; -+ top = do_div(l1, l2); -+ } else -+ goto code_error_out; -+ break; -+ /* rem_unsigned */ -+ case 0x08: -+ if (top) { -+ ULONGEST ul1 = stack[--sp]; -+ ULONGEST ul2 = top; -+ top = do_div(ul1, ul2); -+ } else -+ goto code_error_out; -+ break; ++ /* div_signed */ ++ case 0x05: ++ if (top) { ++ LONGEST l = (LONGEST) stack[--sp]; ++ do_div(l, (LONGEST) top); ++ top = l; ++ } else ++ goto code_error_out; ++ break; ++ ++ case op_check_div_signed: ++ if (top && sp) { ++ LONGEST l = (LONGEST) stack[--sp]; ++ do_div(l, (LONGEST) top); ++ top = l; ++ } else ++ goto code_error_out; ++ break; ++ ++ /* div_unsigned */ ++ case 0x06: ++ if (top) { ++ ULONGEST ul = stack[--sp]; ++ do_div(ul, top); ++ top = ul; ++ } else ++ goto code_error_out; ++ break; ++ ++ case op_check_div_unsigned: ++ if (top && sp) { ++ ULONGEST ul = stack[--sp]; ++ do_div(ul, top); ++ top = ul; ++ } else ++ goto code_error_out; ++ break; ++ ++ /* rem_signed */ ++ case 0x07: ++ if (top) { ++ LONGEST l1 = (LONGEST) stack[--sp]; ++ LONGEST l2 = (LONGEST) top; ++ top = do_div(l1, l2); ++ } else ++ goto code_error_out; ++ break; ++ ++ case op_check_rem_signed: ++ if (top && sp) { ++ LONGEST l1 = (LONGEST) stack[--sp]; ++ LONGEST l2 = (LONGEST) top; ++ top = do_div(l1, l2); ++ } else ++ goto code_error_out; ++ break; ++ ++ /* rem_unsigned */ ++ case 0x08: ++ if (top) { ++ ULONGEST ul1 = stack[--sp]; ++ ULONGEST ul2 = top; ++ top = do_div(ul1, ul2); ++ } else ++ goto code_error_out; ++ break; ++ ++ case op_check_rem_unsigned: ++ if (top && sp) { ++ ULONGEST ul1 = stack[--sp]; ++ ULONGEST ul2 = top; ++ top = do_div(ul1, ul2); ++ } else ++ goto code_error_out; ++ break; +#endif -+ /* lsh */ -+ case 0x09: ++ ++ /* lsh */ ++ case 0x09: ++ top = stack[--sp] << top; ++ break; ++ ++ case op_check_lsh: ++ if (sp) + top = stack[--sp] << top; -+ break; -+ /* rsh_signed */ -+ case 0x0a: ++ else ++ goto code_error_out; ++ break; ++ ++ /* rsh_signed */ ++ case 0x0a: ++ top = ((LONGEST) stack[--sp]) >> top; ++ break; ++ ++ case op_check_rsh_signed: ++ if (sp) + top = ((LONGEST) stack[--sp]) >> top; -+ break; -+ /* rsh_unsigned */ -+ case 0x0b: ++ else ++ goto code_error_out; ++ break; ++ ++ /* rsh_unsigned */ ++ case 0x0b: ++ top = stack[--sp] >> top; ++ break; ++ ++ case op_check_rsh_unsigned: ++ if (sp) + top = stack[--sp] >> top; -+ break; -+ /* trace */ -+ case 0x0c: -+ --sp; -+ if (!gts->tpe->have_printk) { -+ if (gtp_action_memory_read -+ (gts, -1, -+ (CORE_ADDR) stack[sp], -+ (size_t) top)) -+ goto out; ++ else ++ goto code_error_out; ++ break; ++ ++ /* trace */ ++ case 0x0c: ++ --sp; ++ if (!gts->tpe->have_printk) { ++ if (gtp_action_memory_read ++ (gts, -1, ++ (CORE_ADDR) stack[sp], ++ (size_t) top)) ++ goto out; ++ } ++ top = stack[--sp]; ++ break; ++ ++ case op_check_trace: ++ if (sp > 1) { ++ if (gtp_action_memory_read ++ (gts, -1, (CORE_ADDR) stack[--sp], ++ (size_t) top)) { ++ /* gtp_action_memory_read will ++ set error status with itself ++ if it got error. */ ++ goto out; + } + top = stack[--sp]; -+ break; -+ /* trace_printk */ -+ case 0xfd: -+ if (gtp_action_printk(gts, ***The diff for this file has been truncated for email.*** ======================================= --- /wiki/UPDATE.wiki Mon Feb 27 02:37:40 2012 +++ /wiki/UPDATE.wiki Mon Mar 19 01:02:54 2012 @@ -1,3 +1,25 @@ +=== 20120319 === +[http://kgtp.googlecode.com/files/kgtp_20120319.tar.bz2]<br> +svn checkout https://kgtp.googlecode.com/svn/tags/20120319 +{{{ +* Fix bug with GDB RSP package sum check. + +* Increase the speed of access to trace state variables. + +* Increase the speed of agent code execution. ++* Remove the current agent code "printf" support because GDB will support new
+ format of agent code "printf". + +* Fix bug about access $current_task_pid. + +* Add new debug switch GTP_DEBUG_V (just for developer). + +* Add new add-ons hotcode.py. It can show the hotest code line + in the Kernel or user space program through parse and record + the pc address in the interrupt handler. +}}} + === 20120224 === [https://lkml.org/lkml/2012/2/26/127]<br> [http://kgtp.googlecode.com/files/kgtp_20120224.tar.bz2]<br>