ThreadContextInfo.h 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. #pragma once
  6. // Keep in sync with WellKnownType in scriptdirect.idl
  7. typedef enum WellKnownHostType
  8. {
  9. WellKnownHostType_HTMLAllCollection = 0,
  10. WellKnownHostType_Response = 1,
  11. WellKnownHostType_Last = WellKnownHostType_Response,
  12. WellKnownHostType_Invalid = WellKnownHostType_Last + 1
  13. } WellKnownHostType;
  14. class ThreadContextInfo
  15. {
  16. public:
  17. ThreadContextInfo();
  18. #if ENABLE_NATIVE_CODEGEN
  19. intptr_t GetNullFrameDisplayAddr() const;
  20. intptr_t GetStrictNullFrameDisplayAddr() const;
  21. intptr_t GetAbsDoubleCstAddr() const;
  22. intptr_t GetAbsFloatCstAddr() const;
  23. intptr_t GetSgnDoubleBitCst() const;
  24. intptr_t GetSgnFloatBitCst() const;
  25. intptr_t GetMaskNegFloatAddr() const;
  26. intptr_t GetMaskNegDoubleAddr() const;
  27. intptr_t GetDoubleOnePointZeroAddr() const;
  28. intptr_t GetDoublePointFiveAddr() const;
  29. intptr_t GetFloatPointFiveAddr() const;
  30. intptr_t GetDoubleNegPointFiveAddr() const;
  31. intptr_t GetDoubleNegOneAddr() const;
  32. intptr_t GetFloatNegPointFiveAddr() const;
  33. intptr_t GetDoubleTwoToFractionAddr() const;
  34. intptr_t GetFloatTwoToFractionAddr() const;
  35. intptr_t GetDoubleNegTwoToFractionAddr() const;
  36. intptr_t GetDoubleNaNAddr() const;
  37. intptr_t GetDoubleIntMaxPlusOneAddr() const;
  38. intptr_t GetDoubleUintMaxPlusOneAddr() const;
  39. intptr_t GetDoubleIntMinMinusOneAddr() const;
  40. intptr_t GetFloatNaNAddr() const;
  41. intptr_t GetFloatNegTwoToFractionAddr() const;
  42. intptr_t GetDoubleZeroAddr() const;
  43. intptr_t GetFloatZeroAddr() const;
  44. intptr_t GetDoubleIntMinAddr() const;
  45. intptr_t GetDoubleTwoTo31Addr() const;
  46. intptr_t GetUIntConvertConstAddr() const;
  47. intptr_t GetUint8ClampedArraySetItemAddr() const;
  48. intptr_t GetConstructorCacheDefaultInstanceAddr() const;
  49. intptr_t GetJavascriptObjectNewInstanceAddr() const;
  50. intptr_t GetJavascriptArrayNewInstanceAddr() const;
  51. intptr_t GetNativeFloatArrayMissingItemAddr() const;
  52. intptr_t GetMantissaMaskAddr() const;
  53. intptr_t GetExponentMaskAddr() const;
  54. #if _M_IX86 || _M_AMD64
  55. intptr_t GetX86AbsMaskF4Addr() const;
  56. intptr_t GetX86AbsMaskD2Addr() const;
  57. intptr_t GetX86NegMaskF4Addr() const;
  58. intptr_t GetX86NegMaskD2Addr() const;
  59. intptr_t GetX86AllNegOnesAddr() const;
  60. intptr_t GetX86AllNegOnesF4Addr() const;
  61. intptr_t GetX86AllZerosAddr() const;
  62. intptr_t GetX86AllOnesF4Addr() const;
  63. intptr_t GetX86LowBytesMaskAddr() const;
  64. intptr_t GetX86HighBytesMaskAddr() const;
  65. intptr_t GetX86DoubleWordSignBitsAddr() const;
  66. intptr_t GetX86WordSignBitsAddr() const;
  67. intptr_t GetX86ByteSignBitsAddr() const;
  68. intptr_t GetX86TwoPower32F4Addr() const;
  69. intptr_t GetX86TwoPower31F4Addr() const;
  70. intptr_t GetX86TwoPower31I4Addr() const;
  71. intptr_t GetX86NegTwoPower31F4Addr() const;
  72. intptr_t GetX86FourLanesMaskAddr(uint8 minorityLane) const;
  73. #endif
  74. intptr_t GetStringReplaceNameAddr() const;
  75. intptr_t GetStringMatchNameAddr() const;
  76. #endif
  77. void SetValidCallTargetForCFG(PVOID callTargetAddress, bool isSetValid = true);
  78. void ResetIsAllJITCodeInPreReservedRegion();
  79. bool IsAllJITCodeInPreReservedRegion() const;
  80. virtual HANDLE GetProcessHandle() const = 0;
  81. virtual bool IsThreadBound() const = 0;
  82. virtual size_t GetScriptStackLimit() const = 0;
  83. virtual intptr_t GetThreadStackLimitAddr() const = 0;
  84. virtual intptr_t GetDisableImplicitFlagsAddr() const = 0;
  85. virtual intptr_t GetImplicitCallFlagsAddr() const = 0;
  86. virtual ptrdiff_t GetChakraBaseAddressDifference() const = 0;
  87. virtual ptrdiff_t GetCRTBaseAddressDifference() const = 0;
  88. #if ENABLE_NATIVE_CODEGEN
  89. #if defined(ENABLE_WASM_SIMD)
  90. virtual intptr_t GetSimdTempAreaAddr(uint8 tempIndex) const = 0;
  91. #endif
  92. virtual intptr_t GetBailOutRegisterSaveSpaceAddr() const = 0;
  93. #endif
  94. virtual bool IsNumericProperty(Js::PropertyId propertyId) = 0;
  95. bool CanBeFalsy(Js::TypeId typeId) { return typeId == this->wellKnownHostTypeIds[WellKnownHostType_HTMLAllCollection]; }
  96. bool IsCFGEnabled();
  97. bool IsClosed();
  98. #if defined(ENABLE_GLOBALIZATION) && defined(_CONTROL_FLOW_GUARD)
  99. Js::DelayLoadWinCoreMemory * GetWinCoreMemoryLibrary();
  100. Js::DelayLoadWinCoreProcessThreads * GetWinCoreProcessThreads();
  101. Js::DelayLoadWinCoreMemory m_delayLoadWinCoreMemoryLibrary;
  102. Js::DelayLoadWinCoreProcessThreads m_delayLoadWinCoreProcessThreads;
  103. #endif
  104. protected:
  105. class AutoCloseHandle
  106. {
  107. public:
  108. AutoCloseHandle(HANDLE handle) : handle(handle) { Assert(this->handle != GetCurrentProcess()); }
  109. ~AutoCloseHandle() { CloseHandle(this->handle); }
  110. HANDLE GetHandle() const { return this->handle; }
  111. private:
  112. HANDLE handle;
  113. };
  114. Js::TypeId wellKnownHostTypeIds[WellKnownHostType_Last + 1];
  115. bool m_isAllJITCodeInPreReservedRegion;
  116. bool m_isClosed;
  117. };
  118. #pragma warning(push)
  119. #pragma warning(error: 4440)
  120. CLANG_WNO_BEGIN("-Wignored-attributes")
  121. // MSVC will give warning C4440 in case of calling convention redefinition
  122. template<typename F> void EnsureStdcall(F*) { typedef F __stdcall* T; }
  123. template<typename F> void EnsureCdecl(F*) { typedef F __cdecl* T; }
  124. CLANG_WNO_END
  125. #pragma warning(pop)
  126. template<typename T>
  127. uintptr_t ShiftCdeclAddr(const ThreadContextInfo*const context, T* address)
  128. {
  129. EnsureCdecl(address);
  130. return ShiftAddr(context, (uintptr_t)address);
  131. }
  132. template<typename T>
  133. uintptr_t ShiftStdcallAddr(const ThreadContextInfo*const context, T* address)
  134. {
  135. EnsureStdcall(address);
  136. return ShiftAddr(context, (uintptr_t)address);
  137. }
  138. template<typename T>
  139. uintptr_t ShiftAddr(const ThreadContextInfo*const context, T* address)
  140. {
  141. return ShiftAddr(context, (uintptr_t)address);
  142. }
  143. uintptr_t ShiftAddr(const ThreadContextInfo*const context, uintptr_t address);