Lines Matching refs:p2m

105 static void ept_p2m_type_to_flags(struct p2m_domain *p2m, ept_entry_t *entry,  in ept_p2m_type_to_flags()  argument
136 entry->w = !(p2m->ioreq.flags & XEN_DMOP_IOREQ_MEM_ACCESS_WRITE); in ept_p2m_type_to_flags()
157 if ( vmx_domain_pml_enabled(p2m->domain) && in ept_p2m_type_to_flags()
226 static int ept_set_middle_entry(struct p2m_domain *p2m, ept_entry_t *ept_entry) in ept_set_middle_entry() argument
232 mfn = p2m_alloc_ptp(p2m, 0); in ept_set_middle_entry()
238 ept_entry->access = p2m->default_access; in ept_set_middle_entry()
257 static void ept_free_entry(struct p2m_domain *p2m, ept_entry_t *ept_entry, int level) in ept_free_entry() argument
268 ept_free_entry(p2m, epte + i, level - 1); in ept_free_entry()
272 p2m_tlb_flush_sync(p2m); in ept_free_entry()
273 p2m_free_ptp(p2m, mfn_to_page(ept_entry->mfn)); in ept_free_entry()
276 static bool_t ept_split_super_page(struct p2m_domain *p2m, in ept_split_super_page() argument
291 if ( !ept_set_middle_entry(p2m, &new_ept) ) in ept_split_super_page()
307 ept_p2m_type_to_flags(p2m, epte, epte->sa_p2mt, epte->access); in ept_split_super_page()
314 if ( !(rv = ept_split_super_page(p2m, epte, level - 1, target)) ) in ept_split_super_page()
340 static int ept_next_level(struct p2m_domain *p2m, bool_t read_only, in ept_next_level() argument
370 if ( !ept_set_middle_entry(p2m, ept_entry) ) in ept_next_level()
427 static int ept_invalidate_emt_range(struct p2m_domain *p2m, in ept_invalidate_emt_range() argument
437 table = map_domain_page(pagetable_get_mfn(p2m_get_pagetable(p2m))); in ept_invalidate_emt_range()
438 for ( i = p2m->ept.wl; i > target; --i ) in ept_invalidate_emt_range()
440 ret = ept_next_level(p2m, 1, &table, &gfn_remainder, i); in ept_invalidate_emt_range()
455 if ( !ept_split_super_page(p2m, &split_ept_entry, i, target) ) in ept_invalidate_emt_range()
457 ept_free_entry(p2m, &split_ept_entry, i); in ept_invalidate_emt_range()
465 if ( !ept_next_level(p2m, 1, &table, &gfn_remainder, i) ) in ept_invalidate_emt_range()
505 static int resolve_misconfig(struct p2m_domain *p2m, unsigned long gfn) in resolve_misconfig() argument
507 struct ept_data *ept = &p2m->ept; in resolve_misconfig()
543 e.emt = epte_get_entry_emt(p2m->domain, gfn + i, in resolve_misconfig()
548 nt = p2m_recalc_type(e.recalc, e.sa_p2mt, p2m, gfn + i); in resolve_misconfig()
553 ASSERT(p2m->ioreq.entry_count > 0); in resolve_misconfig()
554 p2m->ioreq.entry_count--; in resolve_misconfig()
558 ept_p2m_type_to_flags(p2m, &e, e.sa_p2mt, e.access); in resolve_misconfig()
567 int emt = epte_get_entry_emt(p2m->domain, gfn, _mfn(e.mfn), in resolve_misconfig()
577 switch ( p2m_is_logdirty_range(p2m, gfn & mask, in resolve_misconfig()
595 if ( ept_split_super_page(p2m, &e, level, level - 1) ) in resolve_misconfig()
603 ept_free_entry(p2m, &e, level); in resolve_misconfig()
611 ept_p2m_type_to_flags(p2m, &e, e.sa_p2mt, e.access); in resolve_misconfig()
645 for_each_vcpu ( p2m->domain, v ) in resolve_misconfig()
655 struct p2m_domain *p2m = p2m_get_hostp2m(curr->domain); in ept_handle_misconfig() local
659 p2m_lock(p2m); in ept_handle_misconfig()
662 rc = resolve_misconfig(p2m, PFN_DOWN(gpa)); in ept_handle_misconfig()
665 p2m_unlock(p2m); in ept_handle_misconfig()
677 ept_set_entry(struct p2m_domain *p2m, gfn_t gfn_, mfn_t mfn, in ept_set_entry() argument
696 struct ept_data *ept = &p2m->ept; in ept_set_entry()
697 struct domain *d = p2m->domain; in ept_set_entry()
712 ret = resolve_misconfig(p2m, gfn); in ept_set_entry()
721 table = map_domain_page(pagetable_get_mfn(p2m_get_pagetable(p2m))); in ept_set_entry()
726 ret = ept_next_level(p2m, 0, &table, &gfn_remainder, i); in ept_set_entry()
775 if ( !ept_split_super_page(p2m, &split_ept_entry, i, target) ) in ept_set_entry()
777 ept_free_entry(p2m, &split_ept_entry, i); in ept_set_entry()
789 if ( !ept_next_level(p2m, 0, &table, &gfn_remainder, i) ) in ept_set_entry()
799 int emt = epte_get_entry_emt(p2m->domain, gfn, mfn, in ept_set_entry()
822 ept_p2m_type_to_flags(p2m, &new_entry, p2mt, p2ma); in ept_set_entry()
838 p2m->ioreq.entry_count++; in ept_set_entry()
844 ASSERT(p2m->ioreq.entry_count > 0); in ept_set_entry()
845 p2m->ioreq.entry_count--; in ept_set_entry()
856 (gfn + (1UL << order) - 1 > p2m->max_mapped_pfn) ) in ept_set_entry()
858 p2m->max_mapped_pfn = gfn + (1UL << order) - 1; in ept_set_entry()
863 ept_sync_domain(p2m); in ept_set_entry()
866 if ( rc == 0 && p2m_is_hostp2m(p2m) && need_iommu(d) && in ept_set_entry()
881 if ( iommu_unmap_page(p2m->domain, gfn + i) ) in ept_set_entry()
904 ept_free_entry(p2m, &old_entry, target); in ept_set_entry()
906 if ( entry_written && p2m_is_hostp2m(p2m) ) in ept_set_entry()
913 static mfn_t ept_get_entry(struct p2m_domain *p2m, in ept_get_entry() argument
919 map_domain_page(pagetable_get_mfn(p2m_get_pagetable(p2m))); in ept_get_entry()
928 struct ept_data *ept = &p2m->ept; in ept_get_entry()
936 if ( gfn > p2m->max_mapped_pfn ) in ept_get_entry()
940 p2m->max_mapped_pfn ) in ept_get_entry()
952 ret = ept_next_level(p2m, 1, &table, &gfn_remainder, i); in ept_get_entry()
969 if ( p2m_pod_demand_populate(p2m, gfn_, i * EPT_TABLE_ORDER) ) in ept_get_entry()
991 if ( !p2m_pod_demand_populate(p2m, gfn_, PAGE_ORDER_4K) ) in ept_get_entry()
998 ept_entry->sa_p2mt, p2m, gfn); in ept_get_entry()
1027 struct p2m_domain *p2m = p2m_get_hostp2m(d); in ept_walk_table() local
1028 struct ept_data *ept = &p2m->ept; in ept_walk_table()
1030 map_domain_page(pagetable_get_mfn(p2m_get_pagetable(p2m))); in ept_walk_table()
1038 if ( gfn > p2m->max_mapped_pfn ) in ept_walk_table()
1041 p2m->max_mapped_pfn); in ept_walk_table()
1076 static void ept_change_entry_type_global(struct p2m_domain *p2m, in ept_change_entry_type_global() argument
1079 unsigned long mfn = p2m->ept.mfn; in ept_change_entry_type_global()
1084 if ( ept_invalidate_emt(_mfn(mfn), 1, p2m->ept.wl) ) in ept_change_entry_type_global()
1085 ept_sync_domain(p2m); in ept_change_entry_type_global()
1088 static int ept_change_entry_type_range(struct p2m_domain *p2m, in ept_change_entry_type_range() argument
1093 unsigned int i, wl = p2m->ept.wl; in ept_change_entry_type_range()
1097 if ( !p2m->ept.mfn ) in ept_change_entry_type_range()
1106 rc = ept_invalidate_emt_range(p2m, i, first_gfn, end_gfn); in ept_change_entry_type_range()
1116 rc = ept_invalidate_emt_range(p2m, i, start_gfn, last_gfn); in ept_change_entry_type_range()
1130 ept_sync_domain(p2m); in ept_change_entry_type_range()
1135 static void ept_memory_type_changed(struct p2m_domain *p2m) in ept_memory_type_changed() argument
1137 unsigned long mfn = p2m->ept.mfn; in ept_memory_type_changed()
1142 if ( ept_invalidate_emt(_mfn(mfn), 0, p2m->ept.wl) ) in ept_memory_type_changed()
1143 ept_sync_domain(p2m); in ept_memory_type_changed()
1154 static void ept_sync_domain_prepare(struct p2m_domain *p2m) in ept_sync_domain_prepare() argument
1156 struct domain *d = p2m->domain; in ept_sync_domain_prepare()
1157 struct ept_data *ept = &p2m->ept; in ept_sync_domain_prepare()
1161 if ( p2m_is_nestedp2m(p2m) ) in ept_sync_domain_prepare()
1177 static void ept_sync_domain_mask(struct p2m_domain *p2m, const cpumask_t *mask) in ept_sync_domain_mask() argument
1179 on_selected_cpus(mask, __ept_sync_domain, p2m, 1); in ept_sync_domain_mask()
1182 void ept_sync_domain(struct p2m_domain *p2m) in ept_sync_domain() argument
1184 struct domain *d = p2m->domain; in ept_sync_domain()
1190 ept_sync_domain_prepare(p2m); in ept_sync_domain()
1192 if ( p2m->defer_flush ) in ept_sync_domain()
1194 p2m->need_flush = 1; in ept_sync_domain()
1198 ept_sync_domain_mask(p2m, d->domain_dirty_cpumask); in ept_sync_domain()
1201 static void ept_tlb_flush(struct p2m_domain *p2m) in ept_tlb_flush() argument
1203 ept_sync_domain_mask(p2m, p2m->domain->domain_dirty_cpumask); in ept_tlb_flush()
1206 static void ept_enable_pml(struct p2m_domain *p2m) in ept_enable_pml() argument
1209 ASSERT(atomic_read(&p2m->domain->pause_count)); in ept_enable_pml()
1216 if ( vmx_domain_enable_pml(p2m->domain) ) in ept_enable_pml()
1220 p2m->ept.ad = 1; in ept_enable_pml()
1221 vmx_domain_update_eptp(p2m->domain); in ept_enable_pml()
1224 static void ept_disable_pml(struct p2m_domain *p2m) in ept_disable_pml() argument
1227 ASSERT(atomic_read(&p2m->domain->pause_count)); in ept_disable_pml()
1229 vmx_domain_disable_pml(p2m->domain); in ept_disable_pml()
1232 p2m->ept.ad = 0; in ept_disable_pml()
1233 vmx_domain_update_eptp(p2m->domain); in ept_disable_pml()
1236 static void ept_flush_pml_buffers(struct p2m_domain *p2m) in ept_flush_pml_buffers() argument
1239 ASSERT(atomic_read(&p2m->domain->pause_count)); in ept_flush_pml_buffers()
1241 vmx_domain_flush_pml_buffers(p2m->domain); in ept_flush_pml_buffers()
1244 int ept_p2m_init(struct p2m_domain *p2m) in ept_p2m_init() argument
1246 struct ept_data *ept = &p2m->ept; in ept_p2m_init()
1248 p2m->set_entry = ept_set_entry; in ept_p2m_init()
1249 p2m->get_entry = ept_get_entry; in ept_p2m_init()
1250 p2m->recalc = resolve_misconfig; in ept_p2m_init()
1251 p2m->change_entry_type_global = ept_change_entry_type_global; in ept_p2m_init()
1252 p2m->change_entry_type_range = ept_change_entry_type_range; in ept_p2m_init()
1253 p2m->memory_type_changed = ept_memory_type_changed; in ept_p2m_init()
1254 p2m->audit_p2m = NULL; in ept_p2m_init()
1255 p2m->tlb_flush = ept_tlb_flush; in ept_p2m_init()
1265 p2m->enable_hardware_log_dirty = ept_enable_pml; in ept_p2m_init()
1266 p2m->disable_hardware_log_dirty = ept_disable_pml; in ept_p2m_init()
1267 p2m->flush_hardware_cached_dirty = ept_flush_pml_buffers; in ept_p2m_init()
1282 void ept_p2m_uninit(struct p2m_domain *p2m) in ept_p2m_uninit() argument
1284 struct ept_data *ept = &p2m->ept; in ept_p2m_uninit()
1312 struct p2m_domain *p2m; in ept_dump_p2m_table() local
1320 p2m = p2m_get_hostp2m(d); in ept_dump_p2m_table()
1321 ept = &p2m->ept; in ept_dump_p2m_table()
1324 for ( gfn = 0; gfn <= p2m->max_mapped_pfn; gfn += 1UL << order ) in ept_dump_p2m_table()
1329 table = map_domain_page(pagetable_get_mfn(p2m_get_pagetable(p2m))); in ept_dump_p2m_table()
1336 ret = ept_next_level(p2m, 1, &table, &gfn_remainder, i); in ept_dump_p2m_table()
1373 struct p2m_domain *p2m = d->arch.altp2m_p2m[i]; in p2m_init_altp2m_ept() local
1376 p2m->min_remapped_gfn = gfn_x(INVALID_GFN); in p2m_init_altp2m_ept()
1377 p2m->max_remapped_gfn = 0; in p2m_init_altp2m_ept()
1378 ept = &p2m->ept; in p2m_init_altp2m_ept()
1379 ept->mfn = pagetable_get_pfn(p2m_get_pagetable(p2m)); in p2m_init_altp2m_ept()
1385 struct p2m_domain *p2m; in p2m_find_altp2m_by_eptp() local
1396 p2m = d->arch.altp2m_p2m[i]; in p2m_find_altp2m_by_eptp()
1397 ept = &p2m->ept; in p2m_find_altp2m_by_eptp()