123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279 |
- ; @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>
- ;
- ; SPDX-License-Identifier: BSD-2-Clause-Patent
- ;
- ; 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
|