Добавление модуля-драйвера PCI

This commit is contained in:
Aren Elchinyan 2023-11-02 00:26:06 +03:00
parent 4f0c943fa3
commit 4061a74523
3 changed files with 83 additions and 3 deletions

6
modules/pci/build.sh Normal file
View File

@ -0,0 +1,6 @@
#/bin/sh
echo "Название: PCI"
echo "Лицензия: Публичное достояние"
gcc -I../../modlib -O0 -finput-charset=UTF-8 -fexec-charset=cp1251 -c -fPIC -nostdlib main.c -o pci.o
gcc -Wl,--entry=init -fPIC -shared -nostdlib pci.o -o pci.ko
echo "Сборка завершена, файл: pci.ko"

75
modules/pci/main.c Normal file
View File

@ -0,0 +1,75 @@
#include <system.h>
static inline uint32_t inl(uint16_t port) {
uint32_t data;
asm volatile("inl %1, %0" : "=a"(data) : "Nd"(port));
return data;
}
static inline void outl(uint16_t port, uint32_t data) {
asm volatile("outl %0, %1" : : "a"(data), "Nd"(port));
}
static uint16_t pci_read_word(uint16_t bus, uint16_t slot, uint16_t func,
uint16_t offset) {
uint64_t address;
uint64_t lbus = (uint64_t)bus;
uint64_t lslot = (uint64_t)slot;
uint64_t lfunc = (uint64_t)func;
uint16_t tmp = 0;
address = (uint64_t)((lbus << 16) | (lslot << 11) | (lfunc << 8) |
(offset & 0xFC) | ((uint32_t)0x80000000));
outl(0xCF8, address);
tmp = (uint16_t)((inl(0xCFC) >> ((offset & 2) * 8)) & 0xFFFF);
return (tmp);
}
static uint16_t get_vendor_id(uint16_t bus, uint16_t device,
uint16_t function) {
uint32_t r0 = pci_read_word(bus, device, function, 0);
return r0;
}
static uint16_t get_device_id(uint16_t bus, uint16_t device,
uint16_t function) {
uint32_t r0 = pci_read_word(bus, device, function, 2);
return r0;
}
static uint16_t get_class_id(uint16_t bus, uint16_t device, uint16_t function) {
uint32_t r0 = pci_read_word(bus, device, function, 0xA);
return (r0 & ~0x00FF) >> 8;
}
static uint16_t get_sub_class_id(uint16_t bus, uint16_t device,
uint16_t function) {
uint32_t r0 = pci_read_word(bus, device, function, 0xA);
return (r0 & ~0xFF00);
}
static void scan( ) {
uint64_t devices = 0;
for (uint32_t bus = 0; bus < 256; bus++) {
for (uint32_t slot = 0; slot < 32; slot++) {
for (uint32_t function = 0; function < 8; function++) {
uint16_t vendor = get_vendor_id(bus, slot, function);
if (vendor == 0xFFFF) { continue; }
uint16_t device_id = get_device_id(bus, slot, function);
uint16_t class_id = get_class_id(bus, slot, function);
fb_printf("[%u] vendor: %x, device: %x, class: %u\n",
devices, vendor, device_id);
devices++;
}
}
}
}
module_info_t init(env_t *env) {
init_env(env);
scan( );
return (module_info_t){ .name = (char *)"[PCI]",
.message = (char *)"PCI драйвер",
.err_code = 0,
.func_count = 1 };
}

View File

@ -133,7 +133,7 @@ def create_hdd(IMAGE_NAME):
os.system(f"mformat -i {IMAGE_NAME}.hdd@@1M")
os.system(f"mmd -i {IMAGE_NAME}.hdd@@1M ::/mod ::/EFI ::/EFI/BOOT ::/user")
os.system(f"mcopy -i {IMAGE_NAME}.hdd@@1M kernel.elf configs/limine.cfg limine/limine-bios.sys ::/")
os.system(f"mcopy -i {IMAGE_NAME}.hdd@@1M modules/music/music.ko modules/simd/simd.ko modules/cpubench/cpubench.ko modules/helloworld/hello.ko ::/mod")
os.system(f"mcopy -i {IMAGE_NAME}.hdd@@1M modules/pci/pci.ko modules/simd/simd.ko modules/cpubench/cpubench.ko ::/mod")
os.system(f"mcopy -i {IMAGE_NAME}.hdd@@1M limine/BOOTX64.EFI limine/BOOTIA32.EFI ::/EFI/BOOT")
os.system(f"mcopy -i {IMAGE_NAME}.hdd@@1M boot.jpg boot.tga ::/")
os.system(f"./limine/limine bios-install {IMAGE_NAME}.hdd")
@ -147,8 +147,7 @@ def create_iso(IMAGE_NAME):
os.system(f"cp -v kernel.elf boot.jpg boot.tga configs/limine.cfg limine/limine-bios.sys limine/limine-bios-cd.bin limine/limine-uefi-cd.bin iso_root/")
os.system(f"mkdir -p iso_root/EFI/BOOT")
os.system(f"mkdir -p iso_root/mod")
os.system(f"cp -v modules/helloworld/hello.ko iso_root/mod/")
os.system(f"cp -v modules/music/music.ko iso_root/mod/")
os.system(f"cp -v modules/pci/pci.ko iso_root/mod/")
os.system(f"cp -v modules/simd/simd.ko iso_root/mod/")
os.system(f"cp -v modules/cpubench/cpubench.ko iso_root/mod/")
os.system(f"cp -v limine/BOOTX64.EFI iso_root/EFI/BOOT/")