• TAKADA Yoshihito's avatar
    ptrace GET/SET FPXREGS broken · 11dbc963
    TAKADA Yoshihito authored
    When I update kernel 2.6.25 from 2.6.24, gdb does not work.
    On 2.6.25, ptrace(PTRACE_GETFPXREGS, ...) returns ENODEV.
    
    But 2.6.24 kernel's ptrace() returns EIO.
    It is issue of compatibility.
    
    I attached test program as pt.c and patch for fix it.
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <signal.h>
    #include <errno.h>
    #include <sys/ptrace.h>
    #include <sys/types.h>
    
    struct user_fxsr_struct {
    	unsigned short	cwd;
    	unsigned short	swd;
    	unsigned short	twd;
    	unsigned short	fop;
    	long	fip;
    	long	fcs;
    	long	foo;
    	long	fos;
    	long	mxcsr;
    	long	reserved;
    	long	st_space[32];	/* 8*16 bytes for each FP-reg = 128 bytes */
    	long	xmm_space[32];	/* 8*16 bytes for each XMM-reg = 128 bytes */
    	long	padding[56];
    };
    
    int main(void)
    {
      pid_t pid;
    
      pid = fork();
    
      switch(pid){
      case -1:/*  error */
        break;
      case 0:/*  child */
        child();
        break;
      default:
        parent(pid);
        break;
      }
      return 0;
    }
    
    int child(void)
    {
      ptrace(PTRACE_TRACEME);
      kill(getpid(), SIGSTOP);
      sleep(10);
      return 0;
    }
    int parent(pid_t pid)
    {
      int ret;
      struct user_fxsr_struct fpxregs;
    
      ret = ptrace(PTRACE_GETFPXREGS, pid, 0, &fpxregs);
      if(ret < 0){
        printf("%d: %s.\n", errno, strerror(errno));
      }
      kill(pid, SIGCONT);
      wait(pid);
      return 0;
    }
    
    /* in the kerel, at kernel/i387.c get_fpxregs() */
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    11dbc963
i387.c 12.3 KB