diff options
author | Ananth N Mavinakayanahalli <ananth@in.ibm.com> | 2008-05-29 12:15:29 +0530 |
---|---|---|
committer | Ananth N Mavinakayanahalli <ananth@in.ibm.com> | 2008-05-29 12:15:29 +0530 |
commit | ef63732e82dd7979dcf608ba6ed4528e150b47ac (patch) | |
tree | 49d5af2d9d708efe01d4068c6bf0ba75249dbe3e | |
parent | 38fd9c0aede86d99834dcc693370255652230a75 (diff) | |
download | systemtap-steved-ef63732e82dd7979dcf608ba6ed4528e150b47ac.tar.gz systemtap-steved-ef63732e82dd7979dcf608ba6ed4528e150b47ac.tar.xz systemtap-steved-ef63732e82dd7979dcf608ba6ed4528e150b47ac.zip |
Fix powerpc dwarfless argument access
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | runtime/regs.c | 7 | ||||
-rw-r--r-- | tapset/ppc64/registers.stp | 102 |
3 files changed, 48 insertions, 66 deletions
@@ -1,3 +1,8 @@ +2008-05-29 Ananth N Mavinakayanahalli <ananth@in.ibm.com> + + PR 6563 + * tapset/ppc64/registers.stp: Fix powerpc dwarfless argument access + 2008-05-28 Josh Stone <joshua.i.stone@intel.com> PR 6529 diff --git a/runtime/regs.c b/runtime/regs.c index 5821f7e7..81b865b1 100644 --- a/runtime/regs.c +++ b/runtime/regs.c @@ -256,6 +256,13 @@ 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)); +} + void _stp_print_regs(struct pt_regs * regs) { int i; diff --git a/tapset/ppc64/registers.stp b/tapset/ppc64/registers.stp index d3605c05..f317916b 100644 --- a/tapset/ppc64/registers.stp +++ b/tapset/ppc64/registers.stp @@ -58,6 +58,10 @@ function _stp_register_regs() { _stp_regs_registered = 1 } +function probing_32bit_app() %{ + THIS->__retvalue = _stp_probing_32bit_app(CONTEXT->regs); +%} + function _stp_get_register_by_offset:long (offset:long) %{ long value; memcpy(&value, ((char *)CONTEXT->regs) + THIS->offset, sizeof(value)); @@ -70,13 +74,6 @@ function _stp_sign_extend32:long (value:long) { return value } -function _stp_probing_32bit_app() %{ - if (!(CONTEXT->regs)) - return 0; - return (user_mode(CONTEXT->regs) && - test_tsk_thread_flag(current, TIF_32BIT)); -%} - function _stp_register:long (name:string, sign_extend:long) { if (!_stp_regs_registered) _stp_register_regs() @@ -86,7 +83,7 @@ function _stp_register:long (name:string, sign_extend:long) { return 0 } value = _stp_get_register_by_offset(offset) - if (_stp_probing_32bit_app()) { + if (probing_32bit_app()) { if (sign_extend) value = _stp_sign_extend32(value) else @@ -114,66 +111,39 @@ function u_register:long (name:string) { * If sign_extend=1 and (truncate=1 or the probepoint we've hit is in a * 32-bit app), sign-extend the 32-bit value. */ -function _stp_arg:long (argnum:long, sign_extend:long, truncate:long) %{ - long val; - int n; - size_t argsz = sizeof(long); - - THIS->__retvalue = 0; - if (!CONTEXT->regs) { - snprintf(CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer), - "cannot access function args in this context"); - CONTEXT->last_error = CONTEXT->error_buffer; - return; - } - if (THIS->argnum < 1) - goto bad_argnum; - n = (int) THIS->argnum; - - switch (n) { - case 1: - val = u_register("r3"); - break; - case 2: - val = u_register("r4"); - break; - case 3: - val = u_register("r5"); - break; - case 4: - val = u_register("r6"); - break; - case 5: - val = u_register("r7"); - break; - case 6: - val = u_register("r8"); - break; - case 7: - val = u_register("r9"); - break; - case 8: - val = u_register("r10"); - break; - default: - goto bad_argnum; +function _stp_arg:long (argnum:long, sign_extend:long, truncate:long) { + val = 0 + if (argnum < 1 || argnum > 8) { + error(sprintf("Cannot access arg(%d)", argnum)) + return 0 } - if (THIS->truncate || argsz == sizeof(int)) { - if (THIS->sign_extend) - THIS->__retvalue = (int64_t) _stp_sign_extend32(val); + + if (argnum == 1) + val = u_register("r3") + else if (argnum == 2) + val = u_register("r4") + else if (argnum == 3) + val = u_register("r5") + else if (argnum == 4) + val = u_register("r6") + else if (argnum == 5) + val = u_register("r7") + else if (argnum == 6) + val = u_register("r8") + else if (argnum == 7) + val = u_register("r9") + else (argnum == 8) + val = u_register("r10") + + if (truncate) { + if (sign_extend) + val = _stp_sign_extend32(val) else /* High bits may be garbage. */ - THIS->__retvalue = (int64_t) (val & 0xffffffff); - } else - THIS->__retvalue = (int64_t) val; - return; - -bad_argnum: - snprintf(CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer), - "cannot access arg(%lld)", THIS->argnum); - CONTEXT->last_error = CONTEXT->error_buffer; - return; -%} + val = (val & 0xffffffff); + } + return val; +} /* Return the value of function arg #argnum (1=first arg) as a signed int. */ function int_arg:long (argnum:long) { @@ -194,7 +164,7 @@ function ulong_arg:long (argnum:long) { } function longlong_arg:long (argnum:long) { - if (_stp_probing_32bit_app()) { + if (probing_32bit_app()) { lowbits = _stp_arg(argnum, 0, 1) highbits = _stp_arg(argnum+1, 0, 1) return ((highbits << 32) | lowbits) |