summaryrefslogtreecommitdiffstats
path: root/runtime
diff options
context:
space:
mode:
Diffstat (limited to 'runtime')
-rw-r--r--runtime/regs.h20
-rw-r--r--runtime/staprun/relay_old.c6
-rw-r--r--runtime/syscall.h1
-rw-r--r--runtime/transport/ring_buffer.c10
-rw-r--r--runtime/transport/symbols.c2
-rw-r--r--runtime/transport/transport.c5
6 files changed, 28 insertions, 16 deletions
diff --git a/runtime/regs.h b/runtime/regs.h
index d80cdf0a..dc6b50af 100644
--- a/runtime/regs.h
+++ b/runtime/regs.h
@@ -12,53 +12,61 @@
#define _REGS_H_
#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
#elif defined (__ia64__)
+
#define REG_IP(regs) ((regs)->cr_iip +ia64_psr(regs)->ri)
#define REG_SP(regs) ((regs)->r12)
+#define SET_REG_IP(regs, x) \
+ (((regs)->cr_iip = (x) & ~3UL), (ia64_psr(regs)->ri = (x) & 3UL))
+
#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
#elif defined (__s390__) || defined (__s390x__)
+
#ifndef __s390x__
#define PSW_ADDR_AMODE 0x80000000UL
+#define PSW_ADDR_INSN 0x7FFFFFFFUL
#else /* __s390x__ */
#define PSW_ADDR_AMODE 0x0000000000000000UL
+#define PSW_ADDR_INSN 0xFFFFFFFFFFFFFFFFUL
#endif /* __s390x__ */
-#define REG_IP(regs) (((regs)->psw.addr) | PSW_ADDR_AMODE)
+#define REG_IP(regs) (((regs)->psw.addr) & PSW_ADDR_INSN)
#define REG_SP(regs) (regs)->gprs[15]
+#define SET_REG_IP(regs,x) (regs)->psw.addr = (x) | PSW_ADDR_AMODE
#else
#error "Unimplemented architecture"
#endif
+#ifndef SET_REG_IP
+#define SET_REG_IP(regs, x) REG_IP(regs) = x
+#endif
+
#endif /* _REGS_H_ */
diff --git a/runtime/staprun/relay_old.c b/runtime/staprun/relay_old.c
index 71d8acee..0254173f 100644
--- a/runtime/staprun/relay_old.c
+++ b/runtime/staprun/relay_old.c
@@ -110,7 +110,8 @@ static int open_oldoutfile(int fnum, int cpu, int remove_file)
perr("Couldn't open output file %s", buf);
return -1;
}
- if (set_clexec(fileno(percpu_tmpfile[cpu])) < 0) {
+ out_fd[cpu] = fileno(percpu_tmpfile[cpu]);
+ if (set_clexec(out_fd[cpu]) < 0) {
perr("Couldn't clear exec bit of open output file %s", buf);
return -1;
}
@@ -181,7 +182,8 @@ static int open_relayfs_files(int cpu, const char *relay_filebase, const char *p
perr("Couldn't open output file %s", tmp);
goto err2;
}
- if (set_clexec(fileno(percpu_tmpfile[cpu])) < 0) {
+ out_fd[cpu] = fileno(percpu_tmpfile[cpu]);
+ if (set_clexec(out_fd[cpu]) < 0) {
perr("Couldn't open output file %s", tmp);
goto err2;
}
diff --git a/runtime/syscall.h b/runtime/syscall.h
index 38b523e1..786965f4 100644
--- a/runtime/syscall.h
+++ b/runtime/syscall.h
@@ -52,6 +52,7 @@
: __MREMAP_SYSCALL_NO_X86_64)
# else
#define MMAP_SYSCALL_NO(tsk) __MMAP_SYSCALL_NO_X86_64
+#define MMAP2_SYSCALL_NO(tsk) __MMAP2_SYSCALL_NO_X86_64
#define MPROTECT_SYSCALL_NO(tsk) __MPROTECT_SYSCALL_NO_X86_64
#define MUNMAP_SYSCALL_NO(tsk) __MUNMAP_SYSCALL_NO_X86_64
#define MREMAP_SYSCALL_NO(tsk) __MREMAP_SYSCALL_NO_X86_64
diff --git a/runtime/transport/ring_buffer.c b/runtime/transport/ring_buffer.c
index 43448076..251d6ed9 100644
--- a/runtime/transport/ring_buffer.c
+++ b/runtime/transport/ring_buffer.c
@@ -162,7 +162,7 @@ _stp_event_to_user(struct ring_buffer_event *event, char __user *ubuf,
return -EFAULT;
}
- entry = (struct _stp_data_entry *)ring_buffer_event_data(event);
+ entry = ring_buffer_event_data(event);
if (entry == NULL) {
dbug_trans(1, "returning -EFAULT(2)\n");
return -EFAULT;
@@ -578,7 +578,7 @@ _stp_data_write_reserve(size_t size_request, void **entry)
if (event) {
ssize_t len;
- sde = (struct _stp_data_entry *)ring_buffer_event_data(event);
+ sde = ring_buffer_event_data(event);
if (sde->len < size_request)
size_request = sde->len;
_stp_ring_buffer_consume(iter);
@@ -605,7 +605,7 @@ _stp_data_write_reserve(size_t size_request, void **entry)
}
}
- sde = (struct _stp_data_entry *)ring_buffer_event_data(event);
+ sde = ring_buffer_event_data(event);
sde->len = size_request;
*entry = event;
@@ -620,7 +620,7 @@ static unsigned char *_stp_data_entry_data(void *entry)
if (event == NULL)
return NULL;
- sde = (struct _stp_data_entry *)ring_buffer_event_data(event);
+ sde = ring_buffer_event_data(event);
return sde->buf;
}
@@ -635,7 +635,7 @@ static int _stp_data_write_commit(void *entry)
#if defined(DEBUG_TRANS) && (DEBUG_TRANS >= 2)
{
- struct _stp_data_entry *sde = (struct _stp_data_entry *)ring_buffer_event_data(event);
+ struct _stp_data_entry *sde = ring_buffer_event_data(event);
char *last = sde->buf + (sde->len - 5);
dbug_trans2("commiting %.5s...%.5s\n", sde->buf, last);
}
diff --git a/runtime/transport/symbols.c b/runtime/transport/symbols.c
index 3e6a2fb1..a214d1f2 100644
--- a/runtime/transport/symbols.c
+++ b/runtime/transport/symbols.c
@@ -15,7 +15,7 @@
static void _stp_do_relocation(const char __user *buf, size_t count)
{
- struct _stp_msg_relocation msg;
+ static struct _stp_msg_relocation msg; /* by protocol, never concurrently used */
unsigned mi, si;
if (sizeof(msg) != count)
diff --git a/runtime/transport/transport.c b/runtime/transport/transport.c
index 1d029e53..f5efce9f 100644
--- a/runtime/transport/transport.c
+++ b/runtime/transport/transport.c
@@ -31,8 +31,9 @@ static int _stp_ctl_attached = 0;
static pid_t _stp_target = 0;
static int _stp_probes_started = 0;
-// For now, disable transport version 3
-#if STP_TRANSPORT_VERSION == 3
+// For now, disable transport version 3 (unless STP_USE_RING_BUFFER is
+// defined).
+#if STP_TRANSPORT_VERSION == 3 && !defined(STP_USE_RING_BUFFER)
#undef STP_TRANSPORT_VERSION
#define STP_TRANSPORT_VERSION 2
#endif