diff -r 01e178f7ec6d xen/arch/x86/hvm/vmx/realmode.c --- a/xen/arch/x86/hvm/vmx/realmode.c Mon Jan 28 12:58:57 2008 +0000 +++ b/xen/arch/x86/hvm/vmx/realmode.c Wed Jan 30 09:36:29 2008 -0800 @@ -410,6 +410,44 @@ realmode_write_cr( return X86EMUL_OKAY; } +static int +realmode_read_msr( + unsigned long reg, + uint64_t *val, + struct x86_emulate_ctxt *ctxt) +{ + switch ( reg ) + { + case 0xc0000080L: /* IA32_EFER */ + rdmsrl(reg, *val); + break; + default: + gdprintk(XENLOG_ERR, "reading of msr 0x%lx by guest not allowed\n", reg); + return X86EMUL_UNHANDLEABLE; + } + + return X86EMUL_OKAY; +} + +static int +realmode_write_msr( + unsigned long reg, + uint64_t val, + struct x86_emulate_ctxt *ctxt) +{ + switch ( reg ) + { + case 0xc0000080L: /* IA32_EFER */ + wrmsrl(reg, val); + break; + default: + gdprintk(XENLOG_ERR, "writing of msr 0x%lx by guest not allowed\n", reg); + return X86EMUL_UNHANDLEABLE; + } + + return X86EMUL_OKAY; +} + static int realmode_write_rflags( unsigned long val, struct x86_emulate_ctxt *ctxt) @@ -495,6 +533,8 @@ static struct x86_emulate_ops realmode_e .write_io = realmode_write_io, .read_cr = realmode_read_cr, .write_cr = realmode_write_cr, + .read_msr = realmode_read_msr, + .write_msr = realmode_write_msr, .write_rflags = realmode_write_rflags, .wbinvd = realmode_wbinvd, .cpuid = realmode_cpuid,