Changeset 2785 for neercs/trunk/src/mytrace.c
- Timestamp:
- Aug 27, 2008, 11:19:02 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
neercs/trunk/src/mytrace.c
r2612 r2785 127 127 #define STRINGIFY(x) X(x) 128 128 129 #define SYSCALL_X86 0x80cd /* CD 80 = int $0x80 */ 130 #define SYSCALL_AMD64 0x050fL /* 0F 05 = syscall */ 129 #define SYSCALL_X86 0x80cd /* CD 80 = int $0x80 */ 130 #define SYSCALL_X86_NEW 0xf3eb /* EB F3 = jmp <__kernel_vsyscall+0x3> */ 131 #define SYSENTER 0x340f /* 0F 34 = sysenter */ 132 #define SYSCALL_AMD64 0x050fL /* 0F 05 = syscall */ 131 133 132 134 #if defined __x86_64__ … … 481 483 long oinst; 482 484 int bits; 485 int offset = 2; 483 486 484 487 if(call < 0 || call >= (long)(sizeof(syscallnames)/sizeof(*syscallnames))) … … 508 511 509 512 oinst = ptrace(PTRACE_PEEKTEXT, t->pid, oldregs.RIP - 2, 0) & 0xffff; 513 fprintf(stderr, "%lx\n", oinst); 510 514 511 515 #if defined __x86_64__ 512 516 if(oinst == SYSCALL_AMD64) 513 517 break; 514 if(oinst == SYSCALL_X86 )518 if(oinst == SYSCALL_X86 || oinst == SYSCALL_X86_NEW) 515 519 { 516 520 bits = 32; … … 518 522 } 519 523 #else 520 if(oinst == SYSCALL_X86 )524 if(oinst == SYSCALL_X86 || oinst == SYSCALL_X86_NEW) 521 525 break; 522 526 #endif … … 528 532 } 529 533 waitpid(t->pid, NULL, 0); 530 531 534 if(ptrace(PTRACE_SYSCALL, t->pid, NULL, 0) < 0) 532 535 { … … 539 542 print_registers(t->pid); 540 543 544 if(oinst == SYSCALL_X86_NEW) 545 { 546 /* Get back to sysenter */ 547 while((ptrace(PTRACE_PEEKTEXT, t->pid, oldregs.RIP - offset, 0) & 0xffff) != 0x340f) 548 offset++; 549 oldregs.ebp = oldregs.esp; 550 } 551 541 552 regs = oldregs; 542 regs.RIP = regs.RIP - 2;553 regs.RIP = regs.RIP - offset; 543 554 #if defined __x86_64__ 544 555 if(bits == 64) … … 592 603 return -1; 593 604 } 605 debug("PTRACE_GETEVENTMSG %d", t->child); 594 606 continue; 595 607 case PTRACE_EVENT_EXIT: 608 debug("PTRACE_EVENT_EXIT"); 596 609 /* The process is about to exit, don't do anything else */ 597 610 return 0;
Note: See TracChangeset
for help on using the changeset viewer.