summaryrefslogtreecommitdiffstats
path: root/tapset
diff options
context:
space:
mode:
Diffstat (limited to 'tapset')
-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
4 files changed, 24 insertions, 6 deletions
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]