]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/ia32/apic-debug.cpp
Update
[l4.git] / kernel / fiasco / src / kern / ia32 / apic-debug.cpp
1 IMPLEMENTATION[debug]:
2
3 #include <cstdio>
4 #include "simpleio.h"
5
6 static
7 const char*
8 Apic::reg_lvt_bit_str(unsigned reg, Unsigned32 val, int bit)
9 {
10   static const char * const delivery_mode[] =
11     { "fixed", "???", "SMI", "???", "NMI", "INIT", "???", "ExtINT" };
12   unsigned bits = 0;
13
14   switch (reg)
15     {
16     case APIC_lvtt:    bits = Mask | Delivery_state;                    break;
17     case APIC_lvt0:
18     case APIC_lvt1:    bits = Mask | Trigger_mode | Remote_irr | Pin_polarity
19                             | Delivery_state | Delivery_mode;           break;
20     case APIC_lvterr:  bits = Mask | Delivery_state;                    break;
21     case APIC_lvtpc:   bits = Mask | Delivery_state | Trigger_mode;     break;
22     case APIC_lvtthmr: bits = Mask | Delivery_state | Trigger_mode;     break;
23     }
24
25   if (bits & bit == 0)
26     return "";
27
28   switch (bit)
29     {
30     case Mask:
31       return val & APIC_lvt_masked ? "masked" : "unmasked";
32     case Trigger_mode:
33       return val & APIC_lvt_level_trigger ? "level" : "edge";
34     case Remote_irr:
35       return val & APIC_lvt_remote_irr ? "IRR" : "";
36     case Pin_polarity:
37       return val & APIC_input_polarity ? "active low" : "active high";
38     case Delivery_state:
39       return val & APIC_snd_pending ? "pending" : "idle";
40     case Delivery_mode:
41       return delivery_mode[reg_delivery_mode(val)];
42     }
43
44   return "";
45 }
46
47 PUBLIC static
48 void
49 Apic::reg_show(unsigned reg)
50 {
51   Unsigned32 tmp_val = reg_read(reg);
52
53   printf("%-9s%-6s%-4s%-8s%-7s%02x",
54          reg_lvt_bit_str(reg, tmp_val, Mask),
55          reg_lvt_bit_str(reg, tmp_val, Trigger_mode),
56          reg_lvt_bit_str(reg, tmp_val, Remote_irr),
57          reg_lvt_bit_str(reg, tmp_val, Delivery_state),
58          reg_lvt_bit_str(reg, tmp_val, Delivery_mode),
59          (unsigned)reg_lvt_vector(tmp_val));
60 }
61
62 PUBLIC static
63 void
64 Apic::regs_show(void)
65 {
66   putstr("\nVectors:   LINT0: "); reg_show(APIC_lvt0);
67   putstr("\n           LINT1: "); reg_show(APIC_lvt1);
68   putstr("\n           Timer: "); reg_show(APIC_lvtt);
69   putstr("\n           Error: "); reg_show(APIC_lvterr);
70   if (have_pcint())
71     {
72       putstr("\n         PerfCnt: ");
73       reg_show(APIC_lvtpc);
74     }
75   if (have_tsint())
76     {
77       putstr("\n         Thermal: ");
78       reg_show(APIC_lvtthmr);
79     }
80   putchar('\n');
81 }
82
83 PUBLIC static
84 void
85 Apic::timer_show(void)
86 {
87   printf("Timer mode: %s  counter: %08x/%08x\n",
88          reg_read(APIC_lvtt) & APIC_lvt_timer_periodic
89            ? "periodic" : "one-shot",
90          timer_reg_read_initial(), timer_reg_read());
91 }
92
93 PUBLIC static
94 void
95 Apic::id_show(void)
96 {
97   printf("APIC id: %02x version: %02x\n", get_id() >> 24, get_version());
98 }
99
100 static
101 void
102 Apic::bitfield_show(unsigned reg, const char *name, char flag)
103 {
104   unsigned i, j;
105   Unsigned32 tmp_val;
106
107   printf("%-11s    0123456789abcdef0123456789abcdef"
108                   "0123456789abcdef0123456789abcdef\n", name);
109   for (i=0; i<8; i++)
110     {
111       if (!(i & 1))
112         printf("            %02x ", i*0x20);
113       tmp_val = reg_read(reg + i*0x10);
114       for (j=0; j<32; j++)
115         putchar(tmp_val & (1<<j) ? flag : '.');
116       if (i & 1)
117         putchar('\n');
118     }
119 }
120
121 PUBLIC static
122 void
123 Apic::irr_show()
124 {
125   Apic::bitfield_show(APIC_irr, "Ints Reqst:", 'R');
126 }
127
128 PUBLIC static
129 void
130 Apic::isr_show()
131 {
132   Apic::bitfield_show(APIC_isr, "Ints InSrv:", 'S');
133 }
134