1 IMPLEMENTATION[ia32,amd64,ux]:
11 #include "jdb_symbol.h"
18 class Jdb_kern_info_idt : public Jdb_kern_info_module
22 static Jdb_kern_info_idt k_I INIT_PRIORITY(JDB_MODULE_INIT_PRIO+1);
25 Jdb_kern_info_idt::Jdb_kern_info_idt()
26 : Jdb_kern_info_module('I', "Interrupt Descriptor Table (IDT)")
28 Jdb_kern_info::register_subcmd(this);
33 Jdb_kern_info_idt::show()
35 Pseudo_descriptor idt_pseudo;
38 Idt::get (&idt_pseudo);
40 printf("idt base="L4_PTR_FMT" limit=%04x (%04x bytes)\n",
42 (unsigned)((idt_pseudo.limit() + 1) / sizeof(Idt_entry)),
43 idt_pseudo.limit() + 1);
44 if (!Jdb_core::new_line(line))
47 Idt_entry *ie = reinterpret_cast<Idt_entry*>(idt_pseudo.base());
48 for (unsigned i=0; i<(idt_pseudo.limit()+1)/sizeof(Idt_entry); i++)
52 if (!Jdb_core::new_line(line))
58 //---------------------------------------------------------------------------
59 IMPLEMENTATION[ia32,amd64]:
64 class Jdb_kern_info_pic_state : public Jdb_kern_info_module
68 static Jdb_kern_info_pic_state k_p INIT_PRIORITY(JDB_MODULE_INIT_PRIO+1);
71 Jdb_kern_info_pic_state::Jdb_kern_info_pic_state()
72 : Jdb_kern_info_module('p', "PIC ports")
74 Jdb_kern_info::register_subcmd(this);
78 Jdb_kern_info_pic_state::show()
81 static char const hex[] = "0123456789ABCDEF";
83 // show important I/O ports
84 Io::out8_p(Pic::OCW_TEMPLATE | Pic::READ_NEXT_RD | Pic::READ_IS_ONRD,
86 unsigned in_service = Io::in8(Pic::MASTER_ICW);
87 Io::out8_p(Pic::OCW_TEMPLATE | Pic::READ_NEXT_RD | Pic::READ_IR_ONRD,
89 unsigned requested = Io::in8(Pic::MASTER_ICW);
90 unsigned mask = Jdb::pic_status & 0x0ff;
91 printf("master PIC: in service:");
93 putchar((in_service & (1<<i)) ? hex[i] : '-');
96 putchar((requested & (1<<i)) ? hex[i] : '-');
99 putchar((mask & (1<<i)) ? hex[i] : '-');
102 Io::out8_p( Pic::OCW_TEMPLATE | Pic::READ_NEXT_RD | Pic::READ_IS_ONRD,
104 in_service = Io::in8(Pic::SLAVES_ICW);
105 Io::out8_p( Pic::OCW_TEMPLATE | Pic::READ_NEXT_RD | Pic::READ_IR_ONRD,
107 requested = Io::in8(Pic::SLAVES_ICW);
108 mask = Jdb::pic_status >> 8;
109 printf(" slave PIC: in service:");
111 putchar((in_service & (1<<i)) ? hex[i+8] : '-');
112 printf(", request:");
114 putchar((requested & (1<<i)) ? hex[i+8] : '-');
117 putchar((mask & (1<<i)) ? hex[i+8] : '-');
122 class Jdb_kern_info_misc : public Jdb_kern_info_module
126 static Jdb_kern_info_misc k_i INIT_PRIORITY(JDB_MODULE_INIT_PRIO+1);
129 Jdb_kern_info_misc::Jdb_kern_info_misc()
130 : Jdb_kern_info_module('i', "Miscellaneous info")
132 Jdb_kern_info::register_subcmd(this);
137 Jdb_kern_info_misc::show()
139 printf ("clck: %08x.%08x\n",
140 (unsigned) (Kip::k()->clock >> 32),
141 (unsigned) (Kip::k()->clock));
145 Pseudo_descriptor gdt_pseudo, idt_pseudo;
146 Gdt::get (&gdt_pseudo);
147 Idt::get (&idt_pseudo);
148 printf ("idt : base="L4_PTR_FMT" limit=%04x\n"
149 "gdt : base="L4_PTR_FMT" limit=%04x\n",
150 idt_pseudo.base(), (idt_pseudo.limit()+1)/8,
151 gdt_pseudo.base(), (gdt_pseudo.limit()+1)/8);
154 printf("ldt : %04x", Cpu::get_ldt());
155 if (Cpu::get_ldt() != 0)
157 Gdt_entry *e = Cpu::boot_cpu()->get_gdt()->entries() + (Cpu::boot_cpu()->get_ldt() >> 3);
158 printf(": "L4_PTR_FMT"-"L4_PTR_FMT,
159 e->base(), e->base()+ e->size());
164 "tr : %04x", Cpu::boot_cpu()->get_tr());
165 if(Cpu::get_tr() != 0)
167 Gdt_entry *e = Cpu::boot_cpu()->get_gdt()->entries() + (Cpu::boot_cpu()->get_tr() >> 3);
168 printf(": "L4_PTR_FMT"-"L4_PTR_FMT", iobitmap at "L4_PTR_FMT,
169 e->base(), e->base()+ e->size(),
170 e->base() + (reinterpret_cast<Tss *>(e->base())->_io_bit_map_offset));
173 "cr0 : "L4_PTR_FMT"\n"
174 "cr4 : "L4_PTR_FMT"\n",
175 Cpu::get_cr0(), Cpu::get_cr4());
178 class Jdb_kern_info_cpu : public Jdb_kern_info_module
182 static Jdb_kern_info_cpu k_c INIT_PRIORITY(JDB_MODULE_INIT_PRIO+1);
185 Jdb_kern_info_cpu::Jdb_kern_info_cpu()
186 : Jdb_kern_info_module('c', "CPU features")
188 Jdb_kern_info::register_subcmd(this);
193 Jdb_kern_info_cpu::show()
195 const char *perf_type = Perf_cnt::perf_type();
199 static char const * const scheduler_mode[] = { "PIT", "RTC", "APIC" };
202 if ((hz = Cpu::boot_cpu()->frequency()))
204 unsigned mhz = hz / 1000000;
206 unsigned khz = hz / 1000;
207 snprintf(cpu_mhz, sizeof(cpu_mhz), "%d.%03d MHz", mhz, khz);
210 printf ("CPU: %s %s (%s)\n",
211 Cpu::boot_cpu()->model_str(), cpu_mhz,
212 Config::found_vmware ? "vmware" : "native");
213 Cpu::boot_cpu()->show_cache_tlb_info(" ");
216 if (Cpu::boot_cpu()->tsc())
218 Unsigned32 hour, min, sec, ns;
219 Cpu::boot_cpu()->tsc_to_s_and_ns(Cpu::rdtsc(), &sec, &ns);
224 snprintf(time, sizeof(time), "%02d:%02d:%02d.%06d",
225 hour, min, sec, ns/1000);
228 strcpy(time, "not available");
230 printf("\nTimer interrupt source: %s (irq vector 0x%02x)"
231 "\nPerformance counters: %s"
232 "\nLast branch recording: %s"
233 "\nDebug store to memory: %s"
234 "\nTime stamp counter: %s"
236 scheduler_mode[Config::scheduler_mode],
237 Config::scheduler_irq_vector,
238 perf_type ? perf_type : "no",
239 Cpu::boot_cpu()->lbr_type() != Cpu::Lbr_unsupported
240 ? Cpu::boot_cpu()->lbr_type() == Cpu::Lbr_pentium_4 ? "P4" : "P6"
242 Cpu::boot_cpu()->bts_type() != Cpu::Bts_unsupported
243 ? Cpu::boot_cpu()->bts_type() == Cpu::Bts_pentium_4 ? "P4" : "Pentium-M"
250 class Jdb_kern_info_gdt : public Jdb_kern_info_module
253 static unsigned line;
256 static Jdb_kern_info_gdt k_g INIT_PRIORITY(JDB_MODULE_INIT_PRIO+1);
258 unsigned Jdb_kern_info_gdt::line;
261 Jdb_kern_info_gdt::Jdb_kern_info_gdt()
262 : Jdb_kern_info_module('g', "Global Descriptor Table (GDT)")
264 Jdb_kern_info::register_subcmd(this);
269 Jdb_kern_info_gdt::show_gdt(unsigned cpu)
271 Gdt *gdt = Cpu::cpus.cpu(cpu).get_gdt();
272 unsigned entries = Gdt::gdt_max / 8;
274 if (Config::Max_num_cpus > 1)
275 printf("CPU%d: GDT base="L4_PTR_FMT" limit=%04x (%04x bytes)\n",
276 cpu, (Mword)gdt, entries, Gdt::gdt_max);
278 printf("GDT base="L4_PTR_FMT" limit=%04x (%04x bytes)\n",
279 (Mword)gdt, entries, Gdt::gdt_max);
281 if (!Jdb_core::new_line(line))
284 for (unsigned i = 0; i < entries; i++)
286 printf(" %02x: ", i * 8);
288 if (!Jdb_core::new_line(line))
295 Jdb_kern_info_gdt::show()
298 Jdb::foreach_cpu(&show_gdt);