Date: Wed, 21 Oct 1998 10:11:01 -0400 (EDT) From: "Ron G. Minnich" <rminnich@Sarnoff.COM> To: Luigi Rizzo <luigi@labinfo.iet.unipi.it> Cc: hackers@FreeBSD.ORG Subject: Re: Handling page faults in user space ? Message-ID: <Pine.SUN.3.91.981021100807.6097I-100000@terra> In-Reply-To: <199810210744.IAA09732@labinfo.iet.unipi.it>
next in thread | previous in thread | raw e-mail | index | archive | help
here's how I do it in zounds:
#ifdef bsd
void
zcfault (int sig, int code, struct sigcontext *scp, void *addr)
#endif
#ifdef linux
void
zcfault (int sig, mysigcontext scp)
#endif
{
ZCINFO *zc;
off_t off;
size_t size = PAGESIZE;
#ifdef linux
void *addr = (void *) scp.cr2;
#endif
DEBUG(fprintf(stderr, "(%s):ZCFAULT: addr. 0x%x\n",
stamp(),
(unsigned int) addr););
/* first find the zc for the fault */
zc = zcfind(addr);
/* round the address to page bounadry */
if (! zc)
{
printf("(%s):zcfault: No handler for address 0x%x\n",
stamp(), (unsigned int) addr);
abort();
}
/* round the address to page bounadry */
addr = (void *) trunc_page(addr);
/* now compute offset. size is simply pagesize */
off = ((off_t) addr);
off -= ((off_t) zc->v);
DEBUG(fprintf(stderr, "(%s):ZCFAULT: call zcread now\n", stamp()););
if ((zc->readfd >= 0) && (zc->writefd >= 0))
{
#ifdef PRESENTBITS
/* fill the page, given the zc, and using the presence bits */
if (zc->use_present_bits)
{
zcfillregion(zc, off, size);
}
else
#endif
zcread(zc, off, size);
}
else
if (zc->multifd >= 0) /* we are a multicast client. Just create the
memory */
zcvalidate(zc, off, size);
else
{
fprintf(stderr,
"(%s):ZCFAULT: no tcp or multicast fd: can not handle fault\n",
stamp());
exit(1);
}
DEBUG(fprintf(stderr, "(%s):ZCFAULT: done zcread\n", stamp()););
#ifdef linux
signal(SIGBUS, zcfault);
signal(SIGSEGV, zcfault);
#endif
}
Note also that we have to catch sigbus and sigsegv; bsd has traditionally
gotten bus and segv backwards. Openbsd has fixed this, and I've lost
track of whether freebsd has.
ron
Ron Minnich |"Using Windows NT, which is known to have some
rminnich@sarnoff.com | failure modes, on a warship is similar to hoping
(609)-734-3120 | that luck will be in our favor"- A. Digiorgio
ftp://ftp.sarnoff.com/pub/mnfs/www/docs/cluster.html
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.SUN.3.91.981021100807.6097I-100000>
