+ for (n_apics = 0;
+ Acpi_madt::Io_apic const *ioapic = static_cast<Acpi_madt::Io_apic const *>(_madt->find(Acpi_madt::IOAPIC, n_apics));
+ ++n_apics)
+ {
+
+ if (n_apics >= Max_ioapics)
+ {
+ printf("Maximum number of IO-APICs exceeded ignore further IO-APICs\n");
+ break;
+ }
+
+ printf("IO-APIC[%2d]: struct: %p adr=%x\n", n_apics, ioapic, ioapic->adr);
+
+ Address offs;
+ Address va = Mem_layout::alloc_io_vmem(Config::PAGE_SIZE);
+ assert (va);
+
+ Kmem::map_phys_page(ioapic->adr, va, false, true, &offs);
+
+ Kip::k()->add_mem_region(Mem_desc(ioapic->adr, ioapic->adr + Config::PAGE_SIZE -1, Mem_desc::Reserved));
+
+
+ Io_apic *apic = Io_apic::apic(n_apics);
+ apic->_apic = (Io_apic::Apic*)(va + offs);
+ apic->write(0, 0);
+ unsigned ne = apic->num_entries();
+ apic->_offset = _nr_irqs;
+ _nr_irqs += ne + 1;
+
+ for (unsigned i = 0; i <= ne; ++i)
+ {
+ int v = 0x20+i;
+ Io_apic_entry e(v, Io_apic_entry::Fixed, Io_apic_entry::Physical,
+ Io_apic_entry::High_active, Io_apic_entry::Edge, 0);
+ apic->write_entry(i, e);
+ }
+
+ printf("IO-APIC[%2d]: pins %u\n", n_apics, ne);
+ apic->dump();
+ }
+
+ if (!n_apics)