Subject: Re: md_coredump
To: None <port-masters@sun-lamp.cs.berkeley.edu, port-sparc@sun-lamp.cs.berkeley.edu>
From: Paul Kranenburg <pk@cs.few.eur.nl>
List: port-sparc
Date: 05/21/1994 11:50:01
> 
> you need a struct md_coredump.
> 
> 
> for the sparc, theo, you'll have to do something special, but you're
> used to that...
> 

I am in fact working on a core dump header that would allow much cleaner
core file handling by debuggers. I have it working on the sparc as a matter
of fact, using the following. Now, what would other ports like to see in
the generic `struct core'? The new core file layout provides for three
`sections': machine dependent cpu state, the data segment and the stack
segment (in that order). The cpu state includes eg. the processor registers
(on the sparc, it is a `struct trapframe' + a `struct fpstate' for instance).

<sys/core.h> :

#define CORE_MAGIC	0x11223344 - hmm,

struct core {
	u_long	c_magic;		/* */
	u_long	c_hdrsize;		/* Size of core header (machdep algn) */
	u_long	c_mid;			/* Machine id */
	char	c_name[MAXCOMLEN+1];	/* Copy of p->p_comm */
	u_long	c_cpusize;		/* Size of machine dependent segment */
	u_long	c_tsize;		/* Size of text */
	u_long	c_dsize;		/* Size of data */
	u_long	c_ssize;		/* Size of stack */
	u_long	c_signo;		/* Killing signal */
	u_long	c_ucode;		/* Hmm ? */
};


for reference, here's the relevant part of <arch/sparc/sparc/vm_machdep.c> :

[ appropriate changes have to be made to kern_sig.c as well]

/*
 * cpu_coredump is called to write a core dump header.
 * (should this be defined elsewhere?  machdep.c?)
 */
int
cpu_coredump(p, vp, cred, cp)
	struct proc *p;
	struct vnode *vp;
	struct ucred *cred;
	struct core *cp;
{
	int error;
	register struct user *up = p->p_addr;
	struct cpustate {
		struct trapframe tf;
		struct fpstate fp;
	} cpustate;

	cp->c_hdrsize = roundup(sizeof(*cp), sizeof(double));
	cp->c_cpusize = sizeof(cpustate);
	cp->c_mid = htonl(MID_SPARC);

	cpustate.tf = *p->p_md.md_tf;
	if (p->p_md.md_fpstate)
		cpustate.fp = *p->p_md.md_fpstate;
	else
		bzero((caddr_t)&cpustate.fp, sizeof(struct fpstate));

	error = (vn_rdwr(UIO_WRITE, vp, (caddr_t)cp, cp->c_hdrsize, (off_t)0,
	    UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, cred, (int *)NULL, p));
	if (error)
		return error;

	return (vn_rdwr(UIO_WRITE, vp, (caddr_t)&cpustate, sizeof(cpustate),
	    (off_t)cp->c_hdrsize,
	    UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, cred, (int *)NULL, p));
}

------------------------------------------------------------------------------