aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClyne Sullivan <clyne@bitgloo.com>2024-09-28 10:01:26 -0400
committerClyne Sullivan <clyne@bitgloo.com>2024-09-28 10:01:26 -0400
commit376d7ec265085ae3a77664356a2ad35921cfccaf (patch)
treeb2afd73c602889a59be763542c086371344ecabe
parent8f9329da623bf0812df44f60867180020283ff3f (diff)
millisecond pit; fix multiboot headers for optimization
-rw-r--r--kernel.cpp10
-rw-r--r--multiboot.cpp51
-rw-r--r--pit.cpp10
-rw-r--r--pit.hpp4
-rw-r--r--vgaterminal.cpp2
5 files changed, 41 insertions, 36 deletions
diff --git a/kernel.cpp b/kernel.cpp
index 4d00e07..bf754eb 100644
--- a/kernel.cpp
+++ b/kernel.cpp
@@ -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;
diff --git a/multiboot.cpp b/multiboot.cpp
index 0a30938..719bb5c 100644
--- a/multiboot.cpp
+++ b/multiboot.cpp
@@ -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 6ee5009..964522b 100644
--- 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 5c2796c..55bcde9 100644
--- 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
diff --git a/vgaterminal.cpp b/vgaterminal.cpp
index f2bb081..8158b14 100644
--- a/vgaterminal.cpp
+++ b/vgaterminal.cpp
@@ -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");
}