Sun, 10 Aug 2025 16:36:32 +0200
4 files changed,
122 insertions(+),
44 deletions(-)
M
CMakeLists.txt
→
CMakeLists.txt
@@ -139,6 +139,7 @@ kernel/entry.s
kernel/pipe.c kernel/alarm.c kernel/interrupts.c + kernel/pci.c ) list(APPEND LIBCEDOS_SRC
M
kernel/main.c
→
kernel/main.c
@@ -14,6 +14,7 @@ #include "interrupts.h"
#include "syscall.h" #include "pic.h" #include "pit.h" +#include "pci.h" #include "core.h" #include "elf.h"@@ -36,69 +37,73 @@ #endif
int os_init(void) { - core_init(); - printk("Core functions initialized.\n"); + core_init(); + printk("Core functions initialized.\n"); printk("Initializing VGA console..."); vga_con.init(); printk("done.\n"); - printk("Initializing PIC..."); - pic_init(); - printk("done.\n"); + printk("Initializing PIC..."); + pic_init(); + printk("done.\n"); - printk("Initializing PIT..."); - pit_init(); - printk("done.\n"); - - printk("Initializing interrupts..."); - interrupts_init(); - printk("done.\n"); + printk("Initializing PIT..."); + pit_init(); + printk("done.\n"); + + printk("Initializing interrupts..."); + interrupts_init(); + printk("done.\n"); + + printk("Setting up paging..."); + paging_init(); + printk("done.\n"); - printk("Setting up paging..."); - paging_init(); - printk("done.\n"); + printk("Activating interrupts..."); + sti(); + printk("done.\n"); - printk("Activating interrupts..."); - sti(); - printk("done.\n"); + printk("Initiallizing malloc..."); + malloc_init((void*)(0xC0400000u), (void*)(0xC0800000u)); + printk("done.\n"); - printk("Initiallizing malloc..."); - malloc_init((void*)(0xC0400000u), (void*)(0xC0800000u)); - printk("done.\n"); + printk("Installing syscalls..."); + syscall_init(); + printk("done.\n"); - printk("Installing syscalls..."); - syscall_init(); - printk("done.\n"); + printk("Initializing RTC..."); + time_init(); + printk("done.\n"); - printk("Initializing RTC..."); - time_init(); - printk("done.\n"); + printk("Initializing scheduler..."); + sched_init(); + printk("done.\n"); - printk("Initializing scheduler..."); - sched_init(); - printk("done.\n"); + printk("Initializing keyboard..."); + ps2_kb.init(); + printk("done.\n"); - printk("Initializing keyboard..."); - ps2_kb.init(); - printk("done.\n"); + printk("Initializing files..."); + file_init(); + printk("done.\n"); - printk("Initializing files..."); - file_init(); - printk("done.\n"); + printk("Initializing FAT file system..."); + FAT_init(); + printk("done.\n"); - printk("Initializing FAT file system..."); - FAT_init(); - printk("done.\n"); + printk("Initializing graphics..."); + graphics_init(); + printk("done.\n"); - printk("Initializing graphics..."); - graphics_init(); - printk("done.\n"); + printk("Initializing PCI bus..."); + pci_init(); + printk("done.\n"); - printk("Initialization finished.\n--------------\n"); + printk("Initialization finished.\n--------------\n"); - return 1; + return 1; } void infodump(void) {
A
kernel/pci.c
@@ -0,0 +1,66 @@
+#include <stdint.h> + +#include "assembly.h" + +#include "core.h" + +#define CONFIG_ADDR_ENABLE (31) +#define CONFIG_ADDR_BUS (16) +#define CONFIG_ADDR_PORT (11) +#define CONFIG_ADDR_FUNC (8) +#define CONFIG_ADDR_REG (0) + +#define VENDOR_DEVICE_ID_REGISTER (0x00) + +#define VENDOR_ID_BIT_MASK (0x0000FFFF) +#define VENDOR_ID_BIT_SHIFT (0) + +#define DEVICE_ID_BIT_MASK (0xFFFF0000) +#define DEVICE_ID_BIT_SHIFT (16) + +struct pci_device { + uint8_t bus; + uint8_t port; +}; + +static int pci_read_register(struct pci_device *dev, uint8_t func, uint8_t reg, uint32_t *res) { + uint32_t config_addr = 0; + + config_addr |= (1U << CONFIG_ADDR_ENABLE); + config_addr |= (uint32_t)(dev->bus) << CONFIG_ADDR_BUS; + config_addr |= (uint32_t)(dev->port) << CONFIG_ADDR_PORT; + config_addr |= (uint32_t)(func) << CONFIG_ADDR_FUNC; + config_addr |= (uint32_t)(reg) << CONFIG_ADDR_REG; + + outl(config_addr, 0xCF8); + + *res = inl(0xCFC); + + return 0; +} + +int pci_init(void) { + printk("\n BUS : PORT VENDOR : DEVICE\n"); + for (int bus = 0; bus < 256; bus++) { + for (int port = 0; port < 256; port++) { + struct pci_device dev = { + .bus = (uint8_t)(bus), + .port = (uint8_t)(port), + }; + + uint32_t reg_value = 0; + pci_read_register(&dev, 0, VENDOR_DEVICE_ID_REGISTER, ®_value); + + uint16_t vendor_id = + (reg_value & VENDOR_ID_BIT_MASK) >> VENDOR_ID_BIT_SHIFT; + uint16_t device_id = + (reg_value & DEVICE_ID_BIT_MASK) >> DEVICE_ID_BIT_SHIFT; + + if (vendor_id != 0xFFFF) { + printk("- %x:%x %x:%x\n", dev.bus, dev.port, vendor_id, device_id); + } + } + } + + return 0; +}
A
kernel/pci.h
@@ -0,0 +1,6 @@
+#ifndef INCLUDE_PCI_H +#define INCLUDE_PCI_H + +int pci_init(void); + +#endif