ThreadContextInfo.h 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  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 SetValidCallTargetFile(PVOID callTargetAddress, HANDLE fileHandle, PVOID viewBase, bool isSetValid);
  79. void ResetIsAllJITCodeInPreReservedRegion();
  80. bool IsAllJITCodeInPreReservedRegion() const;
  81. virtual HANDLE GetProcessHandle() const = 0;
  82. virtual bool IsThreadBound() const = 0;
  83. virtual size_t GetScriptStackLimit() const = 0;
  84. virtual intptr_t GetThreadStackLimitAddr() const = 0;
  85. virtual intptr_t GetDisableImplicitFlagsAddr() const = 0;
  86. virtual intptr_t GetImplicitCallFlagsAddr() const = 0;
  87. virtual ptrdiff_t GetChakraBaseAddressDifference() const = 0;
  88. virtual ptrdiff_t GetCRTBaseAddressDifference() const = 0;
  89. #if ENABLE_NATIVE_CODEGEN
  90. #if defined(ENABLE_WASM_SIMD)
  91. virtual intptr_t GetSimdTempAreaAddr(uint8 tempIndex) const = 0;
  92. #endif
  93. virtual intptr_t GetBailOutRegisterSaveSpaceAddr() const = 0;
  94. #endif
  95. virtual bool IsNumericProperty(Js::PropertyId propertyId) = 0;
  96. bool CanBeFalsy(Js::TypeId typeId) { return typeId == this->wellKnownHostTypeIds[WellKnownHostType_HTMLAllCollection]; }
  97. bool IsCFGEnabled();
  98. bool IsClosed();
  99. #if defined(ENABLE_GLOBALIZATION) && defined(_CONTROL_FLOW_GUARD)
  100. Js::DelayLoadWinCoreMemory * GetWinCoreMemoryLibrary();
  101. Js::DelayLoadWinCoreProcessThreads * GetWinCoreProcessThreads();
  102. Js::DelayLoadWinCoreMemory m_delayLoadWinCoreMemoryLibrary;
  103. Js::DelayLoadWinCoreProcessThreads m_delayLoadWinCoreProcessThreads;
  104. #endif
  105. private:
  106. template<bool useFileAPI>
  107. void SetValidCallTargetInternal(
  108. _In_ PVOID callTargetAddress,
  109. _In_opt_ HANDLE fileHandle,
  110. _In_opt_ PVOID viewBase,
  111. bool isSetValid);
  112. protected:
  113. class AutoCloseHandle
  114. {
  115. public:
  116. AutoCloseHandle(HANDLE handle) : handle(handle) { Assert(this->handle != GetCurrentProcess()); }
  117. ~AutoCloseHandle() { CloseHandle(this->handle); }
  118. HANDLE GetHandle() const { return this->handle; }
  119. private:
  120. HANDLE handle;
  121. };
  122. Js::TypeId wellKnownHostTypeIds[WellKnownHostType_Last + 1];
  123. bool m_isAllJITCodeInPreReservedRegion;
  124. bool m_isClosed;
  125. };
  126. #pragma warning(push)
  127. #pragma warning(error: 4440)
  128. CLANG_WNO_BEGIN("-Wignored-attributes")
  129. // MSVC will give warning C4440 in case of calling convention redefinition
  130. template<typename F> void EnsureStdcall(F*) { typedef F __stdcall* T; }
  131. template<typename F> void EnsureCdecl(F*) { typedef F __cdecl* T; }
  132. CLANG_WNO_END
  133. #pragma warning(pop)
  134. template<typename T>
  135. uintptr_t ShiftCdeclAddr(const ThreadContextInfo*const context, T* address)
  136. {
  137. EnsureCdecl(address);
  138. return ShiftAddr(context, (uintptr_t)address);
  139. }
  140. template<typename T>
  141. uintptr_t ShiftStdcallAddr(const ThreadContextInfo*const context, T* address)
  142. {
  143. EnsureStdcall(address);
  144. return ShiftAddr(context, (uintptr_t)address);
  145. }
  146. template<typename T>
  147. uintptr_t ShiftAddr(const ThreadContextInfo*const context, T* address)
  148. {
  149. return ShiftAddr(context, (uintptr_t)address);
  150. }
  151. uintptr_t ShiftAddr(const ThreadContextInfo*const context, uintptr_t address);