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: da...@l8s.co.uk