Module Name: src Committed By: mgorny Date: Wed Jan 8 17:21:38 UTC 2020
Modified Files: src/sys/arch/amd64/include: ptrace.h src/sys/arch/i386/include: ptrace.h src/sys/kern: core_elf32.c Log Message: Include XSTATE note in x86 core dumps Introduce a simple COREDUMP_MACHDEP_LWP_NOTES logic to provide machdep API for injecting per-LWP notes into coredumps, and use it to append PT_GETXSTATE note. Since the XSTATE block uses the same format on i386 and amd64, the code does not have to conditionalize between 32-bit and 64-bit ELF format on that. However, it does need to distinguish between 32-bit and 64-bit PT_* values. In order to do that, it reuses PT32_* constant already present for ptrace(), and adds a matching PT64_GETXSTATE to satisfy the cpp logic. To generate a diff of this commit: cvs rdiff -u -r1.20 -r1.21 src/sys/arch/amd64/include/ptrace.h cvs rdiff -u -r1.23 -r1.24 src/sys/arch/i386/include/ptrace.h cvs rdiff -u -r1.61 -r1.62 src/sys/kern/core_elf32.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/amd64/include/ptrace.h diff -u src/sys/arch/amd64/include/ptrace.h:1.20 src/sys/arch/amd64/include/ptrace.h:1.21 --- src/sys/arch/amd64/include/ptrace.h:1.20 Mon Dec 2 19:17:27 2019 +++ src/sys/arch/amd64/include/ptrace.h Wed Jan 8 17:21:38 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: ptrace.h,v 1.20 2019/12/02 19:17:27 kamil Exp $ */ +/* $NetBSD: ptrace.h,v 1.21 2020/01/08 17:21:38 mgorny Exp $ */ /* * Copyright (c) 1993 Christopher G. Demetriou @@ -105,6 +105,22 @@ int process_machdep_validfpu(struct proc MODULE_HOOK(netbsd32_process_doxmmregs_hook, int, (struct lwp *, struct lwp *, void *, bool)); +#ifdef EXEC_ELF32 +#include <machine/netbsd32_machdep.h> +#endif +#define PT64_GETXSTATE PT_GETXSTATE +#define COREDUMP_MACHDEP_LWP_NOTES(l, ns, name) \ +{ \ + struct xstate xstate; \ + memset(&xstate, 0, sizeof(xstate)); \ + if (!process_read_xstate(l, &xstate)) \ + { \ + ELFNAMEEND(coredump_savenote)(ns, \ + CONCAT(CONCAT(PT, ELFSIZE), _GETXSTATE), name, \ + &xstate, sizeof(xstate)); \ + } \ +} + #endif /* _KERNEL */ #ifdef _KERNEL_OPT Index: src/sys/arch/i386/include/ptrace.h diff -u src/sys/arch/i386/include/ptrace.h:1.23 src/sys/arch/i386/include/ptrace.h:1.24 --- src/sys/arch/i386/include/ptrace.h:1.23 Wed Jun 26 12:30:12 2019 +++ src/sys/arch/i386/include/ptrace.h Wed Jan 8 17:21:38 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: ptrace.h,v 1.23 2019/06/26 12:30:12 mgorny Exp $ */ +/* $NetBSD: ptrace.h,v 1.24 2020/01/08 17:21:38 mgorny Exp $ */ /* * Copyright (c) 2001 Wasabi Systems, Inc. @@ -159,6 +159,18 @@ { DT_REG, N("xmmregs"), Pmachdep_xmmregs, \ procfs_machdep_validxmmregs }, +#define COREDUMP_MACHDEP_LWP_NOTES(l, ns, name) \ +{ \ + struct xstate xstate; \ + memset(&xstate, 0, sizeof(xstate)); \ + if (!process_read_xstate(l, &xstate)) \ + { \ + ELFNAMEEND(coredump_savenote)(ns, \ + CONCAT(CONCAT(PT, ELFSIZE), _GETXSTATE), name, \ + &xstate, sizeof(xstate)); \ + } \ +} + struct xmmregs; /* Functions used by both ptrace(2) and procfs. */ Index: src/sys/kern/core_elf32.c diff -u src/sys/kern/core_elf32.c:1.61 src/sys/kern/core_elf32.c:1.62 --- src/sys/kern/core_elf32.c:1.61 Tue Dec 24 14:50:59 2019 +++ src/sys/kern/core_elf32.c Wed Jan 8 17:21:38 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: core_elf32.c,v 1.61 2019/12/24 14:50:59 kamil Exp $ */ +/* $NetBSD: core_elf32.c,v 1.62 2020/01/08 17:21:38 mgorny Exp $ */ /* * Copyright (c) 2001 Wasabi Systems, Inc. @@ -40,7 +40,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: core_elf32.c,v 1.61 2019/12/24 14:50:59 kamil Exp $"); +__KERNEL_RCSID(1, "$NetBSD: core_elf32.c,v 1.62 2020/01/08 17:21:38 mgorny Exp $"); #ifdef _KERNEL_OPT #include "opt_compat_netbsd32.h" @@ -513,7 +513,11 @@ ELFNAMEEND(coredump_note)(struct lwp *l, ELFNAMEEND(coredump_savenote)(ns, PT_GETFPREGS, name, &freg, freglen); #endif - /* XXX Add hook for machdep per-LWP notes. */ + +#ifdef COREDUMP_MACHDEP_LWP_NOTES + COREDUMP_MACHDEP_LWP_NOTES(l, ns, name); +#endif + return (0); }