Core files ... it works
Don Libes
libes at cme-durer.ARPA
Mon Jul 4 03:00:18 AEST 1988
In article <6053 at megaron.arizona.edu> laidbak!lm at sun.com writes:
>In article <797 at scubed.UUCP> warner at scubed.UUCP (Ken Warner) writes:
>>The next thing I want to do is save the stack and registers at a particular,
>>known state and restore the stack and registers on start-up.
>>
>>How can one get the contents of the registers, including the pc, fp and sp
>>registers? How can these be restored?
>
>I had to do this for a thread library that I wrote for the Vax (Mt Xinu, 4.3).
>I've attached the code below. You should be able to see how to do what you want
>from this code (on a vax). If you do get a Sun version working I'd like a
>copy...
Here's how to restore all the registers on a Sun. This is extracted
from code I wrote to get XINU running on top of UNIX. This was
written up as part of a larger article on XINU in the July/August '87
;login:. The code to save the registers is a little easier. If you want
the whole XINU package, you can get anonymous ftp it from cme-durer.arpa.
It's called xinu.shar.Z. Source is only 16Kb (compressed).
You can think of XINU as a thread library if you like.
static int *new_sp; /* new stack pointer register to be loaded */
static int (*new_pc)(); /* new program counter register to be loaded */
static int new_signal_mask; /* new signal mask to be loaded */
int restore()
{
register struct pentry *nptr; /* pointer to new process entry */
.
. a lot of stuff omitted here
.
/* at this point, nptr->pregs = a4@ */
/* you may have to modify the following assembler if this is */
/* not the case */
/* restart the new process */
/* prepare pc, sp and interrupt mask for rte() to use */
new_sp = nptr->sp; /* movl a4@(60),_new_sp */
new_pc = nptr->pc; /* movl a4@(64),_new_pc */
new_signal_mask = nptr->signal_mask;
/* load rest of registers directly except for a7 (sp) */
asm("moveml a4@,#0xfff"); /* d0-d7,a0-a3 */
asm("movl a4@(56),a6"); /* restore a6 */
asm("movl a4@(52),a5"); /* restore a5 */
asm("movl a4@(48),a4"); /* restore a4 */
kill(getpid(),RTE); /* this is caught by rte() below */
}
/* This routine is necessary to load the signal mask at the same time as */
/* we load the new pc and sp. */
/* ARGSUSED */
static void rte(sig,code,scp)
int sig;
int code;
struct sigcontext *scp;
{
scp->sc_sp = (int)new_sp;
scp->sc_pc = (int)new_pc;
scp->sc_mask = new_signal_mask;
/* No need to reload ps, as no one looks at it anyway, upon return. */
}
Don Libes cme-durer.arpa ...!uunet!cme-durer!libes
More information about the Comp.unix.questions
mailing list