From f1bad60c76d79f01a87e4128df266bf4252a71e0 Mon Sep 17 00:00:00 2001 From: hunt Date: Thu, 2 Nov 2006 18:37:00 +0000 Subject: New dynamic module and symbol handling code. --- tapsets.cxx | 54 +----------------------------------------------------- 1 file changed, 1 insertion(+), 53 deletions(-) (limited to 'tapsets.cxx') diff --git a/tapsets.cxx b/tapsets.cxx index eaa635d4..dc0fc3c1 100644 --- a/tapsets.cxx +++ b/tapsets.cxx @@ -3218,58 +3218,6 @@ dwarf_derived_probe_group::emit_module_decls (systemtap_session& s) s.op->newline() << "/* ---- dwarf probes ---- */"; - // XXX: Until staprun provides us a run-time module/section/address - // table, we take matters into our own hands. - s.op->newline() << "struct stap_module { const char* module; const char* section; unsigned long address; } stap_modules[] = {"; - s.op->indent(1); - glob_t globbuf; - int rc = glob ("/sys/module/*", 0, NULL, &globbuf); - if (!rc) for (unsigned j=0; j> hex_address; } catch (...) { file.close(); continue; } - file.close (); - if (s.verbose > 2) - clog << "found module=" << module << " section=" << section << " base=" << hex_address << endl; - // we don't need to use quoted_lex_blah since module/section names are vanilla - s.op->newline() << "{ \"" << module << "\", \"" << section << "\", " << hex_address << "UL },"; - } - if (!rc2) globfree (& globbuf2); - } - if (!rc) globfree (& globbuf); - s.op->newline() << "{ \"\", \"\", 0 }"; // sentinel - s.op->newline(-1) << "};"; - - // A convenient lookup function for this table - s.op->newline() << "static unsigned long module_relocate (const char *module, const char *section, unsigned long offset) {"; - s.op->newline(1) << "static struct stap_module *last = & stap_modules[0];"; // a one-entry TLB - s.op->newline() << "if (! module) { return offset; }"; // non-relocatable? just hand it back. - // emit code to look at "one-entry TLB"; assumes last-> points no farther than sentinel - s.op->newline() << "if (!strcmp (module, last->module) && !strcmp (section, last->section))"; - s.op->newline(1) << "return offset + last->address;"; - // emit code to look at it the long way ... simple but slow. - // Luckily, the later code makes sure that probes are relocated in a - // sorted sequence by module, so the TLB hit rate should be - // excellent. - s.op->newline(-1) << "last = & stap_modules[0];"; - s.op->newline() << "while (last->module && last->section && last->module[0]) {"; // sentinel - s.op->newline(1) << "if (!strcmp (module, last->module) && !strcmp (section, last->section))"; - s.op->newline(1) << "return offset + last->address;"; - s.op->newline(-1) << "last ++;"; - s.op->newline(-1) << "}"; - s.op->newline() << "last = & stap_modules[0];"; // important: reset to some valid entry - s.op->newline() << "return 0;"; // not found in entire module table - s.op->newline(-1) << "}"; - // Forward declare the master entry functions s.op->newline() << "static int enter_kprobe_probe (struct kprobe *inst,"; s.op->line() << " struct pt_regs *regs);"; @@ -3340,7 +3288,7 @@ dwarf_derived_probe_group::emit_module_init (systemtap_session& s) { s.op->newline() << "for (i=0; i<" << probes_by_module.size() << "; i++) {"; s.op->newline(1) << "struct stap_dwarf_probe *sdp = & stap_dwarf_probes[i];"; - s.op->newline() << "unsigned long relocated_addr = module_relocate (sdp->module, sdp->section, sdp->address);"; + s.op->newline() << "unsigned long relocated_addr = _stp_module_relocate (sdp->module, sdp->section, sdp->address);"; s.op->newline() << "if (relocated_addr == 0) continue;"; // quietly; assume module is absent s.op->newline() << "if (sdp->return_p) {"; s.op->newline(1) << "sdp->u.krp.kp.addr = (void *) relocated_addr;"; -- cgit