summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--stapfuncs.5.in7
-rw-r--r--tapset/context.stp4
-rw-r--r--tapset/i686/registers.stp18
-rw-r--r--tapset/ppc64/registers.stp4
-rw-r--r--tapset/x86_64/registers.stp4
6 files changed, 40 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index 313968d4..78268d82 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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]