1
1
#include < setjmp.h>
2
+ #include < vector>
2
3
3
4
#include " DetectOs.hpp"
4
5
#include " MemoryManager.hpp"
9
10
#include < processthreadsapi.h>
10
11
#endif
11
12
12
- #ifdef LINUX
13
+ #if defined( LINUX) || defined(APPLE)
13
14
#include < pthread.h>
14
15
#endif
15
16
@@ -18,14 +19,19 @@ namespace sd
18
19
namespace
19
20
{
20
21
21
- #define __READ_RBP (rbp ) __asm__ volatile (" movq %%rbp, %0" : " =r" (rbp))
22
+ #define __READ_RBP (rbp ) __asm__ volatile (" movq %%rbp, %0" : " =r" (rbp)) // x86
23
+ #define __READ_RBP_ARM (rbp ) __asm__ volatile (" mov %0, sp" : " =r" (rbp)) // arm64
22
24
#define __READ_RSP (rsp ) __asm__ volatile (" movq %%rsp, %0" : " =r" (rsp))
23
25
24
- auto getStackRsp()
26
+ uint8_t * getStackRsp()
25
27
{
26
- intptr_t *rsp;
27
- __READ_RSP (rsp);
28
- return (uint8_t *)rsp;
28
+ intptr_t *ptr;
29
+ #ifdef APPLE
30
+ __READ_RBP_ARM (ptr);
31
+ #else
32
+ __READ_RSP (ptr);
33
+ #endif
34
+ return (uint8_t *)ptr;
29
35
}
30
36
31
37
#ifdef WINDOWS
@@ -38,17 +44,16 @@ namespace sd
38
44
return std::make_tuple ((uint8_t *)highLimit - 10 , (uint8_t *)lowLimit, rsp);
39
45
}
40
46
#endif
41
- #ifdef LINUX
47
+ #if defined( LINUX) || defined(APPLE)
42
48
auto getStackBounds ()
43
49
{
44
50
auto rsp = getStackRsp ();
45
51
pthread_attr_t attrs;
46
- pthread_getattr_np (pthread_self (), &attrs);
47
- void *stack_ptr;
48
- size_t stack_size;
49
- pthread_attr_getstack (&attrs, &stack_ptr, &stack_size);
52
+ auto self = pthread_self ();
53
+ void *stack_ptr = pthread_get_stackaddr_np (self);
54
+ size_t stack_size = pthread_get_stacksize_np (self);
50
55
51
- return std::make_tuple ((uint8_t *)stack_ptr + stack_size - 10 , (uint8_t *)stack_ptr, rsp);
56
+ return std::make_tuple ((uint8_t *)stack_ptr - 10 , (uint8_t *)stack_ptr - stack_size , rsp);
52
57
}
53
58
#endif
54
59
} // namespace
0 commit comments