55 lines
1.7 KiB
HTML
55 lines
1.7 KiB
HTML
; =============================================================================
|
|
; Модуль : VMMDev I/O Ports
|
|
; Назначение : Операции через I/O порты VMMDev (fast request/events)
|
|
; Файл : core/ports.inc
|
|
; =============================================================================
|
|
|
|
; -----------------------------------------------------------------------------
|
|
; vmmdev_send_request — отправка физического адреса VMMDev-запроса в I/O порт
|
|
;
|
|
; Вход : phys_addr — физ. адрес VMMDev-пакета
|
|
; Выход: —
|
|
; -----------------------------------------------------------------------------
|
|
proc vmmdev_send_request uses edx, phys_addr:dword
|
|
mov eax, [phys_addr]
|
|
|
|
mov dx, [vbox_device.port]
|
|
out dx, eax
|
|
|
|
; Спин-ожидание (~1ms): даёт хосту время на обработку запроса
|
|
mov ecx, 1000000
|
|
.wait:
|
|
xor eax, eax
|
|
loop .wait
|
|
|
|
ret
|
|
endp
|
|
|
|
; -----------------------------------------------------------------------------
|
|
; ports_init — проверка, что порт задан
|
|
;
|
|
; Выход: eax = 0 успех / VERR_INVALID_PARAMETER
|
|
; -----------------------------------------------------------------------------
|
|
proc ports_init
|
|
movzx eax, word [vbox_device.port]
|
|
test eax, eax
|
|
jz .bad
|
|
xor eax, eax
|
|
ret
|
|
.bad:
|
|
mov eax, VERR_INVALID_PARAMETER
|
|
ret
|
|
endp
|
|
|
|
; ports_read_fast_events — прочитать pending mask через FAST порт
|
|
;
|
|
; Выход: eax = маска событий
|
|
proc ports_read_fast_events uses edx
|
|
mov dx, [vbox_device.port]
|
|
add dx, VMMDEV_PORT_OFF_REQUEST_FAST
|
|
in eax, dx
|
|
ret
|
|
endp
|
|
|
|
|