summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--NEWS5
-rw-r--r--parse.cxx6
-rw-r--r--runtime/task_finder.c6
-rw-r--r--tapset/aux_syscalls.stp7
-rw-r--r--tapsets.cxx33
5 files changed, 41 insertions, 16 deletions
diff --git a/NEWS b/NEWS
index 74fd1df5..fff8afc9 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,10 @@
* What's new
+- In guru mode (-g), the kernel probing blacklist is disabled, leaving
+ only a subset - the kernel's own internal kprobe blacklist - to attempt
+ to filter out areas unsafe to probe. The differences may be enough to
+ probe more interrupt handlers.
+
- Variables unavailable in current context may be skipped by setting a
session level flag with command line option --skip-badvars now available.
This will simply substitute the otherwise error causing variable with a
diff --git a/parse.cxx b/parse.cxx
index ac7e652c..a26d594c 100644
--- a/parse.cxx
+++ b/parse.cxx
@@ -2341,6 +2341,12 @@ parser::parse_symbol ()
cop->operand = parse_expression ();
expect_op(",");
expect_unknown(tok_string, cop->type);
+ // types never start with "struct<space>" or "union<space>",
+ // so gobble it up.
+ if (cop->type.compare(0, 7, "struct ") == 0)
+ cop->type = cop->type.substr(7);
+ if (cop->type.compare(0, 6, "union ") == 0)
+ cop->type = cop->type.substr(6);
if (peek_op (","))
{
next();
diff --git a/runtime/task_finder.c b/runtime/task_finder.c
index 38f9145d..2b408763 100644
--- a/runtime/task_finder.c
+++ b/runtime/task_finder.c
@@ -1026,6 +1026,7 @@ __stp_utrace_task_finder_target_syscall_entry(enum utrace_resume_action action,
static void
__stp_call_vm_callbacks_with_vma(struct stap_task_finder_target *tgt,
struct task_struct *tsk,
+ int map_p,
struct vm_area_struct *vma)
{
char *mmpath_buf;
@@ -1052,7 +1053,7 @@ __stp_call_vm_callbacks_with_vma(struct stap_task_finder_target *tgt,
rc, (int)tsk->pid);
}
else {
- __stp_call_vm_callbacks(tgt, tsk, 1, mmpath,
+ __stp_call_vm_callbacks(tgt, tsk, map_p, mmpath,
vma->vm_start, vma->vm_end,
(vma->vm_pgoff << PAGE_SHIFT));
}
@@ -1145,7 +1146,7 @@ __stp_utrace_task_finder_target_syscall_exit(enum utrace_resume_action action,
down_read(&mm->mmap_sem);
vma = __stp_find_file_based_vma(mm, rv);
if (vma != NULL) {
- __stp_call_vm_callbacks_with_vma(tgt, tsk, vma);
+ __stp_call_vm_callbacks_with_vma(tgt, tsk, 0, vma);
}
up_read(&mm->mmap_sem);
mmput(mm);
@@ -1218,6 +1219,7 @@ __stp_utrace_task_finder_target_syscall_exit(enum utrace_resume_action action,
&& vma->vm_end <= entry->vm_end) {
__stp_call_vm_callbacks_with_vma(tgt,
tsk,
+ 1,
vma);
if (vma->vm_end >= entry->vm_end)
break;
diff --git a/tapset/aux_syscalls.stp b/tapset/aux_syscalls.stp
index d2e43903..87ea4e04 100644
--- a/tapset/aux_syscalls.stp
+++ b/tapset/aux_syscalls.stp
@@ -322,17 +322,10 @@ function _struct_sockaddr_u:string(uaddr:long, len:long)
}
else if ((sa->sa_family == AF_PACKET)&&(len == sizeof(struct sockaddr_ll)))
{
- /* FIXME. This needs tested */
struct sockaddr_ll *sll = (struct sockaddr_ll *)buf;
-#if defined(__powerpc__) || defined(__ia64__) || defined(__s390x__)
- snprintf(str, strlen, "{AF_PACKET, proto=%d, ind=%d, hatype=%d, pkttype=%d, halen=%d, addr=0x%lx}",
- (int)sll->sll_protocol, sll->sll_ifindex, (int)sll->sll_hatype, (int)sll->sll_pkttype,
- (int)sll->sll_halen, *(uint64_t *)sll->sll_addr);
-#else
snprintf(str, strlen, "{AF_PACKET, proto=%d, ind=%d, hatype=%d, pkttype=%d, halen=%d, addr=0x%llx}",
(int)sll->sll_protocol, sll->sll_ifindex, (int)sll->sll_hatype, (int)sll->sll_pkttype,
(int)sll->sll_halen, *(uint64_t *)sll->sll_addr);
-#endif
}
else
{
diff --git a/tapsets.cxx b/tapsets.cxx
index 894a7447..a8653d8a 100644
--- a/tapsets.cxx
+++ b/tapsets.cxx
@@ -3521,9 +3521,17 @@ dwarf_query::blacklisted_p(const string& funcname,
if (! (goodfn && goodfile))
{
- if (sess.verbose>1)
- clog << " skipping - blacklisted";
- return true;
+ if (sess.guru_mode)
+ {
+ if (sess.verbose>1)
+ clog << " guru mode enabled - ignoring blacklist";
+ }
+ else
+ {
+ if (sess.verbose>1)
+ clog << " skipping - blacklisted";
+ return true;
+ }
}
// This probe point is not blacklisted.
@@ -5059,7 +5067,8 @@ void dwarf_cast_expanding_visitor::visit_cast_op (cast_op* e)
// cast_op to the next pass. We hope that this value ends
// up not being referenced after all, so it can be optimized out
// quietly.
- semantic_error* er = new semantic_error ("type definition not found", e->tok);
+ string msg = "type definition '" + e->type + "' not found";
+ semantic_error* er = new semantic_error (msg, e->tok);
// NB: we can have multiple errors, since a @cast
// may be expanded in several different contexts:
// function ("*") { @cast(...) }
@@ -9233,7 +9242,7 @@ mark_builder::build(systemtap_session & sess,
struct tracepoint_arg
{
- string name, c_type;
+ string name, c_type, typecast;
bool usable, used, isptr;
Dwarf_Die type_die;
tracepoint_arg(): usable(false), used(false), isptr(false) {}
@@ -9336,6 +9345,9 @@ tracepoint_var_expanding_visitor::visit_target_symbol_arg (target_symbol* e)
if (lvalue && (!dw.sess.guru_mode || e->components.empty()))
throw semantic_error("write to tracepoint variable '" + e->base_name
+ "' not permitted", e->tok);
+ // XXX: if a struct/union arg is passed by value, then writing to its fields
+ // is also meaningless until you dereference past a pointer member. It's
+ // harder to detect and prevent that though...
if (e->components.empty())
{
@@ -9676,6 +9688,14 @@ resolve_tracepoint_arg_type(tracepoint_arg& arg)
if (dwarf_attr_integrate(&arg.type_die, DW_AT_type, &type_attr)
&& dwarf_formref_die(&type_attr, &arg.type_die))
arg.isptr = true;
+ arg.typecast = "(intptr_t)";
+ return true;
+ case DW_TAG_structure_type:
+ case DW_TAG_union_type:
+ // for structs/unions which are passed by value, we turn it into
+ // a pointer that can be dereferenced.
+ arg.isptr = true;
+ arg.typecast = "(intptr_t)&";
return true;
default:
// should we consider other types too?
@@ -9778,8 +9798,7 @@ tracepoint_derived_probe_group::emit_module_decls (systemtap_session& s)
{
s.op->newline() << "c->locals[0]." << p->name << ".__tracepoint_arg_"
<< p->args[j].name << " = (int64_t)";
- if (p->args[j].isptr)
- s.op->line() << "(intptr_t)";
+ s.op->line() << p->args[j].typecast;
s.op->line() << "__tracepoint_arg_" << p->args[j].name << ";";
}
s.op->newline() << p->name << " (c);";