[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Modify CR0 access emulation -- return physical CR0 (except
# HG changeset patch # User kaf24@xxxxxxxxxxxxxxxxxxxx # Node ID 829517be689f95d3d935ab1af17d0c31ee4950fc # Parent 87e5ac90a8df30da6e76be4e93d0f67de6f98f80 Modify CR0 access emulation -- return physical CR0 (except for TS) and allow only the same physical flags to be written back to CR0 by a guest. Add write-to-CR4 emulation, but check that the write does not modify any CR4 flags. Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx> diff -r 87e5ac90a8df -r 829517be689f xen/arch/x86/traps.c --- a/xen/arch/x86/traps.c Fri Dec 23 09:12:41 2005 +++ b/xen/arch/x86/traps.c Fri Dec 23 15:42:46 2005 @@ -885,7 +885,8 @@ switch ( modrm_reg ) { case 0: /* Read CR0 */ - *reg = v->arch.guest_context.ctrlreg[0]; + *reg = (read_cr0() & ~X86_CR0_TS) | + v->arch.guest_context.ctrlreg[0]; break; case 2: /* Read CR2 */ @@ -927,6 +928,11 @@ switch ( modrm_reg ) { case 0: /* Write CR0 */ + if ( (*reg ^ read_cr0()) & ~X86_CR0_TS ) + { + DPRINTK("Attempt to change unmodifiable CR0 flags.\n"); + goto fail; + } (void)do_fpu_taskswitch(!!(*reg & X86_CR0_TS)); break; @@ -939,6 +945,14 @@ LOCK_BIGLOCK(v->domain); (void)new_guest_cr3(*reg); UNLOCK_BIGLOCK(v->domain); + break; + + case 4: + if ( *reg != (read_cr4() & ~(X86_CR4_PGE|X86_CR4_PSE)) ) + { + DPRINTK("Attempt to change CR4 flags.\n"); + goto fail; + } break; default: _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |