Browse Source

Kernel: Address all 32 HPET comparators correctly

Instead of declaring a reserved area from byte 0x160 to 0x400, we
change the declaration of TimerStructure array to be 32 units.

Also, a static_assert was added, to ensure that the calculation is
right.
Liav A 4 years ago
parent
commit
b807e725e0
1 changed files with 6 additions and 2 deletions
  1. 6 2
      Kernel/Time/HPET.cpp

+ 6 - 2
Kernel/Time/HPET.cpp

@@ -92,14 +92,18 @@ struct [[gnu::packed]] HPETRegistersBlock {
     u8 reserved2[0xF0 - 0x28];
     u8 reserved2[0xF0 - 0x28];
     HPETRegister main_counter_value;
     HPETRegister main_counter_value;
     u64 reserved3;
     u64 reserved3;
-    TimerStructure timers[3];
-    u8 reserved4[0x400 - 0x160];
+    TimerStructure timers[32];
 };
 };
 
 
 static_assert(__builtin_offsetof(HPETRegistersBlock, main_counter_value) == 0xf0);
 static_assert(__builtin_offsetof(HPETRegistersBlock, main_counter_value) == 0xf0);
 static_assert(__builtin_offsetof(HPETRegistersBlock, timers[0]) == 0x100);
 static_assert(__builtin_offsetof(HPETRegistersBlock, timers[0]) == 0x100);
 static_assert(__builtin_offsetof(HPETRegistersBlock, timers[1]) == 0x120);
 static_assert(__builtin_offsetof(HPETRegistersBlock, timers[1]) == 0x120);
 
 
+// Note: The HPET specification says it reserves the range of byte 0x160 to
+// 0x400 for comparators 3-31, but for implementing all 32 comparators the HPET
+// MMIO space has to be 1280 bytes and not 1024 bytes.
+static_assert(sizeof(HPETRegistersBlock) == 0x500);
+
 static u64 read_register_safe64(const HPETRegister& reg)
 static u64 read_register_safe64(const HPETRegister& reg)
 {
 {
     // As per 2.4.7 this reads the 64 bit value in a consistent manner
     // As per 2.4.7 this reads the 64 bit value in a consistent manner