]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/jdb/jdb_io_apic.cpp
update
[l4.git] / kernel / fiasco / src / jdb / jdb_io_apic.cpp
1 IMPLEMENTATION:
2
3 #include <cstdio>
4 #include "simpleio.h"
5
6 #include "apic.h"
7 #include "io_apic.h"
8 #include "jdb.h"
9 #include "jdb_module.h"
10 #include "jdb_screen.h"
11 #include "static_init.h"
12 #include "types.h"
13
14
15 /**
16  * Private 'exit' module.
17  * 
18  * This module handles the 'exit' or '^' command that
19  * makes a call to exit() and virtually reboots the system.
20  */
21 class Jdb_io_apic_module : public Jdb_module
22 {
23 public:
24   Jdb_io_apic_module() FIASCO_INIT;
25 };
26
27 static Jdb_io_apic_module jdb_io_apic_module INIT_PRIORITY(JDB_MODULE_INIT_PRIO);
28
29 PRIVATE static
30 void
31 Jdb_io_apic_module::print_lapic(Cpu_number cpu, void *)
32 {
33   printf("\nLocal APIC [%u, %08x]: tpr=%2x ppr=%2x\n",
34          cxx::int_value<Cpu_number>(cpu),
35          Apic::get_id(), Apic::tpr(), Apic::reg_read(0xa0));
36   printf("  Running: tpr=%02x\n", Jdb::apic_tpr.cpu(cpu));
37
38   unsigned const regs[] = { 0x200, 0x100, 0x180 };
39   char const *const regn[] = { "IRR", "ISR", "TMR" };
40   for (unsigned r = 0; r < 3; ++r)
41     {
42       printf("  %s:", regn[r]);
43       for (int i = 3; i >= 0; --i)
44         {
45           unsigned long v = Apic::reg_read(regs[r] + i * 0x10);
46           printf(" %08lx", v);
47         }
48       puts("");
49     }
50 }
51
52 PRIVATE static
53 void
54 Jdb_io_apic_module::remote_print_lapic(Cpu_number cpu)
55 {
56   Jdb::remote_work(cpu, print_lapic, 0);
57 }
58
59 PUBLIC
60 Jdb_module::Action_code
61 Jdb_io_apic_module::action (int cmd, void *&, char const *&, int &)
62 {
63   if (cmd!=0)
64     return NOTHING;
65
66   if (!Io_apic::active())
67     {
68       printf("\nIO APIC not present!\n");
69       return NOTHING;
70     }
71   printf("\nState of IO APIC\n");
72   for (Io_apic *a = Io_apic::_first; a; a = a->_next)
73     a->dump();
74
75   // print global LAPIC state
76   unsigned khz;
77   char apic_state[80];
78   int apic_disabled;
79   strcpy (apic_state, "N/A");
80   if ((apic_disabled = Apic::test_present_but_disabled()))
81     strcpy (apic_state, "disabled by BIOS");
82   if ((khz = Apic::get_frequency_khz()))
83     {
84       unsigned mhz = khz / 1000;
85       khz -= mhz * 1000;
86       snprintf(apic_state, sizeof(apic_state), "yes (%d.%03d MHz)"
87               "\n  local APIC spurious interrupts/bug/error: %d/%d/%d",
88               mhz, khz,
89               apic_spurious_interrupt_cnt,
90               apic_spurious_interrupt_bug_cnt,
91               apic_error_cnt);
92     }
93   printf("\nLocal APIC (general): %s"
94          "\nWatchdog: %s"
95          "\n",
96          apic_state,
97          Config::watchdog
98             ? "active"
99             : Apic::is_present()
100                ? "disabled"
101                : apic_disabled
102                   ? "not supported (Local APIC disabled)"
103                   : "not supported (no Local APIC)"
104       );
105   Jdb::foreach_cpu(&remote_print_lapic);
106
107   return NOTHING;
108 }
109
110 PUBLIC
111 int
112 Jdb_io_apic_module::num_cmds() const
113
114   return 1;
115 }
116
117 PUBLIC
118 Jdb_module::Cmd const *
119 Jdb_io_apic_module::cmds() const
120 {
121   static Cmd cs[] =
122     { { 0, "A", "apic", "", "apic\tdump state of IOAPIC", (void*)0 } };
123
124   return cs;
125 }
126
127 IMPLEMENT
128 Jdb_io_apic_module::Jdb_io_apic_module()
129   : Jdb_module("INFO")
130 {}