Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/runtime/cfdumper/pvdump.c
5985 views
1
/*******************************************************************************
2
* Copyright (c) 1991, 2014 IBM Corp. and others
3
*
4
* This program and the accompanying materials are made available under
5
* the terms of the Eclipse Public License 2.0 which accompanies this
6
* distribution and is available at https://www.eclipse.org/legal/epl-2.0/
7
* or the Apache License, Version 2.0 which accompanies this distribution and
8
* is available at https://www.apache.org/licenses/LICENSE-2.0.
9
*
10
* This Source Code may also be made available under the following
11
* Secondary Licenses when the conditions for such availability set
12
* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU
13
* General Public License, version 2 with the GNU Classpath
14
* Exception [1] and GNU General Public License, version 2 with the
15
* OpenJDK Assembly Exception [2].
16
*
17
* [1] https://www.gnu.org/software/classpath/license.html
18
* [2] http://openjdk.java.net/legal/assembly-exception.html
19
*
20
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception
21
*******************************************************************************/
22
23
#include "j9.h"
24
#include "j9protos.h"
25
#include "j9port.h"
26
#include "cfr.h"
27
#include "rommeth.h"
28
29
/* #defines from bcverify.h */
30
#define TAG_SPECIAL 1 /* clear bit means not a special object */
31
#define TAG_BASE_TYPE 2 /* clear bit means object or array */
32
#define TAG_BASE_ARRAY 4 /* set bit means base type array, clean bit means base type */
33
34
#define ARITY_MASK 0xFF000000
35
#define ARITY_SHIFT 24
36
37
#define CLASS_INDEX_MASK 0x00FFFFF0
38
#define CLASS_INDEX_SHIFT 4
39
40
#define TYPE_INT 0x02
41
#define TYPE_FLOAT 0x03
42
#define TYPE_LONG 0x04
43
#define TYPE_DOUBLE 0x05
44
#define TYPE_OBJECT 0x07
45
#define TYPE_INIT_OBJECT 0x08
46
#define TYPE_NEW_OBJECT 0x09
47
#define TYPE_ARG_OBJECT 0x0a
48
#define TYPE_LONG2 0x0c
49
#define TYPE_DOUBLE2 0x0d
50
51
#define BASE_TYPE_INT 0x010
52
#define BASE_TYPE_FLOAT 0x020
53
#define BASE_TYPE_LONG 0x040
54
#define BASE_TYPE_DOUBLE 0x080
55
#define BASE_TYPE_SHORT 0x100
56
#define BASE_TYPE_BYTE 0x200
57
#define BASE_TYPE_CHAR 0x400
58
59
/* #defines from bcvcfr.h */
60
#ifdef J9VM_ENV_LITTLE_ENDIAN
61
#define J9_READ_LITTLE_ENDIAN( value) value
62
#define J9_READ_BIG_ENDIAN( value ) ((value & 0xFF) << 24) | ((value & 0xFF00) << 8) | ((value & 0xFF0000) >> 8) | ((value & 0xFF000000) >> 24)
63
#define J9_READ_LITTLE_ENDIAN16( value) value
64
#define J9_READ_BIG_ENDIAN16( value ) ((value & 0x00FF) << 8) | ((value & 0xFF00) >> 8)
65
#else
66
#define J9_READ_LITTLE_ENDIAN( value ) ((value & 0xFF) << 24) | ((value & 0xFF00) << 8) | ((value & 0xFF0000) >> 8) | ((value & 0xFF000000) >> 24)
67
#define J9_READ_BIG_ENDIAN( value) value
68
#define J9_READ_LITTLE_ENDIAN16( value) ((value & 0x00FF) << 8) | ((value & 0xFF00) >> 8)
69
#define J9_READ_BIG_ENDIAN16( value ) value
70
#endif
71
#define J9_NEUTRAL_32( value ) (endian ? J9_READ_BIG_ENDIAN(value) : J9_READ_LITTLE_ENDIAN(value))
72
#define J9_NEUTRAL_16( value ) (endian ? J9_READ_BIG_ENDIAN16(value) : J9_READ_LITTLE_ENDIAN16(value))
73
74
/* Prototype from rcdump.c */
75
76
static UDATA decodeStackEntry (J9PortLibrary* portLib, U_8* stackDataPtr, UDATA endian);
77
static U_32 unalignedRead4 (U_8* ptr, UDATA isBigEndian );
78
static U_16 unalignedRead2 (U_8* ptr, UDATA isBigEndian );
79
80
static UDATA decodeStackDepth (J9PortLibrary* portLib, U_8* stackDataPtr, U_8* stackDataEnd);
81
82
static U_16 unalignedRead2(U_8* ptr, UDATA isBigEndian )
83
{
84
if(isBigEndian) return (ptr[0] << 8) | ptr[1];
85
else return (ptr[1] << 8) | ptr[0];
86
}
87
88
89
static U_32 unalignedRead4(U_8* ptr, UDATA isBigEndian )
90
{
91
U_32 a,b,c,d;
92
93
if(isBigEndian) {
94
a = ptr[0];
95
b = ptr[1];
96
c = ptr[2];
97
d = ptr[3];
98
} else {
99
d = ptr[0];
100
c = ptr[1];
101
b = ptr[2];
102
a = ptr[3];
103
}
104
return (a << 24) | (b << 16) | (c << 8) | d;
105
}
106
107
108
static UDATA decodeStackEntry(J9PortLibrary* portLib, U_8* stackDataPtr, UDATA endian)
109
{
110
UDATA entrySize = 1;
111
U_32 data;
112
UDATA i, arity, index;
113
114
PORT_ACCESS_FROM_PORT(portLib);
115
116
switch(*stackDataPtr++)
117
{
118
case TYPE_INT:
119
j9tty_printf(PORTLIB, " I");
120
break;
121
122
case TYPE_FLOAT:
123
j9tty_printf(PORTLIB, " F");
124
break;
125
126
case TYPE_LONG:
127
j9tty_printf(PORTLIB, " <J");
128
break;
129
130
case TYPE_DOUBLE:
131
j9tty_printf(PORTLIB, " <D");
132
break;
133
134
case TYPE_OBJECT:
135
data = unalignedRead4(stackDataPtr, endian);
136
entrySize += 4;
137
if(data & TAG_SPECIAL)
138
{
139
/* Special */
140
j9tty_printf(PORTLIB, " !(%08X)", data);
141
}
142
else if(data & ARITY_MASK)
143
{
144
/* Array */
145
arity = (data & ARITY_MASK) >> ARITY_SHIFT;
146
index = (data & CLASS_INDEX_MASK) >> CLASS_INDEX_SHIFT;
147
j9tty_printf(PORTLIB, " ");
148
for(i = 0; i < arity; i++) j9tty_printf(PORTLIB, "[");
149
if(data & TAG_BASE_ARRAY)
150
{
151
switch(data & CLASS_INDEX_MASK)
152
{
153
case BASE_TYPE_INT:
154
j9tty_printf(PORTLIB, "I");
155
break;
156
case BASE_TYPE_FLOAT:
157
j9tty_printf(PORTLIB, "F");
158
break;
159
case BASE_TYPE_LONG:
160
j9tty_printf(PORTLIB, "J");
161
break;
162
case BASE_TYPE_DOUBLE:
163
j9tty_printf(PORTLIB, "D");
164
break;
165
case BASE_TYPE_SHORT:
166
j9tty_printf(PORTLIB, "S");
167
break;
168
case BASE_TYPE_BYTE:
169
j9tty_printf(PORTLIB, "B");
170
break;
171
case BASE_TYPE_CHAR:
172
j9tty_printf(PORTLIB, "C");
173
break;
174
}
175
}
176
else
177
{
178
j9tty_printf(PORTLIB, "L(%i)", index);
179
}
180
}
181
else
182
{
183
index = (data & CLASS_INDEX_MASK) >> CLASS_INDEX_SHIFT;
184
j9tty_printf(PORTLIB, " L(%i)", index);
185
}
186
break;
187
188
case TYPE_INIT_OBJECT:
189
j9tty_printf(PORTLIB, " init");
190
break;
191
192
case TYPE_NEW_OBJECT:
193
data = unalignedRead4(stackDataPtr, endian);
194
entrySize += 4;
195
index = (data & CLASS_INDEX_MASK) >> CLASS_INDEX_SHIFT;
196
j9tty_printf(PORTLIB, " new(%i)", index);
197
break;
198
199
case TYPE_LONG2:
200
j9tty_printf(PORTLIB, " J>");
201
break;
202
203
case TYPE_DOUBLE2:
204
j9tty_printf(PORTLIB, " D>");
205
break;
206
207
case 0xFF:
208
j9tty_printf(PORTLIB, " X");
209
break;
210
211
default:
212
j9tty_printf(PORTLIB, " ?%02X?", *(stackDataPtr - 1));
213
}
214
return entrySize;
215
}
216
217
218
static UDATA decodeStackDepth(J9PortLibrary* portLib, U_8* stackDataPtr, U_8* stackDataEnd)
219
{
220
UDATA depth = 0;
221
U_8 entry;
222
223
PORT_ACCESS_FROM_PORT(portLib);
224
225
while(stackDataPtr < stackDataEnd)
226
{
227
depth++;
228
entry = *stackDataPtr++;
229
if((entry == TYPE_OBJECT) || (entry == TYPE_NEW_OBJECT)) stackDataPtr += 4;
230
}
231
return depth;
232
}
233
234