diff options
| author | Andrey A. Chernov <ache@FreeBSD.org> | 1998-09-29 20:36:31 +0000 |
|---|---|---|
| committer | Andrey A. Chernov <ache@FreeBSD.org> | 1998-09-29 20:36:31 +0000 |
| commit | 0e4c0f17f380b9a1030eeea1dd32d585083e5e6c (patch) | |
| tree | 95d09d18a8e469189675d7c0a3f6e40b3efbe69c | |
| parent | ecee3646ce7623c3cb59ce45fef2c49b4c083e20 (diff) | |
Notes
| -rw-r--r-- | sys/i386/i386/vm86.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/sys/i386/i386/vm86.c b/sys/i386/i386/vm86.c index 329128790be6..25da03aee658 100644 --- a/sys/i386/i386/vm86.c +++ b/sys/i386/i386/vm86.c @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: vm86.c,v 1.15 1998/08/16 00:05:05 bde Exp $ + * $Id: vm86.c,v 1.16 1998/09/29 09:06:00 bde Exp $ */ #include "opt_vm86.h" @@ -626,16 +626,36 @@ vm86_datacall(intnum, vmf, buffer, buflen, segment, offset) int buflen; u_short *segment, *offset; { + int ret, internb; u_int page; + u_short off; +#define MAX_DATA_SIZE 1024 + static u_char mapped_to_page1[MAX_DATA_SIZE * 2]; + static u_char *buf; + if (buflen < 0 || buflen > MAX_DATA_SIZE) + return(-1); page = (u_int)buffer & PG_FRAME; *offset = (u_int)buffer & PAGE_MASK; - if ((*offset + buflen) & PG_FRAME) - return (-1); /* XXX fixme! */ + if ((*offset + buflen) & PG_FRAME) { + if (buf == NULL) { + buf = mapped_to_page1; + off = (u_int)buf & PAGE_MASK; + if ((off + MAX_DATA_SIZE) & PG_FRAME) + buf += PAGE_SIZE - off; + } + page = (u_int)buf & PG_FRAME; + bcopy((void *)buffer, (void *)buf, (size_t)buflen); + internb = 1; + } else + internb = 0; *segment = 0x100; page = vtophys(page); vmf->vmf_trapno = page | (intnum & PAGE_MASK); - return (vm86_bioscall(vmf)); + ret = vm86_bioscall(vmf); + if (internb) + bcopy((void *)buf, (void *)buffer, (size_t)buflen); + return ret; } #if 0 |
