Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wine-mirror
GitHub Repository: wine-mirror/wine
Path: blob/master/libs/symcrypt/inc/C_asm_shared.inc
15010 views
/*
 C_asm_shared.inc  file to synchronize C and Asm information
 Copyright (c) Microsoft Corporation. Licensed under the MIT license.

 This is a file that is included in both C and ASM such that the values are the same on both sides.
 We use the C preprocessor to set ASM constants, as we already need to use the C preprocessor for
 symcryptasm processing (see scripts/symcryptasm_processor.py).
 We use this to define the structure offsets that the ASM code uses.
 By having equivalent C constants we can add checks to the C code to ensure they are correct.

*/

#include "symcrypt_internal_shared.inc"

#if defined(SYMCRYPT_MASM)
#define SET(_variable, _value) _variable EQU _value
#elif defined(SYMCRYPT_GAS)
#define SET(_variable, _value) .set _variable, _value
#else // assume C
#define SET(_variable, _value) const SIZE_T _variable = _value;
#endif

SET(SymCryptModulusNdigitsOffsetAmd64,          4);
SET(SymCryptModulusInv64OffsetAmd64,            24);
SET(SymCryptModulusValueOffsetAmd64,            128);
SET(SymCryptNegDivisorSingleDigitOffsetAmd64,   256);

SET(SymCryptModulusNdigitsOffsetX86,            4);
SET(SymCryptModulusInv64OffsetX86,              24);
SET(SymCryptModulusValueOffsetX86,              96);

SET(SymCryptModulusNdigitsOffsetArm64,          4);
SET(SymCryptModulusInv64OffsetArm64,            24);
SET(SymCryptModulusValueOffsetArm64,            128);

SET(SymCryptModulusNdigitsOffsetArm,            4);
SET(SymCryptModulusInv64OffsetArm,              24);
SET(SymCryptModulusValueOffsetArm,              96);

#if !defined(SYMCRYPT_MASM) && !defined(SYMCRYPT_GAS)
// Preserve the definition of SET for use in symcryptasm processing
#undef SET
#endif

#if SYMCRYPT_CPU_AMD64
#define SYMCRYPT_CHECK_ASM_OFFSETS \
    SYMCRYPT_CHECK_ASM_OFFSET( SymCryptModulusNdigitsOffsetAmd64, SYMCRYPT_FIELD_OFFSET( SYMCRYPT_MODULUS, nDigits ) );\
    SYMCRYPT_CHECK_ASM_OFFSET( SymCryptModulusInv64OffsetAmd64, SYMCRYPT_FIELD_OFFSET( SYMCRYPT_MODULUS, inv64 ));\
    SYMCRYPT_CHECK_ASM_OFFSET( SymCryptModulusValueOffsetAmd64, SYMCRYPT_FIELD_OFFSET( SYMCRYPT_MODULUS, Divisor.Int.ti.fdef.uint32 ));\
    SYMCRYPT_CHECK_ASM_OFFSET( SymCryptNegDivisorSingleDigitOffsetAmd64, SYMCRYPT_FIELD_OFFSET( SYMCRYPT_MODULUS, Divisor.Int.ti.fdef.uint32 ) + (2*SYMCRYPT_FDEF_DIGIT_SIZE) );\

#elif SYMCRYPT_CPU_X86
#define SYMCRYPT_CHECK_ASM_OFFSETS \
    SYMCRYPT_CHECK_ASM_OFFSET( SymCryptModulusNdigitsOffsetX86, SYMCRYPT_FIELD_OFFSET( SYMCRYPT_MODULUS, nDigits ) );\
    SYMCRYPT_CHECK_ASM_OFFSET( SymCryptModulusInv64OffsetX86, SYMCRYPT_FIELD_OFFSET( SYMCRYPT_MODULUS, inv64 ));\
    SYMCRYPT_CHECK_ASM_OFFSET( SymCryptModulusValueOffsetX86, SYMCRYPT_FIELD_OFFSET( SYMCRYPT_MODULUS, Divisor.Int.ti.fdef.uint32 ));\

#elif SYMCRYPT_CPU_ARM64
#define SYMCRYPT_CHECK_ASM_OFFSETS \
    SYMCRYPT_CHECK_ASM_OFFSET( SymCryptModulusNdigitsOffsetArm64, SYMCRYPT_FIELD_OFFSET( SYMCRYPT_MODULUS, nDigits ) );\
    SYMCRYPT_CHECK_ASM_OFFSET( SymCryptModulusInv64OffsetArm64, SYMCRYPT_FIELD_OFFSET( SYMCRYPT_MODULUS, inv64 ));\
    SYMCRYPT_CHECK_ASM_OFFSET( SymCryptModulusValueOffsetArm64, SYMCRYPT_FIELD_OFFSET( SYMCRYPT_MODULUS, Divisor.Int.ti.fdef.uint32 ));\

#elif SYMCRYPT_CPU_ARM
#define SYMCRYPT_CHECK_ASM_OFFSETS \
    SYMCRYPT_CHECK_ASM_OFFSET( SymCryptModulusNdigitsOffsetArm, SYMCRYPT_FIELD_OFFSET( SYMCRYPT_MODULUS, nDigits ) );\
    SYMCRYPT_CHECK_ASM_OFFSET( SymCryptModulusInv64OffsetArm, SYMCRYPT_FIELD_OFFSET( SYMCRYPT_MODULUS, inv64 ));\
    SYMCRYPT_CHECK_ASM_OFFSET( SymCryptModulusValueOffsetArm, SYMCRYPT_FIELD_OFFSET( SYMCRYPT_MODULUS, Divisor.Int.ti.fdef.uint32 ));\

#endif // CPU_*

#if !defined(SYMCRYPT_CHECK_ASM_OFFSETS)
#define SYMCRYPT_CHECK_ASM_OFFSETS
#endif