Source-Changes-D archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: CVS commit: [matt-nb5-mips64] src/sys



I think this broke core dumps on mips ...

On Sun, Aug 23, 2009 at 03:38:19AM +0000, Matt Thomas wrote:
> Module Name:  src
> Committed By: matt
> Date:         Sun Aug 23 03:38:19 UTC 2009
> 
> Modified Files:
>       src/sys/arch/mips/include [matt-nb5-mips64]: types.h
>       src/sys/arch/mips/mips [matt-nb5-mips64]: mips_machdep.c
>           process_machdep.c
>       src/sys/kern [matt-nb5-mips64]: core_elf32.c sys_process.c
>       src/sys/sys [matt-nb5-mips64]: ptrace.h
> 
> Log Message:
> Change lazy fp load/save is done.  fpcurlwp is never NULL.
> If no current lwp has the FP, then fpcurlwp is set to lwp0.
> this allows many check for NULL and avoids a few null-derefs.
> Since savefpregs clear COP1, loadfpregs can be called to reload
> fpregs.  If it notices that situation, it just sets COP1 and returns
> Save does not reset fpcurlwp, just clears COP1.  load does set fpcurlwp.
> 
> If MIPS3_SR_FR is set, all 32 64-bit FP registers are saved/restored via Xdc1.
> If MIPS3_SR_FR is clear, only 32 32-bit FP register are saved/restore via 
> Xwc1.
> This preserves the existing ABI.
> 
> 
> To generate a diff of this commit:
> cvs rdiff -u -r1.43.36.2 -r1.43.36.3 src/sys/arch/mips/include/types.h
> cvs rdiff -u -r1.205.4.1.2.1.2.2 -r1.205.4.1.2.1.2.3 \
>     src/sys/arch/mips/mips/mips_machdep.c
> cvs rdiff -u -r1.29.62.1 -r1.29.62.2 src/sys/arch/mips/mips/process_machdep.c
> cvs rdiff -u -r1.32.16.1 -r1.32.16.2 src/sys/kern/core_elf32.c
> cvs rdiff -u -r1.143.4.1 -r1.143.4.1.4.1 src/sys/kern/sys_process.c
> cvs rdiff -u -r1.40 -r1.40.28.1 src/sys/sys/ptrace.h
> 
> Please note that diffs are not public domain; they are subject to the
> copyright notices on the relevant files.
> 

The change to core_elf32.c is mostly:

@@ -452,14 +456,19 @@ ELFNAMEEND(coredump_note)(struct proc *p
 #ifdef PT_GETFPREGS
        notesize = sizeof(nhdr) + elfround(namesize) + elfround(sizeof(freg));
        if (iocookie) {
+               size_t freglen = sizeof(freg);
                uvm_lwp_hold(l);
+#ifdef __HAVE_PROCESS_XFPREGS
+               error = elf_process_read_xfpregs(l, &freg, &freglen);
+#else
                error = elf_process_read_fpregs(l, &freg);
+#endif
                uvm_lwp_rele(l);
                if (error)
                        return (error);
 
                nhdr.n_namesz = namesize;
-               nhdr.n_descsz = sizeof(freg);
+               nhdr.n_descsz = freglen;
                nhdr.n_type = PT_GETFPREGS;

                error = ELFNAMEEND(coredump_writenote)(p, iocookie, &nhdr,


However this code is called twice, once with iocookie == NULL in order
to find out how big everything will be, then again with iocookie != NULL
to actually do the writes.

So changing the size of the register area on the second pass is going to
lead to corrupt core files.

        David

-- 
David Laight: david%l8s.co.uk@localhost


Home | Main Index | Thread Index | Old Index