Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 14 Aug 2014 05:00:46 +0000 (UTC)
From:      Neel Natu <neel@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r269962 - in head/sys/amd64/vmm: . intel
Message-ID:  <201408140500.s7E50krj061765@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: neel
Date: Thu Aug 14 05:00:45 2014
New Revision: 269962
URL: http://svnweb.freebsd.org/changeset/base/269962

Log:
  Use the max guest memory address when creating its iommu domain.
  
  Also, assert that the GPA being mapped in the domain is less than its maxaddr.
  
  Reviewed by:	grehan
  Pointed out by:	Anish Gupta (akgupt3@gmail.com)

Modified:
  head/sys/amd64/vmm/intel/vtd.c
  head/sys/amd64/vmm/vmm.c

Modified: head/sys/amd64/vmm/intel/vtd.c
==============================================================================
--- head/sys/amd64/vmm/intel/vtd.c	Thu Aug 14 04:42:09 2014	(r269961)
+++ head/sys/amd64/vmm/intel/vtd.c	Thu Aug 14 05:00:45 2014	(r269962)
@@ -448,6 +448,11 @@ vtd_update_mapping(void *arg, vm_paddr_t
 	ptpindex = 0;
 	ptpshift = 0;
 
+	KASSERT(gpa + len > gpa, ("%s: invalid gpa range %#lx/%#lx", __func__,
+	    gpa, len));
+	KASSERT(gpa + len <= dom->maxaddr, ("%s: gpa range %#lx/%#lx beyond "
+	    "domain maxaddr %#lx", __func__, gpa, len, dom->maxaddr));
+
 	if (gpa & PAGE_MASK)
 		panic("vtd_create_mapping: unaligned gpa 0x%0lx", gpa);
 

Modified: head/sys/amd64/vmm/vmm.c
==============================================================================
--- head/sys/amd64/vmm/vmm.c	Thu Aug 14 04:42:09 2014	(r269961)
+++ head/sys/amd64/vmm/vmm.c	Thu Aug 14 05:00:45 2014	(r269962)
@@ -572,6 +572,21 @@ vm_malloc(struct vm *vm, vm_paddr_t gpa,
 	return (0);
 }
 
+static vm_paddr_t
+vm_maxmem(struct vm *vm)
+{
+	int i;
+	vm_paddr_t gpa, maxmem;
+
+	maxmem = 0;
+	for (i = 0; i < vm->num_mem_segs; i++) {
+		gpa = vm->mem_segs[i].gpa + vm->mem_segs[i].len;
+		if (gpa > maxmem)
+			maxmem = gpa;
+	}
+	return (maxmem);
+}
+
 static void
 vm_gpa_unwire(struct vm *vm)
 {
@@ -709,7 +724,7 @@ vm_assign_pptdev(struct vm *vm, int bus,
 	if (ppt_assigned_devices(vm) == 0) {
 		KASSERT(vm->iommu == NULL,
 		    ("vm_assign_pptdev: iommu must be NULL"));
-		maxaddr = vmm_mem_maxaddr();
+		maxaddr = vm_maxmem(vm);
 		vm->iommu = iommu_create_domain(maxaddr);
 
 		error = vm_gpa_wire(vm);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201408140500.s7E50krj061765>