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);
 }
 

Reply via email to