Lines 112-119
function u_register:long (name:string) {
Link Here
|
112 |
* If truncate=1, mask off the top 32 bits. |
112 |
* If truncate=1, mask off the top 32 bits. |
113 |
* If sign_extend=1 and (truncate=1 or the probepoint we've hit is in a |
113 |
* If sign_extend=1 and (truncate=1 or the probepoint we've hit is in a |
114 |
* 32-bit app), sign-extend the 32-bit value. |
114 |
* 32-bit app), sign-extend the 32-bit value. |
|
|
115 |
* If force64=1, return a 64-bit value even if we're in a 32-bit app. |
115 |
*/ |
116 |
*/ |
116 |
function _stp_arg:long (argnum:long, sign_extend:long, truncate:long) %{ /* pure */ |
117 |
function _stp_arg:long (argnum:long, sign_extend:long, truncate:long) |
|
|
118 |
{ |
119 |
return _stp_arg2(argnum, sign_extend, truncate, 0) |
120 |
} |
121 |
function _stp_arg2:long (argnum:long, sign_extend:long, truncate:long, |
122 |
force64:long) |
123 |
%{ /* pure */ |
124 |
|
117 |
long val; |
125 |
long val; |
118 |
struct pt_regs *regs; |
126 |
struct pt_regs *regs; |
119 |
int result, n, nr_regargs; |
127 |
int result, n, nr_regargs; |
Lines 138-144
function _stp_arg:long (argnum:long, sign_extend:long, truncate:long) %{ /* pure
Link Here
|
138 |
nr_regargs = 6; |
146 |
nr_regargs = 6; |
139 |
} else |
147 |
} else |
140 |
nr_regargs = (CONTEXT->regparm & _STP_REGPARM_MASK); |
148 |
nr_regargs = (CONTEXT->regparm & _STP_REGPARM_MASK); |
141 |
if (CONTEXT->user_mode_p && _stp_is_compat_task()) { |
149 |
if (!STAP_ARG_force64 && CONTEXT->user_mode_p && _stp_is_compat_task()) { |
142 |
argsz = sizeof(int); |
150 |
argsz = sizeof(int); |
143 |
result = _stp_get_arg32_by_number(n, nr_regargs, regs, &val); |
151 |
result = _stp_get_arg32_by_number(n, nr_regargs, regs, &val); |
144 |
} else |
152 |
} else |
Lines 167-173
function _stp_arg:long (argnum:long, sign_extend:long, truncate:long) %{ /* pure
Link Here
|
167 |
default: |
175 |
default: |
168 |
goto bad_argnum; |
176 |
goto bad_argnum; |
169 |
} |
177 |
} |
170 |
if (STAP_ARG_truncate || argsz == sizeof(int)) { |
178 |
if ((STAP_ARG_truncate || _stp_is_compat_task()) |
|
|
179 |
&& !STAP_ARG_force64) { |
171 |
if (STAP_ARG_sign_extend) |
180 |
if (STAP_ARG_sign_extend) |
172 |
STAP_RETVALUE = (int64_t) __stp_sign_extend32(val); |
181 |
STAP_RETVALUE = (int64_t) __stp_sign_extend32(val); |
173 |
else |
182 |
else |
Lines 198-234
function probing_32bit_app:long() %{ /* pure */
Link Here
|
198 |
|
207 |
|
199 |
/* Return the value of function arg #argnum (1=first arg) as a signed int. */ |
208 |
/* Return the value of function arg #argnum (1=first arg) as a signed int. */ |
200 |
function int_arg:long (argnum:long) { |
209 |
function int_arg:long (argnum:long) { |
201 |
return _stp_arg(argnum, 1, 1) |
210 |
return _stp_arg2(argnum, 1, 1, 0) |
202 |
} |
211 |
} |
203 |
|
212 |
|
204 |
/* Return the value of function arg #argnum (1=first arg) as an unsigned int. */ |
213 |
/* Return the value of function arg #argnum (1=first arg) as an unsigned int. */ |
205 |
function uint_arg:long (argnum:long) { |
214 |
function uint_arg:long (argnum:long) { |
206 |
return _stp_arg(argnum, 0, 1) |
215 |
return _stp_arg2(argnum, 0, 1, 0) |
207 |
} |
216 |
} |
208 |
|
217 |
|
209 |
function long_arg:long (argnum:long) { |
218 |
function long_arg:long (argnum:long) { |
210 |
return _stp_arg(argnum, 1, 0) |
219 |
return _stp_arg2(argnum, 1, 0, 0) |
211 |
} |
220 |
} |
212 |
|
221 |
|
213 |
function ulong_arg:long (argnum:long) { |
222 |
function ulong_arg:long (argnum:long) { |
214 |
return _stp_arg(argnum, 0, 0) |
223 |
return _stp_arg2(argnum, 0, 0, 0) |
215 |
} |
224 |
} |
216 |
|
225 |
|
217 |
function longlong_arg:long (argnum:long) { |
226 |
function longlong_arg:long (argnum:long) { |
218 |
if (probing_32bit_app()) { |
227 |
return _stp_arg2(argnum, 0, 0, 1) |
219 |
lowbits = _stp_arg(argnum, 0, 1) |
|
|
220 |
highbits = _stp_arg(argnum+1, 0, 1) |
221 |
return ((highbits << 32) | lowbits) |
222 |
} else |
223 |
return _stp_arg(argnum, 0, 0) |
224 |
} |
228 |
} |
225 |
|
229 |
|
226 |
function ulonglong_arg:long (argnum:long) { |
230 |
function ulonglong_arg:long (argnum:long) { |
227 |
return longlong_arg(argnum) |
231 |
return _stp_arg2(argnum, 0, 0, 1) |
228 |
} |
232 |
} |
229 |
|
233 |
|
230 |
function pointer_arg:long (argnum:long) { |
234 |
function pointer_arg:long (argnum:long) { |
231 |
return _stp_arg(argnum, 0, 0) |
235 |
return _stp_arg2(argnum, 0, 0, 0) |
232 |
} |
236 |
} |
233 |
|
237 |
|
234 |
function s32_arg:long (argnum:long) { |
238 |
function s32_arg:long (argnum:long) { |