Re: [PATCH] x86 ptrace: fix PTRACE_GETFPXREGS error

From: Ingo Molnar
Date: Tue Jul 01 2008 - 06:11:49 EST



* Roland McGrath <roland@xxxxxxxxxx> wrote:

> > since the original fix is already upstream, i've applied the delta
> > patch below. Should we still do this for v2.6.26 or can we defer it
> > to v2.6.27? As ptrace is the only user of this facility for now this
> > would be an identity transformation AFAICS and the v2.6.26 release
> > is very close.
>
> I don't think there's a problem with 2.6.26 either way. I agree that
> the user_regset internal API does not matter much before 2.6.27.

okay - i've queued it up in tip/x86/ptrace for now.

> My patch alone applies to 2.6.25, which is why I CC'd it to stable. I
> think applying that (and not takada's patch) to stable-2.6.25 would be
> best.

i think Greg already queued the original fix up for v2.6.25, as per the
commit notifier below.

so i think it is all sorted fine now?

Ingo

---------------------->
This is a note to let you know that we have just queued up the patch titled

Subject: ptrace GET/SET FPXREGS broken

to the 2.6.25-stable tree. Its filename is

ptrace-get-set-fpxregs-broken.patch

A git repo of this tree can be found at
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary


>From stable-bounces@xxxxxxxxxxxxxxxx Mon Jun 30 09:22:46 2008
From: TAKADA Yoshihito <takada@xxxxxxxxxxxxx>
Date: Mon, 30 Jun 2008 18:22:07 +0200
Subject: ptrace GET/SET FPXREGS broken
To: stable@xxxxxxxxxx
Message-ID: <20080630162207.GC17710@xxxxxxx>
Content-Disposition: inline

From: TAKADA Yoshihito <takada@xxxxxxxxxxxxx>

Commit 11dbc963a8f6128595d0f6ecf138dc369e144997 upstream

ptrace GET/SET FPXREGS broken

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: Ingo Molnar <mingo@xxxxxxx>
Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxx>

---
arch/x86/kernel/i387.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

--- a/arch/x86/kernel/i387.c
+++ b/arch/x86/kernel/i387.c
@@ -130,7 +130,7 @@ int xfpregs_get(struct task_struct *targ
void *kbuf, void __user *ubuf)
{
if (!cpu_has_fxsr)
- return -ENODEV;
+ return -EIO;

init_fpu(target);

@@ -145,7 +145,7 @@ int xfpregs_set(struct task_struct *targ
int ret;

if (!cpu_has_fxsr)
- return -ENODEV;
+ return -EIO;

init_fpu(target);
set_stopped_child_used_math(target);


Patches currently in stable-queue which might be from takada@xxxxxxxxxxxxx are

queue-2.6.25/ptrace-get-set-fpxregs-broken.patch
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/