intel_iommu.c (d45a5270d075ea589f0b0ddcf963a5fea1f500ac) intel_iommu.c (37557b09a6ee1dc93328b1dd53bb26c2b5897cc3)
1/*
2 * QEMU emulation of an Intel IOMMU (VT-d)
3 * (DMA Remapping device)
4 *
5 * Copyright (C) 2013 Knut Omang, Oracle <knut.omang@oracle.com>
6 * Copyright (C) 2014 Le Tan, <tamlokveer@gmail.com>
7 *
8 * This program is free software; you can redistribute it and/or modify

--- 665 unchanged lines hidden (view full) ---

674 case VTD_SM_PASID_ENTRY_NESTED:
675 break;
676 case VTD_SM_PASID_ENTRY_PT:
677 if (!x86_iommu->pt_supported) {
678 return false;
679 }
680 break;
681 default:
1/*
2 * QEMU emulation of an Intel IOMMU (VT-d)
3 * (DMA Remapping device)
4 *
5 * Copyright (C) 2013 Knut Omang, Oracle <knut.omang@oracle.com>
6 * Copyright (C) 2014 Le Tan, <tamlokveer@gmail.com>
7 *
8 * This program is free software; you can redistribute it and/or modify

--- 665 unchanged lines hidden (view full) ---

674 case VTD_SM_PASID_ENTRY_NESTED:
675 break;
676 case VTD_SM_PASID_ENTRY_PT:
677 if (!x86_iommu->pt_supported) {
678 return false;
679 }
680 break;
681 default:
682 /* Unknwon type */
682 /* Unknown type */
683 return false;
684 }
685 return true;
686}
687
688static inline bool vtd_pdire_present(VTDPASIDDirEntry *pdire)
689{
690 return pdire->val & 1;
691}
692
693/**
694 * Caller of this function should check present bit if wants
683 return false;
684 }
685 return true;
686}
687
688static inline bool vtd_pdire_present(VTDPASIDDirEntry *pdire)
689{
690 return pdire->val & 1;
691}
692
693/**
694 * Caller of this function should check present bit if wants
695 * to use pdir entry for futher usage except for fpd bit check.
695 * to use pdir entry for further usage except for fpd bit check.
696 */
697static int vtd_get_pdire_from_pdir_table(dma_addr_t pasid_dir_base,
698 uint32_t pasid,
699 VTDPASIDDirEntry *pdire)
700{
701 uint32_t index;
702 dma_addr_t addr, entry_size;
703

--- 37 unchanged lines hidden (view full) ---

741 return -VTD_FR_PASID_TABLE_INV;
742 }
743
744 return 0;
745}
746
747/**
748 * Caller of this function should check present bit if wants
696 */
697static int vtd_get_pdire_from_pdir_table(dma_addr_t pasid_dir_base,
698 uint32_t pasid,
699 VTDPASIDDirEntry *pdire)
700{
701 uint32_t index;
702 dma_addr_t addr, entry_size;
703

--- 37 unchanged lines hidden (view full) ---

741 return -VTD_FR_PASID_TABLE_INV;
742 }
743
744 return 0;
745}
746
747/**
748 * Caller of this function should check present bit if wants
749 * to use pasid entry for futher usage except for fpd bit check.
749 * to use pasid entry for further usage except for fpd bit check.
750 */
751static int vtd_get_pe_from_pdire(IntelIOMMUState *s,
752 uint32_t pasid,
753 VTDPASIDDirEntry *pdire,
754 VTDPASIDEntry *pe)
755{
756 dma_addr_t addr = pdire->val & VTD_PASID_TABLE_BASE_ADDR_MASK;
757

--- 744 unchanged lines hidden (view full) ---

1502 }
1503 return ret;
1504 }
1505
1506 return vtd_sync_shadow_page_table_range(vtd_as, &ce, 0, UINT64_MAX);
1507}
1508
1509/*
750 */
751static int vtd_get_pe_from_pdire(IntelIOMMUState *s,
752 uint32_t pasid,
753 VTDPASIDDirEntry *pdire,
754 VTDPASIDEntry *pe)
755{
756 dma_addr_t addr = pdire->val & VTD_PASID_TABLE_BASE_ADDR_MASK;
757

--- 744 unchanged lines hidden (view full) ---

1502 }
1503 return ret;
1504 }
1505
1506 return vtd_sync_shadow_page_table_range(vtd_as, &ce, 0, UINT64_MAX);
1507}
1508
1509/*
1510 * Check if specific device is configed to bypass address
1510 * Check if specific device is configured to bypass address
1511 * translation for DMA requests. In Scalable Mode, bypass
1512 * 1st-level translation or 2nd-level translation, it depends
1513 * on PGTT setting.
1514 */
1515static bool vtd_dev_pt_enabled(VTDAddressSpace *as)
1516{
1517 IntelIOMMUState *s;
1518 VTDContextEntry ce;

--- 2379 unchanged lines hidden ---
1511 * translation for DMA requests. In Scalable Mode, bypass
1512 * 1st-level translation or 2nd-level translation, it depends
1513 * on PGTT setting.
1514 */
1515static bool vtd_dev_pt_enabled(VTDAddressSpace *as)
1516{
1517 IntelIOMMUState *s;
1518 VTDContextEntry ce;

--- 2379 unchanged lines hidden ---