]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/kern_cnt.cpp
Inital import
[l4.git] / kernel / fiasco / src / kern / kern_cnt.cpp
1 INTERFACE:
2
3 #include "types.h"
4
5 class Kern_cnt
6 {
7 private:
8   enum {
9     Max_slot = 2,
10   };
11
12   static Mword *kcnt[Max_slot];
13   static Mword (*read_kcnt_fn[Max_slot])();
14 };
15
16
17 IMPLEMENTATION:
18
19 #include "jdb_ktrace.h"
20 #include "mem_layout.h"
21 #include "tb_entry.h"
22
23 Mword *Kern_cnt::kcnt[Max_slot];
24 Mword (*Kern_cnt::read_kcnt_fn[Max_slot])() = { read_kcnt1, read_kcnt2 };
25
26 static Mword Kern_cnt::read_kcnt1() { return *kcnt[0]; }
27 static Mword Kern_cnt::read_kcnt2() { return *kcnt[1]; }
28
29 PUBLIC static
30 Mword*
31 Kern_cnt::get_ctr(int num)
32 {
33   Tracebuffer_status *status = 
34     (Tracebuffer_status*) Mem_layout::Tbuf_status_page;
35
36   return (Mword*)(num < Kern_cnt_max ? status->kerncnts + num : 0);
37 }
38
39 PUBLIC static
40 const char *
41 Kern_cnt::get_str(Mword num)
42 {
43   switch (num)
44     {
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";
57     default:                         return 0;
58     }
59 }
60
61 PUBLIC static
62 int
63 Kern_cnt::mode(Mword slot, const char **mode, const char **name, Mword *event)
64 {
65   Mword *c = 0;
66
67   switch (slot)
68     {
69     case 0: c = kcnt[0]; break;
70     case 1: c = kcnt[1]; break;
71     }
72
73   if (c)
74     {
75       Mword num = c - get_ctr(0);
76
77       *mode  = "on";
78       *name  = get_str(num);
79       *event = 0x80000000 | num;
80       return 1;
81     }
82
83   *mode = "off";
84   *name = "";
85   return 0;
86 }
87
88 PUBLIC static
89 int
90 Kern_cnt::setup_pmc(Mword slot, Mword event)
91 {
92   if (slot>=Max_slot)
93     return 0;
94
95   if (!(event & 0x80000000))
96     {
97       kcnt[slot] = 0;
98       Tb_entry::set_rdcnt(slot, 0);
99       return 0;
100     }
101
102   event &= 0xff;
103   if (event >= Kern_cnt_max)
104     return 0;
105
106   kcnt[slot] = get_ctr(event);
107   Tb_entry::set_rdcnt(slot, read_kcnt_fn[slot]);
108   return 1;
109 }