Browse Source

Kernel: Let's say that IO::delay(N) delays for N microseconds

Supposedly that's how much delay you get when doing I/O on port 0x80.
Andreas Kling 5 years ago
parent
commit
03eb0e5638
3 changed files with 5 additions and 11 deletions
  1. 1 1
      Kernel/Devices/SB16.cpp
  2. 2 6
      Kernel/Interrupts/APIC.cpp
  3. 2 4
      Libraries/LibBareMetal/IO.h

+ 1 - 1
Kernel/Devices/SB16.cpp

@@ -100,7 +100,7 @@ void SB16::initialize()
     disable_irq();
     disable_irq();
 
 
     IO::out8(0x226, 1);
     IO::out8(0x226, 1);
-    IO::delay();
+    IO::delay(32);
     IO::out8(0x226, 0);
     IO::out8(0x226, 0);
 
 
     auto data = dsp_read();
     auto data = dsp_read();

+ 2 - 6
Kernel/Interrupts/APIC.cpp

@@ -215,20 +215,16 @@ void enable(u32 cpu)
     write_register(APIC_REG_TPR, 0);
     write_register(APIC_REG_TPR, 0);
 
 
     if (cpu != 0) {
     if (cpu != 0) {
-        static volatile u32 foo = 0;
-
         // INIT
         // INIT
         write_icr(ICRReg(0, ICRReg::INIT, ICRReg::Physical, ICRReg::Assert, ICRReg::TriggerMode::Edge, ICRReg::AllExcludingSelf));
         write_icr(ICRReg(0, ICRReg::INIT, ICRReg::Physical, ICRReg::Assert, ICRReg::TriggerMode::Edge, ICRReg::AllExcludingSelf));
 
 
-        for (foo = 0; foo < 0x800000; foo++)
-            ; // TODO: 10 millisecond delay
+        IO::delay(10 * 1000);
 
 
         for (int i = 0; i < 2; i++) {
         for (int i = 0; i < 2; i++) {
             // SIPI
             // SIPI
             write_icr(ICRReg(0x08, ICRReg::StartUp, ICRReg::Physical, ICRReg::Assert, ICRReg::TriggerMode::Edge, ICRReg::AllExcludingSelf)); // start execution at P8000
             write_icr(ICRReg(0x08, ICRReg::StartUp, ICRReg::Physical, ICRReg::Assert, ICRReg::TriggerMode::Edge, ICRReg::AllExcludingSelf)); // start execution at P8000
 
 
-            for (foo = 0; foo < 0x80000; foo++)
-                ; // TODO: 200 microsecond delay
+            IO::delay(200);
         }
         }
     }
     }
 }
 }

+ 2 - 4
Libraries/LibBareMetal/IO.h

@@ -94,12 +94,10 @@ inline void repeated_out16(u16 port, const u16* data, int data_size)
                  : "d"(port));
                  : "d"(port));
 }
 }
 
 
-inline void delay()
+inline void delay(size_t microseconds)
 {
 {
-    // ~3 microsecs
-    for (auto i = 0; i < 32; i++) {
+    for (size_t i = 0; i < microseconds; ++i)
         IO::in8(0x80);
         IO::in8(0x80);
-    }
 }
 }
 
 
 }
 }