1
0
Fork 0
mirror of synced 2025-03-07 03:53:26 +01:00

ntdll: Factor out xstate_from_server() function.

This commit is contained in:
Paul Gofman 2024-03-18 15:00:06 -06:00 committed by Alexandre Julliard
parent 6bc2c09232
commit 25e0a25807

View file

@ -613,6 +613,28 @@ static NTSTATUS context_to_server( context_t *to, USHORT to_machine, const void
}
/***********************************************************************
* xstate_from_server
*
* Copy xstate from the server format.
*/
static void xstate_from_server( CONTEXT_EX *xctx, const context_t *from )
{
XSTATE *xs = (XSTATE *)((char *)xctx + xctx->XState.Offset);
unsigned int i;
xs->Mask &= ~4;
if (xs->CompactionMask) xs->CompactionMask = 0x8000000000000004;
for (i = 0; i < ARRAY_SIZE( from->ymm.regs.ymm_high); i++)
{
if (!from->ymm.regs.ymm_high[i].low && !from->ymm.regs.ymm_high[i].high) continue;
memcpy( &xs->YmmContext, &from->ymm.regs, sizeof(xs->YmmContext) );
xs->Mask |= 4;
break;
}
}
/***********************************************************************
* context_from_server
*
@ -686,20 +708,7 @@ static NTSTATUS context_from_server( void *dst, const context_t *from, USHORT ma
memcpy( to->ExtendedRegisters, from->ext.i386_regs, sizeof(to->ExtendedRegisters) );
}
if ((from->flags & SERVER_CTX_YMM_REGISTERS) && (to_flags & CONTEXT_I386_XSTATE))
{
CONTEXT_EX *xctx = (CONTEXT_EX *)(to + 1);
XSTATE *xs = (XSTATE *)((char *)xctx + xctx->XState.Offset);
xs->Mask &= ~4;
if (xs->CompactionMask) xs->CompactionMask = 0x8000000000000004;
for (i = 0; i < ARRAY_SIZE( from->ymm.regs.ymm_high); i++)
{
if (!from->ymm.regs.ymm_high[i].low && !from->ymm.regs.ymm_high[i].high) continue;
memcpy( &xs->YmmContext, &from->ymm.regs, sizeof(xs->YmmContext) );
xs->Mask |= 4;
break;
}
}
xstate_from_server( (CONTEXT_EX *)(to + 1), from );
return STATUS_SUCCESS;
}
@ -760,20 +769,7 @@ static NTSTATUS context_from_server( void *dst, const context_t *from, USHORT ma
to->Dr7 = from->debug.x86_64_regs.dr7;
}
if ((from->flags & SERVER_CTX_YMM_REGISTERS) && (to_flags & CONTEXT_I386_XSTATE))
{
CONTEXT_EX *xctx = (CONTEXT_EX *)(to + 1);
XSTATE *xs = (XSTATE *)((char *)xctx + xctx->XState.Offset);
xs->Mask &= ~4;
if (xs->CompactionMask) xs->CompactionMask = 0x8000000000000004;
for (i = 0; i < ARRAY_SIZE( from->ymm.regs.ymm_high); i++)
{
if (!from->ymm.regs.ymm_high[i].low && !from->ymm.regs.ymm_high[i].high) continue;
memcpy( &xs->YmmContext, &from->ymm.regs, sizeof(xs->YmmContext) );
xs->Mask |= 4;
break;
}
}
xstate_from_server( (CONTEXT_EX *)(to + 1), from );
return STATUS_SUCCESS;
}
@ -835,20 +831,7 @@ static NTSTATUS context_from_server( void *dst, const context_t *from, USHORT ma
to->Dr7 = from->debug.x86_64_regs.dr7;
}
if ((from->flags & SERVER_CTX_YMM_REGISTERS) && (to_flags & CONTEXT_AMD64_XSTATE))
{
CONTEXT_EX *xctx = (CONTEXT_EX *)(to + 1);
XSTATE *xs = (XSTATE *)((char *)xctx + xctx->XState.Offset);
xs->Mask &= ~4;
if (xs->CompactionMask) xs->CompactionMask = 0x8000000000000004;
for (i = 0; i < ARRAY_SIZE( from->ymm.regs.ymm_high); i++)
{
if (!from->ymm.regs.ymm_high[i].low && !from->ymm.regs.ymm_high[i].high) continue;
memcpy( &xs->YmmContext, &from->ymm.regs, sizeof(xs->YmmContext) );
xs->Mask |= 4;
break;
}
}
xstate_from_server( (CONTEXT_EX *)(to + 1), from );
return STATUS_SUCCESS;
}
@ -917,20 +900,7 @@ static NTSTATUS context_from_server( void *dst, const context_t *from, USHORT ma
to->Dr7 = from->debug.i386_regs.dr7;
}
if ((from->flags & SERVER_CTX_YMM_REGISTERS) && (to_flags & CONTEXT_AMD64_XSTATE))
{
CONTEXT_EX *xctx = (CONTEXT_EX *)(to + 1);
XSTATE *xs = (XSTATE *)((char *)xctx + xctx->XState.Offset);
xs->Mask &= ~4;
if (xs->CompactionMask) xs->CompactionMask = 0x8000000000000004;
for (i = 0; i < ARRAY_SIZE( from->ymm.regs.ymm_high); i++)
{
if (!from->ymm.regs.ymm_high[i].low && !from->ymm.regs.ymm_high[i].high) continue;
memcpy( &xs->YmmContext, &from->ymm.regs, sizeof(xs->YmmContext) );
xs->Mask |= 4;
break;
}
}
xstate_from_server( (CONTEXT_EX *)(to + 1), from );
return STATUS_SUCCESS;
}