ntoskrnl.exe: Add emulation of rdmsr for MSR_LSTAR control register.

Signed-off-by: Derek Lesho <dereklesho52@Gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Derek Lesho 2019-03-21 11:10:08 -04:00 committed by Alexandre Julliard
parent 9a2ff84402
commit e7863eaa4e
1 changed files with 26 additions and 0 deletions

View File

@ -473,6 +473,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(int);
#define REX_R 4
#define REX_W 8
#define MSR_LSTAR 0xc0000082
#define REGMODRM_MOD( regmodrm, rex ) ((regmodrm) >> 6)
#define REGMODRM_REG( regmodrm, rex ) (((regmodrm) >> 3) & 7) | (((rex) & REX_R) ? 8 : 0)
#define REGMODRM_RM( regmodrm, rex ) (((regmodrm) & 7) | (((rex) & REX_B) ? 8 : 0))
@ -586,6 +588,12 @@ static BYTE *INSTR_GetOperandAddr( CONTEXT *context, BYTE *instr,
}
static void fake_syscall_function(void)
{
TRACE("() stub\n");
}
/***********************************************************************
* emulate_instruction
*
@ -757,6 +765,24 @@ static DWORD emulate_instruction( EXCEPTION_RECORD *rec, CONTEXT *context )
context->Rip += prefixlen + 3;
return ExceptionContinueExecution;
}
case 0x32: /* rdmsr */
{
ULONG reg = context->Rcx;
TRACE("rdmsr CR 0x%08x\n", reg);
switch (reg)
{
case MSR_LSTAR:
{
ULONG_PTR syscall_address = (ULONG_PTR)fake_syscall_function;
context->Rdx = (ULONG)(syscall_address >> 32);
context->Rax = (ULONG)syscall_address;
break;
}
default: return ExceptionContinueSearch;
}
context->Rip += prefixlen + 2;
return ExceptionContinueExecution;
}
case 0xb6: /* movzx Eb, Gv */
case 0xb7: /* movzx Ew, Gv */
{