#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: core_netbsd.c,v 1.27 2026/01/03 23:57:09 riastradh Exp $");
#include <sys/param.h>
#include <sys/types.h>
#include <sys/compat_stub.h>
#include <sys/core.h>
#include <sys/exec.h>
#include <sys/module.h>
#include <sys/proc.h>
#include <sys/sdt.h>
#include <sys/signalvar.h>
#include <sys/systm.h>
#include <sys/vnode.h>
#include <uvm/uvm_extern.h>
#ifndef CORENAME
#define CORENAME(x) x
#endif
#ifdef COREINC
#include COREINC
#endif
struct coredump_state {
struct coredump_iostate *iocookie;
struct CORENAME(core) core;
};
static int CORENAME(coredump_writesegs_netbsd)(struct uvm_coredump_state *);
int
CORENAME(real_coredump_netbsd)(struct lwp *l, struct coredump_iostate *iocookie)
{
struct coredump_state cs;
struct proc *p = l->l_proc;
struct vmspace *vm = p->p_vmspace;
int error;
cs.iocookie = iocookie;
cs.core.c_midmag = 0;
strncpy(cs.core.c_name, p->p_comm, MAXCOMLEN);
cs.core.c_nseg = 0;
cs.core.c_signo = p->p_sigctx.ps_info._signo;
cs.core.c_ucode = p->p_sigctx.ps_info._code;
cs.core.c_cpusize = 0;
cs.core.c_tsize = (u_long)ctob(vm->vm_tsize);
cs.core.c_dsize = (u_long)ctob(vm->vm_dsize);
cs.core.c_ssize = (u_long)round_page(ctob(vm->vm_ssize));
error = CORENAME(cpu_coredump)(l, NULL, &cs.core);
if (error)
return (error);
MODULE_HOOK_CALL(uvm_coredump_count_segs_hook, (p), 0, cs.core.c_nseg);
MODULE_HOOK_CALL(coredump_write_hook, (iocookie, UIO_SYSSPACE, &cs.core,
cs.core.c_hdrsize), SET_ERROR(ENOSYS), error);
if (error)
return (error);
error = CORENAME(cpu_coredump)(l, iocookie, &cs.core);
if (error)
return (error);
MODULE_HOOK_CALL(uvm_coredump_walkmap_hook,
(p, CORENAME(coredump_writesegs_netbsd), &cs),
SET_ERROR(ENOSYS),
error);
return error;
}
static int
CORENAME(coredump_writesegs_netbsd)(struct uvm_coredump_state *us)
{
struct coredump_state *cs = us->cookie;
struct CORENAME(coreseg) cseg;
int flag, error;
if (us->flags & UVM_COREDUMP_STACK)
flag = CORE_STACK;
else
flag = CORE_DATA;
CORE_SETMAGIC(cseg, CORESEGMAGIC, CORE_GETMID(cs->core), flag);
cseg.c_addr = us->start;
if (us->start == us->realend)
cseg.c_size = 0;
else
cseg.c_size = us->end - us->start;
MODULE_HOOK_CALL(coredump_write_hook, (cs->iocookie, UIO_SYSSPACE,
&cseg, cs->core.c_seghdrsize), SET_ERROR(ENOSYS), error);
if (error)
return (error);
MODULE_HOOK_CALL(coredump_write_hook, (cs->iocookie, UIO_USERSPACE,
(void *)(vaddr_t)us->start, cseg.c_size),
SET_ERROR(ENOSYS),
error);
return error;
}