Binary files xen-unstable.hg-orig/.hg/dirstate and xen-unstable.hg/.hg/dirstate differ Binary files xen-unstable.hg-orig/.hg/store/data/xen/common/page__alloc.c.i and xen-unstable.hg/.hg/store/data/xen/common/page__alloc.c.i differ Binary files xen-unstable.hg-orig/.hg/store/undo and xen-unstable.hg/.hg/store/undo differ Binary files xen-unstable.hg-orig/.hg/undo.dirstate and xen-unstable.hg/.hg/undo.dirstate differ diff -uNr xen-unstable.hg-orig/xen/arch/x86/hvm/svm/svm.c xen-unstable.hg/xen/arch/x86/hvm/svm/svm.c --- xen-unstable.hg-orig/xen/arch/x86/hvm/svm/svm.c 2008-07-22 18:37:51.000000000 +0100 +++ xen-unstable.hg/xen/arch/x86/hvm/svm/svm.c 2008-07-31 11:36:37.870678686 +0100 @@ -874,9 +874,9 @@ 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 -uNr xen-unstable.hg-orig/xen/arch/x86/hvm/vmx/vmx.c xen-unstable.hg/xen/arch/x86/hvm/vmx/vmx.c --- xen-unstable.hg-orig/xen/arch/x86/hvm/vmx/vmx.c 2008-07-22 18:37:51.000000000 +0100 +++ xen-unstable.hg/xen/arch/x86/hvm/vmx/vmx.c 2008-07-31 11:49:01.600678686 +0100 @@ -1971,7 +1971,7 @@ } 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 -uNr xen-unstable.hg-orig/xen/include/asm-x86/p2m.h xen-unstable.hg/xen/include/asm-x86/p2m.h --- xen-unstable.hg-orig/xen/include/asm-x86/p2m.h 2008-06-01 13:51:38.000000000 +0100 +++ xen-unstable.hg/xen/include/asm-x86/p2m.h 2008-07-31 11:48:09.020678686 +0100 @@ -61,7 +61,7 @@ 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;