Date: Thu, 27 Mar 1997 18:56:02 +0100 (MET) From: hans@brandinnovators.com (Hans Zuidam) To: hackers@freebsd.org Subject: driver panic Message-ID: <199703271756.SAA00260@truk.brandinnovators.com>
next in thread | raw e-mail | index | archive | help
Hi, I have a driver which does: /* * As long as there's data, try to fill the output buffer to * it's maximum size. If the number of bytes is not a multiple * of four round down, effectively forgetting up to three bytes. */ while ((n = min((BUFSIZE - bp->b_olen), uio->uio_resid)) != 0) { if (n & 0x3) n &= ~0x3; if (n > 0) { uiomove(((u_char *) bp->b_obuf) + bp->b_olen, n, uio); bp->b_olen += n; } else { splx(s); return 0; } /* * As long as there's something in the output buffer, write it. */ while (bp->b_olen) { ... } ... } while a test program did: u_long wo = 0L; r = write(fd, (char *) wo, 4); which is obviously wrong. What makes me wonder is why this causes a page fault. As far as I can see uiomove() is the only one accessing the write buffer. When I do the right thing (i.e. (char *) &wo) everything is fine. Anyone any idea? Thanks in advance, Hans -- H. Zuidam E-Mail: hans@brandinnovators.com Brand Innovators B.V. P-Mail: P.O. Box 1377 de Pinckart 54 5602 BJ Eindhoven, The Netherlands 5674 CC Nuenen Tel. +31 40 2631134, Fax. +31 40 2831138
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199703271756.SAA00260>