x86/shadow: move dm-mmio handling code in sh_page_fault()

Do away with the partly mis-named "mmio" label there, which really is
only about emulated MMIO. Move the code to the place where the sole
"goto" was. Re-order steps slightly: Assertion first, perfc increment
outside of the locked region, and "gpa" calculation closer to the first
use of the variable. Also make the HVM conditional cover the entire
if(), as p2m_mmio_dm isn't applicable to PV; specifically get_gfn()
won't ever return this type for PV domains.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
This commit is contained in:
Jan Beulich committed 2023-02-27 13:34:30 +01:00
1 parent 608f85a181
commit 4e8205f4fd
1 file changed
+22 -21
+22 -21
View File
@@ -2161,8 +2161,8 @@ static int cf_check sh_page_fault(
gfn_t gfn = _gfn(0);
mfn_t gmfn, sl1mfn = _mfn(0);
shadow_l1e_t sl1e, *ptr_sl1e;
paddr_t gpa;
#ifdef CONFIG_HVM
paddr_t gpa;
struct sh_emulate_ctxt emul_ctxt;
const struct x86_emulate_ops *emul_ops;
int r;
@@ -2586,13 +2586,33 @@ static int cf_check sh_page_fault(
goto emulate;
}
#ifdef CONFIG_HVM
/* Need to hand off device-model MMIO to the device model */
if ( p2mt == p2m_mmio_dm )
{
ASSERT(is_hvm_vcpu(v));
if ( !guest_mode(regs) )
goto not_a_shadow_fault;
sh_audit_gw(v, &gw);
gpa = guest_walk_to_gpa(&gw);
goto mmio;
SHADOW_PRINTK("mmio %#"PRIpaddr"\n", gpa);
shadow_audit_tables(v);
sh_reset_early_unshadow(v);
paging_unlock(d);
put_gfn(d, gfn_x(gfn));
perfc_incr(shadow_fault_mmio);
trace_shadow_gen(TRC_SHADOW_MMIO, va);
return handle_mmio_with_translation(va, gpa >> PAGE_SHIFT, access)
? EXCRET_fault_fixed : 0;
}
#endif /* CONFIG_HVM */
/* Ignore attempts to write to read-only memory. */
if ( p2m_is_readonly(p2mt) && (ft == ft_demand_write) )
goto emulate_readonly; /* skip over the instruction */
@@ -2865,25 +2885,6 @@ static int cf_check sh_page_fault(
return EXCRET_fault_fixed;
#endif /* CONFIG_HVM */
mmio:
if ( !guest_mode(regs) )
goto not_a_shadow_fault;
#ifdef CONFIG_HVM
ASSERT(is_hvm_vcpu(v));
perfc_incr(shadow_fault_mmio);
sh_audit_gw(v, &gw);
SHADOW_PRINTK("mmio %#"PRIpaddr"\n", gpa);
shadow_audit_tables(v);
sh_reset_early_unshadow(v);
paging_unlock(d);
put_gfn(d, gfn_x(gfn));
trace_shadow_gen(TRC_SHADOW_MMIO, va);
return (handle_mmio_with_translation(va, gpa >> PAGE_SHIFT, access)
? EXCRET_fault_fixed : 0);
#else
BUG();
#endif
not_a_shadow_fault:
sh_audit_gw(v, &gw);
SHADOW_PRINTK("not a shadow fault\n");
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.