76 lines
2.3 KiB
NASM
76 lines
2.3 KiB
NASM
|
|
; Start with the driver data at 1 MiB, continue for 2 MiB
|
|
DRIVER_MEMORY_AREA equ 0x100000
|
|
DRIVER_SLOT_SIZE equ 65536
|
|
DRIVER_SLOT_COUNT equ 32
|
|
|
|
; Functions of all drivers which get initialized (in the order of
|
|
; initialization); the last entry must be a zero, but at 32 entries,
|
|
; the end is forced by the main initialization function.
|
|
driver_init_functions:
|
|
dd initialize_pci_driver
|
|
; Ending Entry
|
|
dd 0
|
|
|
|
; [Furthest from EBP]
|
|
; -- No Arguments --
|
|
; [Nearest to EBP]
|
|
setup_drivers:
|
|
push dword esi
|
|
sub esp, 64
|
|
mov esi, esp
|
|
|
|
mov [esi + (64 - 4)], eax
|
|
mov [esi + (64 - 8)], ebx
|
|
mov [esi + (64 - 12)], ecx
|
|
mov [esi + (64 - 16)], edx
|
|
mov [esi + (64 - 20)], edi
|
|
|
|
; [esi + 8]: Pointer to the current driver init function
|
|
; [esi + 12]L Pointer to current driver slot
|
|
; ecx: Driver slot index
|
|
|
|
xor ecx, ecx
|
|
|
|
.driver_setup_loop:
|
|
cmp ecx, DRIVER_SLOT_COUNT
|
|
jae .epilog
|
|
|
|
mov ebx, ecx
|
|
shl ebx, 2
|
|
add ebx, driver_init_functions
|
|
mov eax, [ebx]
|
|
mov [esi + 8], eax
|
|
|
|
cmp eax, 0
|
|
je .epilog
|
|
|
|
mov eax, ecx
|
|
mov edx, DRIVER_SLOT_SIZE
|
|
mul edx
|
|
mov [esi + 12], eax
|
|
|
|
push ebp
|
|
mov ebp, esp
|
|
push dword [esi + 12]
|
|
mov eax, [esi + 8]
|
|
call eax
|
|
mov esp, ebp
|
|
pop ebp
|
|
|
|
inc ecx
|
|
jmp .driver_setup_loop
|
|
|
|
.epilog:
|
|
mov eax, [esi + (64 - 4)]
|
|
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
|
|
|
|
%include "drivers/pci/driver.asm"
|