@@ -34,23 +34,28 @@ namespace x86
3434{
3535 struct ioapic
3636 {
37- uint32_t read (uint8_t reg) const noexcept {
38- auto volatile * addr = (uint32_t volatile *) this ->base ;
39- addr[0 ] = reg;
40- return addr[4 ];
37+ struct io_regs {
38+ volatile uint32_t reg;
39+ uint32_t pad1[3 ];
40+ volatile uint32_t val;
41+ uint32_t pad2[3 ];
42+ };
43+
44+ uint32_t read (uint8_t reg) noexcept {
45+ base->reg = reg;
46+ return base->val ;
4147 }
42- void write (uint8_t reg, uint32_t value) {
43- auto volatile * addr = (uint32_t volatile *) this ->base ;
44- addr[0 ] = reg;
45- addr[4 ] = value;
48+ void write (uint8_t reg, uint32_t value) noexcept {
49+ base->reg = reg;
50+ base->val = value;
4651 }
4752 void set_entry (uint8_t index, uint32_t lo, uint32_t hi)
4853 {
4954 assert (index < entries ());
5055 write (IOAPIC_INTR + index * 2 + 1 , hi);
5156 write (IOAPIC_INTR + index * 2 , lo);
5257 }
53- void set_id (uint32_t id)
58+ void set_id (uint32_t id) noexcept
5459 {
5560 write (IOAPIC_ID, id << 24 );
5661 }
@@ -60,27 +65,25 @@ namespace x86
6065 return entries_;
6166 }
6267
63- void init (uintptr_t base )
68+ void init (uintptr_t base_addr )
6469 {
65- this ->base = base;
70+ INFO (" IOAPIC" , " Initializing" );
71+ this ->base = (decltype (base)) base_addr;
6672 // required: set IOAPIC ID
6773 set_id (0 );
6874 // number of redirection entries supported
69- entries_ = read (IOAPIC_VER) >> 16 ;
70- entries_ = 1 + (entries_ & 0xff );
75+ auto reg = read (IOAPIC_VER) >> 16 ;
76+ this -> entries_ = 1 + (reg & 0xff );
7177
72- INFO (" IOAPIC" , " Initializing" );
73- INFO2 (" Base addr: 0x%x Redirection entries: %u" , base, entries ());
78+ INFO2 (" Base addr: %p Redirection entries: %u" , base, entries ());
7479
7580 // default: all entries disabled
7681 for (unsigned i = 0 ; i < entries (); i++)
7782 set_entry (i, IOAPIC_IRQ_DISABLE, 0 );
78-
79- INFO (" IOAPIC" , " Done" );
8083 }
8184
82- uintptr_t base;
83- uint32_t entries_;
85+ io_regs* base;
86+ uint32_t entries_;
8487 };
8588 // there can be more than one IOAPIC
8689 static ioapic numbawan;
0 commit comments