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