-CXXFLAGS := -m32 -ggdb -g3 -O0 -fno-pic -fno-rtti -fno-exceptions -std=c++23
+CXXFLAGS := -m32 -ggdb -g3 -O1 -fno-pic -fno-rtti -fno-exceptions -std=c++23 \
+ -Wall -Wextra -pedantic -Werror
LDFLAGS := $(CXXFLAGS) -T link.ld -static -nostdlib -fno-use-cxa-atexit
CXXFILES := acpi.cpp \
#include <array>
#include <cstdint>
+#include <span>
+extern void (*__init_array_start)();
+extern void (*__init_array_end)();
extern void kernel_main();
alignas(16)
-std::array<std::uint8_t, 16384> stack;
+static std::array<std::uint8_t, 16384> stack;
+
+static void init_array()
+{
+ std::span initArray (&__init_array_start, &__init_array_end);
+ for (auto& fn : initArray)
+ fn();
+}
extern "C"
__attribute__((naked))
mov %0, %%esp
)" :: "i" (stack.data() + stack.size()));
- extern std::uint32_t __init_array_start;
- extern std::uint32_t __init_array_end;
-
- auto it = &__init_array_start;
- while (it < &__init_array_end) {
- auto fn = reinterpret_cast<void (*)()>(*it);
- fn();
- ++it;
- }
-
+ init_array();
kernel_main();
asm volatile("cli");
std::uint32_t prevTSS;
std::uint32_t esp0;
std::uint32_t ss0;
- std::uint32_t unused[23];
+ std::uint32_t unused[23] = {};
} __attribute__((packed));
static TSSEntry tss = {
struct idt_entry_bits {
std::uint32_t offset_low : 16;
std::uint32_t segment_selector : 16;
- std::uint32_t rsvd : 8;
+ std::uint32_t rsvd : 8 = 0;
std::uint32_t gate_type : 4;
- std::uint32_t rsvd2 : 1;
+ std::uint32_t rsvd2 : 1 = 0;
std::uint32_t dpl : 2;
std::uint32_t present : 1;
std::uint32_t offset_high : 16;
}
extern "C"
-int __cxa_atexit(void (*func)(void *), void *arg, void *dso_handle)
+int __cxa_atexit(void (*)(void *), void *, void *)
{
return 0;
}
K_F11, K_F12
}};
-static constexpr bool isReleased(auto ch) {
+static inline bool isReleased(auto ch) {
return ch & 0x80;
}
-static constexpr auto keycode(auto ch) {
+static inline auto keycode(auto ch) {
return ch & 0x7F;
}
{
keyboardBuffer = CircularBuffer<char>(128);
- idt_register_callback(33, [](auto& regs) {
+ idt_register_callback(33, [](auto&) {
const std::uint8_t kc = keyboardPort;
if (!isReleased(kc)) {
return memory_alloc(size);
}
-void operator delete(void *ptr)
+void operator delete(void *)
{
}
-void operator delete[](void *ptr)
+void operator delete[](void *)
{
}
+
+void operator delete(void *, std::size_t)
+{
+
+}
+
+void operator delete[](void *, std::size_t)
+{
+
+}
+
std::uint32_t data[1];
} __attribute__((packed));
+template<int N>
struct multiboot2
{
static constexpr std::uint32_t MAGIC = 0xE85250D6;
static constexpr std::uint32_t CHECKSUM = -(MAGIC + FLAGS + LENGTH);
alignas(8)
- std::uint32_t magic;
- std::uint32_t flags;
- std::uint32_t length;
- std::uint32_t checksum;
+ std::uint32_t magic = MAGIC;
+ std::uint32_t flags = FLAGS;
+ std::uint32_t length = LENGTH;
+ std::uint32_t checksum = CHECKSUM;
- multiboot2_tag tags[];
+ multiboot2_tag tags[N];
} __attribute__((packed));
__attribute__((section(".multiboot2")))
multiboot2 multibootHeader = {
- .magic = multiboot2::MAGIC,
- .flags = multiboot2::FLAGS,
- .length = multiboot2::LENGTH,
- .checksum = multiboot2::CHECKSUM,
.tags = {
{
1, 0, sizeof(multiboot2_tag) + sizeof(std::uint32_t),
static std::array<Task, 4> tasks;
static int current = -1;
-void schedule(const Registers& regs)
+void schedule(const Registers&)
{
if (current < 0)
return;
)" : "=m" (tasks[current].esp), "=m" (tasks[current].ebp));
do {
- if (++current >= tasks.size())
+ if (++current >= static_cast<int>(tasks.size()))
current = 0;
} while (tasks[current].state == Task::Invalid || tasks[current].state == Task::Staging);
bool tasking_spawn(void (*entry)(), unsigned ssize)
{
- int i = -1;
+ unsigned i;
for (i = 0; i < tasks.size(); ++i) {
if (tasks[i].state == Task::Invalid)
break;
}
- if (i < 0)
+ if (i >= tasks.size())
return false;
tasks[i].state = Task::Staging;