return test_thread_flag(TIF_32BIT);
}
+#else
+
+static inline int _stp_is_compat_task(void)
+{
+ return 0;
+}
+
#endif /* CONFIG_COMPAT */
/* task_pt_regs is used in some core tapset functions, so try to make
#elif defined (__x86_64__)
-#define u_fetch_register(regno) (_stp_probing_32bit_app(c->uregs) ? ursl_fetch32(url_i386, ARRAY_SIZE(url_i386), EM_386, regno) : ursl_fetch64(url_x86_64, ARRAY_SIZE(url_x86_64), EM_X86_64, regno))
-#define u_store_register(regno,value) (_stp_probing_32bit_app(c->uregs) ? ursl_store32(url_i386, ARRAY_SIZE(url_i386), EM_386, regno, value) : ursl_store64(url_x86_64, ARRAY_SIZE(url_x86_64), EM_X86_64, regno, value))
+#define u_fetch_register(regno) (_stp_is_compat_task() ? ursl_fetch32(url_i386, ARRAY_SIZE(url_i386), EM_386, regno) : ursl_fetch64(url_x86_64, ARRAY_SIZE(url_x86_64), EM_X86_64, regno))
+#define u_store_register(regno,value) (_stp_is_compat_task() ? ursl_store32(url_i386, ARRAY_SIZE(url_i386), EM_386, regno, value) : ursl_store64(url_x86_64, ARRAY_SIZE(url_x86_64), EM_X86_64, regno, value))
#endif
#elif defined (__powerpc64__)
-static int _stp_probing_32bit_app(struct pt_regs *regs)
-{
- if (!regs)
- return 0;
- return (user_mode(regs) && test_tsk_thread_flag(current, TIF_32BIT));
-}
-
static void _stp_print_regs(struct pt_regs * regs)
{
int i;
return EREG(sp, regs);
}
-static int _stp_get_regparm(int regparm, struct pt_regs *regs)
-{
- if (regparm == 0) {
- /* Default */
- if (user_mode(regs))
- return 0;
- else
- // Kernel is built with -mregparm=3.
- return 3;
- } else
- return (regparm & _STP_REGPARM_MASK);
-}
#endif /* __i386__ */
#ifdef __x86_64__
return RREG(sp, regs);
}
-static int _stp_probing_32bit_app(struct pt_regs *regs)
-{
- if (!regs)
- return 0;
- return (user_mode(regs) && test_tsk_thread_flag(current, TIF_IA32));
-}
-
/* Ensure that the upper 32 bits of val are a sign-extension of the lower 32. */
static int64_t __stp_sign_extend32(int64_t val)
{
return *val_ptr32;
}
-static int _stp_get_regparm(int regparm, struct pt_regs *regs)
-{
- if (regparm == 0) {
- /* Default */
- if (_stp_probing_32bit_app(regs))
- return 0;
- else
- return 6;
- } else
- return (regparm & _STP_REGPARM_MASK);
-}
#endif /* __x86_64__ */
#if defined(__i386__) || defined(__x86_64__)
if (THIS->argnum < 1)
goto bad_argnum;
n = (int) THIS->argnum;
- nr_regargs = _stp_get_regparm(CONTEXT->regparm, regs);
+ if (CONTEXT->regparm == 0) {
+ /* Default */
+ if (CONTEXT->probe_flags & _STP_PROBE_STATE_USER_MODE)
+ nr_regargs = 0;
+ else
+ nr_regargs = 3;
+ } else
+ nr_regargs = (CONTEXT->regparm & _STP_REGPARM_MASK);
result = _stp_get_arg32_by_number(n, nr_regargs, regs, &val);
switch (result) {
case 0:
function probing_32bit_app() %{ /* pure */
THIS->__retvalue = ((CONTEXT->probe_flags & _STP_PROBE_STATE_USER_MODE)
- && _stp_probing_32bit_app(CONTEXT->uregs));
+ && _stp_is_compat_task());
%}
function _stp_get_register_by_offset:long (offset:long) %{ /* pure */
*/
function probing_32bit_app() %{ /* pure */
if ((CONTEXT->probe_flags & _STP_PROBE_STATE_USER_MODE)
- && CONTEXT->uregs)
- THIS->__retvalue = (user_mode(CONTEXT->uregs) &&
- test_tsk_thread_flag(current, TIF_31BIT));
+ && _stp_is_compat_task())
+ THIS->__retvalue = 1;
else
THIS->__retvalue = 0;
%}
if (THIS->argnum < 1)
goto bad_argnum;
n = (int) THIS->argnum;
- nr_regargs = _stp_get_regparm(CONTEXT->regparm, regs);
- if (_stp_probing_32bit_app(regs)) {
+ if (CONTEXT->regparm == 0) {
+ /* Default */
+ if ((CONTEXT->probe_flags & _STP_PROBE_STATE_USER_MODE)
+ && _stp_is_compat_task())
+ nr_regargs = 0;
+ else
+ nr_regargs = 6;
+ } else
+ nr_regargs = (CONTEXT->regparm & _STP_REGPARM_MASK);
+ if ((CONTEXT->probe_flags & _STP_PROBE_STATE_USER_MODE)
+ && _stp_is_compat_task()) {
argsz = sizeof(int);
result = _stp_get_arg32_by_number(n, nr_regargs, regs, &val);
} else
function probing_32bit_app() %{ /* pure */
THIS->__retvalue = ((CONTEXT->probe_flags & _STP_PROBE_STATE_USER_MODE)
- && _stp_probing_32bit_app(CONTEXT->uregs));
+ && _stp_is_compat_task());
%}
/* Return the value of function arg #argnum (1=first arg) as a signed int. */
function regparm(n:long) %{
if ((CONTEXT->probe_flags & _STP_PROBE_STATE_USER_MODE)
- && _stp_probing_32bit_app(CONTEXT->uregs) &&
- (THIS->n < 0 || THIS->n > 3)) {
+ && _stp_is_compat_task() && (THIS->n < 0 || THIS->n > 3)) {
snprintf(CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
"For -m32 programs, "
"regparm value must be in the range 0-3.");