diff options
Diffstat (limited to 'src/kernel')
| -rw-r--r-- | src/kernel/drivers/ide.asm | 4 | ||||
| -rw-r--r-- | src/kernel/drivers/keyboard.asm | 2 | ||||
| -rw-r--r-- | src/kernel/kernel.asm | 2 | ||||
| -rw-r--r-- | src/kernel/pci.asm | 89 |
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 |
