From: Keir Fraser Date: Thu, 31 Jul 2008 11:11:00 +0000 (+0100) Subject: x86: Handle p2m_ram_ro with HAP X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14165^2~67 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=e00bff2cd33a2fbbef8a250865bc39e9cbe10a32;p=xen.git x86: Handle p2m_ram_ro with HAP I realized that I had failed to cover the hardware assisted paging case in my earlier p2m_ram_ro patches. This should fix it. Signed-off-by: Trolle Selander --- diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c index ea72939413..9b0b86d426 100644 --- a/xen/arch/x86/hvm/svm/svm.c +++ b/xen/arch/x86/hvm/svm/svm.c @@ -874,9 +874,12 @@ static void svm_do_nested_pgfault(paddr_t gpa, struct cpu_user_regs *regs) mfn_t mfn; unsigned long gfn = gpa >> PAGE_SHIFT; - /* If this GFN is emulated MMIO, pass the fault to the mmio handler */ + /* + * If this GFN is emulated MMIO or marked as read-only, pass the fault + * to the mmio handler. + */ mfn = gfn_to_mfn_current(gfn, &p2mt); - if ( p2mt == p2m_mmio_dm ) + if ( (p2mt == p2m_mmio_dm) || (p2mt == p2m_ram_ro) ) { if ( !handle_mmio() ) hvm_inject_exception(TRAP_gp_fault, 0, 0); diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index fbefbd7f75..161a36dec4 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -1971,7 +1971,7 @@ static void ept_handle_violation(unsigned long qualification, paddr_t gpa) } mfn = gfn_to_mfn(d, gfn, &t); - if ( p2m_is_ram(t) && paging_mode_log_dirty(d) ) + if ( (t != p2m_ram_ro) && p2m_is_ram(t) && paging_mode_log_dirty(d) ) { paging_mark_dirty(d, mfn_x(mfn)); p2m_change_type(d, gfn, p2m_ram_logdirty, p2m_ram_rw); diff --git a/xen/include/asm-x86/p2m.h b/xen/include/asm-x86/p2m.h index 4e478502c3..4909c06591 100644 --- a/xen/include/asm-x86/p2m.h +++ b/xen/include/asm-x86/p2m.h @@ -61,7 +61,7 @@ typedef enum { p2m_invalid = 0, /* Nothing mapped here */ p2m_ram_rw = 1, /* Normal read/write guest RAM */ p2m_ram_logdirty = 2, /* Temporarily read-only for log-dirty */ - p2m_ram_ro = 3, /* Read-only; writes go to the device model */ + p2m_ram_ro = 3, /* Read-only; writes are silently dropped */ p2m_mmio_dm = 4, /* Reads and write go to the device model */ p2m_mmio_direct = 5, /* Read/write mapping of genuine MMIO area */ } p2m_type_t;