Messages in this thread Patch in this message | | | Date | Fri, 18 Jul 1997 21:32:36 +0100 (BST) | From | Bryn Paul Arnold Jones <> | Subject | Re: Let me start over - "FPU & ptrace function" |
| |
-----BEGIN PGP SIGNED MESSAGE-----
On Fri, 18 Jul 1997, Stephen Polkowski wrote:
> Hi all, [snip] > > First hack attempt: > Insert this code starting at line 394 in ptrace.c > [snip]
You don't want to do it like that (the patchs, the not code ;). You want to use the program diff, it will produce patches for you, like so:
- ------8<------Cut Here------8<------ - --- linux/arch/i386/kernel/ptrace.c.orig Fri Jul 18 19:16:25 1997 +++ linux/arch/i386/kernel/ptrace.c Fri Jul 18 19:20:44 1997 @@ -392,6 +392,22 @@ child->p_pptr = current; SET_LINKS(child); } + if (hard_math) { /* for now skip fpu if using 387 emulator */ + + addr &= -4; /* align */ + if (addr == &dummy->u_fpvalid) { + tmp = 1; + } + + if (addr >= (long) &dummy->i387.cwd && + addr <= (long) &dummy->i387.st_space[19]) { + + __asm__("fnop"); /* forced dump of fpu state */ + addr -= (long) &dummy->i387.cwd; + addr += (long) &child->tss.i387.hard.cwd; + tmp = *((long*) addr); + } + } send_sig(SIGSTOP, child, 1); ret = 0; goto out; - ------8<------Cut Here------8<------ To produce this patch I did this: cp linux/arch/i386/kernel/ptrace.c linux/arch/i386/kernel/ptrace.c.orig pico linux/arch/i386/kernel/ptrace.c <edit> diff -u linux/arch/i386/kernel/ptrace.c.orig linux/arch/i386/kernel/ptrace.c >fpu.ptrace.diff The -u produces a unified context diff (you can use --unified if you wish). diff does work on directory trees too, and if you make many changes this would be a more reasonable option. You can use the - --recursive option on a pair of source trees (Linus produces patches like this), like this (I have a Symlink linux -> linux-2.1.45):
cp -rd linux-2.1.45 linux-2.1.45.saved <edit linux-2.1.45 tree> diff -u --recursive linux linux-2.1.45.saved This sould produce the same patch as before (touch wood ;). If you create new files you have to also use the --new-file option.
To apply a patch all you need do is "patch -p0 <some.patch", "cat some.patch |patch -p0", or "cat some.patch.gz |gzip -dc |patch -p0". The - -p0 means don't strip anything from the path in the patch, -p1 would mean strip the first bit of the path (ie for "/usr/src/linux/..." you would get "usr/src/linux/..."; "linux/drivers/..." would be "drivers/...") and so on. You can add -E which means remove emptied files.
> > I haven't had a chance to compile this yet. Perhaps > I'll get to it during my lunch break. I have three questions about > this code. First, will the "hard_math" link (I hope so).
Should do, can't see why not.
> Second, > is there a way in the kernel to tell if the child has used the > fpu or not.
In the kernel it should be child->user_math, (child is just like current, except that it's the child's task struct ;) you can find it's whole structure in linux/include/linux/sched.h, and there is lots).
> For now, I'm just assuming its always used, and I return > u_fpvalid as being true.
If it's not used, you proberbly want to return the initalised state rather than the real state, if the child wasn't the last process that used the fpu, then the fpu state won't be that of the child (processes that havent used the fpu wont change it's state).
> Lastly, is there a better way to force a > fpu dump other than executing a fpu instruction in the current process. > > I'm only adding code to read the state. I could > add code to write to the fpu state, but I don't want to risk putting a > security hole into the kernel. Thanks for your comments. > > Regards, > > Steve >
Bryn PS most of this info gleaned with the use of grep ;) - -- PGP Pub key http://www.gytha.demon.co.uk/pubkey.asc ID: 1024/30AF2D69 On-line, adj.: FP: FC 4E 41 9E 64 C3 AB 28 A3 5A 57 F8 CC D9 A7 B8 The idea that a human being should always be accessible to a computer.
-----BEGIN PGP SIGNATURE----- Version: 2.6.3i Charset: noconv Comment: Probably (spelt iQCVAwUBM8/S6esaGi8wry1pAQHOHwP/Spz4o9qjzQLIFuTSN2Nc9suvXSUmqVhN P0/2MtGdR8lzM9XICxNehrgQQOT6jzgVS4N+t9AsNr1uVH3NwUDssyEEaaOJyqUq Jop1i9tnJ+CenTXGCthZew4dSzCsrr6fjRM1VgqGs+vpasSJI8mF2oRlJOMCLEFe Zsi0icIDwRY= =JZ+z -----END PGP SIGNATURE-----
| |