summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJim Keniston <jkenisto@us.ibm.com>2008-05-13 16:33:26 -0700
committerJim Keniston <jkenisto@us.ibm.com>2008-05-13 16:33:26 -0700
commit838cd09eb9134f49a4f290ae5f615edff781f153 (patch)
tree0b06a2a8a40d0936fd1d6732451663563c71488e
parentac158744658d392301e55e42ab53d246de8bc61e (diff)
downloadsystemtap-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.stp44
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)