#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: core_machdep.c,v 1.7 2019/11/20 19:37:53 pgoyette Exp $");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/proc.h>
#include <sys/core.h>
#include <sys/buf.h>
#include <sys/exec.h>
#include <sys/vnode.h>
#include <sys/compat_stub.h>
#include <sys/exec_aout.h>
#include <uvm/uvm_extern.h>
#include <machine/cpu.h>
#include <machine/frame.h>
#include <machine/pcb.h>
#include <machine/trap.h>
#include <sys/bus.h>
int
cpu_coredump(struct lwp *l, struct coredump_iostate *iocookie,
struct core *chdr)
{
int error;
struct md_coredump md_core;
struct coreseg cseg;
if (iocookie == NULL) {
CORE_SETMAGIC(*chdr, COREMAGIC, MID_MACHINE, 0);
chdr->c_hdrsize = ALIGN(sizeof(*chdr));
chdr->c_seghdrsize = ALIGN(sizeof(cseg));
chdr->c_cpusize = sizeof(md_core);
chdr->c_nseg++;
return 0;
}
md_core.md_tf.tf_tstate = l->l_md.md_tf->tf_tstate;
md_core.md_tf.tf_pc = l->l_md.md_tf->tf_pc;
md_core.md_tf.tf_npc = l->l_md.md_tf->tf_npc;
md_core.md_tf.tf_y = l->l_md.md_tf->tf_y;
md_core.md_tf.tf_tt = l->l_md.md_tf->tf_tt;
md_core.md_tf.tf_pil = l->l_md.md_tf->tf_pil;
md_core.md_tf.tf_oldpil = l->l_md.md_tf->tf_oldpil;
md_core.md_tf.tf_global[0] = l->l_md.md_tf->tf_global[0];
md_core.md_tf.tf_global[1] = l->l_md.md_tf->tf_global[1];
md_core.md_tf.tf_global[2] = l->l_md.md_tf->tf_global[2];
md_core.md_tf.tf_global[3] = l->l_md.md_tf->tf_global[3];
md_core.md_tf.tf_global[4] = l->l_md.md_tf->tf_global[4];
md_core.md_tf.tf_global[5] = l->l_md.md_tf->tf_global[5];
md_core.md_tf.tf_global[6] = l->l_md.md_tf->tf_global[6];
md_core.md_tf.tf_global[7] = l->l_md.md_tf->tf_global[7];
md_core.md_tf.tf_out[0] = l->l_md.md_tf->tf_out[0];
md_core.md_tf.tf_out[1] = l->l_md.md_tf->tf_out[1];
md_core.md_tf.tf_out[2] = l->l_md.md_tf->tf_out[2];
md_core.md_tf.tf_out[3] = l->l_md.md_tf->tf_out[3];
md_core.md_tf.tf_out[4] = l->l_md.md_tf->tf_out[4];
md_core.md_tf.tf_out[5] = l->l_md.md_tf->tf_out[5];
md_core.md_tf.tf_out[6] = l->l_md.md_tf->tf_out[6];
md_core.md_tf.tf_out[7] = l->l_md.md_tf->tf_out[7];
#ifdef DEBUG
md_core.md_tf.tf_local[0] = l->l_md.md_tf->tf_local[0];
md_core.md_tf.tf_local[1] = l->l_md.md_tf->tf_local[1];
md_core.md_tf.tf_local[2] = l->l_md.md_tf->tf_local[2];
md_core.md_tf.tf_local[3] = l->l_md.md_tf->tf_local[3];
md_core.md_tf.tf_local[4] = l->l_md.md_tf->tf_local[4];
md_core.md_tf.tf_local[5] = l->l_md.md_tf->tf_local[5];
md_core.md_tf.tf_local[6] = l->l_md.md_tf->tf_local[6];
md_core.md_tf.tf_local[7] = l->l_md.md_tf->tf_local[7];
md_core.md_tf.tf_in[0] = l->l_md.md_tf->tf_in[0];
md_core.md_tf.tf_in[1] = l->l_md.md_tf->tf_in[1];
md_core.md_tf.tf_in[2] = l->l_md.md_tf->tf_in[2];
md_core.md_tf.tf_in[3] = l->l_md.md_tf->tf_in[3];
md_core.md_tf.tf_in[4] = l->l_md.md_tf->tf_in[4];
md_core.md_tf.tf_in[5] = l->l_md.md_tf->tf_in[5];
md_core.md_tf.tf_in[6] = l->l_md.md_tf->tf_in[6];
md_core.md_tf.tf_in[7] = l->l_md.md_tf->tf_in[7];
#endif
if (l->l_md.md_fpstate) {
fpusave_lwp(l, true);
md_core.md_fpstate = *l->l_md.md_fpstate;
} else
memset(&md_core.md_fpstate, 0,
sizeof(md_core.md_fpstate));
CORE_SETMAGIC(cseg, CORESEGMAGIC, MID_MACHINE, CORE_CPU);
cseg.c_addr = 0;
cseg.c_size = chdr->c_cpusize;
MODULE_HOOK_CALL(coredump_write_hook, (iocookie, UIO_SYSSPACE, &cseg,
chdr->c_seghdrsize), ENOSYS, error);
if (error)
return error;
MODULE_HOOK_CALL(coredump_write_hook, (iocookie, UIO_SYSSPACE, &md_core,
sizeof(md_core)), ENOSYS, error);
return error;
}