diff options
| author | Aleksa Vuckovic <aleksa@vuckovic.cc> | 2023-03-06 01:59:33 +0100 |
|---|---|---|
| committer | Aleksa Vuckovic <aleksa@vuckovic.cc> | 2023-03-06 01:59:33 +0100 |
| commit | bd0616e6e76d5b56414a6c77131a9bb63cf5e985 (patch) | |
| tree | 406836fba0660df3dc5666d2c1e341d118553f68 | |
| parent | fbc2cc52c8a38c3c63a34f5547ba7c4209a667ac (diff) | |
parsing pcie MCFG table
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | kernel/Makefile | 1 | ||||
| -rw-r--r-- | kernel/include/mcfg.h | 31 | ||||
| -rw-r--r-- | kernel/src/devices/pci.c | 40 | ||||
| -rw-r--r-- | kernel/src/main.c | 2 |
5 files changed, 75 insertions, 1 deletions
@@ -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(); |
