Page MenuHomeFreeBSD

D15156.id41720.diff
No OneTemporary

D15156.id41720.diff

Index: sys/amd64/include/vmm.h
===================================================================
--- sys/amd64/include/vmm.h
+++ sys/amd64/include/vmm.h
@@ -212,6 +212,7 @@
vm_ooffset_t *segoff, size_t *len, int *prot, int *flags);
int vm_get_memseg(struct vm *vm, int ident, size_t *len, bool *sysmem,
struct vm_object **objptr);
+vm_paddr_t sysmem_maxaddr(struct vm *vm);
void *vm_gpa_hold(struct vm *, int vcpuid, vm_paddr_t gpa, size_t len,
int prot, void **cookie);
void vm_gpa_release(void *cookie);
Index: sys/amd64/vmm/vmm.c
===================================================================
--- sys/amd64/vmm/vmm.c
+++ sys/amd64/vmm/vmm.c
@@ -821,7 +821,7 @@
return (false);
}
-static vm_paddr_t
+vm_paddr_t
sysmem_maxaddr(struct vm *vm)
{
struct mem_map *mm;
Index: sys/amd64/vmm/vmm_dev.c
===================================================================
--- sys/amd64/vmm/vmm_dev.c
+++ sys/amd64/vmm/vmm_dev.c
@@ -173,7 +173,7 @@
vmmdev_rw(struct cdev *cdev, struct uio *uio, int flags)
{
int error, off, c, prot;
- vm_paddr_t gpa;
+ vm_paddr_t gpa, maxaddr;
void *hpa, *cookie;
struct vmmdev_softc *sc;
@@ -189,6 +189,7 @@
return (error);
prot = (uio->uio_rw == UIO_WRITE ? VM_PROT_WRITE : VM_PROT_READ);
+ maxaddr = sysmem_maxaddr(sc->vm);
while (uio->uio_resid > 0 && error == 0) {
gpa = uio->uio_offset;
off = gpa & PAGE_MASK;
@@ -204,7 +205,7 @@
*/
hpa = vm_gpa_hold(sc->vm, VM_MAXCPU - 1, gpa, c, prot, &cookie);
if (hpa == NULL) {
- if (uio->uio_rw == UIO_READ)
+ if (uio->uio_rw == UIO_READ && gpa < maxaddr)
error = uiomove(__DECONST(void *, zero_region),
c, uio);
else

File Metadata

Mime Type
text/plain
Expires
Fri, Mar 13, 12:47 AM (6 h, 23 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29602722
Default Alt Text
D15156.id41720.diff (1 KB)

Event Timeline