From 967ec1f55256eb2d601ce0be5916bb46085f36db Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Mon, 19 Sep 2011 15:42:19 +0200 Subject: [PATCH] Remove arch specific _stp_probing_32bit_app() and _stp_get_regparm(). Both functions were doing more than necessary and didn't actually need access to the current regs. _STP_PROBE_STATE_USER_MODE tells us whether the current probe triggered in user mode. _stp_is_compat_task() tells us whether the current task is a 32-on-64 process. * runtime/compatdefs.h (_stp_is_compat_task): Defined also when CONFIG_COMPAT is undefined (to always return false). * runtime/loc2c-runtime.h: u_fetch_register() and u_store_register() are only called from user space dwarf context. Only needs _stp_is_compat_task() test. * runtime/regs.c: Remove arch specific _stp_probing_32bit_app() and _stp_get_regparm() functions. * tapset/i386/registers.stp (_stp_arg): Check regparm directly. * tapset/powerpc/registers.stp (probing_32bit_app): Use _stp_is_compat_task() test. * tapset/s390/registers.stp (probing_32bit_app): Likewise. * tapset/x86_64/registers.stp (_stp_arg): Check regparm directly. (probing_32bit_app): Use _stp_is_compat_task() test. (regparm): Likewise. --- runtime/compatdefs.h | 7 +++++++ runtime/loc2c-runtime.h | 4 ++-- runtime/regs.c | 37 ------------------------------------ tapset/i386/registers.stp | 9 ++++++++- tapset/powerpc/registers.stp | 2 +- tapset/s390/registers.stp | 5 ++--- tapset/x86_64/registers.stp | 18 +++++++++++++----- 7 files changed, 33 insertions(+), 49 deletions(-) diff --git a/runtime/compatdefs.h b/runtime/compatdefs.h index 4d5de3236..23850be3e 100644 --- a/runtime/compatdefs.h +++ b/runtime/compatdefs.h @@ -34,6 +34,13 @@ static inline int _stp_is_compat_task(void) 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 diff --git a/runtime/loc2c-runtime.h b/runtime/loc2c-runtime.h index ef7d279e8..d11f28f47 100644 --- a/runtime/loc2c-runtime.h +++ b/runtime/loc2c-runtime.h @@ -327,8 +327,8 @@ static void ursl_store64 (const struct usr_regset_lut* lut,unsigned lutsize, in #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 diff --git a/runtime/regs.c b/runtime/regs.c index fe2184a6b..5cf39fa33 100644 --- a/runtime/regs.c +++ b/runtime/regs.c @@ -220,13 +220,6 @@ static void _stp_print_regs(struct pt_regs * regs) #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; @@ -382,18 +375,6 @@ static long _stp_get_sp(struct pt_regs *regs) 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__ @@ -410,13 +391,6 @@ static long _stp_get_sp(struct pt_regs *regs) 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) { @@ -424,17 +398,6 @@ 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__) diff --git a/tapset/i386/registers.stp b/tapset/i386/registers.stp index 2703e9c43..f615b4e91 100644 --- a/tapset/i386/registers.stp +++ b/tapset/i386/registers.stp @@ -131,7 +131,14 @@ function _stp_arg:long (argnum:long) %{ /* pure */ 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: diff --git a/tapset/powerpc/registers.stp b/tapset/powerpc/registers.stp index 555c71dba..3f91c7bce 100644 --- a/tapset/powerpc/registers.stp +++ b/tapset/powerpc/registers.stp @@ -60,7 +60,7 @@ function _stp_register_regs() { 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 */ diff --git a/tapset/s390/registers.stp b/tapset/s390/registers.stp index 695b64a4e..af654e7fe 100644 --- a/tapset/s390/registers.stp +++ b/tapset/s390/registers.stp @@ -44,9 +44,8 @@ function _stp_register_regs() { */ 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; %} diff --git a/tapset/x86_64/registers.stp b/tapset/x86_64/registers.stp index 7ebaa48b2..329ec257e 100644 --- a/tapset/x86_64/registers.stp +++ b/tapset/x86_64/registers.stp @@ -136,8 +136,17 @@ function _stp_arg:long (argnum:long, sign_extend:long, truncate:long) %{ /* pure 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 @@ -193,7 +202,7 @@ deref_fault: /* branched to from kread() */ 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. */ @@ -253,8 +262,7 @@ function fastcall() %{ /* pure */ %} 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."); -- 2.43.5