Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Change memory or register in tracepoint actions #16

Open
teawater opened this issue Dec 18, 2013 · 5 comments
Open

Change memory or register in tracepoint actions #16

teawater opened this issue Dec 18, 2013 · 5 comments

Comments

@teawater
Copy link
Owner

http://bbs.chinaunix.net/thread-3750800-1-1.html

@jinsdb
Copy link

jinsdb commented Feb 11, 2014

我自己使用的是基于201309150版本做了1个丑陋的patch
diff kgtp-org/gtp.c kgtp/gtp.c
135c135,138

<

#include <asm/cacheflush.h>
#include <asm/tlbflush.h>
#include <asm/io.h>
#include <asm/fixmap.h>
192c195

<

//#define GTPDEBUG 1
197c200

< /* #define GTP_DEBUG_V */

#define GTP_DEBUG_V
860c863,867

<

/*added for revise_addr & revise_val*/
GTP_REVISE_ADDR_ID          = 48,
GTP_REVISE_SIZE_ID          = 49,
GTP_REVISE_VAL_ID           = 50,

1990a1998,2262
void *gtp_action_get_current_reg(struct gtp_trace_s *gts, int num)
{
void *ret = NULL;
struct pt_regs *regs = NULL;

regs = gts->regs;//task_pt_regs(get_current());
switch (num) {
#ifdef CONFIG_X86_32
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25))
case 0:
ret = &(regs->ax);
break;
case 1:
ret = &(regs->cx);
break;
case 2:
ret = &(regs->dx);
break;
case 3:
ret = &(regs->bx);
break;
case 4:
ret = &(regs->x86_32_sp);
break;
case 5:
ret = &(regs->bp);
break;
case 6:
ret = &(regs->si);
break;
case 7:
ret = &(regs->di);
break;
case 8:
ret = &(regs->ip);
break;
case 9:
ret = &(regs->flags);
break;
case 10:
ret = &(regs->cs);
break;
case 11:
ret = &(regs->ss);
break;
case 12:
ret = &(regs->ds);
break;
case 13:
ret = &(regs->es);
break;
case 14:
ret = &(regs->fs);
break;
case 15:
ret = &(regs->gs);
break;
#else
case 0:
ret = &(regs->eax);
break;
case 1:
ret = &(regs->ecx);
break;
case 2:
ret = &(regs->edx);
break;
case 3:
ret = &(regs->ebx);
break;
case 4:
ret = &(regs->x86_32_sp);
break;
case 5:
ret = &(regs->ebp);
break;
case 6:
ret = &(regs->esi);
break;
case 7:
ret = &(regs->edi);
break;
case 8:
ret = &(regs->eip);
break;
case 9:
ret = &(regs->eflags);
break;
case 10:
ret = &(regs->xcs);
break;
case 11:
ret = &(regs->xss);
break;
case 12:
ret = &(regs->xds);
break;
case 13:
ret = &(regs->xes);
break;
case 14:
/* ret = gts->regs->xfs; /
ret = 0;
break;
case 15:
/
ret = gts->regs->xgs; */
ret = 0;
break;
#endif
#else
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25))
case 0:
ret = &(regs->ax);
break;
case 1:
ret = &(regs->bx);
break;
case 2:
ret = &(regs->cx);
break;
case 3:
ret = &(regs->dx);
break;
case 4:
ret = &(regs->si);
break;
case 5:
ret = &(regs->di);
break;
case 6:
ret = &(regs->bp);
break;
case 7:
ret = &(regs->sp);
break;
case 16:
ret = &(regs->ip);
break;
case 17:
ret = &(regs->flags);
break;
#else
case 0:
ret = &(regs->rax);
break;
case 1:
ret = &(regs->rbx);
break;
case 2:
ret = &(regs->rcx);
break;
case 3:
ret = &(regs->rdx);
break;
case 4:
ret = &(regs->rsi);
break;
case 5:
ret = &(regs->rdi);
break;
case 6:
ret = &(regs->rbp);
break;
case 7:
ret = &(regs->rsp);
break;
case 16:
ret = &(regs->rip);
break;
case 17:
ret = &(regs->eflags);
break;
#endif
case 8:
ret = &(regs->r8);
break;
case 9:
ret = &(regs->r9);
break;
case 10:
ret = &(regs->r10);
break;
case 11:
ret = &(regs->r11);
break;
case 12:
ret = &(regs->r12);
break;
case 13:
ret = &(regs->r13);
break;
case 14:
ret = &(regs->r14);
break;
case 15:
ret = &(regs->r15);
break;
case 18:
ret = &(regs->cs);
break;
case 19:
ret = &(regs->ss);
break;
#endif
default:
ret = NULL;
gts->tpe->reason = gtp_stop_access_wrong_reg;
break;
}

return ret;
}
static int gtp_revise_addr_set_val(struct gtp_trace_s *gts,
struct gtp_var *gtv, int64_t val)
{
printk("gtp_revise_addr_set_val:0x%llx\n",val);
gts->revise_addr = val;
return 0;
}

static struct gtp_var_hooks gtp_revise_addr_hooks = {
.agent_set_val = gtp_revise_addr_set_val,
};

long gtp_kernel_write(void dst, void *src, size_t size);
/

  • Do action: revise the value of $revise_addr.
    */
    static int gtp_revise_val_set_val(struct gtp_trace_s *gts,
    struct gtp_var *gtv, int64_t val)
    {
    uint64_t value = 0;
    uint64_t *regaddr = NULL;
    printk("gtp_revise_val_set_val:set revise_addr:0x%llx val to 0x%llx\n",
    gts->revise_addr,val);
    if ((gts->revise_addr >=0) &&
    (gts->revise_addr <= 19)){

    regaddr = gtp_action_get_current_reg(gts, gts->revise_addr);
    if (NULL != regaddr){
         /*do action of modify reg value.*/
         *regaddr = val;
    }
    
    return 0;
    

    }

    /modify data or code in memory./
    value = be64_to_cpu(val);
    gtp_kernel_write((void_)(gts->revise_addr), (void_)&value, gts->revise_size);

    return 0;
    }

static struct gtp_var_hooks gtp_revise_val_hooks = {
.agent_set_val = gtp_revise_val_set_val,
};

static int gtp_revise_size_set_val(struct gtp_trace_s *gts,
struct gtp_var *gtv, int64_t val)
{
printk("gtp_revise_size_set_val:0x%llx\n",val);
gts->revise_size = val;
return 0;
}
1991a2264,2266
static struct gtp_var_hooks gtp_revise_size_hooks = {
.agent_set_val = gtp_revise_size_set_val,
};
2230a2506,2520

var = gtp_var_special_add(GTP_REVISE_ADDR_ID, 0, 0,
            "revise_addr", &gtp_revise_addr_hooks);

if (IS_ERR(var))
return PTR_ERR(var);

var = gtp_var_special_add(GTP_REVISE_SIZE_ID, 0, 0,
            "revise_size", &gtp_revise_size_hooks);

if (IS_ERR(var))
return PTR_ERR(var);

var = gtp_var_special_add(GTP_REVISE_VAL_ID, 0, 0,
            "revise_val", &gtp_revise_val_hooks);

if (IS_ERR(var))
return PTR_ERR(var);
3345c3635

< if (unlikely(vma->vm_flags & (VM_PFNMAP|VM_MIXEDMAP))) {

if (unlikely(vma->vm_flags & (VM_PFNMAP|VM_MIXEDMAP)))
3347c3637

< if (unlikely(vma->vm_flags & (VM_PFNMAP))) {

if (unlikely(vma->vm_flags & (VM_PFNMAP)))
3348a3639
{
3898d4188
<
5249a5540

5783a6075,6096
static char *hex2rawcode(char *pkg, unsigned char *ubytes,int len)
{
int i = 0;
int j = 0;

while (hex2int(pkg[0], &i) && len) {
pkg++;
if (j == 0){ /high byte/
_ubytes = i & 0xf;
*ubytes = (_ubytes) << 4;
j++;
}else{ /low byte/
*ubytes |= i & 0xf;
j = 0;
ubytes++;
len--;
}

}

return pkg;
}
8442c8755

< || gtp_have_step)) {

      || gtp_have_step)) 

8444c8757

< )) {

      )) 

8445a8759
{
8597c8911

< if (gtp_have_step || gtp_have_watch_tracepoint) {

if (gtp_have_step || gtp_have_watch_tracepoint)
8599c8913

< if (gtp_have_step) {

if (gtp_have_step)
8600a8915
{
8638c8953

< if (tpe->addr != 0) {

      if (tpe->addr != 0) 

8640c8955

< if (tpe->disable == 0 && tpe->addr != 0) {

      if (tpe->disable == 0 && tpe->addr != 0) 

8641a8957
{
8667c8983

< if (tpe->step || gtp_have_step) {

                  if (tpe->step || gtp_have_step) 

8669c8985

< if (tpe->step) {

                  if (tpe->step) 

8670a8987
{
9941c10258

< if (GTP_RB_PAGE_IS_EMPTY) {

if (GTP_RB_PAGE_IS_EMPTY)
9944c10261

< if (!gtp_frame) {

if (!gtp_frame)
9945a10263
{
10389c10707

< if (gtp_start || !gtp_frame_current) {

if (gtp_start || !gtp_frame_current)
10391c10709

< if (gtp_start || gtp_frame_current_num < 0) {

if (gtp_start || gtp_frame_current_num < 0)
10392a10711
{
10753a11073,11170
static void set_addr_rw(unsigned long addr, int *flag)
{
unsigned int level;
pte_t *pte;

*flag = 1;

pte = lookup_address(addr, &level);

if (pte->pte & _PAGE_RW) 
    *flag = 0;
else 
    pte->pte |= _PAGE_RW;

}

static void set_addr_ro(unsigned long addr, int flag)
{
unsigned int level;
pte_t *pte;

if (flag) {
    pte = lookup_address(addr, &level); 
    pte->pte = pte->pte &~_PAGE_RW; 
}

}

long gtp_kernel_write(void *dst, void *src, size_t size)
{
int is_rw;
int ret = 0;
unsigned long flags;

preempt_disable(); 

local_irq_save(flags);

set_addr_rw((unsigned long)dst, &is_rw); 
ret = probe_kernel_write(dst, src, size);
set_addr_ro((unsigned long)dst, is_rw); 

local_flush_tlb(); 

sync_core();
local_irq_restore(flags);

preempt_enable();

return ret;

}

#define MAX_BYTES 12 /enough/
/pkg: ffffffffa0a6a5f0,1:c3/
static int gtp_gdbrsp_M(char *pkg)
{
#ifdef GTP_DEBUG
int i = 0;
#endif
int ret = 0;
char *org_pkg = NULL;
ULONGEST addr, len;
unsigned char tmp_raw[MAX_BYTES];

if (pkg[0] == '\0')
return -EINVAL;
memset(tmp_raw, 0x0, sizeof(tmp_raw));
/* Get add and len. _/
pkg = hex2ulongest(pkg, &addr);
if (pkg[0] != ',')
return -EINVAL;
pkg++;
pkg = hex2ulongest(pkg, &len);
if (len == 0)
return -EINVAL;
len &= 0xffff;
len = (ULONGEST) min((int)(GTP_RW_BUFP_MAX / 2),
(int)len);
if (pkg[0] != ':')
return -EINVAL;
pkg++;
org_pkg = pkg;
/_Get raw hex code*/
pkg = hex2rawcode(pkg, tmp_raw, sizeof(tmp_raw));

#ifdef GTP_DEBUG
printk(GTP_DEBUG "gtp_gdbrsp_M: addr = 0x%lx len = %d\n",
(unsigned long) addr, (int) len);
for (i = 0; i < sizeof(tmp_raw);i++)
{
printk("0x%x ", tmp_raw[i]);
}
printk("\n");
#endif
if (pkg == org_pkg)
{
printk("not found raw code.\n");
return -EINVAL;
}
ret = gtp_kernel_write((void*)addr, tmp_raw, len);
return ret;
10754a11172
}
10783c11201

< if (gtp_start || !gtp_frame_current) {

if (gtp_start || !gtp_frame_current)
10785c11203

< if (gtp_start || gtp_frame_current_num < 0) {

if (gtp_start || gtp_frame_current_num < 0)
10786a11205
{
11029c11448

< if (gtp_start || !gtp_frame_current) {

if (gtp_start || !gtp_frame_current)
11031c11450

< if (gtp_start || gtp_frame_current_num < 0) {

if (gtp_start || gtp_frame_current_num < 0)
11032a11452
{
11730a12151,12154
/case 'M':write memory/
case 'M':
ret = gtp_gdbrsp_M(rsppkg + 1);
break;
12169c12593

<

12453c12877

< if (GTP_RB_PAGE_IS_EMPTY) {

if (GTP_RB_PAGE_IS_EMPTY)
12455c12879

< if (!gtp_frame) {

if (!gtp_frame)
12456a12881
{
12509a12935

12536c12962

< if (GTP_RB_PAGE_IS_EMPTY) {

if (GTP_RB_PAGE_IS_EMPTY)
12538c12964

< if (!gtp_frame) {

if (!gtp_frame)
12539a12966
{
12544c12971

< !GTP_RB_PAGE_IS_EMPTY) == -ERESTARTSYS) {

      !GTP_RB_PAGE_IS_EMPTY) == -ERESTARTSYS) 

12547c12974

< gtp_frame) == -ERESTARTSYS) {

                   gtp_frame) == -ERESTARTSYS)

12548a12976
{

实现以下gdb命令:
1.(gdb) set *(unsigned char *)(0xxxxxx) = 0xc3 #修改0xxxxxx处的指令
2.添加trace point var $revise_addr、$revise_val、$revise_size在tracepoint处修改寄存器或内存内容
如,修改寄存器:
修改函数第一个参数
trace *xxxfunction
actions

teval $revise_addr=5
teval $revise_val=0x22003
end
修改rdi寄存器的值为0x22003,$revise_addr的值从从0~19分别表示rax,rbx,rcx,rdx,rsi,rdi...ss

tracepoint触发时候,修改内存的内容的如下:
修改内存指令或数据
trace *xxxfuction
actions

teval $revise_addr=0xxxxxx
teval $revise_size=3
teval $revise_val=0x022003
end
表示修改0xxxxxx处3个字节内容为02 20 03

用tracepoint var的方式不是很好用,最好是能在tracepint actions中支持set指令,用类似如下的方式修改寄存器或内存的内容:set $pc = 0xxxxx,set v_inpointer->id = 0x485;

貌似早期版本的kgtp有个patch支持tracepoint 使用printf,这个功能挺方便的,不知道这个功能能否添加到最新版本中?

@teawater
Copy link
Owner Author

厉害!很大的一个功能啊!难道不能用github 的pull request来作么?这样也能更清晰你的贡献啊
这个功能弄顺溜了 可以release一个新版本了

关于printf的问题是这样 GDB那边我一直在作PATCH 后来STAN说他也在弄 我就没弄 弄完以后发现他作的一个单独的功能 dprintf
虽然agent code 那块代码是有的 但是tracepoint支持没作 后续因为printf的反馈比较少 所以我也就没再接着作
因为作涉及到要在GDB里加功能的代码比较麻烦 即使代码提交进了GDB 也不可能要求用户马上使用upstream的GDB 所以要在已经发布版本里加PATCH等等 比较麻烦 不过我为multiprocess tracepoint的事也会需要弄GDB branch 所以会在那时候解决这个问题

@jinsdb
Copy link

jinsdb commented Feb 13, 2014

由于在公司网络管制,git用不了,附件也没法上传。之前贴出来的patch由于特殊字符被转义了没法使用,现在尝试将patch使用base64编码后贴上来

gtp.c.patch:

MTM1LDEzOGMxMzUKPCAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KPCAjaW5jbHVkZSA8YXNt
L3RsYmZsdXNoLmg+CjwgI2luY2x1ZGUgPGFzbS9pby5oPgo8ICNpbmNsdWRlIDxhc20vZml4bWFw
Lmg+Ci0tLQo+IAoxOTRhMTkyCj4gCjg2Miw4NjZjODYwCjwgICAgIC8qYWRkZWQgZm9yIHJldmlz
ZV9hZGRyICYgcmV2aXNlX3ZhbCovCjwgICAgIEdUUF9SRVZJU0VfQUREUl9JRCAgICAgICAgICA9
IDQ4LAo8ICAgICBHVFBfUkVWSVNFX1NJWkVfSUQgICAgICAgICAgPSA0OSwKPCAgICAgR1RQX1JF
VklTRV9WQUxfSUQgICAgICAgICAgID0gNTAsCjwgICAgIAotLS0KPiAKMTk5NywyMjYxZDE5OTAK
PCB2b2lkICpndHBfYWN0aW9uX2dldF9jdXJyZW50X3JlZyhzdHJ1Y3QgZ3RwX3RyYWNlX3MgKmd0
cywgaW50IG51bSkKPCB7CjwgCXZvaWQgKnJldCA9IE5VTEw7CjwgCXN0cnVjdCBwdF9yZWdzICpy
ZWdzID0gTlVMTDsKPCAgICAgCjwgCXJlZ3MgPSBndHMtPnJlZ3M7Ly90YXNrX3B0X3JlZ3MoZ2V0
X2N1cnJlbnQoKSk7CjwgCXN3aXRjaCAobnVtKSB7CjwgI2lmZGVmIENPTkZJR19YODZfMzIKPCAj
aWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjUpKQo8IAljYXNl
IDA6CjwgCQlyZXQgPSAmKHJlZ3MtPmF4KTsKPCAJCWJyZWFrOwo8IAljYXNlIDE6CjwgCQlyZXQg
PSAmKHJlZ3MtPmN4KTsKPCAJCWJyZWFrOwo8IAljYXNlIDI6CjwgCQlyZXQgPSAmKHJlZ3MtPmR4
KTsKPCAJCWJyZWFrOwo8IAljYXNlIDM6CjwgCQlyZXQgPSAmKHJlZ3MtPmJ4KTsKPCAJCWJyZWFr
Owo8IAljYXNlIDQ6CjwgCQlyZXQgPSAmKHJlZ3MtPng4Nl8zMl9zcCk7CjwgCQlicmVhazsKPCAJ
Y2FzZSA1Ogo8IAkJcmV0ID0gJihyZWdzLT5icCk7CjwgCQlicmVhazsKPCAJY2FzZSA2Ogo8IAkJ
cmV0ID0gJihyZWdzLT5zaSk7CjwgCQlicmVhazsKPCAJY2FzZSA3Ogo8IAkJcmV0ID0gJihyZWdz
LT5kaSk7CjwgCQlicmVhazsKPCAJY2FzZSA4Ogo8IAkJcmV0ID0gJihyZWdzLT5pcCk7CjwgCQli
cmVhazsKPCAJY2FzZSA5Ogo8IAkJcmV0ID0gJihyZWdzLT5mbGFncyk7CjwgCQlicmVhazsKPCAJ
Y2FzZSAxMDoKPCAJCXJldCA9ICYocmVncy0+Y3MpOwo8IAkJYnJlYWs7CjwgCWNhc2UgMTE6Cjwg
CQlyZXQgPSAmKHJlZ3MtPnNzKTsKPCAJCWJyZWFrOwo8IAljYXNlIDEyOgo8IAkJcmV0ID0gJihy
ZWdzLT5kcyk7CjwgCQlicmVhazsKPCAJY2FzZSAxMzoKPCAJCXJldCA9ICYocmVncy0+ZXMpOwo8
IAkJYnJlYWs7CjwgCWNhc2UgMTQ6CjwgCQlyZXQgPSAmKHJlZ3MtPmZzKTsKPCAJCWJyZWFrOwo8
IAljYXNlIDE1Ogo8IAkJcmV0ID0gJihyZWdzLT5ncyk7CjwgCQlicmVhazsKPCAjZWxzZQo8IAlj
YXNlIDA6CjwgCQlyZXQgPSAmKHJlZ3MtPmVheCk7CjwgCQlicmVhazsKPCAJY2FzZSAxOgo8IAkJ
cmV0ID0gJihyZWdzLT5lY3gpOwo8IAkJYnJlYWs7CjwgCWNhc2UgMjoKPCAJCXJldCA9ICYocmVn
cy0+ZWR4KTsKPCAJCWJyZWFrOwo8IAljYXNlIDM6CjwgCQlyZXQgPSAmKHJlZ3MtPmVieCk7Cjwg
CQlicmVhazsKPCAJY2FzZSA0Ogo8IAkJcmV0ID0gJihyZWdzLT54ODZfMzJfc3ApOwo8IAkJYnJl
YWs7CjwgCWNhc2UgNToKPCAJCXJldCA9ICYocmVncy0+ZWJwKTsKPCAJCWJyZWFrOwo8IAljYXNl
IDY6CjwgCQlyZXQgPSAmKHJlZ3MtPmVzaSk7CjwgCQlicmVhazsKPCAJY2FzZSA3Ogo8IAkJcmV0
ID0gJihyZWdzLT5lZGkpOwo8IAkJYnJlYWs7CjwgCWNhc2UgODoKPCAJCXJldCA9ICYocmVncy0+
ZWlwKTsKPCAJCWJyZWFrOwo8IAljYXNlIDk6CjwgCQlyZXQgPSAmKHJlZ3MtPmVmbGFncyk7Cjwg
CQlicmVhazsKPCAJY2FzZSAxMDoKPCAJCXJldCA9ICYocmVncy0+eGNzKTsKPCAJCWJyZWFrOwo8
IAljYXNlIDExOgo8IAkJcmV0ID0gJihyZWdzLT54c3MpOwo8IAkJYnJlYWs7CjwgCWNhc2UgMTI6
CjwgCQlyZXQgPSAmKHJlZ3MtPnhkcyk7CjwgCQlicmVhazsKPCAJY2FzZSAxMzoKPCAJCXJldCA9
ICYocmVncy0+eGVzKTsKPCAJCWJyZWFrOwo8IAljYXNlIDE0Ogo8IAkJLyogcmV0ID0gZ3RzLT5y
ZWdzLT54ZnM7ICovCjwgCQlyZXQgPSAwOwo8IAkJYnJlYWs7CjwgCWNhc2UgMTU6CjwgCQkvKiBy
ZXQgPSBndHMtPnJlZ3MtPnhnczsgKi8KPCAJCXJldCA9IDA7CjwgCQlicmVhazsKPCAjZW5kaWYK
PCAjZWxzZQo8ICNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwy
NSkpCjwgCWNhc2UgMDoKPCAJCXJldCA9ICYocmVncy0+YXgpOwo8IAkJYnJlYWs7CjwgCWNhc2Ug
MToKPCAJCXJldCA9ICYocmVncy0+YngpOwo8IAkJYnJlYWs7CjwgCWNhc2UgMjoKPCAJCXJldCA9
ICYocmVncy0+Y3gpOwo8IAkJYnJlYWs7CjwgCWNhc2UgMzoKPCAJCXJldCA9ICYocmVncy0+ZHgp
Owo8IAkJYnJlYWs7CjwgCWNhc2UgNDoKPCAJCXJldCA9ICYocmVncy0+c2kpOwo8IAkJYnJlYWs7
CjwgCWNhc2UgNToKPCAJCXJldCA9ICYocmVncy0+ZGkpOwo8IAkJYnJlYWs7CjwgCWNhc2UgNjoK
PCAJCXJldCA9ICYocmVncy0+YnApOwo8IAkJYnJlYWs7CjwgCWNhc2UgNzoKPCAJCXJldCA9ICYo
cmVncy0+c3ApOwo8IAkJYnJlYWs7CjwgCWNhc2UgMTY6CjwgCQlyZXQgPSAmKHJlZ3MtPmlwKTsK
PCAJCWJyZWFrOwo8IAljYXNlIDE3Ogo8IAkJcmV0ID0gJihyZWdzLT5mbGFncyk7CjwgCQlicmVh
azsKPCAjZWxzZQo8IAljYXNlIDA6CjwgCQlyZXQgPSAmKHJlZ3MtPnJheCk7CjwgCQlicmVhazsK
PCAJY2FzZSAxOgo8IAkJcmV0ID0gJihyZWdzLT5yYngpOwo8IAkJYnJlYWs7CjwgCWNhc2UgMjoK
PCAJCXJldCA9ICYocmVncy0+cmN4KTsKPCAJCWJyZWFrOwo8IAljYXNlIDM6CjwgCQlyZXQgPSAm
KHJlZ3MtPnJkeCk7CjwgCQlicmVhazsKPCAJY2FzZSA0Ogo8IAkJcmV0ID0gJihyZWdzLT5yc2kp
Owo8IAkJYnJlYWs7CjwgCWNhc2UgNToKPCAJCXJldCA9ICYocmVncy0+cmRpKTsKPCAJCWJyZWFr
Owo8IAljYXNlIDY6CjwgCQlyZXQgPSAmKHJlZ3MtPnJicCk7CjwgCQlicmVhazsKPCAJY2FzZSA3
Ogo8IAkJcmV0ID0gJihyZWdzLT5yc3ApOwo8IAkJYnJlYWs7CjwgCWNhc2UgMTY6CjwgCQlyZXQg
PSAmKHJlZ3MtPnJpcCk7CjwgCQlicmVhazsKPCAJY2FzZSAxNzoKPCAJCXJldCA9ICYocmVncy0+
ZWZsYWdzKTsKPCAJCWJyZWFrOwo8ICNlbmRpZgo8IAljYXNlIDg6CjwgCQlyZXQgPSAmKHJlZ3Mt
PnI4KTsKPCAJCWJyZWFrOwo8IAljYXNlIDk6CjwgCQlyZXQgPSAmKHJlZ3MtPnI5KTsKPCAJCWJy
ZWFrOwo8IAljYXNlIDEwOgo8IAkJcmV0ID0gJihyZWdzLT5yMTApOwo8IAkJYnJlYWs7CjwgCWNh
c2UgMTE6CjwgCQlyZXQgPSAmKHJlZ3MtPnIxMSk7CjwgCQlicmVhazsKPCAJY2FzZSAxMjoKPCAJ
CXJldCA9ICYocmVncy0+cjEyKTsKPCAJCWJyZWFrOwo8IAljYXNlIDEzOgo8IAkJcmV0ID0gJihy
ZWdzLT5yMTMpOwo8IAkJYnJlYWs7CjwgCWNhc2UgMTQ6CjwgCQlyZXQgPSAmKHJlZ3MtPnIxNCk7
CjwgCQlicmVhazsKPCAJY2FzZSAxNToKPCAJCXJldCA9ICYocmVncy0+cjE1KTsKPCAJCWJyZWFr
Owo8IAljYXNlIDE4Ogo8IAkJcmV0ID0gJihyZWdzLT5jcyk7CjwgCQlicmVhazsKPCAJY2FzZSAx
OToKPCAJCXJldCA9ICYocmVncy0+c3MpOwo8IAkJYnJlYWs7CjwgI2VuZGlmCjwgCWRlZmF1bHQ6
CjwgCQlyZXQgPSBOVUxMOwo8IAkJZ3RzLT50cGUtPnJlYXNvbiA9IGd0cF9zdG9wX2FjY2Vzc193
cm9uZ19yZWc7CjwgCQlicmVhazsKPCAJfQo8IAo8IAlyZXR1cm4gcmV0Owo8IH0KPCBzdGF0aWMg
aW50IGd0cF9yZXZpc2VfYWRkcl9zZXRfdmFsKHN0cnVjdCBndHBfdHJhY2VfcyAqZ3RzLAo8IAkJ
CSAgICAgIHN0cnVjdCBndHBfdmFyICpndHYsIGludDY0X3QgdmFsKQo8IHsKPCAgICAgcHJpbnRr
KCJndHBfcmV2aXNlX2FkZHJfc2V0X3ZhbDoweCVsbHhcbiIsdmFsKTsKPCAgICAgZ3RzLT5yZXZp
c2VfYWRkciA9IHZhbDsKPCAgICAgcmV0dXJuIDA7CjwgfQo8IAo8IHN0YXRpYyBzdHJ1Y3QgZ3Rw
X3Zhcl9ob29rcyBndHBfcmV2aXNlX2FkZHJfaG9va3MgPSB7CjwgICAgIC5hZ2VudF9zZXRfdmFs
ID0gZ3RwX3JldmlzZV9hZGRyX3NldF92YWwsCjwgfTsKPCAKPCBsb25nIGd0cF9rZXJuZWxfd3Jp
dGUodm9pZCAqZHN0LCB2b2lkICpzcmMsIHNpemVfdCBzaXplKTsKPCAvKgo8ICAqIERvIGFjdGlv
bjogcmV2aXNlIHRoZSB2YWx1ZSBvZiAkcmV2aXNlX2FkZHIuCjwgICovCjwgc3RhdGljIGludCBn
dHBfcmV2aXNlX3ZhbF9zZXRfdmFsKHN0cnVjdCBndHBfdHJhY2VfcyAqZ3RzLAo8IAkJCSAgICAg
IHN0cnVjdCBndHBfdmFyICpndHYsIGludDY0X3QgdmFsKQo8IHsKPCAgICAgdWludDY0X3QgIHZh
bHVlID0gMDsKPCAgICAgdWludDY0X3QgKnJlZ2FkZHIgPSBOVUxMOwo8ICAgICBwcmludGsoImd0
cF9yZXZpc2VfdmFsX3NldF92YWw6c2V0IHJldmlzZV9hZGRyOjB4JWxseCB2YWwgdG8gMHglbGx4
XG4iLAo8ICAgICAgICAgICAgICAgICAgICAgICAgIGd0cy0+cmV2aXNlX2FkZHIsdmFsKTsKPCAg
ICAgaWYgKChndHMtPnJldmlzZV9hZGRyID49MCkgJiYgCjwgICAgICAgICAoZ3RzLT5yZXZpc2Vf
YWRkciA8PSAxOSkpewo8IAo8ICAgICAgICAgcmVnYWRkciA9IGd0cF9hY3Rpb25fZ2V0X2N1cnJl
bnRfcmVnKGd0cywgZ3RzLT5yZXZpc2VfYWRkcik7CjwgICAgICAgICBpZiAoTlVMTCAhPSByZWdh
ZGRyKXsKPCAgICAgICAgICAgICAgLypkbyBhY3Rpb24gb2YgbW9kaWZ5IHJlZyB2YWx1ZS4qLwo8
ICAgICAgICAgICAgICAqcmVnYWRkciA9IHZhbDsKPCAgICAgICAgIH0KPCAgICAgICAgIAo8ICAg
ICAgICAgcmV0dXJuIDA7CjwgICAgIH0KPCAKPCAgICAgLyptb2RpZnkgZGF0YSBvciBjb2RlIGlu
IG1lbW9yeS4qLwo8ICAgICB2YWx1ZSA9IGJlNjRfdG9fY3B1KHZhbCk7CjwgICAgIGd0cF9rZXJu
ZWxfd3JpdGUoKHZvaWQqKShndHMtPnJldmlzZV9hZGRyKSwgKHZvaWQqKSZ2YWx1ZSwgZ3RzLT5y
ZXZpc2Vfc2l6ZSk7CjwgICAgIAo8ICAgICByZXR1cm4gMDsKPCB9CjwgCjwgc3RhdGljIHN0cnVj
dCBndHBfdmFyX2hvb2tzIGd0cF9yZXZpc2VfdmFsX2hvb2tzID0gewo8ICAgICAuYWdlbnRfc2V0
X3ZhbCA9IGd0cF9yZXZpc2VfdmFsX3NldF92YWwsCjwgfTsKPCAKPCBzdGF0aWMgaW50IGd0cF9y
ZXZpc2Vfc2l6ZV9zZXRfdmFsKHN0cnVjdCBndHBfdHJhY2VfcyAqZ3RzLAo8IAkJCSAgICAgIHN0
cnVjdCBndHBfdmFyICpndHYsIGludDY0X3QgdmFsKQo8IHsKPCAgICAgcHJpbnRrKCJndHBfcmV2
aXNlX3NpemVfc2V0X3ZhbDoweCVsbHhcbiIsdmFsKTsKPCAgICAgZ3RzLT5yZXZpc2Vfc2l6ZSA9
IHZhbDsKPCAgICAgcmV0dXJuIDA7CjwgfQoyMjYzLDIyNjVkMTk5MQo8IHN0YXRpYyBzdHJ1Y3Qg
Z3RwX3Zhcl9ob29rcyBndHBfcmV2aXNlX3NpemVfaG9va3MgPSB7CjwgICAgIC5hZ2VudF9zZXRf
dmFsID0gZ3RwX3JldmlzZV9zaXplX3NldF92YWwsCjwgfTsKMjUwNSwyNTE5ZDIyMzAKPCAgICAg
CjwgICAgIHZhciA9IGd0cF92YXJfc3BlY2lhbF9hZGQoR1RQX1JFVklTRV9BRERSX0lELCAwLCAw
LAo8IAkJCQkgICJyZXZpc2VfYWRkciIsICZndHBfcmV2aXNlX2FkZHJfaG9va3MpOwo8IAlpZiAo
SVNfRVJSKHZhcikpCjwgCQlyZXR1cm4gUFRSX0VSUih2YXIpOwo8ICAgICAKPCAgICAgdmFyID0g
Z3RwX3Zhcl9zcGVjaWFsX2FkZChHVFBfUkVWSVNFX1NJWkVfSUQsIDAsIDAsCjwgCQkJCSAgInJl
dmlzZV9zaXplIiwgJmd0cF9yZXZpc2Vfc2l6ZV9ob29rcyk7CjwgCWlmIChJU19FUlIodmFyKSkK
PCAJCXJldHVybiBQVFJfRVJSKHZhcik7CjwgCjwgICAgIHZhciA9IGd0cF92YXJfc3BlY2lhbF9h
ZGQoR1RQX1JFVklTRV9WQUxfSUQsIDAsIDAsCjwgCQkJCSAgInJldmlzZV92YWwiLCAmZ3RwX3Jl
dmlzZV92YWxfaG9va3MpOwo8IAlpZiAoSVNfRVJSKHZhcikpCjwgCQlyZXR1cm4gUFRSX0VSUih2
YXIpOwo2MDczLDYwOTRkNTc4Mwo8IHN0YXRpYyBjaGFyICpoZXgycmF3Y29kZShjaGFyICpwa2cs
IHVuc2lnbmVkIGNoYXIgKnVieXRlcyxpbnQgbGVuKQo8IHsKPCAJaW50CWkgPSAwOwo8ICAgICBp
bnQgaiA9IDA7CjwgICAgIAo8IAl3aGlsZSAoaGV4MmludChwa2dbMF0sICZpKSAmJiBsZW4pIHsK
PCAJCXBrZysrOwo8ICAgICAgICAgaWYgKGogPT0gMCl7IC8qaGlnaCBieXRlKi8KPCAJCQkqdWJ5
dGVzID0gaSAmIDB4ZjsKPCAJCQkqdWJ5dGVzID0gKCp1Ynl0ZXMpIDw8IDQ7CjwgICAgICAgICAg
ICAgIGorKzsKPCAgICAgICAgIH1lbHNleyAvKmxvdyBieXRlKi8KPCAgICAgICAgICAgICAqdWJ5
dGVzIHw9IGkgJiAweGY7CjwgICAgICAgICAgICAgaiA9IDA7CjwgICAgICAgICAgICAgdWJ5dGVz
Kys7CjwgICAgICAgICAgICAgbGVuLS07CjwgICAgICAgICB9CjwgCQkKPCAJfQo8IAo8IAlyZXR1
cm4gcGtnOwo8IH0KMTEwNjUsMTExMjRkMTA3NTMKPCBzdGF0aWMgdm9pZCBzZXRfYWRkcl9ydyh1
bnNpZ25lZCBsb25nIGFkZHIsIGludCAqZmxhZykgCjwgewo8ICAgICB1bnNpZ25lZCBpbnQgbGV2
ZWw7CjwgICAgIHB0ZV90ICpwdGU7CjwgCjwgICAgICpmbGFnID0gMTsKPCAKPCAgICAgcHRlID0g
bG9va3VwX2FkZHJlc3MoYWRkciwgJmxldmVsKTsKPCAKPCAgICAgaWYgKHB0ZS0+cHRlICYgX1BB
R0VfUlcpIAo8ICAgICAgICAgKmZsYWcgPSAwOwo8ICAgICBlbHNlIAo8ICAgICAgICAgcHRlLT5w
dGUgfD0gX1BBR0VfUlc7CjwgfQo8IAo8IHN0YXRpYyB2b2lkIHNldF9hZGRyX3JvKHVuc2lnbmVk
IGxvbmcgYWRkciwgaW50IGZsYWcpIAo8IHsKPCAgICAgdW5zaWduZWQgaW50IGxldmVsOwo8ICAg
ICBwdGVfdCAqcHRlOwo8IAo8ICAgICBpZiAoZmxhZykgewo8ICAgICAgICAgcHRlID0gbG9va3Vw
X2FkZHJlc3MoYWRkciwgJmxldmVsKTsgCjwgICAgICAgICBwdGUtPnB0ZSA9IHB0ZS0+cHRlICZ+
X1BBR0VfUlc7IAo8ICAgICB9CjwgfQo8IAo8IGxvbmcgZ3RwX2tlcm5lbF93cml0ZSh2b2lkICpk
c3QsIHZvaWQgKnNyYywgc2l6ZV90IHNpemUpCjwgewo8ICAgICBpbnQgICAgIGlzX3J3OyAKPCAg
ICAgaW50ICAgICByZXQgPSAwOwo8ICAgICB1bnNpZ25lZCBsb25nICAgZmxhZ3M7CjwgICAgIAo8
ICAgICBwcmVlbXB0X2Rpc2FibGUoKTsgCjwgCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsgCjwgCjwg
ICAgIHNldF9hZGRyX3J3KCh1bnNpZ25lZCBsb25nKWRzdCwgJmlzX3J3KTsgCjwgICAgIHJldCA9
IHByb2JlX2tlcm5lbF93cml0ZShkc3QsIHNyYywgc2l6ZSk7CjwgICAgIHNldF9hZGRyX3JvKCh1
bnNpZ25lZCBsb25nKWRzdCwgaXNfcncpOyAKPCAKPCAgICAgbG9jYWxfZmx1c2hfdGxiKCk7IAo8
IAlzeW5jX2NvcmUoKTsgCjwgCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgCjwgCQo8IAlwcmVl
bXB0X2VuYWJsZSgpOwo8ICAgICAKPCAgICAgcmV0dXJuIHJldDsKPCAgICAgCjwgfQo8IAo8ICNk
ZWZpbmUgTUFYX0JZVEVTIDEyIC8qZW5vdWdoKi8KPCAvKnBrZzogZmZmZmZmZmZhMGE2YTVmMCwx
OmMzKi8KPCBzdGF0aWMgaW50IGd0cF9nZGJyc3BfTShjaGFyICpwa2cpCjwgewo8ICNpZmRlZiBH
VFBfREVCVUcKPCAgICAgaW50IGkgPSAwOwo8ICNlbmRpZgo8ICAgICBpbnQgICAgIHJldCA9IDA7
CjwgICAgIGNoYXIgKm9yZ19wa2cgPSBOVUxMOwo8IAlVTE9OR0VTVAlhZGRyLCBsZW47CjwgICAg
IHVuc2lnbmVkIGNoYXIgdG1wX3Jhd1tNQVhfQllURVNdOwoxMTEyNiwxMTE2NGQxMDc1NAo8IAlp
ZiAocGtnWzBdID09ICdcMCcpCjwgCQlyZXR1cm4gLUVJTlZBTDsKPCAgICAgbWVtc2V0KHRtcF9y
YXcsIDB4MCwgc2l6ZW9mKHRtcF9yYXcpKTsKPCAgICAgLyogR2V0IGFkZCBhbmQgbGVuLiAgKi8K
PCAJcGtnID0gaGV4MnVsb25nZXN0KHBrZywgJmFkZHIpOwo8IAlpZiAocGtnWzBdICE9ICcsJykK
PCAJCXJldHVybiAtRUlOVkFMOwo8IAlwa2crKzsKPCAJcGtnID0gaGV4MnVsb25nZXN0KHBrZywg
Jmxlbik7CjwgCWlmIChsZW4gPT0gMCkKPCAJCXJldHVybiAtRUlOVkFMOwo8IAlsZW4gJj0gMHhm
ZmZmOwo8IAlsZW4gPSAoVUxPTkdFU1QpIG1pbigoaW50KShHVFBfUldfQlVGUF9NQVggLyAyKSwK
PCAJCQkgICAgIChpbnQpbGVuKTsKPCAgICAgaWYgKHBrZ1swXSAhPSAnOicpCjwgCQlyZXR1cm4g
LUVJTlZBTDsKPCAgICAgcGtnKys7CjwgICAgIG9yZ19wa2cgPSBwa2c7CjwgICAgIC8qR2V0IHJh
dyBoZXggY29kZSovCjwgICAgIHBrZyA9IGhleDJyYXdjb2RlKHBrZywgdG1wX3Jhdywgc2l6ZW9m
KHRtcF9yYXcpKTsKPCAgICAgCjwgI2lmZGVmIEdUUF9ERUJVRwo8IAlwcmludGsoR1RQX0RFQlVH
ICJndHBfZ2RicnNwX006IGFkZHIgPSAweCVseCBsZW4gPSAlZFxuIiwKPCAJCSh1bnNpZ25lZCBs
b25nKSBhZGRyLCAoaW50KSBsZW4pOwo8ICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHRtcF9y
YXcpO2krKykKPCAgICAgewo8ICAgICAgICAgcHJpbnRrKCIweCV4ICIsIHRtcF9yYXdbaV0pOwo8
ICAgICB9CjwgICAgIHByaW50aygiXG4iKTsKPCAjZW5kaWYKPCAgICAgaWYgKHBrZyA9PSBvcmdf
cGtnKQo8ICAgICB7CjwgICAgICAgICBwcmludGsoIm5vdCBmb3VuZCByYXcgY29kZS5cbiIpOwo8
ICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CjwgICAgIH0KPCAgICAgcmV0ID0gZ3RwX2tlcm5lbF93
cml0ZSgodm9pZCopYWRkciwgdG1wX3JhdywgbGVuKTsKPCAgICAgcmV0dXJuIHJldDsKPCAKPCB9
CjEyMTQxLDEyMTQ0ZDExNzMwCjwgICAgIC8qY2FzZSAnTSc6d3JpdGUgbWVtb3J5Ki8KPCAgICAg
Y2FzZSAnTSc6CjwgICAgICAgICByZXQgPSBndHBfZ2RicnNwX00ocnNwcGtnICsgMSk7CjwgICAg
ICAgICBicmVhazsK

gtp.h.patch

MTM4LDE0MGQxMzcKPCAgICAgLypGb3Igc2V0ICRyZXZpc2VfYWRkciAmICRyZXZpc2Vfc2l6ZSov
CjwgICAgIHVpbnQ2NF90ICByZXZpc2VfYWRkcjsKPCAgICAgdWludDY0X3QgIHJldmlzZV9zaXpl
OyAK

@teawater
Copy link
Owner Author

如果你确实不能用pull request来弄 能否向我提供一个你的名字和邮件?这样如果需要的话我提交代码可以使用你的信息

另外有什么方式可以和你进行沟通么?邮件或者IM工具之类的?

@jinsdb
Copy link

jinsdb commented Mar 1, 2014

不好意思最近比较忙,现在才看到。我的邮件jinsdb@gmail.com.
很希望能和你多交流。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants