iommu/vt-d: shift wrapping bug in prq_event_thread()
authorDan Carpenter <dan.carpenter@oracle.com>
Thu, 15 Oct 2015 18:25:15 +0000 (21:25 +0300)
committerDavid Woodhouse <David.Woodhouse@intel.com>
Thu, 15 Oct 2015 20:16:47 +0000 (21:16 +0100)
The "req->addr" variable is a bit field declared as "u64 addr:52;".
The "address" variable is a u64.  We need to cast "req->addr" to a u64
before the shift or the result is truncated to 52 bits.

Fixes: a222a7f0bb6c ('iommu/vt-d: Implement page request handling')
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
drivers/iommu/intel-svm.c

index b7e923aae4d87e4952333d1e061521f68a85688a..99a78030857b78d5e31c5d53db8b2627238fa069 100644 (file)
@@ -490,7 +490,7 @@ static irqreturn_t prq_event_thread(int irq, void *d)
                req = &iommu->prq[head / sizeof(*req)];
 
                result = QI_RESP_FAILURE;
-               address = req->addr << PAGE_SHIFT;
+               address = (u64)req->addr << PAGE_SHIFT;
                if (!req->pasid_present) {
                        pr_err("%s: Page request without PASID: %08llx %08llx\n",
                               iommu->name, ((unsigned long long *)req)[0],