All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] ptrace GET/SET FPXREGS broken
@ 2008-06-30  4:44 TAKADA Yoshihito
  2008-06-30 12:18 ` Ingo Molnar
                   ` (2 more replies)
  0 siblings, 3 replies; 13+ messages in thread
From: TAKADA Yoshihito @ 2008-06-30  4:44 UTC (permalink / raw)
  To: linux-kernel

[-- Attachment #1: Type: Text/Plain, Size: 247 bytes --]

Hi
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.

[-- Attachment #2: pt.c --]
[-- Type: Text/Plain, Size: 1077 bytes --]

#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() */

[-- Attachment #3: fxsr.patch --]
[-- Type: Text/Plain, Size: 417 bytes --]

--- a/arch/x86/kernel/i387.c	2008-04-17 11:49:44.000000000 +0900
+++ b/arch/x86/kernel/i387.c	2008-06-30 13:22:57.000000000 +0900
@@ -130,7 +130,7 @@
 		void *kbuf, void __user *ubuf)
 {
 	if (!cpu_has_fxsr)
-		return -ENODEV;
+		return -EIO;
 
 	init_fpu(target);
 
@@ -145,7 +145,7 @@
 	int ret;
 
 	if (!cpu_has_fxsr)
-		return -ENODEV;
+		return -EIO;
 
 	init_fpu(target);
 	set_stopped_child_used_math(target);

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

end of thread, other threads:[~2008-07-03  7:07 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-06-30  4:44 [PATCH] ptrace GET/SET FPXREGS broken TAKADA Yoshihito
2008-06-30 12:18 ` Ingo Molnar
2008-06-30 21:02 ` [PATCH] x86 ptrace: fix PTRACE_GETFPXREGS error Roland McGrath
2008-07-01  9:02   ` Ingo Molnar
2008-07-01  9:32     ` Roland McGrath
2008-07-01 10:11       ` Ingo Molnar
2008-07-01 14:34         ` [stable] " Greg KH
2008-07-01 14:46           ` Ingo Molnar
2008-07-01 15:02             ` Greg KH
2008-07-03  2:37     ` TAKADA Yoshihito
2008-07-03  1:58   ` TAKADA Yoshihito
2008-07-03  3:00     ` Roland McGrath
2008-06-30 21:02 ` [PATCH] ptrace GET/SET FPXREGS broken Roland McGrath

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.