Files
VBoxGuest/common/macros.inc
Alexey Mikhailov 0f400bc0e0 #1 init в репу
2026-01-06 15:43:37 +03:00

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
}