Просмотр исходного кода

Kernel: Simplify 64-bit HPET reads on x86_64

We don't have to worry about racy 32-bit reads when we're reading the
64-bit HPET value using a 64-bit CPU. :^)
Andreas Kling 3 лет назад
Родитель
Сommit
63117f826b
1 измененных файлов с 11 добавлено и 2 удалено
  1. 11 2
      Kernel/Time/HPET.cpp

+ 11 - 2
Kernel/Time/HPET.cpp

@@ -46,8 +46,13 @@ enum class TimerConfiguration : u32 {
 };
 
 struct [[gnu::packed]] HPETRegister {
-    volatile u32 low;
-    volatile u32 high;
+    union {
+        volatile u64 full;
+        struct {
+            volatile u32 low;
+            volatile u32 high;
+        };
+    };
 };
 
 struct [[gnu::packed]] TimerStructure {
@@ -87,6 +92,9 @@ static_assert(AssertSize<HPETRegistersBlock, 0x500>());
 
 static u64 read_register_safe64(const HPETRegister& reg)
 {
+#if ARCH(X86_64)
+    return reg.full;
+#else
     // As per 2.4.7 this reads the 64 bit value in a consistent manner
     // using only 32 bit reads
     u32 low, high = reg.high;
@@ -98,6 +106,7 @@ static u64 read_register_safe64(const HPETRegister& reg)
         high = new_high;
     }
     return ((u64)high << 32) | (u64)low;
+#endif
 }
 
 static HPET* s_hpet;