FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
async-profiler/src/stackFrame_i386.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_i386.cpp
Copy path
More file actions
More file actions
Latest commit
History
History
History
116 lines (99 loc) · 2.84 KB
Breadcrumbs
async-profiler
/
src
/
stackFrame_i386.cpp
Copy path
File metadata and controls
116 lines (99 loc) · 2.84 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
105
106
107
108
109
110
111
112
113
114
115
116
/*
* 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.
*/
#
ifdef
__i386__
#
include
<
errno.h
>
#
include
<
string.h
>
#
include
"
stackFrame.h
"
uintptr_t
&
StackFrame::pc
() {
return
(
uintptr_t
&)_ucontext->
uc_mcontext
.
gregs
[
REG_EIP
];
}
uintptr_t
&
StackFrame::sp
() {
return
(
uintptr_t
&)_ucontext->
uc_mcontext
.
gregs
[
REG_ESP
];
}
uintptr_t
&
StackFrame::fp
() {
return
(
uintptr_t
&)_ucontext->
uc_mcontext
.
gregs
[
REG_EBP
];
}
uintptr_t
&
StackFrame::retval
() {
return
(
uintptr_t
&)_ucontext->
uc_mcontext
.
gregs
[
REG_EAX
];
}
uintptr_t
StackFrame::arg0
() {
return
stackAt
(
1
);
}
uintptr_t
StackFrame::arg1
() {
return
stackAt
(
2
);
}
uintptr_t
StackFrame::arg2
() {
return
stackAt
(
3
);
}
uintptr_t
StackFrame::arg3
() {
return
stackAt
(
4
);
}
void
StackFrame::ret
() {
pc
() =
stackAt
(
0
);
sp
() +=
4
;
}
bool
StackFrame::popStub
(
instruction_t
* entry,
const
char
* name) {
instruction_t
* ip = (
instruction_t
*)
pc
();
if
(ip == entry || *ip ==
0xc3
||
strncmp
(name,
"
itable
"
,
6
) ==
0
||
strncmp
(name,
"
vtable
"
,
6
) ==
0
||
strcmp
(name,
"
InlineCacheBuffer
"
) ==
0
)
{
pc
() =
stackAt
(
0
);
sp
() +=
4
;
return
true
;
}
else
if
(entry !=
NULL
&& entry[
0
] ==
0x55
&& entry[
1
] ==
0x8b
&& entry[
2
] ==
0xec
) {
//
The stub begins with
//
push ebp
//
mov ebp, esp
if
(ip == entry +
1
) {
pc
() =
stackAt
(
1
);
sp
() +=
8
;
return
true
;
}
else
if
(
withinCurrentStack
(
fp
())) {
sp
() =
fp
() +
8
;
fp
() =
stackAt
(-
2
);
pc
() =
stackAt
(-
1
);
return
true
;
}
}
return
false
;
}
bool
StackFrame::popMethod
(
instruction_t
* entry) {
instruction_t
* ip = (
instruction_t
*)
pc
();
if
(ip <= entry || *ip ==
0xc3
|| *ip ==
0x55
//
ret or push ebp
|| (((
uintptr_t
)ip &
0xfff
) && ip[-
1
] ==
0x5d
))
//
after pop ebp
{
pc
() =
stackAt
(
0
);
sp
() +=
4
;
return
true
;
}
else
if
(*ip ==
0x5d
) {
//
pop ebp
fp
() =
stackAt
(
0
);
pc
() =
stackAt
(
1
);
sp
() +=
8
;
return
true
;
}
return
false
;
}
bool
StackFrame::checkInterruptedSyscall
() {
return
retval
() == (
uintptr_t
)-
EINTR
;
}
bool
StackFrame::isSyscall
(
instruction_t
* pc) {
//
int 0x80
return
pc[
0
] ==
0xcd
&& pc[
1
] ==
0x80
;
}
#
endif
//
__i386__
Back
|
FazBrowse Home
|
New Git URL