x86: Handle p2m_ram_ro with HAP
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 31 Jul 2008 11:11:00 +0000 (12:11 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 31 Jul 2008 11:11:00 +0000 (12:11 +0100)
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 <trolle.selander@eu.citrix.com>
xen/arch/x86/hvm/svm/svm.c
xen/arch/x86/hvm/vmx/vmx.c
xen/include/asm-x86/p2m.h

index ea72939413637fe89a0f38642bd8c507f49b1365..9b0b86d426c39f2327a080a99a8d31709c42d81a 100644 (file)
@@ -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);
index fbefbd7f75368af4021d64f7e281557af3311b40..161a36dec4195d7e3377b756c3e5aa00b3c38b9f 100644 (file)
@@ -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);
index 4e478502c3e0699dd515407263f32f32c4310037..4909c065910596160b4a014ebaeb2f9350282503 100644 (file)
@@ -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;