/* Check if the compiler thinks you are targeting the wrong operating system. */ #if defined(__linux__) #error "You are not using a cross-compiler" #endif /* This tutorial will only work for the 32-bit ix86 targets. */ #if !defined(__i386__) #error "This tutorial needs to be compiled with a ix86-elf compiler" #endif #include #include #include "cga.h" #include "gdt.h" #include "idt.h" #include "serial.h" #include "hardware.h" typedef void (*constructor)(); extern "C" { constructor start_ctors; constructor end_ctors; void kernel_constructors() { for (constructor* i = &start_ctors; i != &end_ctors; ++i) (*i)(); } void dump_multiboot(uint32_t mb_magic, uint32_t mb_addr); void dump_gdt(); void kernel_main([[maybe_unused]] uint32_t mb_magic, [[maybe_unused]] uint32_t mb_addr) { #ifdef HAS_SERIAL0 if constexpr (serial0_console) if (serial0.self_check()) Console::set(&serial0); #endif #ifdef HAS_VIDEO0 if constexpr (video0_console) Console::set(&video0); #endif // printk("Hello, kernel World!\n"); // dump_multiboot(mb_magic, mb_addr); // dump_gdt(); // printk("GDT::SegmentDescriptor tests\n"); auto x = GDT::SegmentDescriptor::make<0xffff>(0xdeadbeef, {}); // printk("x.base(): ", uhex{x.base()}, '\n'); // printk("Setting new GDT\n"); GDT gdt; // dump_gdt(); IDT idt; while (true) asm volatile("hlt"); } } // extern "C"