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@xensource.com>
This commit is contained in:
kaf24@firebug.cl.cam.ac.uk committed 2005-12-23 16:42:46 +01:00
1 parent efec87263e
commit f0010ba27f
1 file changed
+15 -1
+15 -1
View File
@@ -885,7 +885,8 @@ static int emulate_privileged_op(struct cpu_user_regs *regs)
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 @@ static int emulate_privileged_op(struct cpu_user_regs *regs)
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;
@@ -941,6 +947,14 @@ static int emulate_privileged_op(struct cpu_user_regs *regs)
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:
goto fail;
}
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.