1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker * Copyright (C) 2005 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker *
4*38e8c45fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker *
8*38e8c45fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker *
10*38e8c45fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker */
16*38e8c45fSAndroid Build Coastguard Worker
17*38e8c45fSAndroid Build Coastguard Worker #include "Debug.h"
18*38e8c45fSAndroid Build Coastguard Worker #include "BuildFlags.h"
19*38e8c45fSAndroid Build Coastguard Worker
20*38e8c45fSAndroid Build Coastguard Worker #include <binder/ProcessState.h>
21*38e8c45fSAndroid Build Coastguard Worker
22*38e8c45fSAndroid Build Coastguard Worker #include <stdio.h>
23*38e8c45fSAndroid Build Coastguard Worker #include <stdlib.h>
24*38e8c45fSAndroid Build Coastguard Worker #include <ctype.h>
25*38e8c45fSAndroid Build Coastguard Worker
26*38e8c45fSAndroid Build Coastguard Worker namespace android {
27*38e8c45fSAndroid Build Coastguard Worker
28*38e8c45fSAndroid Build Coastguard Worker // ---------------------------------------------------------------------
29*38e8c45fSAndroid Build Coastguard Worker
30*38e8c45fSAndroid Build Coastguard Worker static const char indentStr[] =
31*38e8c45fSAndroid Build Coastguard Worker " "
32*38e8c45fSAndroid Build Coastguard Worker " ";
33*38e8c45fSAndroid Build Coastguard Worker
stringForIndent(int32_t indentLevel)34*38e8c45fSAndroid Build Coastguard Worker const char* stringForIndent(int32_t indentLevel)
35*38e8c45fSAndroid Build Coastguard Worker {
36*38e8c45fSAndroid Build Coastguard Worker ssize_t off = sizeof(indentStr)-1-(indentLevel*2);
37*38e8c45fSAndroid Build Coastguard Worker return indentStr + (off < 0 ? 0 : off);
38*38e8c45fSAndroid Build Coastguard Worker }
39*38e8c45fSAndroid Build Coastguard Worker
40*38e8c45fSAndroid Build Coastguard Worker // ---------------------------------------------------------------------
41*38e8c45fSAndroid Build Coastguard Worker
defaultPrintFunc(void *,const char * txt)42*38e8c45fSAndroid Build Coastguard Worker static void defaultPrintFunc(void* /*cookie*/, const char* txt)
43*38e8c45fSAndroid Build Coastguard Worker {
44*38e8c45fSAndroid Build Coastguard Worker printf("%s", txt);
45*38e8c45fSAndroid Build Coastguard Worker }
46*38e8c45fSAndroid Build Coastguard Worker
47*38e8c45fSAndroid Build Coastguard Worker // ---------------------------------------------------------------------
48*38e8c45fSAndroid Build Coastguard Worker
isident(int c)49*38e8c45fSAndroid Build Coastguard Worker static inline int isident(int c)
50*38e8c45fSAndroid Build Coastguard Worker {
51*38e8c45fSAndroid Build Coastguard Worker return isalnum(c) || c == '_';
52*38e8c45fSAndroid Build Coastguard Worker }
53*38e8c45fSAndroid Build Coastguard Worker
isasciitype(char c)54*38e8c45fSAndroid Build Coastguard Worker static inline bool isasciitype(char c)
55*38e8c45fSAndroid Build Coastguard Worker {
56*38e8c45fSAndroid Build Coastguard Worker if( c >= ' ' && c < 127 && c != '\'' && c != '\\' ) return true;
57*38e8c45fSAndroid Build Coastguard Worker return false;
58*38e8c45fSAndroid Build Coastguard Worker }
59*38e8c45fSAndroid Build Coastguard Worker
makehexdigit(uint32_t val)60*38e8c45fSAndroid Build Coastguard Worker static inline char makehexdigit(uint32_t val)
61*38e8c45fSAndroid Build Coastguard Worker {
62*38e8c45fSAndroid Build Coastguard Worker return "0123456789abcdef"[val&0xF];
63*38e8c45fSAndroid Build Coastguard Worker }
64*38e8c45fSAndroid Build Coastguard Worker
appendhexnum(uint32_t val,char * out)65*38e8c45fSAndroid Build Coastguard Worker static char* appendhexnum(uint32_t val, char* out)
66*38e8c45fSAndroid Build Coastguard Worker {
67*38e8c45fSAndroid Build Coastguard Worker for( int32_t i=28; i>=0; i-=4 ) {
68*38e8c45fSAndroid Build Coastguard Worker *out++ = makehexdigit( val>>i );
69*38e8c45fSAndroid Build Coastguard Worker }
70*38e8c45fSAndroid Build Coastguard Worker *out = 0;
71*38e8c45fSAndroid Build Coastguard Worker return out;
72*38e8c45fSAndroid Build Coastguard Worker }
73*38e8c45fSAndroid Build Coastguard Worker
appendcharornum(char c,char * out,bool skipzero=true)74*38e8c45fSAndroid Build Coastguard Worker static char* appendcharornum(char c, char* out, bool skipzero = true)
75*38e8c45fSAndroid Build Coastguard Worker {
76*38e8c45fSAndroid Build Coastguard Worker if (skipzero && c == 0) return out;
77*38e8c45fSAndroid Build Coastguard Worker
78*38e8c45fSAndroid Build Coastguard Worker if (isasciitype(c)) {
79*38e8c45fSAndroid Build Coastguard Worker *out++ = c;
80*38e8c45fSAndroid Build Coastguard Worker return out;
81*38e8c45fSAndroid Build Coastguard Worker }
82*38e8c45fSAndroid Build Coastguard Worker
83*38e8c45fSAndroid Build Coastguard Worker *out++ = '\\';
84*38e8c45fSAndroid Build Coastguard Worker *out++ = 'x';
85*38e8c45fSAndroid Build Coastguard Worker *out++ = makehexdigit(c>>4);
86*38e8c45fSAndroid Build Coastguard Worker *out++ = makehexdigit(c);
87*38e8c45fSAndroid Build Coastguard Worker return out;
88*38e8c45fSAndroid Build Coastguard Worker }
89*38e8c45fSAndroid Build Coastguard Worker
typetostring(uint32_t type,char * out,bool fullContext=true,bool strict=false)90*38e8c45fSAndroid Build Coastguard Worker static char* typetostring(uint32_t type, char* out,
91*38e8c45fSAndroid Build Coastguard Worker bool fullContext = true,
92*38e8c45fSAndroid Build Coastguard Worker bool strict = false)
93*38e8c45fSAndroid Build Coastguard Worker {
94*38e8c45fSAndroid Build Coastguard Worker char* pos = out;
95*38e8c45fSAndroid Build Coastguard Worker char c[4];
96*38e8c45fSAndroid Build Coastguard Worker c[0] = (char)((type>>24)&0xFF);
97*38e8c45fSAndroid Build Coastguard Worker c[1] = (char)((type>>16)&0xFF);
98*38e8c45fSAndroid Build Coastguard Worker c[2] = (char)((type>>8)&0xFF);
99*38e8c45fSAndroid Build Coastguard Worker c[3] = (char)(type&0xFF);
100*38e8c45fSAndroid Build Coastguard Worker bool valid;
101*38e8c45fSAndroid Build Coastguard Worker if( !strict ) {
102*38e8c45fSAndroid Build Coastguard Worker // now even less strict!
103*38e8c45fSAndroid Build Coastguard Worker // valid = isasciitype(c[3]);
104*38e8c45fSAndroid Build Coastguard Worker valid = true;
105*38e8c45fSAndroid Build Coastguard Worker int32_t i = 0;
106*38e8c45fSAndroid Build Coastguard Worker bool zero = true;
107*38e8c45fSAndroid Build Coastguard Worker while (valid && i<3) {
108*38e8c45fSAndroid Build Coastguard Worker if (c[i] == 0) {
109*38e8c45fSAndroid Build Coastguard Worker if (!zero) valid = false;
110*38e8c45fSAndroid Build Coastguard Worker } else {
111*38e8c45fSAndroid Build Coastguard Worker zero = false;
112*38e8c45fSAndroid Build Coastguard Worker //if (!isasciitype(c[i])) valid = false;
113*38e8c45fSAndroid Build Coastguard Worker }
114*38e8c45fSAndroid Build Coastguard Worker i++;
115*38e8c45fSAndroid Build Coastguard Worker }
116*38e8c45fSAndroid Build Coastguard Worker // if all zeros, not a valid type code.
117*38e8c45fSAndroid Build Coastguard Worker if (zero) valid = false;
118*38e8c45fSAndroid Build Coastguard Worker } else {
119*38e8c45fSAndroid Build Coastguard Worker valid = isident(c[3]) ? true : false;
120*38e8c45fSAndroid Build Coastguard Worker int32_t i = 0;
121*38e8c45fSAndroid Build Coastguard Worker bool zero = true;
122*38e8c45fSAndroid Build Coastguard Worker while (valid && i<3) {
123*38e8c45fSAndroid Build Coastguard Worker if (c[i] == 0) {
124*38e8c45fSAndroid Build Coastguard Worker if (!zero) valid = false;
125*38e8c45fSAndroid Build Coastguard Worker } else {
126*38e8c45fSAndroid Build Coastguard Worker zero = false;
127*38e8c45fSAndroid Build Coastguard Worker if (!isident(c[i])) valid = false;
128*38e8c45fSAndroid Build Coastguard Worker }
129*38e8c45fSAndroid Build Coastguard Worker i++;
130*38e8c45fSAndroid Build Coastguard Worker }
131*38e8c45fSAndroid Build Coastguard Worker }
132*38e8c45fSAndroid Build Coastguard Worker if( valid && (!fullContext || c[0] != '0' || c[1] != 'x') ) {
133*38e8c45fSAndroid Build Coastguard Worker if( fullContext ) *pos++ = '\'';
134*38e8c45fSAndroid Build Coastguard Worker pos = appendcharornum(c[0], pos);
135*38e8c45fSAndroid Build Coastguard Worker pos = appendcharornum(c[1], pos);
136*38e8c45fSAndroid Build Coastguard Worker pos = appendcharornum(c[2], pos);
137*38e8c45fSAndroid Build Coastguard Worker pos = appendcharornum(c[3], pos);
138*38e8c45fSAndroid Build Coastguard Worker if( fullContext ) *pos++ = '\'';
139*38e8c45fSAndroid Build Coastguard Worker *pos = 0;
140*38e8c45fSAndroid Build Coastguard Worker return pos;
141*38e8c45fSAndroid Build Coastguard Worker }
142*38e8c45fSAndroid Build Coastguard Worker
143*38e8c45fSAndroid Build Coastguard Worker if( fullContext ) {
144*38e8c45fSAndroid Build Coastguard Worker *pos++ = '0';
145*38e8c45fSAndroid Build Coastguard Worker *pos++ = 'x';
146*38e8c45fSAndroid Build Coastguard Worker }
147*38e8c45fSAndroid Build Coastguard Worker return appendhexnum(type, pos);
148*38e8c45fSAndroid Build Coastguard Worker }
149*38e8c45fSAndroid Build Coastguard Worker
printTypeCode(uint32_t typeCode,debugPrintFunc func,void * cookie)150*38e8c45fSAndroid Build Coastguard Worker void printTypeCode(uint32_t typeCode, debugPrintFunc func, void* cookie)
151*38e8c45fSAndroid Build Coastguard Worker {
152*38e8c45fSAndroid Build Coastguard Worker char buffer[32];
153*38e8c45fSAndroid Build Coastguard Worker char* end = typetostring(typeCode, buffer);
154*38e8c45fSAndroid Build Coastguard Worker *end = 0;
155*38e8c45fSAndroid Build Coastguard Worker func ? (*func)(cookie, buffer) : defaultPrintFunc(cookie, buffer);
156*38e8c45fSAndroid Build Coastguard Worker }
157*38e8c45fSAndroid Build Coastguard Worker
printHexData(int32_t indent,const void * buf,size_t length,size_t bytesPerLine,int32_t singleLineBytesCutoff,size_t alignment,bool cStyle,debugPrintFunc func,void * cookie)158*38e8c45fSAndroid Build Coastguard Worker void printHexData(int32_t indent, const void *buf, size_t length,
159*38e8c45fSAndroid Build Coastguard Worker size_t bytesPerLine, int32_t singleLineBytesCutoff,
160*38e8c45fSAndroid Build Coastguard Worker size_t alignment, bool cStyle,
161*38e8c45fSAndroid Build Coastguard Worker debugPrintFunc func, void* cookie)
162*38e8c45fSAndroid Build Coastguard Worker {
163*38e8c45fSAndroid Build Coastguard Worker if (alignment == 0) {
164*38e8c45fSAndroid Build Coastguard Worker if (bytesPerLine >= 16) alignment = 4;
165*38e8c45fSAndroid Build Coastguard Worker else if (bytesPerLine >= 8) alignment = 2;
166*38e8c45fSAndroid Build Coastguard Worker else alignment = 1;
167*38e8c45fSAndroid Build Coastguard Worker }
168*38e8c45fSAndroid Build Coastguard Worker if (func == nullptr) func = defaultPrintFunc;
169*38e8c45fSAndroid Build Coastguard Worker
170*38e8c45fSAndroid Build Coastguard Worker size_t offset;
171*38e8c45fSAndroid Build Coastguard Worker
172*38e8c45fSAndroid Build Coastguard Worker unsigned char *pos = (unsigned char *)buf;
173*38e8c45fSAndroid Build Coastguard Worker
174*38e8c45fSAndroid Build Coastguard Worker if (pos == nullptr) {
175*38e8c45fSAndroid Build Coastguard Worker if (singleLineBytesCutoff < 0) func(cookie, "\n");
176*38e8c45fSAndroid Build Coastguard Worker func(cookie, "(NULL)");
177*38e8c45fSAndroid Build Coastguard Worker return;
178*38e8c45fSAndroid Build Coastguard Worker }
179*38e8c45fSAndroid Build Coastguard Worker
180*38e8c45fSAndroid Build Coastguard Worker if (length == 0) {
181*38e8c45fSAndroid Build Coastguard Worker if (singleLineBytesCutoff < 0) func(cookie, "\n");
182*38e8c45fSAndroid Build Coastguard Worker func(cookie, "(empty)");
183*38e8c45fSAndroid Build Coastguard Worker return;
184*38e8c45fSAndroid Build Coastguard Worker }
185*38e8c45fSAndroid Build Coastguard Worker
186*38e8c45fSAndroid Build Coastguard Worker if ((int32_t)length < 0) {
187*38e8c45fSAndroid Build Coastguard Worker if (singleLineBytesCutoff < 0) func(cookie, "\n");
188*38e8c45fSAndroid Build Coastguard Worker char buf[64];
189*38e8c45fSAndroid Build Coastguard Worker sprintf(buf, "(bad length: %zu)", length);
190*38e8c45fSAndroid Build Coastguard Worker func(cookie, buf);
191*38e8c45fSAndroid Build Coastguard Worker return;
192*38e8c45fSAndroid Build Coastguard Worker }
193*38e8c45fSAndroid Build Coastguard Worker
194*38e8c45fSAndroid Build Coastguard Worker char buffer[256];
195*38e8c45fSAndroid Build Coastguard Worker static const size_t maxBytesPerLine = (sizeof(buffer)-1-11-4)/(3+1);
196*38e8c45fSAndroid Build Coastguard Worker
197*38e8c45fSAndroid Build Coastguard Worker if (bytesPerLine > maxBytesPerLine) bytesPerLine = maxBytesPerLine;
198*38e8c45fSAndroid Build Coastguard Worker
199*38e8c45fSAndroid Build Coastguard Worker const bool oneLine = (int32_t)length <= singleLineBytesCutoff;
200*38e8c45fSAndroid Build Coastguard Worker bool newLine = false;
201*38e8c45fSAndroid Build Coastguard Worker if (cStyle) {
202*38e8c45fSAndroid Build Coastguard Worker indent++;
203*38e8c45fSAndroid Build Coastguard Worker func(cookie, "{\n");
204*38e8c45fSAndroid Build Coastguard Worker newLine = true;
205*38e8c45fSAndroid Build Coastguard Worker } else if (!oneLine) {
206*38e8c45fSAndroid Build Coastguard Worker func(cookie, "\n");
207*38e8c45fSAndroid Build Coastguard Worker newLine = true;
208*38e8c45fSAndroid Build Coastguard Worker }
209*38e8c45fSAndroid Build Coastguard Worker
210*38e8c45fSAndroid Build Coastguard Worker for (offset = 0; ; offset += bytesPerLine, pos += bytesPerLine) {
211*38e8c45fSAndroid Build Coastguard Worker ssize_t remain = length;
212*38e8c45fSAndroid Build Coastguard Worker
213*38e8c45fSAndroid Build Coastguard Worker char* c = buffer;
214*38e8c45fSAndroid Build Coastguard Worker if (!oneLine && !cStyle) {
215*38e8c45fSAndroid Build Coastguard Worker sprintf(c, "0x%08x: ", (int)offset);
216*38e8c45fSAndroid Build Coastguard Worker c += 12;
217*38e8c45fSAndroid Build Coastguard Worker }
218*38e8c45fSAndroid Build Coastguard Worker
219*38e8c45fSAndroid Build Coastguard Worker size_t index;
220*38e8c45fSAndroid Build Coastguard Worker size_t word;
221*38e8c45fSAndroid Build Coastguard Worker
222*38e8c45fSAndroid Build Coastguard Worker for (word = 0; word < bytesPerLine; ) {
223*38e8c45fSAndroid Build Coastguard Worker
224*38e8c45fSAndroid Build Coastguard Worker size_t align_offset = alignment-(alignment?1:0);
225*38e8c45fSAndroid Build Coastguard Worker if (remain > 0 && (size_t)remain <= align_offset) {
226*38e8c45fSAndroid Build Coastguard Worker align_offset = remain - 1;
227*38e8c45fSAndroid Build Coastguard Worker }
228*38e8c45fSAndroid Build Coastguard Worker const size_t startIndex = word+align_offset;
229*38e8c45fSAndroid Build Coastguard Worker
230*38e8c45fSAndroid Build Coastguard Worker for (index = 0; index < alignment || (alignment == 0 && index < bytesPerLine); index++) {
231*38e8c45fSAndroid Build Coastguard Worker
232*38e8c45fSAndroid Build Coastguard Worker if (!cStyle) {
233*38e8c45fSAndroid Build Coastguard Worker if (index == 0 && word > 0 && alignment > 0) {
234*38e8c45fSAndroid Build Coastguard Worker *c++ = ' ';
235*38e8c45fSAndroid Build Coastguard Worker }
236*38e8c45fSAndroid Build Coastguard Worker
237*38e8c45fSAndroid Build Coastguard Worker if (remain-- > 0) {
238*38e8c45fSAndroid Build Coastguard Worker const unsigned char val = *(pos+startIndex-index);
239*38e8c45fSAndroid Build Coastguard Worker *c++ = makehexdigit(val>>4);
240*38e8c45fSAndroid Build Coastguard Worker *c++ = makehexdigit(val);
241*38e8c45fSAndroid Build Coastguard Worker } else if (!oneLine) {
242*38e8c45fSAndroid Build Coastguard Worker *c++ = ' ';
243*38e8c45fSAndroid Build Coastguard Worker *c++ = ' ';
244*38e8c45fSAndroid Build Coastguard Worker }
245*38e8c45fSAndroid Build Coastguard Worker } else {
246*38e8c45fSAndroid Build Coastguard Worker if (remain > 0) {
247*38e8c45fSAndroid Build Coastguard Worker if (index == 0 && word > 0) {
248*38e8c45fSAndroid Build Coastguard Worker *c++ = ',';
249*38e8c45fSAndroid Build Coastguard Worker *c++ = ' ';
250*38e8c45fSAndroid Build Coastguard Worker }
251*38e8c45fSAndroid Build Coastguard Worker if (index == 0) {
252*38e8c45fSAndroid Build Coastguard Worker *c++ = '0';
253*38e8c45fSAndroid Build Coastguard Worker *c++ = 'x';
254*38e8c45fSAndroid Build Coastguard Worker }
255*38e8c45fSAndroid Build Coastguard Worker const unsigned char val = *(pos+startIndex-index);
256*38e8c45fSAndroid Build Coastguard Worker *c++ = makehexdigit(val>>4);
257*38e8c45fSAndroid Build Coastguard Worker *c++ = makehexdigit(val);
258*38e8c45fSAndroid Build Coastguard Worker remain--;
259*38e8c45fSAndroid Build Coastguard Worker }
260*38e8c45fSAndroid Build Coastguard Worker }
261*38e8c45fSAndroid Build Coastguard Worker }
262*38e8c45fSAndroid Build Coastguard Worker
263*38e8c45fSAndroid Build Coastguard Worker word += index;
264*38e8c45fSAndroid Build Coastguard Worker }
265*38e8c45fSAndroid Build Coastguard Worker
266*38e8c45fSAndroid Build Coastguard Worker if (!cStyle) {
267*38e8c45fSAndroid Build Coastguard Worker remain = length;
268*38e8c45fSAndroid Build Coastguard Worker *c++ = ' ';
269*38e8c45fSAndroid Build Coastguard Worker *c++ = '\'';
270*38e8c45fSAndroid Build Coastguard Worker for (index = 0; index < bytesPerLine; index++) {
271*38e8c45fSAndroid Build Coastguard Worker
272*38e8c45fSAndroid Build Coastguard Worker if (remain-- > 0) {
273*38e8c45fSAndroid Build Coastguard Worker const unsigned char val = pos[index];
274*38e8c45fSAndroid Build Coastguard Worker *c++ = (val >= ' ' && val < 127) ? val : '.';
275*38e8c45fSAndroid Build Coastguard Worker } else if (!oneLine) {
276*38e8c45fSAndroid Build Coastguard Worker *c++ = ' ';
277*38e8c45fSAndroid Build Coastguard Worker }
278*38e8c45fSAndroid Build Coastguard Worker }
279*38e8c45fSAndroid Build Coastguard Worker
280*38e8c45fSAndroid Build Coastguard Worker *c++ = '\'';
281*38e8c45fSAndroid Build Coastguard Worker if (length > bytesPerLine) *c++ = '\n';
282*38e8c45fSAndroid Build Coastguard Worker } else {
283*38e8c45fSAndroid Build Coastguard Worker if (remain > 0) *c++ = ',';
284*38e8c45fSAndroid Build Coastguard Worker *c++ = '\n';
285*38e8c45fSAndroid Build Coastguard Worker }
286*38e8c45fSAndroid Build Coastguard Worker
287*38e8c45fSAndroid Build Coastguard Worker if (newLine && indent) func(cookie, stringForIndent(indent));
288*38e8c45fSAndroid Build Coastguard Worker *c = 0;
289*38e8c45fSAndroid Build Coastguard Worker func(cookie, buffer);
290*38e8c45fSAndroid Build Coastguard Worker newLine = true;
291*38e8c45fSAndroid Build Coastguard Worker
292*38e8c45fSAndroid Build Coastguard Worker if (length <= bytesPerLine) break;
293*38e8c45fSAndroid Build Coastguard Worker length -= bytesPerLine;
294*38e8c45fSAndroid Build Coastguard Worker }
295*38e8c45fSAndroid Build Coastguard Worker
296*38e8c45fSAndroid Build Coastguard Worker if (cStyle) {
297*38e8c45fSAndroid Build Coastguard Worker if (indent > 0) func(cookie, stringForIndent(indent-1));
298*38e8c45fSAndroid Build Coastguard Worker func(cookie, "};");
299*38e8c45fSAndroid Build Coastguard Worker }
300*38e8c45fSAndroid Build Coastguard Worker }
301*38e8c45fSAndroid Build Coastguard Worker
getBinderKernelReferences(size_t count,uintptr_t * buf)302*38e8c45fSAndroid Build Coastguard Worker ssize_t getBinderKernelReferences(size_t count, uintptr_t* buf) {
303*38e8c45fSAndroid Build Coastguard Worker if constexpr (!kEnableKernelIpc) {
304*38e8c45fSAndroid Build Coastguard Worker LOG_ALWAYS_FATAL("Binder kernel driver disabled at build time");
305*38e8c45fSAndroid Build Coastguard Worker return 0;
306*38e8c45fSAndroid Build Coastguard Worker }
307*38e8c45fSAndroid Build Coastguard Worker
308*38e8c45fSAndroid Build Coastguard Worker sp<ProcessState> proc = ProcessState::selfOrNull();
309*38e8c45fSAndroid Build Coastguard Worker if (proc.get() == nullptr) {
310*38e8c45fSAndroid Build Coastguard Worker return 0;
311*38e8c45fSAndroid Build Coastguard Worker }
312*38e8c45fSAndroid Build Coastguard Worker
313*38e8c45fSAndroid Build Coastguard Worker return proc->getKernelReferences(count, buf);
314*38e8c45fSAndroid Build Coastguard Worker }
315*38e8c45fSAndroid Build Coastguard Worker
316*38e8c45fSAndroid Build Coastguard Worker } // namespace android
317*38e8c45fSAndroid Build Coastguard Worker
318