diff options
author | 2015-08-04 12:17:53 -0700 | |
---|---|---|
committer | 2015-08-04 15:44:42 -0700 | |
commit | 9ca8dbcc65cfc63d6f5ef3312a33184e1d726e00 (patch) | |
tree | 1c9cafbcd35f783a87880a10f85d1a060db1a563 /kernel/tools/perf/ui/browsers/map.c | |
parent | 98260f3884f4a202f9ca5eabed40b1354c489b29 (diff) |
Add the rt linux 4.1.3-rt3 as base
Import the rt linux 4.1.3-rt3 as OPNFV kvm base.
It's from git://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git linux-4.1.y-rt and
the base is:
commit 0917f823c59692d751951bf5ea699a2d1e2f26a2
Author: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Date: Sat Jul 25 12:13:34 2015 +0200
Prepare v4.1.3-rt3
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
We lose all the git history this way and it's not good. We
should apply another opnfv project repo in future.
Change-Id: I87543d81c9df70d99c5001fbdf646b202c19f423
Signed-off-by: Yunhong Jiang <yunhong.jiang@intel.com>
Diffstat (limited to 'kernel/tools/perf/ui/browsers/map.c')
-rw-r--r-- | kernel/tools/perf/ui/browsers/map.c | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/kernel/tools/perf/ui/browsers/map.c b/kernel/tools/perf/ui/browsers/map.c new file mode 100644 index 000000000..b11639f33 --- /dev/null +++ b/kernel/tools/perf/ui/browsers/map.c @@ -0,0 +1,130 @@ +#include "../libslang.h" +#include <elf.h> +#include <inttypes.h> +#include <sys/ttydefaults.h> +#include <string.h> +#include <linux/bitops.h> +#include "../../util/util.h" +#include "../../util/debug.h" +#include "../../util/symbol.h" +#include "../browser.h" +#include "../helpline.h" +#include "../keysyms.h" +#include "map.h" + +struct map_browser { + struct ui_browser b; + struct map *map; + u8 addrlen; +}; + +static void map_browser__write(struct ui_browser *browser, void *nd, int row) +{ + struct symbol *sym = rb_entry(nd, struct symbol, rb_node); + struct map_browser *mb = container_of(browser, struct map_browser, b); + bool current_entry = ui_browser__is_current_entry(browser, row); + int width; + + ui_browser__set_percent_color(browser, 0, current_entry); + slsmg_printf("%*" PRIx64 " %*" PRIx64 " %c ", + mb->addrlen, sym->start, mb->addrlen, sym->end, + sym->binding == STB_GLOBAL ? 'g' : + sym->binding == STB_LOCAL ? 'l' : 'w'); + width = browser->width - ((mb->addrlen * 2) + 4); + if (width > 0) + slsmg_write_nstring(sym->name, width); +} + +/* FIXME uber-kludgy, see comment on cmd_report... */ +static u32 *symbol__browser_index(struct symbol *browser) +{ + return ((void *)browser) - sizeof(struct rb_node) - sizeof(u32); +} + +static int map_browser__search(struct map_browser *browser) +{ + char target[512]; + struct symbol *sym; + int err = ui_browser__input_window("Search by name/addr", + "Prefix with 0x to search by address", + target, "ENTER: OK, ESC: Cancel", 0); + if (err != K_ENTER) + return -1; + + if (target[0] == '0' && tolower(target[1]) == 'x') { + u64 addr = strtoull(target, NULL, 16); + sym = map__find_symbol(browser->map, addr, NULL); + } else + sym = map__find_symbol_by_name(browser->map, target, NULL); + + if (sym != NULL) { + u32 *idx = symbol__browser_index(sym); + + browser->b.top = &sym->rb_node; + browser->b.index = browser->b.top_idx = *idx; + } else + ui_helpline__fpush("%s not found!", target); + + return 0; +} + +static int map_browser__run(struct map_browser *browser) +{ + int key; + + if (ui_browser__show(&browser->b, browser->map->dso->long_name, + "Press <- or ESC to exit, %s / to search", + verbose ? "" : "restart with -v to use") < 0) + return -1; + + while (1) { + key = ui_browser__run(&browser->b, 0); + + switch (key) { + case '/': + if (verbose) + map_browser__search(browser); + default: + break; + case K_LEFT: + case K_ESC: + case 'q': + case CTRL('c'): + goto out; + } + } +out: + ui_browser__hide(&browser->b); + return key; +} + +int map__browse(struct map *map) +{ + struct map_browser mb = { + .b = { + .entries = &map->dso->symbols[map->type], + .refresh = ui_browser__rb_tree_refresh, + .seek = ui_browser__rb_tree_seek, + .write = map_browser__write, + }, + .map = map, + }; + struct rb_node *nd; + char tmp[BITS_PER_LONG / 4]; + u64 maxaddr = 0; + + for (nd = rb_first(mb.b.entries); nd; nd = rb_next(nd)) { + struct symbol *pos = rb_entry(nd, struct symbol, rb_node); + + if (maxaddr < pos->end) + maxaddr = pos->end; + if (verbose) { + u32 *idx = symbol__browser_index(pos); + *idx = mb.b.nr_entries; + } + ++mb.b.nr_entries; + } + + mb.addrlen = snprintf(tmp, sizeof(tmp), "%" PRIx64, maxaddr); + return map_browser__run(&mb); +} |