Compare commits

..

2 Commits

Author SHA1 Message Date
Eric-Paul Ickhorn 18e5b049a4
Add PCI register read utility
The newly added utility routine reads the content of a known PCI
device's register given the index assigned to the device during
enumeration and the index of the register (and the PCI driver area,
but that is implied).
2024-07-23 01:01:20 +02:00
Eric-Paul Ickhorn 1285994cbf
Improve coding style of PCI device enumerator
The arguments of all of the statements are now indented and one or two
comments have been rewritten partially, improving readability.
2024-07-23 00:51:04 +02:00
2 changed files with 238 additions and 170 deletions

View File

@ -22,13 +22,14 @@ pci_device_exists:
; Bus Number
mov al, [esi + 5]
; Device Number
shl eax, 5 ; Make space for device number
; Make space for device number
shl eax, 5
mov dl, [esi + 4]
and dl, 0x1f
or al, dl
shl eax, 11
.io_task:
.input_output:
mov dx, PCI_CONFIG_ADDRESS_PORT
out dx, eax
@ -139,7 +140,8 @@ pci_get_device_class_at_address:
; Bus Number
mov al, [ebp - 2]
; Device Number
shl eax, 5 ; Make space for device number
; Make space for device number
shl eax, 5
mov dl, [ebp - 4]
and dl, 0x1f
or al, dl
@ -192,6 +194,7 @@ pci_enumerate_bus:
; [esi]: Device-in-bus Index
; [esi + 4]: Number of existing devices
; [esi + 8]: Bus number
; [esi + 12]:
mov [esi], dword 0
mov [esi + 4], dword 0
mov eax, [ebp - 8]
@ -227,7 +230,6 @@ pci_enumerate_bus:
mov dl, ah
xor ah, ah
push ebp
mov ebp, esp
push ax
@ -248,14 +250,10 @@ pci_enumerate_bus:
mov esp, ebp
pop ebp
mov eax, [esi + 4]
inc eax
mov [esi + 4], eax
mov ebx, [ebp - 4]
.no_device:
mov ecx, [esi]
inc ecx
mov [esi], ecx
inc dword [esi]
jmp .device_loop
.epilog:
@ -277,6 +275,8 @@ pci_enumerate_bus:
; (0 to eliminate limit)
; 1. Ptr32 Pointer to PCI driver area of 65536 bytes
; [NEAREST TO EBP]
; Returns:
; eax: Number of devices read
pci_enumerate:
push dword esi
sub esp, 64

View File

@ -0,0 +1,68 @@
; Arguments:
; [FURTHER FROM EBP]
; 3. U16 Register Index
; 2. U16 Device Index in device list
; 1. Ptr32 Pointer to PCI driver area
; [NEAREST TO EBP]
pci_read_register:
push dword esi
sub esp, 64
mov esi, esp
mov [esi + (64 - 8)], ebx
mov [esi + (64 - 12)], ecx
mov [esi + (64 - 16)], edx
mov [esi + (64 - 20)], edi
.check_device_index:
; todo: Boundary checks
.get_device:
xor ebx, ebx
mov bx, [ebp - 6]
shl ebx, 4
; Point into the driver's device area
add ebx, [ebp - 4]
add ebx, PCI_DEVICE_AREA_OFFSET
mov [esi], ebx
xor eax, eax
mov ax, [ebx]
mov [esi + 4], ah
mov [esi + 5], al
.make_address:
xor eax, eax
; Enable Bit
or al, 1
; Make space for 8 Reserved Bits and 8 Bytes of bus number.
shl eax, 15
; Bus Number
mov al, [esi + 5]
; Device Number
shl eax, 5 ; Make space for device number
mov dl, [esi + 4]
and dl, 0x1f
or al, dl
shl eax, 9
or al, [ebp - 8]
shl eax, 2
.input_output:
mov dx, PCI_CONFIG_ADDRESS_PORT
out dx, eax
mov dx, PCI_CONFIG_DATA_PORT
in eax, dx
.epilog:
mov ebx, [esi + (64 - 8)]
mov ecx, [esi + (64 - 12)]
mov edx, [esi + (64 - 16)]
mov edi, [esi + (64 - 20)]
add esp, 64
pop dword esi
ret