Network driver programming ========================== Parameters at config.mnt: network_driver = Ethernet drivers filename network_card_enable = 0/1 = disabled/enabled General driver steps: 1) Kernel loads driver (config.mnt/network_driver) 2) Kernel scans PCI for matching device ID's from drivers header. 3) If a match is found, kernel executes driver_entry functions 1 and 2. 4) Kernel calls poll and send functions when needed. Memory references within the driver: ; Relative mov [testaddr] , rax ; Absolute mov rdi , testaddr add rdi , rbp ; rbp = Driver base address. Set by OS. mov [rdi], rax testaddr: dq 0x0 Memory references in linear memory: ; At receive function mov [r11], al ; first byte of packet ; At transmit function mov al , [rsi] ; first byte of packet Driver is executed at ring-0 privelidge level. If needed, set page uncacheable with system call 400. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; PCI network card driver for MenuetOS ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; use64 db 'MENUET64' ; Header identifier dq 0x100 ; PCI Network card driver dq driver_entry ; Driver entry dq image_end ; Size of image dq image_end ; Required memory (max 4mb) dd 0x11111111 ; Supported PCI card 1 dd 0x22222222 ; Supported PCI card 2, .. dd 0x00000000 ; End db "Newcard interface",0 ; Device db "Newco",0 ; Manufacturer inbytes: dq 0x0 ; Received bytes outbytes: dq 0x0 ; Sent bytes status: dq 0x0 ; 0x00 = driver not initialized ; 0x01 = device is working properly ; 0xff = undefined error driver_entry: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; Description : Driver entry from OS. ; ; In : rax 1 - Probe card ; 2 - Reset card ; 3 - Poll for data ; 4 - Transmit data ; ; rbp - Driver location in linear memory ; r10 - Network card IO port base ; r11 - Ethernet buffer pointer in linear memory ( X bytes ) ; r12 - Node address pointer in linear memory ( 6 bytes ) ; r13 - PCI position [pci_bus] shl 16 + [pci_dev] shl 8 ; r14 - Entry point for drivers internal system calls ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; cmp rax , 1 je card_probe cmp rax , 2 je card_reset cmp rax , 3 je card_poll cmp rax , 4 je card_transmit cmp rax , 5 je card_free_tx_slots mov rax , 0xff ; function not supported ret card_probe: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; Description : Search for card and enable ethernet ; ; Out: [r12+] = Node address at [r12+] ( 6 bytes ) ; rax = 0 - Success ; 1 - Fail ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mov [r12], al ; first node byte mov [status],dword 1 mov rax , 0 ret card_reset: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; Description : Reset PCI card ; ; Out: rbx = Speed of the card ( X Mbps, 10 for 10 Mbps ) ; rax = 0 - Success ; 1 - Fail ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mov [status],dword 1 mov rbx , 100 mov rax , 0 ret card_poll: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; Description : Polls card for received packet ; ; Out : rax = Data length ( 0 = no data ) ; [r11+] = Received data ( absolute address in kernel ) ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mov [r11], al ; first byte of packet add [inbytes],rcx mov rax , rcx ; amount of data ret mov rax , 0 ; no data received ret card_transmit: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; Description : Transmit packet via ethernet card ; ; In : bx - Type of packet ; rcx - Size of packet ; rsi - Pointer to data ( absolute address in kernel ) ; edi - Pointer to 48 bit destination ethernet address ; ; Out: rax = 0 - Success ; 1 - Failed ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mov al , [rsi] ; first byte of packet add [outbytes],rcx mov rax , 0 ret card_free_tx_slots: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; Description : Returns number of free TX packet slots ; Function not required, but speeds up the network stack. ; ; Out: rax = 0 - Success ; 1 - Failed ; rbx = free tx packet slot count ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mov rax , 0 ; rbx = number of free tx packet slots ret image_end: