]> code.bitgloo.com Git - clyne/osdev.git/commitdiff
millisecond pit; fix multiboot headers for optimization
authorClyne Sullivan <clyne@bitgloo.com>
Sat, 28 Sep 2024 14:01:26 +0000 (10:01 -0400)
committerClyne Sullivan <clyne@bitgloo.com>
Sat, 28 Sep 2024 14:01:26 +0000 (10:01 -0400)
kernel.cpp
multiboot.cpp
pit.cpp
pit.hpp
vgaterminal.cpp

index 4d00e07c365ec2ad291a6a26a43d995ef8c5bf94..bf754ebfd769102dfcede6b97b1548abf784066e 100644 (file)
@@ -20,7 +20,7 @@ void kernel_main(void)
     if (!multiboot_initialize())
         for (;;);
 
-    idt_register_callback(14, [](const Registers& regs) {
+    idt_register_callback(14, [](auto& regs) {
         term.write("Page fault! eip=");
         term.write(regs.eip);
         term.write('\n');
@@ -32,14 +32,14 @@ void kernel_main(void)
     gdt_initialize();
     pic_initialize();
     idt_initialize();
-    pit_initialize(100);
+    pit_initialize();
     asm volatile("sti");
     tasking_initialize();
     term.write("Tasking enabled.\n");
 
     tasking_spawn([] {
         for (;;) {
-            do pit_busy_wait(1);
+            do pit_delay_ms(1);
             while (termBusy);
 
             termBusy = true;
@@ -50,7 +50,7 @@ void kernel_main(void)
 
     tasking_spawn([] {
         for (;;) {
-            do pit_busy_wait(1);
+            do pit_delay_ms(1);
             while (termBusy);
 
             termBusy = true;
@@ -60,7 +60,7 @@ void kernel_main(void)
     }, 256);
 
     for (;;) {
-        do pit_busy_wait(1);
+        do pit_delay_ms(1);
         while (termBusy);
 
         termBusy = true;
index 0a309382b6c8b0a8bebb062a72194a2387d88edd..719bb5c9c5075125bc8497d10fdb1294fd383cff 100644 (file)
@@ -4,6 +4,15 @@
 
 extern TextOutput& term;
 
+struct multiboot2_tag
+{
+    alignas(8)
+    std::uint16_t id;
+    std::uint16_t flags;
+    std::uint32_t length;
+    std::uint32_t data[1];
+} __attribute__((packed));
+
 struct multiboot2
 {
     static constexpr std::uint32_t MAGIC    = 0xE85250D6;
@@ -12,33 +21,29 @@ struct multiboot2
     static constexpr std::uint32_t CHECKSUM = -(MAGIC + FLAGS + LENGTH);
 
     alignas(8)
-    std::uint32_t magic = MAGIC;
-    std::uint32_t flags = FLAGS;
-    std::uint32_t length = LENGTH;
-    std::uint32_t checksum = CHECKSUM;
-} __attribute__((packed));
-
-struct multiboot2_tag
-{
-    alignas(8)
-    std::uint16_t id;
-    std::uint16_t flags;
+    std::uint32_t magic;
+    std::uint32_t flags;
     std::uint32_t length;
-    std::uint32_t data[];
-} __attribute__((packed));
-
-__attribute__((section(".multiboot2")))
-multiboot2 multibootHeader;
+    std::uint32_t checksum;
 
-__attribute__((section(".multiboot2")))
-multiboot2_tag multibootTagInfoRequest = {
-    1, 0, sizeof(multiboot2_tag) + sizeof(std::uint32_t),
-    {4}
-};
+    multiboot2_tag tags[];
+} __attribute__((packed));
 
 __attribute__((section(".multiboot2")))
-multiboot2_tag multibootTagEnd = {
-    0, 0, sizeof(multiboot2_tag), {}
+multiboot2 multibootHeader = {
+    .magic = multiboot2::MAGIC,
+    .flags = multiboot2::FLAGS,
+    .length = multiboot2::LENGTH,
+    .checksum = multiboot2::CHECKSUM,
+    .tags = {
+        {
+            1, 0, sizeof(multiboot2_tag) + sizeof(std::uint32_t),
+            {4}
+        },
+        {
+            0, 0, 8, {}
+        }
+    }
 };
 
 std::uint32_t multiboot_magic;
diff --git a/pit.cpp b/pit.cpp
index 6ee50097137f851b00afa1895b5757d477b3a1b6..964522b114a404ac414bc1c5a17fb3e54a6b2f27 100644 (file)
--- a/pit.cpp
+++ b/pit.cpp
@@ -3,6 +3,8 @@
 #include "portio.hpp"
 #include "tasking.hpp"
 
+constexpr std::uint32_t Frequency = 1000;
+
 static volatile std::uint32_t ticks = 0;
 
 static void timer_callback(const Registers& regs)
@@ -12,7 +14,7 @@ static void timer_callback(const Registers& regs)
     schedule(regs);
 }
 
-void pit_initialize(std::uint32_t frequency)
+void pit_initialize()
 {
    // Firstly, register our timer callback.
    idt_register_callback(32, timer_callback);
@@ -20,7 +22,7 @@ void pit_initialize(std::uint32_t frequency)
    // The value we send to the PIT is the value to divide it's input clock
    // (1193180 Hz) by, to get our required frequency. Important to note is
    // that the divisor must be small enough to fit into 16-bits.
-   auto divisor = 1193180 / frequency;
+   const auto divisor = 1193180ul / Frequency;
 
    // Send the command byte.
    outb(0x43, 0x36);
@@ -30,9 +32,9 @@ void pit_initialize(std::uint32_t frequency)
    outb(0x40, (divisor >> 8) & 0xFF);
 }
 
-void pit_busy_wait(std::int32_t tks)
+void pit_delay_ms(std::int32_t ms)
 {
-    const auto end = ticks + tks;
+    const auto end = ticks + ms;
     while (static_cast<std::int32_t>(end - ticks) > 0)
         asm volatile("nop");
 }
diff --git a/pit.hpp b/pit.hpp
index 5c2796c10f1268df7cda4fba213ea1e3dceea9a9..55bcde9edc6d8ab629cecf365d56796d028e0c11 100644 (file)
--- a/pit.hpp
+++ b/pit.hpp
@@ -3,8 +3,8 @@
 
 #include <cstdint>
 
-void pit_initialize(std::uint32_t frequency);
-void pit_busy_wait(std::int32_t tks);
+void pit_initialize();
+void pit_delay_ms(std::int32_t ms);
 
 #endif // PIT_HPP
 
index f2bb0812af6a272d52235a632e7be56b408d26e5..8158b14b24512e9f47a42fd3ade5f9fb41718de1 100644 (file)
@@ -46,11 +46,9 @@ void VGATerminal::checkpos() noexcept
 
 void VGATerminal::updatecursor() const noexcept
 {
-    asm volatile("cli");
     outb(0x03d4, 0x0f);
     outb(0x03d5, static_cast<std::uint8_t>(offset));
     outb(0x03d4, 0x0e);
     outb(0x03d5, static_cast<std::uint8_t>(offset >> 8));
-    asm volatile("sti");
 }