diff options
author | Jim Keniston <jkenisto@us.ibm.com> | 2008-05-13 16:33:26 -0700 |
---|---|---|
committer | Jim Keniston <jkenisto@us.ibm.com> | 2008-05-13 16:33:26 -0700 |
commit | 838cd09eb9134f49a4f290ae5f615edff781f153 (patch) | |
tree | 0b06a2a8a40d0936fd1d6732451663563c71488e | |
parent | ac158744658d392301e55e42ab53d246de8bc61e (diff) | |
download | systemtap-steved-838cd09eb9134f49a4f290ae5f615edff781f153.tar.gz systemtap-steved-838cd09eb9134f49a4f290ae5f615edff781f153.tar.xz systemtap-steved-838cd09eb9134f49a4f290ae5f615edff781f153.zip |
Factored returnval() out of returnstr(), for use in dwarfless probing.
-rw-r--r-- | tapset/errno.stp | 44 |
1 files changed, 28 insertions, 16 deletions
diff --git a/tapset/errno.stp b/tapset/errno.stp index 550e5d4f..2523d846 100644 --- a/tapset/errno.stp +++ b/tapset/errno.stp @@ -351,33 +351,45 @@ function errno_str:string (err:long) %{ /* pure */ strlcpy (THIS->__retvalue, errlist[e], MAXSTRINGLEN); %} -/* for syscall tapset. set returnp = 1 for decimal, 2 for hex */ -function returnstr:string (returnp:long) %{ /* pure */ - long ret; - - /* XXX: unfortunate duplication with return.stp:retval() */ - - if (CONTEXT->regs) { +%{ +static long _stp_returnval(struct pt_regs *regs) { + if (regs) { #if defined (STAPCONF_X86_UNIREGS) && (defined (__x86_64__) || defined (__i386__)) - ret = CONTEXT->regs->ax; + return regs->ax; #elif defined (__i386__) - ret = CONTEXT->regs->eax; + return regs->eax; #elif defined (__x86_64__) - ret = CONTEXT->regs->rax; + // TODO: Handle -m32 apps. + return regs->rax; #elif defined (__powerpc64__) - ret = CONTEXT->regs->gpr[3]; + return regs->gpr[3]; #elif defined (__ia64__) - ret = CONTEXT->regs->r8; + return regs->r8; #elif defined (__sparc64__) - ret = CONTEXT->regs->u_regs[UREG_RETPC]; + return regs->u_regs[UREG_RETPC]; #elif defined (__s390x__) - ret = CONTEXT->regs->gprs[2]; + return regs->gprs[2]; #elif defined (__arm__) - ret = CONTEXT->regs->ARM_r0; + return regs->ARM_r0; #else - goto no_ret; + _stp_error("returnval() not defined for this architecture"); + return 0; #endif + } else { + _stp_error("returnval() not defined in this context"); + return 0; + } +} +%} + +function returnval:long () %{ /* pure */ + THIS->__retvalue = _stp_returnval(CONTEXT->regs); +%} +/* for syscall tapset. set returnp = 1 for decimal, 2 for hex */ +function returnstr:string (returnp:long) %{ /* pure */ + if (CONTEXT->regs) { + long ret = _stp_returnval(CONTEXT->regs); if (ret < 0 && ret > -Maxerrno && errlist[-ret]) snprintf (THIS->__retvalue, MAXSTRINGLEN, "%ld (%s)", ret, errlist[-ret]); else if (THIS->returnp == 2) |