; 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 dd initialize_acpi_driver ; Ending Entry dd 0 ; Arguments: ; -- None -- 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" %include "drivers/acpi/driver.asm"