12 static Mword *kcnt[Max_slot];
13 static Mword (*read_kcnt_fn[Max_slot])();
19 #include "jdb_ktrace.h"
20 #include "mem_layout.h"
23 Mword *Kern_cnt::kcnt[Max_slot];
24 Mword (*Kern_cnt::read_kcnt_fn[Max_slot])() = { read_kcnt1, read_kcnt2 };
26 static Mword Kern_cnt::read_kcnt1() { return *kcnt[0]; }
27 static Mword Kern_cnt::read_kcnt2() { return *kcnt[1]; }
31 Kern_cnt::get_ctr(int num)
33 Tracebuffer_status *status =
34 (Tracebuffer_status*) Mem_layout::Tbuf_status_page;
36 return (Mword*)(num < Kern_cnt_max ? status->kerncnts + num : 0);
41 Kern_cnt::get_str(Mword num)
45 case Kern_cnt_context_switch: return "Context switches";
46 case Kern_cnt_addr_space_switch: return "Address space switches";
47 case Kern_cnt_shortcut_failed: return "IPC shortcut failed";
48 case Kern_cnt_shortcut_success: return "IPC shortcut success";
49 case Kern_cnt_irq: return "Long IPCs";
50 case Kern_cnt_ipc_long: return "Hardware interrupts";
51 case Kern_cnt_page_fault: return "Page faults";
52 case Kern_cnt_io_fault: return "IO bitmap faults";
53 case Kern_cnt_task_create: return "Tasks created";
54 case Kern_cnt_schedule: return "Scheduler calls";
55 case Kern_cnt_iobmap_tlb_flush: return "IO bitmap TLB flushs";
56 case Kern_cnt_exc_ipc: return "Exception IPCs";
63 Kern_cnt::mode(Mword slot, const char **mode, const char **name, Mword *event)
69 case 0: c = kcnt[0]; break;
70 case 1: c = kcnt[1]; break;
75 Mword num = c - get_ctr(0);
79 *event = 0x80000000 | num;
90 Kern_cnt::setup_pmc(Mword slot, Mword event)
95 if (!(event & 0x80000000))
98 Tb_entry::set_rdcnt(slot, 0);
103 if (event >= Kern_cnt_max)
106 kcnt[slot] = get_ctr(event);
107 Tb_entry::set_rdcnt(slot, read_kcnt_fn[slot]);