|
|
|
|
|
|
|
|
|
|
xen-changelog
[Xen-changelog] Modify CR0 access emulation -- return physical CR0 (exce
# 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
|
<Prev in Thread] |
Current Thread |
[Next in Thread> |
- [Xen-changelog] Modify CR0 access emulation -- return physical CR0 (except,
Xen patchbot -unstable <=
|
|
|
|
|