summaryrefslogtreecommitdiffstats
path: root/runtime
diff options
context:
space:
mode:
authorjistone <jistone>2007-08-11 02:19:25 +0000
committerjistone <jistone>2007-08-11 02:19:25 +0000
commit8d164e0cd719fff3db67b868b0d942c7296890a2 (patch)
tree06fbb801caf3f3a5c59c69d56df98ad368b5627f /runtime
parent7bccd5b6f9778a91a1e66a52689d690bf2228131 (diff)
downloadsystemtap-steved-8d164e0cd719fff3db67b868b0d942c7296890a2.tar.gz
systemtap-steved-8d164e0cd719fff3db67b868b0d942c7296890a2.tar.xz
systemtap-steved-8d164e0cd719fff3db67b868b0d942c7296890a2.zip
2007-08-10 Josh Stone <joshua.i.stone@intel.com>
PR 4593 * translate.cxx (c_unparser::emit_common_header): Add an error_buffer to the context to allow dynamic error messages. * tapsets.cxx (dwflpp::express_as_string): Let deref / store_deref fill in last_error with a detailed message. runtime/ * loc2c-runtime.h (deref, store_deref): Set an error message with the pointer value and name into last_error, since it's hard to determine the details once you've already jumped to deref_fault. tapset/ * conversions.stp (kernel_string, kernel_long, kernel_int, kernel_short, kernel_char, user_string_warn): Use the CONTEXT->error_buffer to create an error message instead of a static local array.
Diffstat (limited to 'runtime')
-rw-r--r--runtime/ChangeLog7
-rw-r--r--runtime/loc2c-runtime.h42
2 files changed, 35 insertions, 14 deletions
diff --git a/runtime/ChangeLog b/runtime/ChangeLog
index 2f7f8140..56ad6103 100644
--- a/runtime/ChangeLog
+++ b/runtime/ChangeLog
@@ -1,3 +1,10 @@
+2007-08-10 Josh Stone <joshua.i.stone@intel.com>
+
+ PR 4593
+ * loc2c-runtime.h (deref, store_deref): Set an error message with
+ the pointer value and name into last_error, since it's hard to
+ determine the details once you've already jumped to deref_fault.
+
2007-07-09 Martin Hunt <hunt@redhat.com>
* sym.h (STP_MAX_MODULES): Raise limit to 256.
diff --git a/runtime/loc2c-runtime.h b/runtime/loc2c-runtime.h
index 02d4df17..34b4ba10 100644
--- a/runtime/loc2c-runtime.h
+++ b/runtime/loc2c-runtime.h
@@ -60,6 +60,21 @@
must work right for kernel addresses, and can use whatever existing
machine-specific kernel macros are convenient. */
+#define DEREF_FAULT(addr) ({ \
+ snprintf(c->error_buffer, sizeof(c->error_buffer), \
+ "kernel read fault at 0x%p (%s)", (void *)(intptr_t)(addr), #addr); \
+ c->last_error = c->error_buffer; \
+ goto deref_fault; \
+ })
+
+#define STORE_DEREF_FAULT(addr) ({ \
+ snprintf(c->error_buffer, sizeof(c->error_buffer), \
+ "kernel write fault at 0x%p (%s)", (void *)(intptr_t)(addr), #addr); \
+ c->last_error = c->error_buffer; \
+ goto deref_fault; \
+ })
+
+
#if defined __i386__
/* The stack pointer is unlike other registers. When a trap happens in
@@ -143,7 +158,7 @@
default: _v = __get_user_bad(); \
} \
if (_bad) \
- goto deref_fault; \
+ DEREF_FAULT(addr); \
_v; \
})
@@ -158,7 +173,7 @@
default: __put_user_bad(); \
} \
if (_bad) \
- goto deref_fault; \
+ STORE_DEREF_FAULT(addr); \
})
@@ -178,7 +193,7 @@
default: _v = __get_user_bad(); \
} \
if (_bad) \
- goto deref_fault; \
+ DEREF_FAULT(addr); \
_v; \
})
@@ -194,7 +209,7 @@
default: __put_user_bad(); \
} \
if (_bad) \
- goto deref_fault; \
+ STORE_DEREF_FAULT(addr); \
})
#elif defined __ia64__
@@ -210,7 +225,7 @@
default: __get_user_unknown(); break; \
} \
if (_bad) \
- goto deref_fault; \
+ DEREF_FAULT(addr); \
_v; \
})
@@ -225,7 +240,7 @@
default: __put_user_unknown(); break; \
} \
if (_bad) \
- goto deref_fault; \
+ STORE_DEREF_FAULT(addr); \
})
#elif defined __powerpc__ || defined __powerpc64__
@@ -283,7 +298,7 @@
default: _v = __get_user_bad(); \
} \
if (_bad) \
- goto deref_fault; \
+ DEREF_FAULT(addr); \
_v; \
})
@@ -299,7 +314,7 @@
default: __put_user_bad(); \
} \
if (_bad) \
- goto deref_fault; \
+ STORE_DEREF_FAULT(addr); \
})
#elif defined (__arm__)
@@ -449,7 +464,7 @@
default: __get_user_bad(); break; \
} \
if (_bad) \
- goto deref_fault; \
+ DEREF_FAULT(addr); \
_v; \
})
@@ -464,7 +479,7 @@
default: __put_user_bad(); break; \
} \
if (_bad) \
- goto deref_fault; \
+ STORE_DEREF_FAULT(addr); \
})
#elif defined (__s390__) || defined (__s390x__)
@@ -550,7 +565,7 @@
_bad = -EFAULT; \
} \
if (_bad) \
- goto deref_fault; \
+ DEREF_FAULT(addr); \
_v; \
})
@@ -562,7 +577,7 @@
__stp_put_asm((u8)(value>>((size-i-1)*8)&0xff), \
(u64)addr+i,_bad); \
if (_bad) \
- goto deref_fault; \
+ STORE_DEREF_FAULT(addr); \
} \
})
@@ -617,6 +632,5 @@
#define CATCH_DEREF_FAULT() \
if (0) { \
-deref_fault: \
- CONTEXT->last_error = "pointer dereference fault"; \
+deref_fault: ; \
}