From b3392eb3226d06750792d9cc177556109a2785d5 Mon Sep 17 00:00:00 2001 From: Nigel Date: Sun, 16 Nov 2025 20:41:20 +0100 Subject: [PATCH] WIP: drivers and boot --- kernel/boot/boot.s | 6 +- kernel/drivers/rtl8139/rtl8139.cpp | 35 ++++++++ kernel/drivers/rtl8139/rtl8139.h | 35 ++++++++ kernel/interrupts/idt.cpp | 3 +- kernel/kernel.cpp | 129 ++++++++++++++++------------- kernel/prekernel/prekernel.cpp | 2 +- 6 files changed, 147 insertions(+), 63 deletions(-) create mode 100644 kernel/drivers/rtl8139/rtl8139.cpp create mode 100644 kernel/drivers/rtl8139/rtl8139.h diff --git a/kernel/boot/boot.s b/kernel/boot/boot.s index b45b3a8..177501f 100644 --- a/kernel/boot/boot.s +++ b/kernel/boot/boot.s @@ -59,6 +59,10 @@ _start: movl $(boot_page_table - 0xC0000000 + 0x003), boot_page_directory - 0xC0000000 + 0 movl $(boot_page_table - 0xC0000000 + 0x003), boot_page_directory - 0xC0000000 + 768 * 4 +# movl source, destination + movl $(boot_page_directory - 0xC0000000 + 0x003), boot_page_directory - 0xC0000000 + 1024 * 4 + + # Set cr3 to the address of the boot_page_directory movl $(boot_page_directory - 0xC0000000), %ecx movl %ecx, %cr3 @@ -98,7 +102,7 @@ isPaging: call prekernelSetup # Unmap the identity mapping as it is now unnecessary - # movl $0, boot_page_directory + 0 + movl $0, boot_page_directory + 0 call kernel diff --git a/kernel/drivers/rtl8139/rtl8139.cpp b/kernel/drivers/rtl8139/rtl8139.cpp new file mode 100644 index 0000000..8279315 --- /dev/null +++ b/kernel/drivers/rtl8139/rtl8139.cpp @@ -0,0 +1,35 @@ +#include "rtl8139.h" +#include "../io/io.h" + + +rtl8139::rtl8139(){ + +} + +rtl8139::~rtl8139(){ + +} + +void rtl8139::Wake(){ + outb(ioaddr + CONFIG_1, 0x0); +} + +void rtl8139::Reset(){ + outb(ioaddr + CMD_OFFSET, 0x10); + // Wait for the reset procedure + while((inb(ioaddr + CMD_OFFSET) & 0x10) != 0) continue; +} + + +void rtl8139::Sleep(){ + +} + +void rtl8139::Receive(){ + +} + + +void rtl8139::Transmit(){ + +} \ No newline at end of file diff --git a/kernel/drivers/rtl8139/rtl8139.h b/kernel/drivers/rtl8139/rtl8139.h new file mode 100644 index 0000000..1f94ac5 --- /dev/null +++ b/kernel/drivers/rtl8139/rtl8139.h @@ -0,0 +1,35 @@ +#pragma once +#define MAC05_OFFSET 0x00 // size 6 +#define MAC07_OFFSET 0x08 // size 8 +#define RBSTART_OFFSET 0x30 // size 4 +#define CMD_OFFSET 0x37 // size 1 +#define IMR_OFFSET 0x3C // size 2 +#define ISR_OFFSET 0x3E // size 2 +#define CONFIG_1 0x52 + +// Copyright © Nigel Barink 2023 +// Information source: https://wiki.osdev.org/RTL8139 + +// Get me some networking !! XD +class NetworkDevice { + protected: + +}; + + +class rtl8139 : public NetworkDevice { + public: + rtl8139(); + ~rtl8139(); + + + void Wake(); + void Reset(); + + void Sleep(); + void Receive(); + void Transmit(); + private: + int ioaddr ; + +}; \ No newline at end of file diff --git a/kernel/interrupts/idt.cpp b/kernel/interrupts/idt.cpp index 4b20f2e..0acb764 100644 --- a/kernel/interrupts/idt.cpp +++ b/kernel/interrupts/idt.cpp @@ -4,7 +4,7 @@ #include "../i386/processor.h" #include "../memory/VirtualMemoryManager.h" #include "../syscalls.h" - +#include "../klog.h" IDT_entry idt_table[256]; IDT_ptr idt_ptr; @@ -91,7 +91,6 @@ void irs_handler (registers* regs) { printf("EIP: 0x%x\n", regs->eip); printf("EAX: 0x%x\n", regs->eax); printf("EBP: 0x%x\n", regs->ebp); - while(true); break; case 9: diff --git a/kernel/kernel.cpp b/kernel/kernel.cpp index 4ac7889..9e77993 100644 --- a/kernel/kernel.cpp +++ b/kernel/kernel.cpp @@ -1,88 +1,99 @@ /* Copyright © Nigel Barink 2023 */ -#include "memory/memory.h" -#include "memory/KernelHeap.h" -#include "memory/gdt/gdtc.h" -#include "memory/TaskStateSegment.h" -#include "supervisorterminal/superVisorTerminal.h" -#include "drivers/vga/VBE.h" -#include "pci/pci.h" -#include "drivers/pit/pit.h" -#include "i386/processor.h" -#include "terminal/kterm.h" -#include "interrupts/idt.h" -#include "storage/vfs/vfs.h" -#include "storage/filesystems/FAT/FAT.h" #include "acpi/acpi.h" -#include "memory/VirtualMemoryManager.h" +#include "drivers/pit/pit.h" +#include "drivers/vga/VBE.h" +#include "i386/processor.h" +#include "interrupts/idt.h" #include "klog.h" +#include "memory/KernelHeap.h" +#include "memory/TaskStateSegment.h" +#include "memory/VirtualMemoryManager.h" +#include "memory/gdt/gdtc.h" +#include "memory/memory.h" +#include "pci/pci.h" +#include "storage/filesystems/FAT/FAT.h" +#include "storage/vfs/vfs.h" +#include "supervisorterminal/superVisorTerminal.h" +#include "terminal/kterm.h" - -extern BootInfoBlock* BIB; -extern "C" void LoadGlobalDescriptorTable(); +extern BootInfoBlock *BIB; +extern "C" void LoadGlobalDescriptorTable(); extern "C" void jump_usermode(); -void initBootDrive(){ - printf("Boot device: 0x%x\n", BIB->bootDeviceID); - unsigned int part3 = BIB->bootDeviceID & 0xFF; - unsigned int part2 = (BIB->bootDeviceID & 0xFF00) >> 8; - unsigned int part1 = (BIB->bootDeviceID & 0xFF0000) >> 16; - unsigned int drive = (BIB->bootDeviceID & 0xFF000000) >> 24; - if (drive == 0x80 ) - printf("booted from disk!\n"); - if(drive == 0x00) - printf("booted from floppy disk\n"); +void initBootDrive() { + printf("Boot device: 0x%x\n", BIB->bootDeviceID); + unsigned int part3 = BIB->bootDeviceID & 0xFF; + unsigned int part2 = (BIB->bootDeviceID & 0xFF00) >> 8; + unsigned int part1 = (BIB->bootDeviceID & 0xFF0000) >> 16; + unsigned int drive = (BIB->bootDeviceID & 0xFF000000) >> 24; + if (drive == 0x80) + printf("booted from disk!\n"); + if (drive == 0x00) + printf("booted from floppy disk\n"); - printf("Part1: %d, Part2: %d, Part3: %d\n", part1, part2 , part3); - ATAPIO::Identify(ATAPIO_PORT::Primary, DEVICE_DRIVE::MASTER); + printf("Part1: %d, Part2: %d, Part3: %d\n", part1, part2, part3); + ATAPIO::Identify(ATAPIO_PORT::Primary, DEVICE_DRIVE::MASTER); } +extern uint32_t *boot_page_directory; +extern "C" void kernel() { -extern "C" void kernel () -{ - kterm_init(); - setup_tss(); - initGDT(); - initidt(); - LoadGlobalDescriptorTable(); - flush_tss(); + while (true) { + __asm__ __volatile__("NOP"); + }; + // kterm_init(); + uint32_t cr3; + __asm__ __volatile__("mov %%cr3, %%eax\n\t" + "mov %%eax, %0\n\t" + : "=m"(cr3) + : + : "%eax"); - print_info("Memory setup complete!\n"); - // Enable interrupts - asm volatile("STI"); + printf("value of cr3: 0x%x\n", cr3); + // printf("page directory entry : 0x%x\n" , boot_page_directory[1023]); + while (true) + ; + setup_tss(); + initGDT(); + initidt(); + LoadGlobalDescriptorTable(); + flush_tss(); + print_info("Memory setup complete!\n"); + // Enable interrupts + asm volatile("STI"); - initHeap(); - //pit_initialise(); + initHeap(); + pit_initialise(); + PCI::Scan(); + processor::initialize(); + processor::enable_protectedMode(); + initBootDrive(); + VirtualFileSystem::initialize(); - //ACPI::initialize(); - //PCI::Scan(); - processor::initialize(); - processor::enable_protectedMode(); - initBootDrive(); - VirtualFileSystem::initialize(); + print_dbg("Hello debug!\n"); + print_info("Hello info!\n"); + print_err("Hello error!\n"); - print_dbg("Hello debug!\n"); - print_info("Hello info!\n"); - print_err("Hello error!\n"); + ACPI::initialize(); #define VFS_EXAMPLE #ifdef VFS_EXAMPLE - auto fontFile = VirtualFileSystem::open("/FONT PSF", 0); - printf("Size of font file: %d bytes\n", fontFile->root->size); // COOL This Works like a charm - + auto fontFile = VirtualFileSystem::open("/FONT PSF", 0); + printf("Size of font file: %d bytes\n", + fontFile->root->size); // COOL This Works like a charm #endif #ifdef USERMODE_RELEASE - // Lets jump into user mode - jump_usermode(); + // Lets jump into user mode + jump_usermode(); #else - startSuperVisorTerminal(); + startSuperVisorTerminal(); #endif - -} \ No newline at end of file +} diff --git a/kernel/prekernel/prekernel.cpp b/kernel/prekernel/prekernel.cpp index 5e4f059..fe001d0 100644 --- a/kernel/prekernel/prekernel.cpp +++ b/kernel/prekernel/prekernel.cpp @@ -53,7 +53,7 @@ extern "C" void prekernelSetup ( unsigned long magic, multiboot_info_t* mbi) if(mmap->type == MULTIBOOT_MEMORY_ACPI_RECLAIMABLE) allocate_region(mmap->addr, mmap->len); // memory map - Immediate_Map(mmap->addr , mmap->addr); + Immediate_Map(PADDR_TO_VADDR(mmap->addr) , mmap->addr); if(mmap->type == MULTIBOOT_MEMORY_RESERVED) allocate_region(mmap->addr, mmap->len); if(mmap->type == MULTIBOOT_MEMORY_NVS)