|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 1/3] x86/shadow: move dm-mmio handling code in sh_page_fault()
On 23.01.2023 15:26, Jan Beulich wrote:
> 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@xxxxxxxx>
> ---
> v2: New.
>
> --- a/xen/arch/x86/mm/shadow/multi.c
> +++ b/xen/arch/x86/mm/shadow/multi.c
I've sent a stale patch, I'm sorry. This further hunk is needed to keep
!HVM builds working:
@@ -2144,8 +2144,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;
Jan
> @@ -2588,13 +2588,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 */
> @@ -2867,25 +2887,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");
>
>
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |