xref: /netbsd-src/sys/kern/core_netbsd.c (revision 76c7fc5f6b13ed0b1508e6b313e88e59977ed78e)
1 /*	$NetBSD: core_netbsd.c,v 1.23 2017/01/06 22:53:17 kamil Exp $	*/
2 
3 /*
4  * Copyright (c) 1997 Charles D. Cranor and Washington University.
5  * Copyright (c) 1991, 1993 The Regents of the University of California.
6  * Copyright (c) 1988 University of Utah.
7  *
8  * All rights reserved.
9  *
10  * This code is derived from software contributed to Berkeley by
11  * the Systems Programming Group of the University of Utah Computer
12  * Science Department.
13  *
14  * Redistribution and use in source and binary forms, with or without
15  * modification, are permitted provided that the following conditions
16  * are met:
17  * 1. Redistributions of source code must retain the above copyright
18  *    notice, this list of conditions and the following disclaimer.
19  * 2. Redistributions in binary form must reproduce the above copyright
20  *    notice, this list of conditions and the following disclaimer in the
21  *    documentation and/or other materials provided with the distribution.
22  * 3. Neither the name of the University nor the names of its contributors
23  *    may be used to endorse or promote products derived from this software
24  *    without specific prior written permission.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36  * SUCH DAMAGE.
37  *
38  * from: Utah $Hdr: vm_unix.c 1.1 89/11/07$
39  *      @(#)vm_unix.c   8.1 (Berkeley) 6/11/93
40  * from: NetBSD: uvm_unix.c,v 1.25 2001/11/10 07:37:01 lukem Exp
41  */
42 
43 /*
44  * core_netbsd.c: Support for the historic NetBSD core file format.
45  */
46 
47 #include <sys/cdefs.h>
48 __KERNEL_RCSID(0, "$NetBSD: core_netbsd.c,v 1.23 2017/01/06 22:53:17 kamil Exp $");
49 
50 #ifdef _KERNEL_OPT
51 #include "opt_coredump.h"
52 #endif
53 
54 #include <sys/param.h>
55 #include <sys/systm.h>
56 #include <sys/exec.h>
57 #include <sys/proc.h>
58 #include <sys/vnode.h>
59 #include <sys/core.h>
60 
61 #include <uvm/uvm_extern.h>
62 
63 #ifndef CORENAME
64 #define	CORENAME(x)	x
65 #endif
66 #ifdef COREINC
67 #include COREINC
68 #endif
69 
70 #ifdef COREDUMP
71 
72 struct coredump_state {
73 	struct coredump_iostate *iocookie;
74 	struct CORENAME(core) core;
75 };
76 
77 static int	CORENAME(coredump_writesegs_netbsd)(struct uvm_coredump_state *);
78 
79 int
80 CORENAME(coredump_netbsd)(struct lwp *l, struct coredump_iostate *iocookie)
81 {
82 	struct coredump_state cs;
83 	struct proc *p = l->l_proc;
84 	struct vmspace *vm = p->p_vmspace;
85 	int error;
86 
87 	cs.iocookie = iocookie;
88 	cs.core.c_midmag = 0;
89 	strncpy(cs.core.c_name, p->p_comm, MAXCOMLEN);
90 	cs.core.c_nseg = 0;
91 	cs.core.c_signo = p->p_sigctx.ps_info._signo;
92 	cs.core.c_ucode = p->p_sigctx.ps_info._code;
93 	cs.core.c_cpusize = 0;
94 	cs.core.c_tsize = (u_long)ctob(vm->vm_tsize);
95 	cs.core.c_dsize = (u_long)ctob(vm->vm_dsize);
96 	cs.core.c_ssize = (u_long)round_page(ctob(vm->vm_ssize));
97 
98 	error = CORENAME(cpu_coredump)(l, NULL, &cs.core);
99 	if (error)
100 		return (error);
101 	cs.core.c_nseg = uvm_coredump_count_segs(p);
102 
103 	/* First write out the core header. */
104 	error = coredump_write(iocookie, UIO_SYSSPACE, &cs.core,
105 	    cs.core.c_hdrsize);
106 	if (error)
107 		return (error);
108 
109 	/* Then the CPU specific stuff */
110 	error = CORENAME(cpu_coredump)(l, iocookie, &cs.core);
111 	if (error)
112 		return (error);
113 
114 	/* Finally, the address space dump */
115 	return uvm_coredump_walkmap(p, CORENAME(coredump_writesegs_netbsd),
116 	    &cs);
117 }
118 
119 static int
120 CORENAME(coredump_writesegs_netbsd)(struct uvm_coredump_state *us)
121 {
122 	struct coredump_state *cs = us->cookie;
123 	struct CORENAME(coreseg) cseg;
124 	int flag, error;
125 
126 	if (us->flags & UVM_COREDUMP_STACK)
127 		flag = CORE_STACK;
128 	else
129 		flag = CORE_DATA;
130 
131 	/*
132 	 * Set up a new core file segment.
133 	 */
134 	CORE_SETMAGIC(cseg, CORESEGMAGIC, CORE_GETMID(cs->core), flag);
135 	cseg.c_addr = us->start;
136 
137 	if (us->start == us->realend)
138 		/* Not really wanted, but counted... */
139 		cseg.c_size = 0;
140 	else
141 		cseg.c_size = us->end - us->start;
142 
143 	error = coredump_write(cs->iocookie, UIO_SYSSPACE,
144 	    &cseg, cs->core.c_seghdrsize);
145 	if (error)
146 		return (error);
147 
148 	return coredump_write(cs->iocookie, UIO_USERSPACE,
149 	    (void *)(vaddr_t)us->start, cseg.c_size);
150 }
151 
152 #else	/* COREDUMP */
153 
154 int
155 CORENAME(coredump_netbsd)(struct lwp *l, struct coredump_iostate *cookie)
156 {
157 
158 	return ENOSYS;
159 }
160 
161 #endif	/* COREDUMP */
162