From owner-p4-projects@FreeBSD.ORG Wed May 4 22:02:10 2005 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 3DAF416A4D0; Wed, 4 May 2005 22:02:10 +0000 (GMT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 032AC16A4CE for ; Wed, 4 May 2005 22:02:10 +0000 (GMT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id D0E2943D72 for ; Wed, 4 May 2005 22:02:09 +0000 (GMT) (envelope-from peter@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.1/8.13.1) with ESMTP id j44M1Xi9089998 for ; Wed, 4 May 2005 22:01:33 GMT (envelope-from peter@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.1/8.13.1/Submit) id j44M1Wiv089995 for perforce@freebsd.org; Wed, 4 May 2005 22:01:32 GMT (envelope-from peter@freebsd.org) Date: Wed, 4 May 2005 22:01:32 GMT Message-Id: <200505042201.j44M1Wiv089995@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to peter@freebsd.org using -f From: Peter Wemm To: Perforce Change Reviews Subject: PERFORCE change 76523 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 04 May 2005 22:02:11 -0000 http://perforce.freebsd.org/chv.cgi?CH=76523 Change 76523 by peter@peter_hammer on 2005/05/04 22:00:55 Do valid 32 bit coredumps for 32 bit apps so that gdb can read them. Affected files ... .. //depot/projects/hammer/sys/amd64/ia32/ia32_reg.c#1 add .. //depot/projects/hammer/sys/compat/ia32/ia32_reg.h#1 add .. //depot/projects/hammer/sys/conf/files.amd64#68 edit .. //depot/projects/hammer/sys/kern/imgact_elf.c#27 edit Differences ... ==== //depot/projects/hammer/sys/conf/files.amd64#68 (text+ko) ==== @@ -185,6 +185,7 @@ # IA32 binary support # #amd64/ia32/ia32_exception.S optional compat_ia32 +amd64/ia32/ia32_reg.c optional compat_ia32 amd64/ia32/ia32_signal.c optional compat_ia32 amd64/ia32/ia32_sigtramp.S optional compat_ia32 amd64/ia32/ia32_syscall.c optional compat_ia32 ==== //depot/projects/hammer/sys/kern/imgact_elf.c#27 (text+ko) ==== @@ -66,6 +66,11 @@ #include #include +#if defined(__amd64__) && __ELF_WORD_SIZE == 32 +#include +#include +#endif + #define OLD_EI_BRAND 8 static int __elfN(check_header)(const Elf_Ehdr *hdr); @@ -1124,17 +1129,31 @@ td)); /* XXXKSE */ } +#if defined(__amd64__) && __ELF_WORD_SIZE == 32 +typedef struct prstatus32 elf_prstatus_t; +typedef struct prpsinfo32 elf_prpsinfo_t; +typedef struct fpreg32 elf_prfpregset_t; +typedef struct fpreg32 elf_fpregset_t; +typedef struct reg32 elf_gregset_t; +#else +typedef prstatus_t elf_prstatus_t; +typedef prpsinfo_t elf_prpsinfo_t; +typedef prfpregset_t elf_prfpregset_t; +typedef prfpregset_t elf_fpregset_t; +typedef gregset_t elf_gregset_t; +#endif + static void __elfN(puthdr)(struct thread *td, void *dst, size_t *off, int numsegs) { struct { - prstatus_t status; - prfpregset_t fpregset; - prpsinfo_t psinfo; + elf_prstatus_t status; + elf_prfpregset_t fpregset; + elf_prpsinfo_t psinfo; } *tempdata; - prstatus_t *status; - prfpregset_t *fpregset; - prpsinfo_t *psinfo; + elf_prstatus_t *status; + elf_prfpregset_t *fpregset; + elf_prpsinfo_t *psinfo; struct proc *p; struct thread *thr; size_t ehoff, noteoff, notesz, phoff; @@ -1166,7 +1185,7 @@ if (dst != NULL) { psinfo->pr_version = PRPSINFO_VERSION; - psinfo->pr_psinfosz = sizeof(prpsinfo_t); + psinfo->pr_psinfosz = sizeof(elf_prpsinfo_t); strlcpy(psinfo->pr_fname, p->p_comm, sizeof(psinfo->pr_fname)); /* * XXX - We don't fill in the command line arguments properly @@ -1188,14 +1207,19 @@ while (thr != NULL) { if (dst != NULL) { status->pr_version = PRSTATUS_VERSION; - status->pr_statussz = sizeof(prstatus_t); - status->pr_gregsetsz = sizeof(gregset_t); - status->pr_fpregsetsz = sizeof(fpregset_t); + status->pr_statussz = sizeof(elf_prstatus_t); + status->pr_gregsetsz = sizeof(elf_gregset_t); + status->pr_fpregsetsz = sizeof(elf_fpregset_t); status->pr_osreldate = osreldate; status->pr_cursig = p->p_sig; status->pr_pid = thr->td_tid; +#if defined(__amd64__) && __ELF_WORD_SIZE == 32 + fill_regs32(thr, &status->pr_reg); + fill_fpregs32(thr, fpregset); +#else fill_regs(thr, &status->pr_reg); fill_fpregs(thr, fpregset); +#endif } __elfN(putnote)(dst, off, "FreeBSD", NT_PRSTATUS, status, sizeof *status); @@ -1241,7 +1265,11 @@ ehdr->e_ident[EI_ABIVERSION] = 0; ehdr->e_ident[EI_PAD] = 0; ehdr->e_type = ET_CORE; +#if defined(__amd64__) && __ELF_WORD_SIZE == 32 + ehdr->e_machine = EM_386; +#else ehdr->e_machine = ELF_ARCH; +#endif ehdr->e_version = EV_CURRENT; ehdr->e_entry = 0; ehdr->e_phoff = phoff;