108 lines
3.5 KiB
HTML
108 lines
3.5 KiB
HTML
; =============================================================================
|
|
; VBoxGuest Driver for KolibriOS - Helper Macros
|
|
; VBox request sending, VGA control, HGCM packet initialization
|
|
; =============================================================================
|
|
|
|
; =============================================================================
|
|
; VirtualBox Request Sending
|
|
; =============================================================================
|
|
|
|
macro vbox_send_pack {
|
|
movzx edx, word [vbox_device.port]
|
|
DEBUGF 2, "Sending request: port=0x%x, phys_addr=0x%x\n", edx, eax
|
|
|
|
mov dx, [vbox_device.port]
|
|
out dx, eax
|
|
|
|
; Small delay for processing
|
|
push ecx
|
|
mov ecx, 1000
|
|
.wait:
|
|
in al, 0x80 ; I/O wait
|
|
loop .wait
|
|
pop ecx
|
|
}
|
|
|
|
; =============================================================================
|
|
; VGA Control Macros
|
|
; =============================================================================
|
|
|
|
macro vga_write_reg index_val, data_val {
|
|
mov eax, index_val
|
|
mov dx, VGA_INDEX_PORT
|
|
out dx, ax
|
|
|
|
mov eax, data_val
|
|
mov dx, VGA_DATA_PORT
|
|
out dx, ax
|
|
}
|
|
|
|
macro vga_set_mode w, h, bpp {
|
|
vga_write_reg VGA_INDEX_ENABLE, VGA_DISABLED
|
|
vga_write_reg VGA_INDEX_XRES, w
|
|
vga_write_reg VGA_INDEX_YRES, h
|
|
vga_write_reg VGA_INDEX_BPP, bpp
|
|
vga_write_reg VGA_INDEX_ENABLE, VGA_ENABLED or VGA_LFB_ENABLED
|
|
}
|
|
|
|
; =============================================================================
|
|
; HGCM Packet Initialization Macros
|
|
; =============================================================================
|
|
|
|
macro hgcm_init_header ptr, pkt_size, req_type {
|
|
mov dword [ptr + HGCM_HEADER.header.size], pkt_size
|
|
mov dword [ptr + HGCM_HEADER.header.version], VMMDEV_REQUEST_HEADER_VERSION
|
|
mov dword [ptr + HGCM_HEADER.header.request_type], req_type
|
|
mov dword [ptr + HGCM_HEADER.header.rc], VERR_INTERNAL_ERROR
|
|
mov dword [ptr + HGCM_HEADER.header.reserved1], 0
|
|
mov dword [ptr + HGCM_HEADER.header.reserved2], 0
|
|
mov dword [ptr + HGCM_HEADER.flags], 0
|
|
mov dword [ptr + HGCM_HEADER.result], VERR_INTERNAL_ERROR
|
|
}
|
|
|
|
macro hgcm_set_parm_u32 ptr, val {
|
|
mov dword [ptr + HGCM_PARM.type], HGCM_PARM_TYPE_32BIT
|
|
mov dword [ptr + HGCM_PARM.value_or_size], val
|
|
mov dword [ptr + HGCM_PARM.offset_or_addr], 0
|
|
}
|
|
|
|
macro hgcm_set_parm_ptr ptr, psize, paddr {
|
|
mov dword [ptr + HGCM_PARM.type], HGCM_PARM_TYPE_LINADDR_IN
|
|
mov dword [ptr + HGCM_PARM.value_or_size], psize
|
|
mov dword [ptr + HGCM_PARM.offset_or_addr], paddr
|
|
}
|
|
|
|
; =============================================================================
|
|
; Error Checking Macros
|
|
; =============================================================================
|
|
|
|
macro CHECK_VMMDEV_RC label_error {
|
|
stdcall error_is_success
|
|
jnz label_error
|
|
}
|
|
|
|
macro CHECK_HGCM_RESULT ptr, label_error {
|
|
mov eax, [ptr + HGCM_HEADER.result]
|
|
stdcall error_is_success
|
|
jnz label_error
|
|
}
|
|
|
|
|
|
macro hgcm_set_parm_ptr_out dest, size, addr
|
|
{
|
|
mov dword [dest + HGCM_PARM.type], HGCM_PARM_TYPE_LINADDR_OUT
|
|
mov dword [dest + HGCM_PARM.value_or_size], size
|
|
mov dword [dest + HGCM_PARM.offset_or_addr], addr
|
|
}
|
|
|
|
macro hgcm_set_parm32_u32 ptr, val {
|
|
mov dword [ptr + 0], 1 ; type = 32BIT
|
|
mov dword [ptr + 4], val ; value32
|
|
mov dword [ptr + 8], 0 ; unused
|
|
}
|
|
|
|
macro hgcm_set_parm32_linaddr_out ptr, size, addr {
|
|
mov dword [ptr + 0], 9 ; type = LINADDR_KERNEL_OUT
|
|
mov dword [ptr + 4], size ; buffer size
|
|
mov dword [ptr + 8], addr ; linear address
|
|
} |