diff options
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | stapfuncs.5.in | 7 | ||||
-rw-r--r-- | tapset/context.stp | 4 | ||||
-rw-r--r-- | tapset/i686/registers.stp | 18 | ||||
-rw-r--r-- | tapset/ppc64/registers.stp | 4 | ||||
-rw-r--r-- | tapset/x86_64/registers.stp | 4 |
6 files changed, 40 insertions, 7 deletions
@@ -1,3 +1,13 @@ +2008-05-29 Jim Keniston <jkenisto@us.ibm.com> + + PR 6582 + * tapset/context.stp: Added registers_valid(). + * stapfuncs.5.in: Ditto. + * tapset/x86_64/registers.stp: Added registers_valid() check. + * tapset/ppc64/registers.stp: Ditto. + * tapset/i686/registers.stp: Ditto. Also fixed warnings due to + sp_offset and ss_offset not being global. + 2008-05-29 Ananth N Mavinakayanahalli <ananth@in.ibm.com> PR 6563 diff --git a/stapfuncs.5.in b/stapfuncs.5.in index 04e5ea17..6d4546ab 100644 --- a/stapfuncs.5.in +++ b/stapfuncs.5.in @@ -345,6 +345,11 @@ Return the maximum number of file handles for the given task. .SS CPU REGISTERS .TP +registers_valid:long () +Return 1 if register() and u_register() can be used +in the current context, or 0 otherwise. +For example, registers_valid() returns 0 when called from a begin or end probe. +.TP register:long (name:string) Return the value of the named CPU register, as it was saved when the current probe point was hit. @@ -368,7 +373,7 @@ segment registers: xcs/cs, xss/ss. For powerpc, the following names are recognized: r1, r2... r31, nip, msr, orig_gpr3, ctr, link, xer, ccr, softe, trap, -dar, dsisr, result; +dar, dsisr, result. .TP u_register:long (name:string) diff --git a/tapset/context.stp b/tapset/context.stp index dc560316..45e3be30 100644 --- a/tapset/context.stp +++ b/tapset/context.stp @@ -136,6 +136,10 @@ function probemod:string () %{ /* pure */ } %} +function registers_valid:long () %{ /* pure */ + THIS->__retvalue = (CONTEXT->regs != NULL); +%} + function is_return:long () %{ /* pure */ if (CONTEXT->pi) THIS->__retvalue = 1; diff --git a/tapset/i686/registers.stp b/tapset/i686/registers.stp index 52b00973..72114dc9 100644 --- a/tapset/i686/registers.stp +++ b/tapset/i686/registers.stp @@ -1,4 +1,4 @@ -global _reg_offsets, _stp_regs_registered +global _reg_offsets, _stp_regs_registered, _sp_offset, _ss_offset function _stp_register_regs() { /* Same order as pt_regs */ @@ -16,8 +16,10 @@ function _stp_register_regs() { _reg_offsets["eip"] = 44 _reg_offsets["ip"] = 44 _reg_offsets["xcs"] = 48 _reg_offsets["cs"] = 48 _reg_offsets["eflags"] = 52 _reg_offsets["flags"] = 52 - _reg_offsets["esp"] = 56 _reg_offsets["sp"] = 56 sp_offset = 56 - _reg_offsets["xss"] = 60 _reg_offsets["ss"] = 60 ss_offset = 60 + _reg_offsets["esp"] = 56 _reg_offsets["sp"] = 56 + _reg_offsets["xss"] = 60 _reg_offsets["ss"] = 60 + _sp_offset = 56 + _ss_offset = 60 _stp_regs_registered = 1 } @@ -49,6 +51,10 @@ function _stp_kernel_ss:long () %{ /* Return the named register value as a signed value. */ function register:long (name:string) { + if (!registers_valid()) { + error("cannot access CPU registers in this context") + return 0 + } if (!_stp_regs_registered) _stp_register_regs() offset = _reg_offsets[name] @@ -57,9 +63,9 @@ function register:long (name:string) { return 0 } if (_stp_probing_kernel()) { - if (offset == sp_offset) - return _stp_kernel_sp(sp_offset) - else if (offset == ss_offset) + if (offset == _sp_offset) + return _stp_kernel_sp(_sp_offset) + else if (offset == _ss_offset) return _stp_kernel_ss() } return _stp_get_register_by_offset(offset) diff --git a/tapset/ppc64/registers.stp b/tapset/ppc64/registers.stp index f317916b..ea520892 100644 --- a/tapset/ppc64/registers.stp +++ b/tapset/ppc64/registers.stp @@ -75,6 +75,10 @@ function _stp_sign_extend32:long (value:long) { } function _stp_register:long (name:string, sign_extend:long) { + if (!registers_valid()) { + error("cannot access CPU registers in this context") + return 0 + } if (!_stp_regs_registered) _stp_register_regs() offset = _reg_offsets[name] diff --git a/tapset/x86_64/registers.stp b/tapset/x86_64/registers.stp index 8e3c088b..c9728de9 100644 --- a/tapset/x86_64/registers.stp +++ b/tapset/x86_64/registers.stp @@ -54,6 +54,10 @@ function _stp_sign_extend32:long (value:long) %{ function _stp_register:long (name:string, sign_extend:long) { reg32 = 0 + if (!registers_valid()) { + error("cannot access CPU registers in this context") + return 0 + } if (!_stp_regs_registered) _stp_register_regs() offset = _reg_offsets[name] |