public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [patch] really-ptrace-single-step
@ 2004-05-11 17:12 Davide Libenzi
  2004-05-11 17:31 ` Fabiano Ramos
  2004-05-11 17:36 ` Fabiano Ramos
  0 siblings, 2 replies; 11+ messages in thread
From: Davide Libenzi @ 2004-05-11 17:12 UTC (permalink / raw)
  To: Linux Kernel Mailing List; +Cc: Andrew Morton, Linus Torvalds


This patch lets a ptrace process on x86 to "see" the instruction 
following the INT #80h op.



- Davide


arch/i386/kernel/entry.S       |    2 +-
include/asm-i386/thread_info.h |    2 +-
2 files changed, 2 insertions(+), 2 deletions(-)




Index: arch/i386/kernel/entry.S
===================================================================
RCS file: /usr/src/bkcvs/linux-2.5/arch/i386/kernel/entry.S,v
retrieving revision 1.83
diff -u -r1.83 entry.S
--- arch/i386/kernel/entry.S	12 Apr 2004 20:29:12 -0000	1.83
+++ arch/i386/kernel/entry.S	11 May 2004 06:35:29 -0000
@@ -354,7 +354,7 @@
 	# perform syscall exit tracing
 	ALIGN
 syscall_exit_work:
-	testb $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT), %cl
+	testb $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP), %cl
 	jz work_pending
 	sti				# could let do_syscall_trace() call
 					# schedule() instead
Index: include/asm-i386/thread_info.h
===================================================================
RCS file: /usr/src/bkcvs/linux-2.5/include/asm-i386/thread_info.h,v
retrieving revision 1.19
diff -u -r1.19 thread_info.h
--- include/asm-i386/thread_info.h	12 Apr 2004 20:29:12 -0000	1.19
+++ include/asm-i386/thread_info.h	11 May 2004 06:34:47 -0000
@@ -165,7 +165,7 @@
 
 /* work to do on interrupt/exception return */
 #define _TIF_WORK_MASK \
-  (0x0000FFFF & ~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT))
+  (0x0000FFFF & ~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP))
 #define _TIF_ALLWORK_MASK	0x0000FFFF	/* work to do on any return to u-space */
 
 /*

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [patch] really-ptrace-single-step
  2004-05-11 17:12 [patch] really-ptrace-single-step Davide Libenzi
@ 2004-05-11 17:31 ` Fabiano Ramos
  2004-05-12  0:17   ` Andrew Morton
  2004-05-11 17:36 ` Fabiano Ramos
  1 sibling, 1 reply; 11+ messages in thread
From: Fabiano Ramos @ 2004-05-11 17:31 UTC (permalink / raw)
  To: Davide Libenzi, Linux Kernel Mailing List

Still not getting the desired result.
Which kernel is the patch based on?

On Tue, 2004-05-11 at 14:12, Davide Libenzi wrote:
> This patch lets a ptrace process on x86 to "see" the instruction 
> following the INT #80h op.
> 
> 
> 
> - Davide
> 
> 
> arch/i386/kernel/entry.S       |    2 +-
> include/asm-i386/thread_info.h |    2 +-
> 2 files changed, 2 insertions(+), 2 deletions(-)
> 
> 
> 
> 
> Index: arch/i386/kernel/entry.S
> ===================================================================
> RCS file: /usr/src/bkcvs/linux-2.5/arch/i386/kernel/entry.S,v
> retrieving revision 1.83
> diff -u -r1.83 entry.S
> --- arch/i386/kernel/entry.S	12 Apr 2004 20:29:12 -0000	1.83
> +++ arch/i386/kernel/entry.S	11 May 2004 06:35:29 -0000
> @@ -354,7 +354,7 @@
>  	# perform syscall exit tracing
>  	ALIGN
>  syscall_exit_work:
> -	testb $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT), %cl
> +	testb $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP), %cl
>  	jz work_pending
>  	sti				# could let do_syscall_trace() call
>  					# schedule() instead
> Index: include/asm-i386/thread_info.h
> ===================================================================
> RCS file: /usr/src/bkcvs/linux-2.5/include/asm-i386/thread_info.h,v
> retrieving revision 1.19
> diff -u -r1.19 thread_info.h
> --- include/asm-i386/thread_info.h	12 Apr 2004 20:29:12 -0000	1.19
> +++ include/asm-i386/thread_info.h	11 May 2004 06:34:47 -0000
> @@ -165,7 +165,7 @@
>  
>  /* work to do on interrupt/exception return */
>  #define _TIF_WORK_MASK \
> -  (0x0000FFFF & ~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT))
> +  (0x0000FFFF & ~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP))
>  #define _TIF_ALLWORK_MASK	0x0000FFFF	/* work to do on any return to u-space */
>  
>  /*
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [patch] really-ptrace-single-step
  2004-05-11 17:12 [patch] really-ptrace-single-step Davide Libenzi
  2004-05-11 17:31 ` Fabiano Ramos
@ 2004-05-11 17:36 ` Fabiano Ramos
  2004-05-11 17:38   ` Davide Libenzi
  1 sibling, 1 reply; 11+ messages in thread
From: Fabiano Ramos @ 2004-05-11 17:36 UTC (permalink / raw)
  To: Linux Kernel Mailing List, Davide Libenzi

It would not work against 2.6.5, since

do_syscall_trace()

makes the check

if (!test_thread_flag(TIF_SYSCALL_TRACE))
		return;


Simply removing it would do?



On Tue, 2004-05-11 at 14:12, Davide Libenzi wrote:
> This patch lets a ptrace process on x86 to "see" the instruction 
> following the INT #80h op.
> 
> 
> 
> - Davide
> 
> 
> arch/i386/kernel/entry.S       |    2 +-
> include/asm-i386/thread_info.h |    2 +-
> 2 files changed, 2 insertions(+), 2 deletions(-)
> 
> 
> 
> 
> Index: arch/i386/kernel/entry.S
> ===================================================================
> RCS file: /usr/src/bkcvs/linux-2.5/arch/i386/kernel/entry.S,v
> retrieving revision 1.83
> diff -u -r1.83 entry.S
> --- arch/i386/kernel/entry.S	12 Apr 2004 20:29:12 -0000	1.83
> +++ arch/i386/kernel/entry.S	11 May 2004 06:35:29 -0000
> @@ -354,7 +354,7 @@
>  	# perform syscall exit tracing
>  	ALIGN
>  syscall_exit_work:
> -	testb $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT), %cl
> +	testb $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP), %cl
>  	jz work_pending
>  	sti				# could let do_syscall_trace() call
>  					# schedule() instead
> Index: include/asm-i386/thread_info.h
> ===================================================================
> RCS file: /usr/src/bkcvs/linux-2.5/include/asm-i386/thread_info.h,v
> retrieving revision 1.19
> diff -u -r1.19 thread_info.h
> --- include/asm-i386/thread_info.h	12 Apr 2004 20:29:12 -0000	1.19
> +++ include/asm-i386/thread_info.h	11 May 2004 06:34:47 -0000
> @@ -165,7 +165,7 @@
>  
>  /* work to do on interrupt/exception return */
>  #define _TIF_WORK_MASK \
> -  (0x0000FFFF & ~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT))
> +  (0x0000FFFF & ~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP))
>  #define _TIF_ALLWORK_MASK	0x0000FFFF	/* work to do on any return to u-space */
>  
>  /*
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [patch] really-ptrace-single-step
  2004-05-11 17:36 ` Fabiano Ramos
@ 2004-05-11 17:38   ` Davide Libenzi
  2004-05-11 18:40     ` Fabiano Ramos
  0 siblings, 1 reply; 11+ messages in thread
From: Davide Libenzi @ 2004-05-11 17:38 UTC (permalink / raw)
  To: Fabiano Ramos; +Cc: Linux Kernel Mailing List

On Tue, 11 May 2004, Fabiano Ramos wrote:

> It would not work against 2.6.5, since
> 
> do_syscall_trace()
> 
> makes the check
> 
> if (!test_thread_flag(TIF_SYSCALL_TRACE))
> 		return;
> 
> Simply removing it would do?

No no. You need to OR it with the single-step. Try:

if (!test_thread_flag(TIF_SYSCALL_TRACE) && 
    !test_thread_flag(TIF_SINGLESTEP))
	return;


- Davide


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [patch] really-ptrace-single-step
  2004-05-11 17:38   ` Davide Libenzi
@ 2004-05-11 18:40     ` Fabiano Ramos
  0 siblings, 0 replies; 11+ messages in thread
From: Fabiano Ramos @ 2004-05-11 18:40 UTC (permalink / raw)
  To: Davide Libenzi, Linux Kernel Mailing List

On Tue, 2004-05-11 at 14:38, Davide Libenzi wrote:
> On Tue, 11 May 2004, Fabiano Ramos wrote:
> 
> > It would not work against 2.6.5, since
> > 
> > do_syscall_trace()
> > 
> > makes the check
> > 
> > if (!test_thread_flag(TIF_SYSCALL_TRACE))
> > 		return;
> > 
> > Simply removing it would do?
> 
> No no. You need to OR it with the single-step. Try:
> 
> if (!test_thread_flag(TIF_SYSCALL_TRACE) && 
>     !test_thread_flag(TIF_SINGLESTEP))
> 	return;
> 
> 
> - Davide

Still not working. :(
Correct me if I am wrong: is TIF_SINGLESTEP asserted whenever a process
is being singlestepped? I do not see where it is done.

> 
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [patch] really-ptrace-single-step
  2004-05-11 17:31 ` Fabiano Ramos
@ 2004-05-12  0:17   ` Andrew Morton
  2004-05-12  0:42     ` Davide Libenzi
  2004-05-12  1:04     ` Fabiano Ramos
  0 siblings, 2 replies; 11+ messages in thread
From: Andrew Morton @ 2004-05-12  0:17 UTC (permalink / raw)
  To: Fabiano Ramos; +Cc: davidel, linux-kernel

Fabiano Ramos <ramos_fabiano@yahoo.com.br> wrote:
>
> Still not getting the desired result.
> Which kernel is the patch based on?
> 
> On Tue, 2004-05-11 at 14:12, Davide Libenzi wrote:
> > This patch lets a ptrace process on x86 to "see" the instruction 
> > following the INT #80h op.

Please.  Don't edit people out of email headers.  Just do reply-to-all.  I
didn't see your "it doesn't work" email for many hours after having merged
the patch.

Thanks.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [patch] really-ptrace-single-step
  2004-05-12  0:17   ` Andrew Morton
@ 2004-05-12  0:42     ` Davide Libenzi
  2004-05-12  1:04     ` Fabiano Ramos
  1 sibling, 0 replies; 11+ messages in thread
From: Davide Libenzi @ 2004-05-12  0:42 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Fabiano Ramos, Linux Kernel Mailing List

On Tue, 11 May 2004, Andrew Morton wrote:

> Fabiano Ramos <ramos_fabiano@yahoo.com.br> wrote:
> >
> > Still not getting the desired result.
> > Which kernel is the patch based on?
> > 
> > On Tue, 2004-05-11 at 14:12, Davide Libenzi wrote:
> > > This patch lets a ptrace process on x86 to "see" the instruction 
> > > following the INT #80h op.
> 
> Please.  Don't edit people out of email headers.  Just do reply-to-all.  I
> didn't see your "it doesn't work" email for many hours after having merged
> the patch.

Sorry Andrew, it's my fault. I should have told you when I received the 
message, but today I had about 25000 meetings. Hold about the new patch, 
since I want to see it running a little bit more on my machine. I will 
send you the final ack later.



- Davide


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [patch] really-ptrace-single-step
  2004-05-12  0:17   ` Andrew Morton
  2004-05-12  0:42     ` Davide Libenzi
@ 2004-05-12  1:04     ` Fabiano Ramos
  2004-05-12  1:06       ` Davide Libenzi
  1 sibling, 1 reply; 11+ messages in thread
From: Fabiano Ramos @ 2004-05-12  1:04 UTC (permalink / raw)
  To: Andrew Morton; +Cc: davidel, Linux Kernel Mailing List

On Tue, 2004-05-11 at 21:17, Andrew Morton wrote:
> Fabiano Ramos <ramos_fabiano@yahoo.com.br> wrote:
> >
> > Still not getting the desired result.
> > Which kernel is the patch based on?
> > 
> > On Tue, 2004-05-11 at 14:12, Davide Libenzi wrote:
> > > This patch lets a ptrace process on x86 to "see" the instruction 
> > > following the INT #80h op.
> 
> Please.  Don't edit people out of email headers.  Just do reply-to-all.  I
> didn't see your "it doesn't work" email for many hours after having merged
> the patch.
> 
> Thanks.

Sorry for that.
By the way the email was sent in response to the first
patch, not for the second version.

> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [patch] really-ptrace-single-step
  2004-05-12  1:04     ` Fabiano Ramos
@ 2004-05-12  1:06       ` Davide Libenzi
  2004-05-12  1:15         ` Fabiano Ramos
  2004-05-12  2:19         ` Fabiano Ramos
  0 siblings, 2 replies; 11+ messages in thread
From: Davide Libenzi @ 2004-05-12  1:06 UTC (permalink / raw)
  To: Fabiano Ramos; +Cc: Andrew Morton, Linux Kernel Mailing List

On Tue, 11 May 2004, Fabiano Ramos wrote:

> Sorry for that.
> By the way the email was sent in response to the first
> patch, not for the second version.

The second version works for me. Pls give it a spin.


- Davide


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [patch] really-ptrace-single-step
  2004-05-12  1:06       ` Davide Libenzi
@ 2004-05-12  1:15         ` Fabiano Ramos
  2004-05-12  2:19         ` Fabiano Ramos
  1 sibling, 0 replies; 11+ messages in thread
From: Fabiano Ramos @ 2004-05-12  1:15 UTC (permalink / raw)
  To: Davide Libenzi; +Cc: Andrew Morton, Linux Kernel Mailing List

I am testing it right now.

On Tue, 2004-05-11 at 22:06, Davide Libenzi wrote:
> On Tue, 11 May 2004, Fabiano Ramos wrote:
> 
> > Sorry for that.
> > By the way the email was sent in response to the first
> > patch, not for the second version.
> 
> The second version works for me. Pls give it a spin.
> 
> 
> - Davide


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [patch] really-ptrace-single-step
  2004-05-12  1:06       ` Davide Libenzi
  2004-05-12  1:15         ` Fabiano Ramos
@ 2004-05-12  2:19         ` Fabiano Ramos
  1 sibling, 0 replies; 11+ messages in thread
From: Fabiano Ramos @ 2004-05-12  2:19 UTC (permalink / raw)
  To: Davide Libenzi; +Cc: Andrew Morton, Linux Kernel Mailing List

On Tue, 2004-05-11 at 22:06, Davide Libenzi wrote:
> On Tue, 11 May 2004, Fabiano Ramos wrote:
> 
> > Sorry for that.
> > By the way the email was sent in response to the first
> > patch, not for the second version.
> 
> The second version works for me. Pls give it a spin.
> 
> 
> - Davide


Seems to be working just fine on 2.6.5 and 2.6.6. Tracing the following
code (tracer appended) would produce:


 8050cd6:	b8 c7 00 00 00       	mov    $0xc7,%eax
 8050cdb:	cd 80                	int    $0x80
 8050cdd:	3d 00 f0 ff ff       	cmp    $0xfffff000,%eax
 8050ce2:	76 f0                	jbe    8050cd4 <__getuid+0x14>



EIP = 0x08050cd6

EIP = 0x08050cdb

EIP = 0x08050cdd

EIP = 0x08050ce2


--------- TRACER -----------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <syscall.h>
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <linux/user.h>
#include <unistd.h>
#include <errno.h>


extern char **environ;

int main(int argc, char **argv)
{

	struct user_regs_struct regs;

        int wait_val;           /*  child's return value        */
        int pid;                /*  child's process id          */

        long long totalinstr=0;        /* # of intr executed */
        unsigned char opcode;          /* syscall opcode goes in one
byte */


        int i;

       /* printing options */
       printf("\n\nPTRACE: Will execute \"");
       for (i=1; i<argc; i++)
             printf("%s ", argv[i]);

       printf("\". Please wait (it may take long...)\n\n\n");

       printf("***** SIMULATED PROGRAM OUTPUT *****\n\n");

        switch (pid = fork()) {

        case -1:
                perror("fork");
                break;

        case 0: /*  child process starts        */
                if ( ptrace(PTRACE_TRACEME, 0, NULL, NULL) < 0)
			perror("\nError in ptrace PTRACE_TRACEME");
		execv(argv[1],&argv[1]);
		break;

        default:/*  parent process starts       */
		if (waitpid(pid,&wait_val,0) < 0)
			perror("\nchild process EXITED");

		if (ptrace(PTRACE_SINGLESTEP,pid,NULL,NULL) < 0)
               		perror("\nError in ptrace PTRACE_SINGLESTEP");

                waitpid(pid,&wait_val,0);

                while (1) {

		      totalinstr++;

			/* get PC */
                      if (ptrace(PTRACE_GETREGS, pid, 0, (int)&regs) ==
-1){
                           perror("ptrace");
                            printf("Exiting on error ... \n");
                      }

		      printf("\nEIP = 0x%08lx\n", regs.eip);

		      // will stop after each instruction
                      if (ptrace(PTRACE_SINGLESTEP, pid, 0, 0) != 0)
                               perror("ptrace");

                      waitpid(pid,&wait_val,0);
		      if ( WIFEXITED(wait_val)) break;

                }

        }
	printf("\n************************************\n\n");
        printf("Number of machine instructions : %lld\n\n\n",
totalinstr);
        return 0;
}



^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2004-05-12  2:17 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-05-11 17:12 [patch] really-ptrace-single-step Davide Libenzi
2004-05-11 17:31 ` Fabiano Ramos
2004-05-12  0:17   ` Andrew Morton
2004-05-12  0:42     ` Davide Libenzi
2004-05-12  1:04     ` Fabiano Ramos
2004-05-12  1:06       ` Davide Libenzi
2004-05-12  1:15         ` Fabiano Ramos
2004-05-12  2:19         ` Fabiano Ramos
2004-05-11 17:36 ` Fabiano Ramos
2004-05-11 17:38   ` Davide Libenzi
2004-05-11 18:40     ` Fabiano Ramos

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox