Lines Matching refs:gw

175 sh_walk_guest_tables(struct vcpu *v, unsigned long va, walk_t *gw,  in sh_walk_guest_tables()  argument
178 return guest_walk_tables(v, p2m_get_hostp2m(v->domain), va, gw, pfec, in sh_walk_guest_tables()
196 shadow_check_gwalk(struct vcpu *v, unsigned long va, walk_t *gw, int version) in shadow_check_gwalk() argument
227 mismatch |= (gw->l4e.l4 != l4p[guest_l4_table_offset(va)].l4); in shadow_check_gwalk()
228 l3p = map_domain_page(gw->l3mfn); in shadow_check_gwalk()
229 mismatch |= (gw->l3e.l3 != l3p[guest_l3_table_offset(va)].l3); in shadow_check_gwalk()
232 mismatch |= (gw->l3e.l3 != in shadow_check_gwalk()
235 l2p = map_domain_page(gw->l2mfn); in shadow_check_gwalk()
236 mismatch |= (gw->l2e.l2 != l2p[guest_l2_table_offset(va)].l2); in shadow_check_gwalk()
240 mismatch |= (gw->l2e.l2 != l2p[guest_l2_table_offset(va)].l2); in shadow_check_gwalk()
243 (guest_l2e_get_flags(gw->l2e) & _PAGE_PSE)) ) in shadow_check_gwalk()
245 l1p = map_domain_page(gw->l1mfn); in shadow_check_gwalk()
246 mismatch |= (gw->l1e.l1 != l1p[guest_l1_table_offset(va)].l1); in shadow_check_gwalk()
255 shadow_check_gl1e(struct vcpu *v, walk_t *gw) in shadow_check_gl1e() argument
259 if ( !mfn_valid(gw->l1mfn) ) in shadow_check_gl1e()
263 l1p = map_domain_page(gw->l1mfn); in shadow_check_gl1e()
264 nl1e.l1 = l1p[guest_l1_table_offset(gw->va)].l1; in shadow_check_gl1e()
267 return gw->l1e.l1 != nl1e.l1; in shadow_check_gl1e()
283 gw_remove_write_accesses(struct vcpu *v, unsigned long va, walk_t *gw) in gw_remove_write_accesses() argument
291 if ( mfn_is_out_of_sync(gw->l3mfn) ) in gw_remove_write_accesses()
293 sh_resync(d, gw->l3mfn); in gw_remove_write_accesses()
298 if ( sh_remove_write_access(d, gw->l3mfn, 3, va) ) in gw_remove_write_accesses()
303 if ( mfn_is_out_of_sync(gw->l2mfn) ) in gw_remove_write_accesses()
305 sh_resync(d, gw->l2mfn); in gw_remove_write_accesses()
310 if ( sh_remove_write_access(d, gw->l2mfn, 2, va) ) in gw_remove_write_accesses()
315 (guest_l2e_get_flags(gw->l2e) & _PAGE_PSE)) in gw_remove_write_accesses()
317 && !mfn_is_out_of_sync(gw->l1mfn) in gw_remove_write_accesses()
319 && sh_remove_write_access(d, gw->l1mfn, 1, va) ) in gw_remove_write_accesses()
327 static void sh_audit_gw(struct vcpu *v, const walk_t *gw) in sh_audit_gw() argument
337 if ( mfn_valid(gw->l4mfn) in sh_audit_gw()
338 && mfn_valid((smfn = get_shadow_status(d, gw->l4mfn, in sh_audit_gw()
341 if ( mfn_valid(gw->l3mfn) in sh_audit_gw()
342 && mfn_valid((smfn = get_shadow_status(d, gw->l3mfn, in sh_audit_gw()
346 if ( mfn_valid(gw->l2mfn) ) in sh_audit_gw()
348 if ( mfn_valid((smfn = get_shadow_status(d, gw->l2mfn, in sh_audit_gw()
352 if ( mfn_valid((smfn = get_shadow_status(d, gw->l2mfn, in sh_audit_gw()
357 if ( mfn_valid(gw->l1mfn) in sh_audit_gw()
358 && mfn_valid((smfn = get_shadow_status(d, gw->l1mfn, in sh_audit_gw()
361 else if ( (guest_l2e_get_flags(gw->l2e) & _PAGE_PRESENT) in sh_audit_gw()
362 && (guest_l2e_get_flags(gw->l2e) & _PAGE_PSE) in sh_audit_gw()
364 (smfn = get_fl1_shadow_status(d, guest_l2e_get_gfn(gw->l2e)))) ) in sh_audit_gw()
1649 walk_t *gw, in shadow_get_and_create_l4e() argument
1655 return sh_linear_l4_table(v) + shadow_l4_linear_offset(gw->va); in shadow_get_and_create_l4e()
1659 walk_t *gw, in shadow_get_and_create_l3e() argument
1667 if ( !mfn_valid(gw->l3mfn) ) return NULL; /* No guest page. */ in shadow_get_and_create_l3e()
1669 sl4e = shadow_get_and_create_l4e(v, gw, &sl4mfn); in shadow_get_and_create_l3e()
1681 *sl3mfn = get_shadow_status(d, gw->l3mfn, SH_type_l3_shadow); in shadow_get_and_create_l3e()
1685 *sl3mfn = sh_make_shadow(v, gw->l3mfn, SH_type_l3_shadow); in shadow_get_and_create_l3e()
1688 l4e_propagate_from_guest(v, gw->l4e, *sl3mfn, &new_sl4e, ft); in shadow_get_and_create_l3e()
1700 return sh_linear_l3_table(v) + shadow_l3_linear_offset(gw->va); in shadow_get_and_create_l3e()
1706 walk_t *gw, in shadow_get_and_create_l2e() argument
1715 if ( !mfn_valid(gw->l2mfn) ) return NULL; /* No guest page. */ in shadow_get_and_create_l2e()
1717 sl3e = shadow_get_and_create_l3e(v, gw, &sl3mfn, ft, resync); in shadow_get_and_create_l2e()
1732 guest_l4_table_offset(gw->va) == 0 && in shadow_get_and_create_l2e()
1733 guest_l3_table_offset(gw->va) == 3 ) in shadow_get_and_create_l2e()
1737 *sl2mfn = get_shadow_status(d, gw->l2mfn, t); in shadow_get_and_create_l2e()
1741 *sl2mfn = sh_make_shadow(v, gw->l2mfn, t); in shadow_get_and_create_l2e()
1744 l3e_propagate_from_guest(v, gw->l3e, *sl2mfn, &new_sl3e, ft); in shadow_get_and_create_l2e()
1756 return sh_linear_l2_table(v) + shadow_l2_linear_offset(gw->va); in shadow_get_and_create_l2e()
1761 + shadow_l3_linear_offset(gw->va); in shadow_get_and_create_l2e()
1766 return sh_linear_l2_table(v) + shadow_l2_linear_offset(gw->va); in shadow_get_and_create_l2e()
1773 (void) shadow_l2_index(sl2mfn, guest_l2_table_offset(gw->va)); in shadow_get_and_create_l2e()
1775 return sh_linear_l2_table(v) + shadow_l2_linear_offset(gw->va); in shadow_get_and_create_l2e()
1781 walk_t *gw, in shadow_get_and_create_l1e() argument
1791 sl2e = shadow_get_and_create_l2e(v, gw, &sl2mfn, ft, &resync); in shadow_get_and_create_l1e()
1799 || !(guest_l2e_get_flags(gw->l2e) & _PAGE_PSE)) ) in shadow_get_and_create_l1e()
1807 int r, flags = guest_l2e_get_flags(gw->l2e); in shadow_get_and_create_l1e()
1814 gfn_t l2gfn = guest_l2e_get_gfn(gw->l2e); in shadow_get_and_create_l1e()
1825 if ( !mfn_valid(gw->l1mfn) ) return NULL; /* No guest page. */ in shadow_get_and_create_l1e()
1826 *sl1mfn = get_shadow_status(d, gw->l1mfn, SH_type_l1_shadow); in shadow_get_and_create_l1e()
1830 *sl1mfn = sh_make_shadow(v, gw->l1mfn, SH_type_l1_shadow); in shadow_get_and_create_l1e()
1834 l2e_propagate_from_guest(v, gw->l2e, *sl1mfn, &new_sl2e, ft); in shadow_get_and_create_l1e()
1845 (void) shadow_l1_index(sl1mfn, guest_l1_table_offset(gw->va)); in shadow_get_and_create_l1e()
1856 return sh_linear_l1_table(v) + shadow_l1_linear_offset(gw->va); in shadow_get_and_create_l1e()
2594 static void sh_prefetch(struct vcpu *v, walk_t *gw, in sh_prefetch() argument
2616 if ( mfn_valid(gw->l1mfn) ) in sh_prefetch()
2619 gl1p = map_domain_page(gw->l1mfn); in sh_prefetch()
2620 gl1p += guest_l1_table_offset(gw->va); in sh_prefetch()
2623 if ( mfn_is_out_of_sync(gw->l1mfn) ) in sh_prefetch()
2625 mfn_t snpmfn = oos_snapshot_lookup(d, gw->l1mfn); in sh_prefetch()
2629 snpl1p += guest_l1_table_offset(gw->va); in sh_prefetch()
2640 if ( mfn_valid(gw->l1mfn) ) in sh_prefetch()
2655 ASSERT(guest_l2e_get_flags(gw->l2e) & _PAGE_PSE); in sh_prefetch()
2658 _gfn(gfn_x(guest_l1e_get_gfn(gw->l1e)) + i), in sh_prefetch()
2659 guest_l1e_get_flags(gw->l1e)); in sh_prefetch()
2834 walk_t gw; in sh_page_fault() local
3062 walk_ok = sh_walk_guest_tables(v, va, &gw, error_code); in sh_page_fault()
3066 if ( gw.pfec & PFEC_page_present ) in sh_page_fault()
3075 regs->error_code = gw.pfec & PFEC_arch_mask; in sh_page_fault()
3090 gfn = guest_walk_to_gfn(&gw); in sh_page_fault()
3128 rc = gw_remove_write_accesses(v, va, &gw); in sh_page_fault()
3152 if ( !shadow_check_gwalk(v, va, &gw, version) ) in sh_page_fault()
3161 sh_audit_gw(v, &gw); in sh_page_fault()
3165 ptr_sl1e = shadow_get_and_create_l1e(v, &gw, &sl1mfn, ft); in sh_page_fault()
3207 if ( shadow_check_gl1e(v, &gw) ) in sh_page_fault()
3217 l1e_propagate_from_guest(v, gw.l1e, gmfn, &sl1e, ft, p2mt); in sh_page_fault()
3221 if ( mfn_valid(gw.l1mfn) in sh_page_fault()
3222 && mfn_is_out_of_sync(gw.l1mfn) ) in sh_page_fault()
3225 mfn_t snpmfn = oos_snapshot_lookup(d, gw.l1mfn); in sh_page_fault()
3231 snp[guest_l1_table_offset(va)] = gw.l1e; in sh_page_fault()
3238 sh_prefetch(v, &gw, ptr_sl1e, sl1mfn); in sh_page_fault()
3258 gpa = guest_walk_to_gpa(&gw); in sh_page_fault()
3291 trace_shadow_fixup(gw.l1e, va); in sh_page_fault()
3293 sh_audit_gw(v, &gw); in sh_page_fault()
3364 sh_audit_gw(v, &gw); in sh_page_fault()
3532 trace_shadow_emulate(gw.l1e, va); in sh_page_fault()
3541 sh_audit_gw(v, &gw); in sh_page_fault()
3552 sh_audit_gw(v, &gw); in sh_page_fault()
3560 trace_not_shadow_fault(gw.l1e, va); in sh_page_fault()
3708 walk_t gw; in sh_gva_to_gfn() local
3719 if ( !(walk_ok = sh_walk_guest_tables(v, va, &gw, *pfec)) ) in sh_gva_to_gfn()
3721 *pfec = gw.pfec; in sh_gva_to_gfn()
3724 gfn = guest_walk_to_gfn(&gw); in sh_gva_to_gfn()