9 #include "jdb_disasm.h"
10 #include "jdb_input.h"
11 #include "jdb_module.h"
12 #include "jdb_screen.h"
13 #include "jdb_symbol.h"
14 #include "jdb_regex.h"
16 #include "jdb_tbuf_output.h"
18 #include "kernel_console.h"
22 #include "static_init.h"
28 enum { Max_group_size = 10 };
29 typedef Tb_entry::Group_order Group_order;
36 Item() : e(0), y(0), order(Group_order::none()) {}
39 Entry_group() : _c(0) {}
41 Item const &operator [] (unsigned i) const { return _i[i]; }
42 Item &operator [] (unsigned i) { return _i[i]; }
43 unsigned size() const { return _c; }
44 bool full() const { return _c >= Max_group_size; }
45 unsigned push_back(Tb_entry const *e, Mword y, Group_order t)
57 Item _i[Max_group_size];
60 class Jdb_tbuf_show : public Jdb_module
63 Jdb_tbuf_show() FIASCO_INIT;
66 static char _search_str[40];
67 static char _filter_str[40];
68 static char _buffer_str[512];
69 static Mword _status_type;
73 static Mword _nr_pos[10];
74 static Mword y_offset;
78 Index_mode = 0, // number of event
79 Tsc_delta_mode = 1, // tsc ticks starting from last event
80 Tsc_ref_mode = 2, // tsc ticks starting from reference event
81 Tsc_start_mode = 3, // tsc ticks starting from 0
82 Kclock_ref_mode = 4, // kernel clock units (us) since reference event
83 Kclock_start_mode = 5, // kernel clock units (us) since start of system
84 Pmc1_delta_mode = 6, // ticks of ctr 1 starting from last event
85 Pmc2_delta_mode = 7, // ticks of ctr 2 starting from last event
86 Pmc1_ref_mode = 8, // ticks of ctr 1 starting from reference event
87 Pmc2_ref_mode = 9, // ticks of ctr 2 starting from reference event
108 char Jdb_tbuf_show::_search_str[40];
109 char Jdb_tbuf_show::_filter_str[40];
110 char Jdb_tbuf_show::_buffer_str[512];
111 Mword Jdb_tbuf_show::_status_type;
112 Mword Jdb_tbuf_show::_absy;
113 Mword Jdb_tbuf_show::_nr_cur;
114 Mword Jdb_tbuf_show::_nr_ref;
115 Mword Jdb_tbuf_show::_nr_pos[10] = { Nil, Nil, Nil, Nil, Nil,
116 Nil, Nil, Nil, Nil, Nil };
118 Mword Jdb_tbuf_show::y_offset = 0;
121 Jdb_tbuf_show::error(const char * const msg)
123 Jdb::printf_statline("tbuf", 0, "\033[31;1m=== %s! ===\033[m", msg);
124 _status_type = Status_error;
128 Jdb_tbuf_show::get_string(char *string, unsigned size)
130 for (unsigned pos=strlen(string); ; )
132 switch(int c=Jdb_core::getchar())
138 string[--pos] = '\0';
144 Jdb::abort_command();
161 Jdb_tbuf_show::show_perf_event_unit_mask_entry(Mword nr, Mword idx,
162 Mword unit_mask, int exclusive)
167 Perf_cnt::get_unit_mask_entry(nr, idx, &value, &desc);
169 desc = "(no description?)";
170 printf(" %c %02lx %.59s\033[K",
171 exclusive ? unit_mask == value ? '+' : ' '
172 : unit_mask & value ? '+' : ' ',
177 Jdb_tbuf_show::show_perf_event(Mword nr)
179 const char *name, *desc;
181 Mword add_kcnt = Config::Jdb_accounting ? Kern_cnt_max : 0;
185 const char * const s = Kern_cnt::get_str(nr);
186 printf(" %-26.26s %.49s\033[K", s, "(kernel event counter)");
190 Perf_cnt::get_perf_event(nr - add_kcnt, &evntsel, &name, &desc);
194 desc = "(no description)";
196 printf("%02x %-26.26s %.49s\033[K", evntsel, name, desc);
200 Jdb_tbuf_show::select_perf_event_unit_mask(Mword nr, Mword unit_mask)
206 Mword cols = Jdb_screen::cols() - 1;
208 Mword default_value, nvalues, value;
209 Perf_cnt::Unit_mask_type type;
212 Perf_cnt::get_unit_mask(nr, &type, &default_value, &nvalues);
213 int exclusive = (type == Perf_cnt::Exclusive);
215 if (type == Perf_cnt::None)
218 if (type == Perf_cnt::Fixed || (nvalues < 1))
219 return default_value;
223 Perf_cnt::get_unit_mask_entry(nr, 0, &value, &desc);
230 Jdb::printf_statline("tbuf", "<Space>=set mask <CR>=done", "P?");
232 Jdb::cursor(Tbuf_start_line, 1);
234 show_perf_event(nr + (Config::Jdb_accounting ? Kern_cnt_max : 0));
235 printf("\033[m\033[K\n"
237 " \033[1;32mSelect Event Mask (%s):\033[m\033[K\n"
238 "\033[K\n", exclusive ? "exclusive" : "bitmap");
244 Jdb::cursor(Tbuf_start_line+4, 1);
245 for (i=0; i<lines; i++)
247 show_perf_event_unit_mask_entry(nr, i, unit_mask, exclusive);
250 for (; i<Jdb_screen::height()-Tbuf_start_line-5; i++)
253 for (bool redraw=false; !redraw; )
259 Jdb::cursor(addy+Tbuf_start_line+4, 1);
260 putstr(Jdb::esc_emph);
261 show_perf_event_unit_mask_entry(nr, absy+addy, unit_mask, exclusive);
263 Jdb::cursor(addy+Tbuf_start_line+4, 1);
264 c = Jdb_core::getchar();
265 show_perf_event_unit_mask_entry(nr, absy+addy, unit_mask, exclusive);
266 Perf_cnt::get_unit_mask_entry(nr, absy+addy, &value, &dummy);
268 if (Jdb::std_cursor_key(c, cols, lines, max_absy,
269 &absy, &addy, 0, &redraw))
288 if (Jdb::is_toplevel_cmd(c))
296 Jdb_tbuf_show::select_perf_event(Mword event)
300 Mword add_kcnt = Config::Jdb_accounting ? Kern_cnt_max : 0;
301 Mword nevents = Perf_cnt::get_max_perf_event() + add_kcnt;
302 Mword lines = (nevents < Jdb_screen::height()-6)
304 : Jdb_screen::height()-6;
305 Mword cols = Jdb_screen::cols() - 1;
306 Mword max_absy = nevents-lines;
309 // libperfctr not linked
315 Jdb::printf_statline("tbuf", "<CR>=select", "P?");
317 Jdb::cursor(Tbuf_start_line, 1);
318 printf("%sSelect Performance Counter\033[m\033[K\n\033[K", Jdb::esc_emph2);
320 if (event & 0x80000000)
324 Perf_cnt::split_event(event, &evntsel, &unit_mask);
325 addy = Perf_cnt::lookup_event(evntsel);
334 absy += (addy-lines+1);
342 Jdb::cursor(Tbuf_start_line+2, 1);
343 for (i=0; i<lines; i++)
345 show_perf_event(absy+i);
348 for (; i<Jdb_screen::height()-Tbuf_start_line-2; i++)
351 for (bool redraw=false; !redraw; )
355 Jdb::cursor(addy+Tbuf_start_line+2, 1);
356 putstr(Jdb::esc_emph);
357 show_perf_event(absy+addy);
359 Jdb::cursor(addy+Tbuf_start_line+2, 1);
360 int c = Jdb_core::getchar();
361 show_perf_event(absy+addy);
362 if (Jdb::std_cursor_key(c, cols, lines, max_absy,
363 &absy, &addy, 0, &redraw))
371 return absy | 0x80000000;
374 Perf_cnt::get_perf_event(absy, &evntsel, &dummy, &dummy);
375 unit_mask = select_perf_event_unit_mask(absy, unit_mask);
376 if (unit_mask != Nil)
378 Perf_cnt::combine_event(evntsel, unit_mask, &event);
385 if (Jdb::is_toplevel_cmd(c))
394 Jdb_tbuf_show::show_events(Mword n, Mword ref, Mword count, Unsigned8 mode,
395 Unsigned8 time_mode, int long_output)
398 Unsigned32 ref_kclock, ref_pmc1, ref_pmc2;
401 Jdb_tbuf::event(ref, &dummy, &ref_kclock, &ref_tsc, &ref_pmc1, &ref_pmc2);
403 for (i=0; i<count; i++)
409 Unsigned32 kclock, upmc1, upmc2;
411 Kconsole::console()->getchar_chance();
413 if (!Jdb_tbuf::event(n, &number, &kclock, &utsc, &upmc1, &upmc2))
419 Jdb_tbuf_output::print_entry(n, _buffer_str, sizeof(_buffer_str));
421 if (!Jdb_tbuf::diff_tsc(n, &dtsc))
432 for (int i=0; i<10; i++)
433 if (number == _nr_pos[i])
441 char s_tsc_dc[13], s_tsc_ds[15], s_tsc_sc[13], s_tsc_ss[15];
442 Jdb::write_ll_dec(dtsc, s_tsc_dc, sizeof(s_tsc_dc), false);
443 Jdb::write_tsc_s (dtsc, s_tsc_ds, sizeof(s_tsc_ds), false);
444 Jdb::write_ll_dec(utsc, s_tsc_sc, sizeof(s_tsc_sc), false);
445 Jdb::write_tsc_s (utsc, s_tsc_ss, sizeof(s_tsc_ss), false);
447 printf("%-3s%10lu. %120.120s %13.13s (%14.14s) %13.13s (%14.14s) kclk=%d\n",
448 s, number, _buffer_str+y_offset, s_tsc_dc, s_tsc_ds, s_tsc_sc, s_tsc_ss, kclock);
453 Jdb_tbuf_output::print_entry(n, _buffer_str, sizeof(_buffer_str));
457 snprintf(s, sizeof(s), "%12lu", number);
460 if (!Jdb_tbuf::diff_tsc(n, &dtsc))
464 case 0: Jdb::write_ll_hex(dtsc, s, sizeof(s), false); break;
465 case 1: Jdb::write_tsc (dtsc, s, sizeof(s), false); break;
466 case 2: Jdb::write_ll_dec(dtsc, s, sizeof(s), false); break;
470 dtsc = (n == ref) ? 0 : utsc - ref_tsc;
473 case 0: Jdb::write_ll_hex(dtsc, s, sizeof(s), true); break;
474 case 1: Jdb::write_tsc (dtsc, s, sizeof(s), true); break;
475 case 2: Jdb::write_ll_dec(dtsc, s, sizeof(s), true); break;
482 case 0: Jdb::write_ll_hex(dtsc, s, sizeof(s), true); break;
483 case 1: Jdb::write_tsc (dtsc, s, sizeof(s), false); break;
484 case 2: Jdb::write_ll_dec(dtsc, s, sizeof(s), true); break;
487 case Kclock_ref_mode:
488 if (kclock == ref_kclock)
489 snprintf(s, sizeof(s), "%12u", 0);
493 Jdb::write_ll_hex((Unsigned64)kclock-ref_kclock,
496 snprintf(s, sizeof(s), "%+12d", kclock-ref_kclock);
499 case Kclock_start_mode:
500 snprintf(s, sizeof(s), time_mode != 1 ? "%012x" : "%12u",
503 case Pmc1_delta_mode:
504 case Pmc2_delta_mode:
505 if (!Jdb_tbuf::diff_pmc(n, (mode-Pmc1_delta_mode), &dpmc))
507 Jdb::write_ll_dec((Signed64)dpmc, s, sizeof(s), false);
510 dpmc = (n == ref) ? 0 : upmc1 - ref_pmc1;
511 Jdb::write_ll_dec((Signed64)dpmc, s, sizeof(s), true);
514 dpmc = (n == ref) ? 0 : upmc2 - ref_pmc2;
515 Jdb::write_ll_dec((Signed64)dpmc, s, sizeof(s), true);
524 for (int i=0; i<10; i++)
525 if (number == _nr_pos[i])
531 printf("%s%-*.*s %12s\033[m%s",
532 c, Jdb_screen::width()-13, (int)Jdb_screen::width()-13,
533 _buffer_str+y_offset, s, count != 1 ? "\n" : "");
539 // search in tracebuffer
541 Jdb_tbuf_show::search(Mword start, Mword entries, const char *str,
549 if (Jdb_regex::avail() && !Jdb_regex::start(str))
551 error("Error in regular expression");
555 for (Mword n=direction==1 ? start-1 : start+1; ; (direction==1) ? n-- : n++)
557 static char buffer[120];
559 // don't cycle through entries more than once
560 // (should not happen due to the following check)
564 if (!Jdb_tbuf::event_valid(n))
566 error(direction ? "Begin of tracebuffer reached"
567 : "End of tracebuffer reached");
571 if (!Jdb_tbuf::event_valid(n))
572 n = (direction==1) ? entries-1 : 0;
574 Jdb_tbuf_output::print_entry(n, buffer, sizeof(buffer));
580 Jdb::cursor(Jdb_screen::height(), 79);
581 putchar("|/-\\"[progress++]);
585 if (Jdb_regex::avail() && Jdb_regex::find(buffer, 0, 0))
590 else if (strstr(buffer, str))
598 Jdb::cursor(Jdb_screen::height(), 79);
606 Jdb_tbuf_show::find_group(Entry_group *g, Tb_entry const *e, bool older, unsigned lines,
609 typedef Entry_group::Group_order Group_order;
611 Tb_entry_formatter const *fmt = Tb_entry_formatter::get_fmt(e);
612 Mword idx = Jdb_tbuf::unfiltered_idx(e);
613 int dir = older ? 1 : -1;
614 while (idx > 0 && !g->full())
617 Tb_entry *e1 = Jdb_tbuf::unfiltered_lookup(idx);
622 Group_order t = fmt->is_pair(e, e1);
625 py = Jdb_tbuf::idx(e1);
626 if (py < _absy || py >= _absy + lines)
629 if (older && t.depth() >= depth)
631 if (!older && t.depth() <= depth)
634 g->push_back(e1, py, t);
636 if (older && t.is_first())
638 if (!older && t.is_last())
647 Tb_entry_formatter const *fmt2 = Tb_entry_formatter::get_fmt(e1);
648 if (fmt2 && fmt2->partner(e1) == e->number())
650 py = Jdb_tbuf::idx(e1);
651 if (py < _absy || py >= _absy + lines)
653 g->push_back(e1, py, older ? Group_order::first() : Group_order::last());
654 // HM: is one direct enry enough
661 Jdb_tbuf_show::show()
663 static Unsigned8 mode = Index_mode;
664 static Unsigned8 time_mode = 1;
665 static Unsigned8 direction = 0;
668 Jdb_tbuf_output::set_filter(_filter_str, &entries);
672 Mword refy; // idx of reference event
673 Mword posy[10]; // idx of mark{0..9}
674 Mword addy; // cursor position starting from top of screen
675 Mword lines = Jdb_screen::height()-4;
676 Mword cols = Jdb_screen::cols() - 1;
680 if (Jdb_tbuf::max_entries() < lines)
681 lines = Jdb_tbuf::max_entries();
687 Mword max_absy = entries > lines ? entries - lines : 0;
689 // Search reference element. If not found, use last entry.
690 if ((refy = Jdb_tbuf::search_to_idx(_nr_ref)) >= (Mword)-2)
696 // Search mark {0..9}. If not found, set Nil.
698 posy[n] = Jdb_tbuf::search_to_idx(_nr_pos[n]);
700 // Search current position. If beyond buffer, goto first entry.
701 if ((addy = Jdb_tbuf::search_to_idx(_nr_cur)))
710 Mword count, perf_event[2];
711 Mword perf_user[2] = { 0, 0 };
712 Mword perf_kern[2] = { 0, 0 };
713 Mword perf_edge[2] = { 0, 0 };
714 const char *perf_mode[2], *perf_name[2];
716 for (Mword i=0; i<2; i++)
717 if (Kern_cnt::mode (i, &perf_mode[i], &perf_name[i], &perf_event[i]) ||
718 Perf_cnt::mode (i, &perf_mode[i], &perf_name[i], &perf_event[i],
719 &perf_user[i], &perf_kern[i], &perf_edge[i])) {}
721 static const char * const mode_str[] =
722 { "index", "tsc diff", "tsc rel", "tsc start", "kclock rel",
723 "kclock", "pmc1 diff", "pmc2 diff", "pmc1 rel", "pmc2 rel" };
725 const char *perf_type = Perf_cnt::perf_type();
728 printf("%3lu%% of %-6lu Perf:%-4s 1=" L4_PTR_FMT
729 "(%s%s\033[m%s%s%s\033[m)\033[K",
730 Jdb_tbuf::unfiltered_entries()*100/Jdb_tbuf::max_entries(),
731 Jdb_tbuf::max_entries(),
732 perf_type, perf_event[0], Jdb::esc_emph, perf_mode[0],
733 perf_name[0] && *perf_name[0] ? ":" : "",
734 mode==Pmc1_delta_mode || mode==Pmc1_ref_mode ? Jdb::esc_emph : "",
739 "%24s 2=" L4_PTR_FMT "(%s%s\033[m%s%s%s\033[m)\033[K\n",
740 mode_str[(int)mode], "",
741 perf_event[1], Jdb::esc_emph, perf_mode[1],
742 perf_name[1] && *perf_name[1] ? ":" : "",
743 mode==Pmc2_delta_mode || mode==Pmc2_ref_mode ? Jdb::esc_emph : "",
748 printf("\033[31m%3lu%% filtered\033[m\n",
749 entries*100/Jdb_tbuf::max_entries());
751 for (Mword i=3; i<Tbuf_start_line; i++)
754 show_events(_absy, refy, lines, mode, time_mode, 0);
758 for (Mword i=Tbuf_start_line + lines; i<Jdb_screen::height(); i++)
761 _status_type = Status_redraw;
764 for (bool redraw=false; !redraw;)
767 Unsigned8 d = 0; // default search direction is forward
769 if (_status_type == Status_redraw)
771 Jdb::printf_statline("tbuf", "/?nN=search sj=mark c=clear r=ref "
772 "F=filter D=dump P=perf <CR>=select", "_");
773 _status_type = Status_ok;
775 else if (_status_type == Status_error)
776 _status_type = Status_redraw;
782 typedef Tb_entry::Group_order Group_order;
785 Tb_entry const *ce = Jdb_tbuf::lookup(_absy + addy);
789 Tb_entry_formatter const *fmt = Tb_entry_formatter::get_fmt(ce);
792 pt = fmt->has_partner(ce);
794 if (!pt.not_grouped())
797 find_group(&group, ce, true, lines, pt.depth());
799 find_group(&group, ce, false, lines, pt.depth());
802 for (unsigned i = 0; i < group.size(); ++i)
804 Entry_group::Item const &item = group[i];
805 Jdb::cursor(item.y - _absy + Tbuf_start_line, 3);
806 putstr(Jdb::esc_emph);
807 if (item.order.is_first())
809 else if (item.order.is_last())
811 else if (item.order.grouped())
818 Jdb::cursor(addy + Tbuf_start_line, 1);
819 putstr(Jdb::esc_emph);
820 show_events(_absy + addy, refy, 1, mode, time_mode, 0);
822 Jdb::cursor(addy + Tbuf_start_line, 1);
825 c=Jdb_core::getchar();
827 show_events(_absy + addy, refy, 1, mode, time_mode, 0);
828 for (unsigned i = 0; i < group.size(); ++i)
830 Entry_group::Item const &item = group[i];
831 Jdb::cursor(item.y - _absy + Tbuf_start_line, 1);
832 show_events(item.y, refy, 1, mode, time_mode, 0);
835 if (Jdb::std_cursor_key(c, cols, lines, max_absy,
836 &_absy, &addy, 0, &redraw))
850 if (y_offset<sizeof(_buffer_str)-82)
853 y_offset = sizeof(_buffer_str)-72;
857 case 'F': // filter view by regex
858 Jdb::printf_statline("tbuf", 0, "Filter(%s)=%s",
859 Jdb_regex::avail() ? "regex" : "instr",
861 _status_type = Status_redraw;
862 Jdb::cursor(Jdb_screen::height(), 21+strlen(_filter_str));
863 if (!get_string(_filter_str, sizeof(_filter_str)))
865 if (!Jdb_tbuf_output::set_filter(_filter_str, &entries))
867 error("Error in regular expression");
873 case 'D': // dump to console
874 if (!Kconsole::console()->find_console(Console::GZIP))
876 Jdb::cursor(Jdb_screen::height(), 10);
879 if (Jdb_input::get_mword(&count, 7, 10))
883 Kconsole::console()->start_exclusive(Console::GZIP);
884 show_events(_absy, refy, count, mode, time_mode, 1);
885 Kconsole::console()->end_exclusive(Console::GZIP);
889 _status_type = Status_redraw;
891 case 'P': // set performance counter
894 int user, kern, edge, nr;
896 Jdb::printf_statline("tbuf", "1..2=select counter", "P");
897 Jdb::cursor(Jdb_screen::height(), 8);
900 nr = Jdb_core::getchar();
903 if (nr >= '1' && nr <= '2')
910 event = perf_event[nr];
911 user = perf_user[nr];
912 kern = perf_kern[nr];
913 edge = perf_edge[nr];
914 Jdb::printf_statline("tbuf", "d=duration e=edge u=user "
915 "k=kern +=both -=none ?=event",
916 "P%c", (char)'1'+nr);
918 Jdb::cursor(Jdb_screen::height(), 9);
919 switch(c=Jdb_core::getchar())
921 case '+': user = 1; kern = 1; break;
922 case '-': user = 0; kern = 0; event = 0; break;
923 case 'u': user = 1; kern = 0; break;
924 case 'k': user = 0; kern = 1; break;
925 case 'd': edge = 0; break;
926 case 'e': edge = 1; break;
928 case '_': if ((e = select_perf_event(event)) == Nil)
936 default: Jdb_input::get_mword(&event, 4, 16, c);
940 if (!Kern_cnt::setup_pmc(nr, event) &&
941 !Perf_cnt::setup_pmc(nr, event, user, kern, edge))
942 Tb_entry::set_rdcnt(nr, 0);
947 case KEY_RETURN: // disassemble eip of current entry
951 if (Jdb_tbuf_output::thread_ip(_absy+addy, &t, &eip))
953 if (Jdb_disasm::avail())
955 if (!Jdb_disasm::show(eip, t->space(), 1, 1))
959 { // hacky, we should get disasm working for arm too
960 // (at least without the disassembly itself)
961 printf("\n==========================\n"
963 "==========================\n", eip);
971 Jdb_tbuf_output::toggle_names();
974 case KEY_CURSOR_LEFT: // mode switch
975 if (mode == Index_mode)
976 mode = Pmc2_ref_mode;
981 case KEY_CURSOR_RIGHT: // mode switch
983 if (mode > Pmc2_ref_mode)
987 case ' ': // mode switch
988 if (mode != Index_mode)
990 time_mode = (time_mode+1) % 3;
994 case 'c': // clear tracebuffer
995 Jdb_tbuf::clear_tbuf();
1000 for (n=0; n<10; n++)
1003 case 's': // set mark
1004 Jdb::printf_statline("tbuf", 0, "set mark [0-9] ");
1005 _status_type = Status_redraw;
1006 c = Jdb_core::getchar();
1007 if (!entries || c < '0' || c > '9')
1009 error("Invalid marker");
1013 posy[n] = _absy + addy;
1014 _nr_pos[n] = Jdb_tbuf::lookup(_absy+addy)->number();
1017 case 'r': // set reference entry
1020 refy = _absy + addy;
1021 _nr_ref = Jdb_tbuf::lookup(_absy+addy)->number();
1024 case 'j': // jump to mark or reference element
1025 Jdb::printf_statline("tbuf", 0, "jump to mark [0-9] or ref [r] ");
1026 _status_type = Status_redraw;
1027 c = Jdb_core::getchar();
1028 if ((c < '0' || c > '9') && c != 'r')
1030 error("Invalid marker");
1033 n = (c == 'r') ? refy : posy[c-'0'];
1036 error("Mark unset");
1039 else if (n == (Mword)-2)
1041 error("Mark not visible within current filter");
1045 case '?': // search backward
1048 case '/': // search forward
1050 // search in tracebuffer events
1051 Jdb::printf_statline("tbuf", 0, "%s=%s",
1052 Jdb_regex::avail() ? "Regexp" : "Search",
1054 _status_type = Status_redraw;
1055 Jdb::cursor(Jdb_screen::height(), 14+strlen(_search_str));
1056 if (!get_string(_search_str, sizeof(_search_str)) ||
1060 case 'n': // search next
1061 case 'N': // search next reverse
1062 n = search(_absy+addy, entries, _search_str,
1063 c == 'N' ? !direction : direction);
1068 if (n < _absy || n > _absy+lines-1)
1078 if (_absy > max_absy)
1091 Jdb::abort_command();
1094 if (Jdb::is_toplevel_cmd(c))
1101 _nr_cur = (e = Jdb_tbuf::lookup(_absy+addy)) ? e->number() : 0;
1105 Jdb_module::Action_code
1106 Jdb_tbuf_show::action(int cmd, void *&, char const *&, int &)
1115 if (Kconsole::console()->find_console(Console::GZIP))
1117 Jdb_tbuf_output::set_filter(_filter_str, 0);
1118 Kconsole::console()->start_exclusive(Console::GZIP);
1119 show_events(0, 0, 1000000, 0, 0, 1);
1120 Kconsole::console()->end_exclusive(Console::GZIP);
1129 Jdb_module::Cmd const *
1130 Jdb_tbuf_show::cmds() const
1134 { 0, "T", "tbuf", "",
1135 "T{P{+|-|k|u|<event>}}\tenter tracebuffer, on/off/kernel/user perf",
1137 { 1, "Tgzip", "", "", 0 /* invisible */, 0 },
1145 Jdb_tbuf_show::num_cmds() const
1151 Jdb_tbuf_show::Jdb_tbuf_show()
1152 : Jdb_module("MONITORING")
1155 static Jdb_tbuf_show jdb_tbuf_show INIT_PRIORITY(JDB_MODULE_INIT_PRIO);