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;)
768 Unsigned8 d = 0; // default search direction is forward
770 if (_status_type == Status_redraw)
772 Jdb::printf_statline("tbuf", "/?nN=search sj=mark c=clear r=ref "
773 "F=filter D=dump P=perf <CR>=select", "_");
774 _status_type = Status_ok;
776 else if (_status_type == Status_error)
777 _status_type = Status_redraw;
783 typedef Tb_entry::Group_order Group_order;
786 Tb_entry const *ce = Jdb_tbuf::lookup(_absy + addy);
790 Tb_entry_formatter const *fmt = Tb_entry_formatter::get_fmt(ce);
793 pt = fmt->has_partner(ce);
795 if (!pt.not_grouped())
798 find_group(&group, ce, true, lines, pt.depth());
800 find_group(&group, ce, false, lines, pt.depth());
803 for (unsigned i = 0; i < group.size(); ++i)
805 Entry_group::Item const &item = group[i];
806 Jdb::cursor(item.y - _absy + Tbuf_start_line, 3);
807 putstr(Jdb::esc_emph);
808 if (item.order.is_first())
810 else if (item.order.is_last())
812 else if (item.order.grouped())
819 Jdb::cursor(addy+Tbuf_start_line, 1);
820 putstr(Jdb::esc_emph);
821 show_events(_absy+addy, refy, 1, mode, time_mode, 0);
823 Jdb::cursor(addy+Tbuf_start_line, 1);
826 c=Jdb_core::getchar();
828 show_events(_absy+addy, refy, 1, mode, time_mode, 0);
829 for (unsigned i = 0; i < group.size(); ++i)
831 Entry_group::Item const &item = group[i];
832 Jdb::cursor(item.y - _absy + Tbuf_start_line, 1);
833 show_events(item.y, refy, 1, mode, time_mode, 0);
836 if (Jdb::std_cursor_key(c, cols, lines, max_absy,
837 &_absy, &addy, 0, &redraw))
851 if (y_offset<sizeof(_buffer_str)-82)
854 y_offset = sizeof(_buffer_str)-72;
858 case 'F': // filter view by regex
859 Jdb::printf_statline("tbuf", 0, "Filter(%s)=%s",
860 Jdb_regex::avail() ? "regex" : "instr",
862 _status_type = Status_redraw;
863 Jdb::cursor(Jdb_screen::height(), 21+strlen(_filter_str));
864 if (!get_string(_filter_str, sizeof(_filter_str)))
866 if (!Jdb_tbuf_output::set_filter(_filter_str, &entries))
868 error("Error in regular expression");
874 case 'D': // dump to console
875 if (!Kconsole::console()->find_console(Console::GZIP))
877 Jdb::cursor(Jdb_screen::height(), 10);
880 if (Jdb_input::get_mword(&count, 7, 10))
884 Kconsole::console()->start_exclusive(Console::GZIP);
885 show_events(_absy, refy, count, mode, time_mode, 1);
886 Kconsole::console()->end_exclusive(Console::GZIP);
890 _status_type = Status_redraw;
892 case 'P': // set performance counter
895 int user, kern, edge, nr;
897 Jdb::printf_statline("tbuf", "1..2=select counter", "P");
898 Jdb::cursor(Jdb_screen::height(), 8);
901 nr = Jdb_core::getchar();
904 if (nr >= '1' && nr <= '2')
911 event = perf_event[nr];
912 user = perf_user[nr];
913 kern = perf_kern[nr];
914 edge = perf_edge[nr];
915 Jdb::printf_statline("tbuf", "d=duration e=edge u=user "
916 "k=kern +=both -=none ?=event",
917 "P%c", (char)'1'+nr);
919 Jdb::cursor(Jdb_screen::height(), 9);
920 switch(c=Jdb_core::getchar())
922 case '+': user = 1; kern = 1; break;
923 case '-': user = 0; kern = 0; event = 0; break;
924 case 'u': user = 1; kern = 0; break;
925 case 'k': user = 0; kern = 1; break;
926 case 'd': edge = 0; break;
927 case 'e': edge = 1; break;
929 case '_': if ((e = select_perf_event(event)) == Nil)
937 default: Jdb_input::get_mword(&event, 4, 16, c);
941 if (!Kern_cnt::setup_pmc(nr, event) &&
942 !Perf_cnt::setup_pmc(nr, event, user, kern, edge))
943 Tb_entry::set_rdcnt(nr, 0);
948 case KEY_RETURN: // disassemble eip of current entry
952 if (Jdb_tbuf_output::thread_ip(_absy+addy, &t, &eip))
954 if (Jdb_disasm::avail())
956 if (!Jdb_disasm::show(eip, t->space(), 1, 1))
960 { // hacky, we should get disasm working for arm too
961 // (at least without the disassembly itself)
962 printf("\n==========================\n"
964 "==========================\n", eip);
972 Jdb_tbuf_output::toggle_names();
975 case KEY_CURSOR_LEFT: // mode switch
976 if (mode == Index_mode)
977 mode = Pmc2_ref_mode;
982 case KEY_CURSOR_RIGHT: // mode switch
984 if (mode > Pmc2_ref_mode)
988 case ' ': // mode switch
989 if (mode != Index_mode)
991 time_mode = (time_mode+1) % 3;
995 case 'c': // clear tracebuffer
996 Jdb_tbuf::clear_tbuf();
1001 for (n=0; n<10; n++)
1004 case 's': // set mark
1005 Jdb::printf_statline("tbuf", 0, "set mark [0-9] ");
1006 _status_type = Status_redraw;
1007 c = Jdb_core::getchar();
1008 if (!entries || c < '0' || c > '9')
1010 error("Invalid marker");
1014 posy[n] = _absy + addy;
1015 _nr_pos[n] = Jdb_tbuf::lookup(_absy+addy)->number();
1018 case 'r': // set reference entry
1021 refy = _absy + addy;
1022 _nr_ref = Jdb_tbuf::lookup(_absy+addy)->number();
1025 case 'j': // jump to mark or reference element
1026 Jdb::printf_statline("tbuf", 0, "jump to mark [0-9] or ref [r] ");
1027 _status_type = Status_redraw;
1028 c = Jdb_core::getchar();
1029 if ((c < '0' || c > '9') && c != 'r')
1031 error("Invalid marker");
1034 n = (c == 'r') ? refy : posy[c-'0'];
1037 error("Mark unset");
1040 else if (n == (Mword)-2)
1042 error("Mark not visible within current filter");
1046 case '?': // search backward
1049 case '/': // search forward
1051 // search in tracebuffer events
1052 Jdb::printf_statline("tbuf", 0, "%s=%s",
1053 Jdb_regex::avail() ? "Regexp" : "Search",
1055 _status_type = Status_redraw;
1056 Jdb::cursor(Jdb_screen::height(), 14+strlen(_search_str));
1057 if (!get_string(_search_str, sizeof(_search_str)) ||
1061 case 'n': // search next
1062 case 'N': // search next reverse
1063 n = search(_absy+addy, entries, _search_str,
1064 c == 'N' ? !direction : direction);
1069 if (n < _absy || n > _absy+lines-1)
1079 if (_absy > max_absy)
1092 Jdb::abort_command();
1095 if (Jdb::is_toplevel_cmd(c))
1102 _nr_cur = (e = Jdb_tbuf::lookup(_absy+addy)) ? e->number() : 0;
1106 Jdb_module::Action_code
1107 Jdb_tbuf_show::action(int cmd, void *&, char const *&, int &)
1116 if (Kconsole::console()->find_console(Console::GZIP))
1118 Jdb_tbuf_output::set_filter(_filter_str, 0);
1119 Kconsole::console()->start_exclusive(Console::GZIP);
1120 show_events(0, 0, 1000000, 0, 0, 1);
1121 Kconsole::console()->end_exclusive(Console::GZIP);
1130 Jdb_module::Cmd const *
1131 Jdb_tbuf_show::cmds() const
1135 { 0, "T", "tbuf", "",
1136 "T{P{+|-|k|u|<event>}}\tenter tracebuffer, on/off/kernel/user perf",
1138 { 1, "Tgzip", "", "", 0 /* invisible */, 0 },
1146 Jdb_tbuf_show::num_cmds() const
1152 Jdb_tbuf_show::Jdb_tbuf_show()
1153 : Jdb_module("MONITORING")
1156 static Jdb_tbuf_show jdb_tbuf_show INIT_PRIORITY(JDB_MODULE_INIT_PRIO);