FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
async-profiler/src/stackFrame_arm.cpp at master · parca-dev/async-profiler · GitHub
parca-dev
/
async-profiler
Public
forked from
async-profiler/async-profiler
Notifications
You must be signed in to change notification settings
Fork
0
Star
0
Code
Pull requests
0
Actions
Projects
Security and quality
0
Insights
Additional navigation options
Code
Pull requests
Actions
Projects
Security and quality
Insights
Expand file tree
Breadcrumbs
async-profiler
/
src
/
stackFrame_arm.cpp
Copy path
More file actions
More file actions
Latest commit
History
History
History
104 lines (87 loc) · 2.63 KB
Breadcrumbs
async-profiler
/
src
/
stackFrame_arm.cpp
Copy path
File metadata and controls
104 lines (87 loc) · 2.63 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/*
* Copyright 2017 Andrei Pangin
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#
if
defined(__arm__) || defined(__thumb__)
#
include
<
errno.h
>
#
include
<
string.h
>
#
include
"
stackFrame.h
"
uintptr_t
&
StackFrame::pc
() {
return
(
uintptr_t
&)_ucontext->
uc_mcontext
.
arm_pc
;
}
uintptr_t
&
StackFrame::sp
() {
return
(
uintptr_t
&)_ucontext->
uc_mcontext
.
arm_sp
;
}
uintptr_t
&
StackFrame::fp
() {
return
(
uintptr_t
&)_ucontext->
uc_mcontext
.
arm_fp
;
}
uintptr_t
&
StackFrame::retval
() {
return
(
uintptr_t
&)_ucontext->
uc_mcontext
.
arm_r0
;
}
uintptr_t
StackFrame::arg0
() {
return
(
uintptr_t
)_ucontext->
uc_mcontext
.
arm_r0
;
}
uintptr_t
StackFrame::arg1
() {
return
(
uintptr_t
)_ucontext->
uc_mcontext
.
arm_r1
;
}
uintptr_t
StackFrame::arg2
() {
return
(
uintptr_t
)_ucontext->
uc_mcontext
.
arm_r2
;
}
uintptr_t
StackFrame::arg3
() {
return
(
uintptr_t
)_ucontext->
uc_mcontext
.
arm_r3
;
}
void
StackFrame::ret
() {
_ucontext->
uc_mcontext
.
arm_pc
= _ucontext->
uc_mcontext
.
arm_lr
;
}
bool
StackFrame::popStub
(
instruction_t
* entry,
const
char
* name) {
instruction_t
* ip = (
instruction_t
*)
pc
();
if
(ip == entry || *ip ==
0xe12fff1e
||
strncmp
(name,
"
itable
"
,
6
) ==
0
||
strncmp
(name,
"
vtable
"
,
6
) ==
0
||
strcmp
(name,
"
InlineCacheBuffer
"
) ==
0
)
{
ret
();
return
true
;
}
return
false
;
}
bool
StackFrame::popMethod
(
instruction_t
* entry) {
instruction_t
* ip = (
instruction_t
*)
pc
();
if
(ip > entry && ip <= entry +
4
&& (*ip &
0xffffff00
) ==
0xe24dd000
) {
//
push {r11, lr}
//
mov r11, sp (optional)
//
-> sub sp, sp, #offs
fp
() =
stackAt
(
0
);
pc
() =
stackAt
(
1
);
sp
() +=
8
;
return
true
;
}
else
if
(*ip ==
0xe8bd4800
) {
//
add sp, sp, #offs
//
-> pop {r11, lr}
fp
() =
stackAt
(
0
);
pc
() =
stackAt
(
1
);
sp
() +=
8
;
return
true
;
}
ret
();
return
true
;
}
bool
StackFrame::checkInterruptedSyscall
() {
return
retval
() == (
uintptr_t
)-
EINTR
;
}
bool
StackFrame::isSyscall
(
instruction_t
* pc) {
//
swi #0
return
*pc ==
0xef000000
;
}
#
endif
//
defined(__arm__) || defined(__thumb__)
Back
|
FazBrowse Home
|
New Git URL