aboutsummaryrefslogtreecommitdiffstats
path: root/src/kernel
diff options
context:
space:
mode:
authorkotorifan <kotorifan05@gmail.com>2026-04-03 10:42:26 +0200
committerkotorifan <kotorifan05@gmail.com>2026-04-03 10:42:26 +0200
commitf4294119b4398a855d3d91870dc02854844d18a8 (patch)
tree61f87f6b045081214b766f572476fda39689ecd8 /src/kernel
parentaa9b4da2c96b0d6c90d51de4b3bb6c4590083365 (diff)
downloadkotori-os-f4294119b4398a855d3d91870dc02854844d18a8.tar.gz
Added code to pci.asmHEADmaster
Diffstat (limited to 'src/kernel')
-rw-r--r--src/kernel/drivers/ide.asm4
-rw-r--r--src/kernel/drivers/keyboard.asm2
-rw-r--r--src/kernel/kernel.asm2
-rw-r--r--src/kernel/pci.asm89
4 files changed, 97 insertions, 0 deletions
diff --git a/src/kernel/drivers/ide.asm b/src/kernel/drivers/ide.asm
index e69de29..ee408f8 100644
--- a/src/kernel/drivers/ide.asm
+++ b/src/kernel/drivers/ide.asm
@@ -0,0 +1,4 @@
+;; ide.asm
+;; PCI IDE driver
+
+
diff --git a/src/kernel/drivers/keyboard.asm b/src/kernel/drivers/keyboard.asm
index e69de29..7c67ef9 100644
--- a/src/kernel/drivers/keyboard.asm
+++ b/src/kernel/drivers/keyboard.asm
@@ -0,0 +1,2 @@
+;; keyboard.asm
+;; Keyboard driver
diff --git a/src/kernel/kernel.asm b/src/kernel/kernel.asm
index d09520a..fe19902 100644
--- a/src/kernel/kernel.asm
+++ b/src/kernel/kernel.asm
@@ -26,3 +26,5 @@ welcome_msg:
%include "common.protmode.print.asm"
%include "common.protmode.clear.asm"
+
+%include "pci.asm"
diff --git a/src/kernel/pci.asm b/src/kernel/pci.asm
new file mode 100644
index 0000000..63ff3df
--- /dev/null
+++ b/src/kernel/pci.asm
@@ -0,0 +1,89 @@
+;; pci.asm
+;; PCI Bus
+
+%define PCI_ENABLE 0x80000000
+%define PCI_CONFIG_ADDR_1 0xcf8
+%define PCI_CONFIG_ADDR_2 0xcfc
+%define PCI_SLOT_EMPTY 0xffff
+%define PCI_SLOT_COUNT 32
+
+pci_config_read_word:
+ enter
+ movzx ebx, word [ebp + 8] ; bus
+ movzx edx, word [ebp + 12] ; slot
+ movzx ecx, word [ebp + 16] ; func
+ movzx eax, word [ebp + 20] ; offset
+
+ shl ebx, 16
+ shl edx, 11
+ shl ecx, 8
+ and eax, 0xfc
+
+ or eax, ecx
+ or eax, edx
+ or eax, ebx
+ or eax, 0x80000000
+
+ mov dx, PCI_CONFIG_ADDR_1 ; write address
+ out dx, eax
+
+ mov dx, PCI_CONFIG_ADDR_2 ; read data
+ in dx, eax
+
+ movzx ecx, word [ebp + 20] ; offset
+ and ecx, 2
+ imul ecx, ecx, 8
+ shr eax, cl
+ and ax, 0xffff
+
+ leave
+ ret
+
+pci_config_get_vendor:
+ enter
+ movzx ebx, word [ebp + 8] ; bus
+ movzx edx, word [ebp + 12] ; device
+ movzx ecx, word [ebp + 16] ; func
+
+ push 0
+ push ecx
+ push edx
+ push ebx
+ call pci_config_read_word
+
+ leave
+ ret
+
+pci_config_get_device:
+ enter
+ movzx ebx, word [ebp + 8] ; bus
+ movzx edx, word [ebp + 12] ; device
+ movzx ecx, word [ebp + 16] ; func
+
+ push 2
+ push ecx
+ push edx
+ push ebx
+
+ call pci_config_read_word
+ leave
+ ret
+
+pci_config_get_class:
+ enter
+ movzx ebx, word [ebp + 8] ; bus
+ movzx edx, word [ebp + 12] ; device
+ movzx ecx, word [ebp + 16] ; func
+
+ push 0xa
+ push ecx
+ push edx
+ push ebx
+ call pci_config_read_word
+
+ xor esi, esi
+ not esi, 0xff00
+ and eax, esi
+
+ leave
+ ret