summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksa Vuckovic <aleksa@vuckovic.cc>2023-03-06 01:59:33 +0100
committerAleksa Vuckovic <aleksa@vuckovic.cc>2023-03-06 01:59:33 +0100
commitbd0616e6e76d5b56414a6c77131a9bb63cf5e985 (patch)
tree406836fba0660df3dc5666d2c1e341d118553f68
parentfbc2cc52c8a38c3c63a34f5547ba7c4209a667ac (diff)
parsing pcie MCFG table
-rw-r--r--Makefile2
-rw-r--r--kernel/Makefile1
-rw-r--r--kernel/include/mcfg.h31
-rw-r--r--kernel/src/devices/pci.c40
-rw-r--r--kernel/src/main.c2
5 files changed, 75 insertions, 1 deletions
diff --git a/Makefile b/Makefile
index 4bbe5dc..4884827 100644
--- a/Makefile
+++ b/Makefile
@@ -55,7 +55,7 @@ QEMU = qemu-system-x86_64
BOCHS = bochs -q
qemu: kernel.iso
- @$(QEMU) -cdrom kernel.iso -serial file:serial.log -smp 4
+ @$(QEMU) -machine q35 -cdrom kernel.iso -serial file:serial.log -smp 4
@cat serial.log
bochs: kernel.iso
diff --git a/kernel/Makefile b/kernel/Makefile
index d1c8d32..539fa45 100644
--- a/kernel/Makefile
+++ b/kernel/Makefile
@@ -24,6 +24,7 @@ OBJS = \
src/cpu/tss.o \
src/devices/disc.o \
src/devices/keyboard.o \
+ src/devices/pci.o \
src/devices/serial.o \
src/devices/timer.o \
src/fs/ext2.o \
diff --git a/kernel/include/mcfg.h b/kernel/include/mcfg.h
new file mode 100644
index 0000000..9f062c0
--- /dev/null
+++ b/kernel/include/mcfg.h
@@ -0,0 +1,31 @@
+#ifndef MCFG_H
+#define MCFG_H
+
+#include <types.h>
+
+struct config_space_mcfgt {
+ uint64_t base_addr;
+ uint16_t pci_seg_group;
+ uint8_t start_pci_bus;
+ uint8_t end_pci_bus;
+ uint32_t reserved;
+} __attribute__((packed));
+typedef struct config_space_mcfgt config_space_mcfgt;
+
+struct MCFGT {
+ uint32_t signature;
+ uint32_t length;
+ uint8_t revision;
+ uint8_t checksum;
+ uint8_t oem_id[6];
+ uint64_t oem_table_id;
+ uint32_t oem_table_revision;
+ uint32_t creator_id;
+ uint32_t creator_revision;
+ uint64_t reserved;
+} __attribute__((packed));
+typedef struct MCFGT MCFGT;
+
+void read_mcfgt(void);
+
+#endif
diff --git a/kernel/src/devices/pci.c b/kernel/src/devices/pci.c
new file mode 100644
index 0000000..85c7b69
--- /dev/null
+++ b/kernel/src/devices/pci.c
@@ -0,0 +1,40 @@
+#include <types.h>
+#include <rsdp.h>
+#include <libk/stdio.h>
+#include <mcfg.h>
+#include <heap.h>
+#include <paging.h>
+#include <libk/string.h>
+
+void read_mcfgt()
+{
+ uint64_t *mcfgt_addr = find_sys_table_addr("MCFG");
+ uint64_t mcfgt_cfg_addr;
+ size_t len;
+ size_t i;
+
+ if (mcfgt_addr == NULL) {
+ printf("MCFG not found\n");
+ return;
+ }
+
+ mcfgt_cfg_addr = (uint64_t)((uint8_t *)mcfgt_addr + sizeof(MCFGT));
+ map_addr((uint64_t)mcfgt_addr, (uint64_t)mcfgt_addr, sizeof(MCFGT));
+ MCFGT *mcfgt = (MCFGT *)kalloc(sizeof(MCFGT));
+ memcpy(mcfgt, mcfgt_addr, sizeof(MCFGT));
+ len = (mcfgt->length - sizeof(MCFGT)) / 16;
+ kfree(mcfgt);
+
+ config_space_mcfgt *cfg_space =
+ (config_space_mcfgt *)kalloc(sizeof(config_space_mcfgt));
+ for (i = 0; i < len; i++) {
+ map_addr(mcfgt_cfg_addr, mcfgt_cfg_addr,
+ sizeof(config_space_mcfgt));
+ memcpy(cfg_space, (uint64_t *)mcfgt_cfg_addr,
+ sizeof(config_space_mcfgt));
+ printf("addr: 0x%x, group: %d, start: %d, stop: %d\n",
+ cfg_space->base_addr, cfg_space->pci_seg_group,
+ cfg_space->start_pci_bus, cfg_space->end_pci_bus);
+ }
+ kfree(cfg_space);
+}
diff --git a/kernel/src/main.c b/kernel/src/main.c
index f9d1b8f..2e142ca 100644
--- a/kernel/src/main.c
+++ b/kernel/src/main.c
@@ -25,6 +25,7 @@
#include <pmm.h>
#include <scheduler.h>
#include <process.h>
+#include <mcfg.h>
int kernel_main(mb2_tag_header *multiboot_bootinfo, uint32_t multiboot_magic);
int kernel_main(mb2_tag_header *multiboot_bootinfo, uint32_t multiboot_magic)
@@ -52,6 +53,7 @@ int kernel_main(mb2_tag_header *multiboot_bootinfo, uint32_t multiboot_magic)
apic_remap_interrupts();
enable_interrupts();
init_userspace();
+ read_mcfgt();
init_scheduler();