diff options
Diffstat (limited to 'main/xen/xsa378-4.13-3.patch')
-rw-r--r-- | main/xen/xsa378-4.13-3.patch | 102 |
1 files changed, 0 insertions, 102 deletions
diff --git a/main/xen/xsa378-4.13-3.patch b/main/xen/xsa378-4.13-3.patch deleted file mode 100644 index 0e22c73cfc7..00000000000 --- a/main/xen/xsa378-4.13-3.patch +++ /dev/null @@ -1,102 +0,0 @@ -From: Jan Beulich <jbeulich@suse.com> -Subject: IOMMU: also pass p2m_access_t to p2m_get_iommu_flags() - -A subsequent change will want to customize the IOMMU permissions based -on this. - -This is part of XSA-378. - -Signed-off-by: Jan Beulich <jbeulich@suse.com> -Reviewed-by: Paul Durrant <paul@xen.org> - ---- a/xen/arch/x86/mm/p2m-ept.c -+++ b/xen/arch/x86/mm/p2m-ept.c -@@ -678,7 +678,7 @@ ept_set_entry(struct p2m_domain *p2m, gf - uint8_t ipat = 0; - bool_t need_modify_vtd_table = 1; - bool_t vtd_pte_present = 0; -- unsigned int iommu_flags = p2m_get_iommu_flags(p2mt, mfn); -+ unsigned int iommu_flags = p2m_get_iommu_flags(p2mt, p2ma, mfn); - bool_t needs_sync = 1; - ept_entry_t old_entry = { .epte = 0 }; - ept_entry_t new_entry = { .epte = 0 }; -@@ -805,8 +805,8 @@ ept_set_entry(struct p2m_domain *p2m, gf - - /* Safe to read-then-write because we hold the p2m lock */ - if ( ept_entry->mfn == new_entry.mfn && -- p2m_get_iommu_flags(ept_entry->sa_p2mt, _mfn(ept_entry->mfn)) == -- iommu_flags ) -+ p2m_get_iommu_flags(ept_entry->sa_p2mt, ept_entry->access, -+ _mfn(ept_entry->mfn)) == iommu_flags ) - need_modify_vtd_table = 0; - - ept_p2m_type_to_flags(p2m, &new_entry, p2mt, p2ma); ---- a/xen/arch/x86/mm/p2m-pt.c -+++ b/xen/arch/x86/mm/p2m-pt.c -@@ -480,6 +480,16 @@ int p2m_pt_handle_deferred_changes(uint6 - return rc; - } - -+/* Reconstruct a fake p2m_access_t from stored PTE flags. */ -+static p2m_access_t p2m_flags_to_access(unsigned int flags) -+{ -+ if ( flags & _PAGE_PRESENT ) -+ return p2m_access_n; -+ -+ /* No need to look at _PAGE_NX for now. */ -+ return flags & _PAGE_RW ? p2m_access_rw : p2m_access_r; -+} -+ - /* Checks only applicable to entries with order > PAGE_ORDER_4K */ - static void check_entry(mfn_t mfn, p2m_type_t new, p2m_type_t old, - unsigned int order) -@@ -514,7 +524,7 @@ p2m_pt_set_entry(struct p2m_domain *p2m, - l2_pgentry_t l2e_content; - l3_pgentry_t l3e_content; - int rc; -- unsigned int iommu_pte_flags = p2m_get_iommu_flags(p2mt, mfn); -+ unsigned int iommu_pte_flags = p2m_get_iommu_flags(p2mt, p2ma, mfn); - /* - * old_mfn and iommu_old_flags control possible flush/update needs on the - * IOMMU: We need to flush when MFN or flags (i.e. permissions) change. -@@ -577,6 +587,7 @@ p2m_pt_set_entry(struct p2m_domain *p2m, - old_mfn = l1e_get_pfn(*p2m_entry); - iommu_old_flags = - p2m_get_iommu_flags(p2m_flags_to_type(flags), -+ p2m_flags_to_access(flags), - _mfn(old_mfn)); - } - else -@@ -619,9 +630,10 @@ p2m_pt_set_entry(struct p2m_domain *p2m, - 0, L1_PAGETABLE_ENTRIES); - ASSERT(p2m_entry); - old_mfn = l1e_get_pfn(*p2m_entry); -+ flags = l1e_get_flags(*p2m_entry); - iommu_old_flags = -- p2m_get_iommu_flags(p2m_flags_to_type(l1e_get_flags(*p2m_entry)), -- _mfn(old_mfn)); -+ p2m_get_iommu_flags(p2m_flags_to_type(flags), -+ p2m_flags_to_access(flags), _mfn(old_mfn)); - - if ( mfn_valid(mfn) || p2m_allows_invalid_mfn(p2mt) ) - entry_content = p2m_l1e_from_pfn(mfn_x(mfn), -@@ -649,6 +661,7 @@ p2m_pt_set_entry(struct p2m_domain *p2m, - old_mfn = l1e_get_pfn(*p2m_entry); - iommu_old_flags = - p2m_get_iommu_flags(p2m_flags_to_type(flags), -+ p2m_flags_to_access(flags), - _mfn(old_mfn)); - } - else ---- a/xen/include/asm-x86/p2m.h -+++ b/xen/include/asm-x86/p2m.h -@@ -908,7 +908,8 @@ static inline void p2m_altp2m_check(stru - /* - * p2m type to IOMMU flags - */ --static inline unsigned int p2m_get_iommu_flags(p2m_type_t p2mt, mfn_t mfn) -+static inline unsigned int p2m_get_iommu_flags(p2m_type_t p2mt, -+ p2m_access_t p2ma, mfn_t mfn) - { - unsigned int flags; - |