;------------------------------------------------------------------------------ ; @file ; A minimal Int10h stub that allows the Windows 2008 R2 SP1 UEFI guest's buggy, ; default VGA driver to switch to 1024x768x32, on the stdvga and QXL video ; cards of QEMU. ; ; Copyright (C) 2014, Red Hat, Inc. ; Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.<BR> ; ; This program and the accompanying materials are licensed and made available ; under the terms and conditions of the BSD License which accompanies this ; distribution. The full text of the license may be found at ; http://opensource.org/licenses/bsd-license.php ; ; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT ; WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. ; ;------------------------------------------------------------------------------ ; enable this macro for debug messages ;%define DEBUG %macro DebugLog 1 %ifdef DEBUG push si mov si, %1 call PrintStringSi pop si %endif %endmacro BITS 16 ORG 0 VbeInfo: TIMES 256 nop VbeModeInfo: TIMES 256 nop Handler: cmp ax, 0x4f00 je GetInfo cmp ax, 0x4f01 je GetModeInfo cmp ax, 0x4f02 je SetMode cmp ax, 0x4f03 je GetMode cmp ax, 0x4f10 je GetPmCapabilities cmp ax, 0x4f15 je ReadEdid cmp ah, 0x00 je SetModeLegacy DebugLog StrUnkownFunction Hang: jmp Hang GetInfo: push es push di push ds push si push cx DebugLog StrEnterGetInfo ; target (es:di) set on input push cs pop ds mov si, VbeInfo ; source (ds:si) set now mov cx, 256 cld rep movsb pop cx pop si pop ds pop di pop es jmp Success GetModeInfo: push es push di push ds push si push cx DebugLog StrEnterGetModeInfo and cx, ~0x4000 ; clear potentially set LFB bit in mode number cmp cx, 0x00f1 je KnownMode1 DebugLog StrUnkownMode jmp Hang KnownMode1: ; target (es:di) set on input push cs pop ds mov si, VbeModeInfo ; source (ds:si) set now mov cx, 256 cld rep movsb pop cx pop si pop ds pop di pop es jmp Success %define ATT_ADDRESS_REGISTER 0x03c0 %define VBE_DISPI_IOPORT_INDEX 0x01ce %define VBE_DISPI_IOPORT_DATA 0x01d0 %define VBE_DISPI_INDEX_XRES 0x1 %define VBE_DISPI_INDEX_YRES 0x2 %define VBE_DISPI_INDEX_BPP 0x3 %define VBE_DISPI_INDEX_ENABLE 0x4 %define VBE_DISPI_INDEX_BANK 0x5 %define VBE_DISPI_INDEX_VIRT_WIDTH 0x6 %define VBE_DISPI_INDEX_VIRT_HEIGHT 0x7 %define VBE_DISPI_INDEX_X_OFFSET 0x8 %define VBE_DISPI_INDEX_Y_OFFSET 0x9 %define VBE_DISPI_ENABLED 0x01 %define VBE_DISPI_LFB_ENABLED 0x40 %macro BochsWrite 2 push dx push ax mov dx, VBE_DISPI_IOPORT_INDEX mov ax, %1 out dx, ax mov dx, VBE_DISPI_IOPORT_DATA mov ax, %2 out dx, ax pop ax pop dx %endmacro SetMode: push dx push ax DebugLog StrEnterSetMode cmp bx, 0x40f1 je KnownMode2 DebugLog StrUnkownMode jmp Hang KnownMode2: ; unblank mov dx, ATT_ADDRESS_REGISTER mov al, 0x20 out dx, al BochsWrite VBE_DISPI_INDEX_ENABLE, 0 BochsWrite VBE_DISPI_INDEX_BANK, 0 BochsWrite VBE_DISPI_INDEX_X_OFFSET, 0 BochsWrite VBE_DISPI_INDEX_Y_OFFSET, 0 BochsWrite VBE_DISPI_INDEX_BPP, 32 BochsWrite VBE_DISPI_INDEX_XRES, 1024 BochsWrite VBE_DISPI_INDEX_VIRT_WIDTH, 1024 BochsWrite VBE_DISPI_INDEX_YRES, 768 BochsWrite VBE_DISPI_INDEX_VIRT_HEIGHT, 768 BochsWrite VBE_DISPI_INDEX_ENABLE, VBE_DISPI_ENABLED | VBE_DISPI_LFB_ENABLED pop ax pop dx jmp Success GetMode: DebugLog StrEnterGetMode mov bx, 0x40f1 jmp Success GetPmCapabilities: DebugLog StrGetPmCapabilities jmp Unsupported ReadEdid: DebugLog StrReadEdid jmp Unsupported SetModeLegacy: DebugLog StrEnterSetModeLegacy cmp al, 0x03 je KnownMode3 cmp al, 0x12 je KnownMode4 DebugLog StrUnkownMode jmp Hang KnownMode3: mov al, 0x30 jmp SetModeLegacyDone KnownMode4: mov al, 0x20 SetModeLegacyDone: DebugLog StrExitSuccess iret Success: DebugLog StrExitSuccess mov ax, 0x004f iret Unsupported: DebugLog StrExitUnsupported mov ax, 0x014f iret %ifdef DEBUG PrintStringSi: pusha push ds ; save original push cs pop ds mov dx, 0x0402 PrintStringSiLoop: lodsb cmp al, 0 je PrintStringSiDone out dx, al jmp PrintStringSiLoop PrintStringSiDone: pop ds ; restore original popa ret StrExitSuccess: db 'Exit', 0x0a, 0 StrExitUnsupported: db 'Unsupported', 0x0a, 0 StrUnkownFunction: db 'Unknown Function', 0x0a, 0 StrEnterGetInfo: db 'GetInfo', 0x0a, 0 StrEnterGetModeInfo: db 'GetModeInfo', 0x0a, 0 StrEnterGetMode: db 'GetMode', 0x0a, 0 StrEnterSetMode: db 'SetMode', 0x0a, 0 StrEnterSetModeLegacy: db 'SetModeLegacy', 0x0a, 0 StrUnkownMode: db 'Unkown Mode', 0x0a, 0 StrGetPmCapabilities: db 'GetPmCapabilities', 0x0a, 0 StrReadEdid: db 'ReadEdid', 0x0a, 0 %endif