StackFrame.cpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. #include "RuntimeLanguagePch.h"
  6. #if !defined(_M_IX86)
  7. #error X86StackFrame is not supported on this architecture.
  8. #endif
  9. namespace Js
  10. {
  11. bool
  12. X86StackFrame::InitializeByFrameId(void * frame, ScriptContext* scriptContext)
  13. {
  14. this->frame = (void **)frame;
  15. this->stackCheckCodeHeight =
  16. scriptContext->GetThreadContext()->DoInterruptProbe() ? stackCheckCodeHeightWithInterruptProbe
  17. : scriptContext->GetThreadContext()->IsThreadBound() ? stackCheckCodeHeightThreadBound
  18. : stackCheckCodeHeightNotThreadBound;
  19. return Next();
  20. }
  21. bool
  22. X86StackFrame::InitializeByReturnAddress(void * returnAddress, ScriptContext* scriptContext)
  23. {
  24. void ** framePtr;
  25. __asm
  26. {
  27. mov framePtr, ebp;
  28. }
  29. this->frame = framePtr;
  30. this->stackCheckCodeHeight =
  31. scriptContext->GetThreadContext()->DoInterruptProbe() ? stackCheckCodeHeightWithInterruptProbe
  32. : scriptContext->GetThreadContext()->IsThreadBound() ? stackCheckCodeHeightThreadBound
  33. : stackCheckCodeHeightNotThreadBound;
  34. while (Next())
  35. {
  36. if (this->codeAddr == returnAddress)
  37. {
  38. return true;
  39. }
  40. }
  41. return false;
  42. }
  43. bool
  44. X86StackFrame::Next()
  45. {
  46. this->addressOfCodeAddr = this->GetAddressOfReturnAddress();
  47. this->codeAddr = this->GetReturnAddress();
  48. this->frame = (void **)this->frame[0];
  49. return frame != nullptr;
  50. }
  51. bool
  52. X86StackFrame::SkipToFrame(void * frameAddress)
  53. {
  54. this->frame = (void **)frameAddress;
  55. return Next();
  56. }
  57. bool
  58. X86StackFrame::IsInStackCheckCode(void *entry, void *codeAddr, size_t stackCheckCodeHeight)
  59. {
  60. return ((size_t(codeAddr) - size_t(entry)) <= stackCheckCodeHeight);
  61. }
  62. };