summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnanth N Mavinakayanahalli <ananth@in.ibm.com>2008-05-29 12:15:29 +0530
committerAnanth N Mavinakayanahalli <ananth@in.ibm.com>2008-05-29 12:15:29 +0530
commitef63732e82dd7979dcf608ba6ed4528e150b47ac (patch)
tree49d5af2d9d708efe01d4068c6bf0ba75249dbe3e
parent38fd9c0aede86d99834dcc693370255652230a75 (diff)
downloadsystemtap-steved-ef63732e82dd7979dcf608ba6ed4528e150b47ac.tar.gz
systemtap-steved-ef63732e82dd7979dcf608ba6ed4528e150b47ac.tar.xz
systemtap-steved-ef63732e82dd7979dcf608ba6ed4528e150b47ac.zip
Fix powerpc dwarfless argument access
-rw-r--r--ChangeLog5
-rw-r--r--runtime/regs.c7
-rw-r--r--tapset/ppc64/registers.stp102
3 files changed, 48 insertions, 66 deletions
diff --git a/ChangeLog b/ChangeLog
index d0247242..313968d4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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)