From 3d9889977397098d14c5be50f1dfef1c3eeb508f Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 6 Aug 2009 10:41:46 +0200 Subject: PR10491 Don't assign to REG_IP if it isn't an lvalue (s390 and ia64). To fixup REG_IP to show the correct value after a [ku]probe trap we assigned the address of the actual instruction pointer of the probed instruction. That doesn't work on architectures, s390 and ia64, where REG_IP is not a simple lvalue. Just don't try to fixup the address in those cases. If this isn't enough, the uprobe_stmt_num.exp testcase will point this out. * runtime/regs.h: Define REG_IP_LVALUE for x86_64, i386, powerpc64 and arm. * tapsets.cxx (dwarf_derived_probe_group::emit_module_decls): Only fixup REG_IP when REG_IP_LVALUE is defined. (uprobe_derived_probe_group::emit_module_decls): Likewise. (kprobe_derived_probe_group::emit_module_decls): Likewise. --- runtime/regs.h | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'runtime/regs.h') diff --git a/runtime/regs.h b/runtime/regs.h index 123d7601..d80cdf0a 100644 --- a/runtime/regs.h +++ b/runtime/regs.h @@ -13,17 +13,20 @@ #if defined (STAPCONF_X86_UNIREGS) && (defined (__x86_64__) || defined (__i386__)) #define REG_IP(regs) regs->ip +#define REG_IP_LVALUE 1 #define REG_SP(regs) regs->sp #define REG_FP(regs) regs->bp #elif defined (__x86_64__) #define REG_IP(regs) regs->rip +#define REG_IP_LVALUE 1 #define REG_SP(regs) regs->rsp #elif defined (__i386__) #define REG_IP(regs) regs->eip +#define REG_IP_LVALUE 1 #define REG_SP(regs) regs->esp #define REG_FP(regs) regs->ebp @@ -34,12 +37,14 @@ #elif defined (__powerpc64__) #define REG_IP(regs) regs->nip +#define REG_IP_LVALUE 1 #define REG_SP(regs) regs->gpr[1] #define REG_LINK(regs) regs->link #elif defined (__arm__) #define REG_IP(regs) regs->ARM_pc +#define REG_IP_LVALUE 1 #define REG_SP(regs) regs->ARM_sp #define REG_LINK(regs) regs->ARM_lr -- cgit