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;
|
||||
}
|
||||
|
||||
/* 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) {
|
||||
sz = 1 << (ctz64(~(addr | (VTD_PAGE_MASK_4K - 1))) + 1);
|
||||
sz = (VTD_PAGE_SIZE * 2) << cto64(addr >> VTD_PAGE_SHIFT);
|
||||
addr &= ~(sz - 1);
|
||||
} else {
|
||||
sz = VTD_PAGE_SIZE;
|
||||
|
Loading…
Reference in New Issue
Block a user