diff options
author | neel <neel@FreeBSD.org> | 2014-05-27 04:26:22 +0000 |
---|---|---|
committer | neel <neel@FreeBSD.org> | 2014-05-27 04:26:22 +0000 |
commit | 4b40e47cf8359d8523d7bc430a69b6a9d2858f99 (patch) | |
tree | 4797cc8702eb6792ba901cc3743ab04d42013fa6 /usr.sbin/bhyve/inout.c | |
parent | 79126286127856e52fef833f89f41ffc8235c951 (diff) | |
download | FreeBSD-src-4b40e47cf8359d8523d7bc430a69b6a9d2858f99.zip FreeBSD-src-4b40e47cf8359d8523d7bc430a69b6a9d2858f99.tar.gz |
Add segment protection and limits violation checks in vie_calculate_gla()
for 32-bit x86 guests.
Tested using ins/outs executed in a FreeBSD/i386 guest.
Diffstat (limited to 'usr.sbin/bhyve/inout.c')
-rw-r--r-- | usr.sbin/bhyve/inout.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/usr.sbin/bhyve/inout.c b/usr.sbin/bhyve/inout.c index 4aaa54a..babd6e1 100644 --- a/usr.sbin/bhyve/inout.c +++ b/usr.sbin/bhyve/inout.c @@ -103,7 +103,7 @@ register_default_iohandler(int start, int size) int emulate_inout(struct vmctx *ctx, int vcpu, struct vm_exit *vmexit, int strict) { - int addrsize, bytes, flags, in, port, rep; + int addrsize, bytes, flags, in, port, prot, rep; uint32_t val; inout_func_t handler; void *arg; @@ -141,6 +141,7 @@ emulate_inout(struct vmctx *ctx, int vcpu, struct vm_exit *vmexit, int strict) vis = &vmexit->u.inout_str; rep = vis->inout.rep; addrsize = vis->addrsize; + prot = in ? PROT_WRITE : PROT_READ; assert(addrsize == 2 || addrsize == 4 || addrsize == 8); /* Index register */ @@ -152,8 +153,8 @@ emulate_inout(struct vmctx *ctx, int vcpu, struct vm_exit *vmexit, int strict) while (count) { if (vie_calculate_gla(vis->paging.cpu_mode, - vis->addrsize, vis->seg_name, &vis->seg_desc, - index, &gla)) { + vis->seg_name, &vis->seg_desc, index, bytes, + addrsize, prot, &gla)) { error = vm_inject_exception2(ctx, vcpu, IDT_GP, 0); assert(error == 0); @@ -161,7 +162,7 @@ emulate_inout(struct vmctx *ctx, int vcpu, struct vm_exit *vmexit, int strict) } error = vm_gla2gpa(ctx, vcpu, &vis->paging, gla, bytes, - in ? PROT_WRITE : PROT_READ, iov, nitems(iov)); + prot, iov, nitems(iov)); assert(error == 0 || error == 1 || error == -1); if (error) { retval = (error == 1) ? INOUT_RESTART : |