[kgtp] r984 committed - Update version to 20120319

  • From: kgtp@xxxxxxxxxxxxxx
  • To: kgtp@xxxxxxxxxxxxx
  • Date: Mon, 19 Mar 2012 08:04:15 +0000

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, &regs->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, &regs->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, &regs->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(&gts->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(&gts->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(&gtp_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, &regs->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, &regs->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, &regs->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(&gts->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(&gts->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(&gtp_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, &regs->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, &regs->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, &regs->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(&gts->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(&gts->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(&gtp_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                     |    4
lib/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, &regs->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, &regs->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, &regs->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(&gts->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(&gts->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(&gtp_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>

Other related posts:

  • » [kgtp] r984 committed - Update version to 20120319 - kgtp