intel_iommu: fix and simplify size calculation in process_device_iotlb_desc()
We don't use 1ULL which is wrong during size calculation. Fix it, and while at it, switch to use cto64() and adds a comments to make it simpler and easier to be understood. Reported-by: Paolo Bonzini <pbonzini@redhat.com> Cc: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Jason Wang <jasowang@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
		
							parent
							
								
									ec42813028
								
							
						
					
					
						commit
						04eb6247eb
					
				@ -1485,8 +1485,16 @@ static bool vtd_process_device_iotlb_desc(IntelIOMMUState *s,
 | 
				
			|||||||
        goto done;
 | 
					        goto done;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* According to ATS spec table 2.4:
 | 
				
			||||||
 | 
					     * S = 0, bits 15:12 = xxxx     range size: 4K
 | 
				
			||||||
 | 
					     * S = 1, bits 15:12 = xxx0     range size: 8K
 | 
				
			||||||
 | 
					     * S = 1, bits 15:12 = xx01     range size: 16K
 | 
				
			||||||
 | 
					     * S = 1, bits 15:12 = x011     range size: 32K
 | 
				
			||||||
 | 
					     * S = 1, bits 15:12 = 0111     range size: 64K
 | 
				
			||||||
 | 
					     * ...
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
    if (size) {
 | 
					    if (size) {
 | 
				
			||||||
        sz = 1 << (ctz64(~(addr | (VTD_PAGE_MASK_4K - 1))) + 1);
 | 
					        sz = (VTD_PAGE_SIZE * 2) << cto64(addr >> VTD_PAGE_SHIFT);
 | 
				
			||||||
        addr &= ~(sz - 1);
 | 
					        addr &= ~(sz - 1);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        sz = VTD_PAGE_SIZE;
 | 
					        sz = VTD_PAGE_SIZE;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user