1;------------------------------------------------------------------------------ 2; @file 3; A minimal Int10h stub that allows the Windows 2008 R2 SP1 UEFI guest's buggy, 4; default VGA driver to switch to 1024x768x32, on the stdvga and QXL video 5; cards of QEMU. 6; 7; Copyright (C) 2014, Red Hat, Inc. 8; Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.<BR> 9; 10; This program and the accompanying materials are licensed and made available 11; under the terms and conditions of the BSD License which accompanies this 12; distribution. The full text of the license may be found at 13; http://opensource.org/licenses/bsd-license.php 14; 15; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT 16; WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 17; 18;------------------------------------------------------------------------------ 19 20; enable this macro for debug messages 21;%define DEBUG 22 23%macro DebugLog 1 24%ifdef DEBUG 25 push si 26 mov si, %1 27 call PrintStringSi 28 pop si 29%endif 30%endmacro 31 32 33BITS 16 34ORG 0 35 36VbeInfo: 37TIMES 256 nop 38 39VbeModeInfo: 40TIMES 256 nop 41 42 43Handler: 44 cmp ax, 0x4f00 45 je GetInfo 46 cmp ax, 0x4f01 47 je GetModeInfo 48 cmp ax, 0x4f02 49 je SetMode 50 cmp ax, 0x4f03 51 je GetMode 52 cmp ax, 0x4f10 53 je GetPmCapabilities 54 cmp ax, 0x4f15 55 je ReadEdid 56 cmp ah, 0x00 57 je SetModeLegacy 58 DebugLog StrUnkownFunction 59Hang: 60 jmp Hang 61 62 63GetInfo: 64 push es 65 push di 66 push ds 67 push si 68 push cx 69 70 DebugLog StrEnterGetInfo 71 72 ; target (es:di) set on input 73 push cs 74 pop ds 75 mov si, VbeInfo 76 ; source (ds:si) set now 77 78 mov cx, 256 79 cld 80 rep movsb 81 82 pop cx 83 pop si 84 pop ds 85 pop di 86 pop es 87 jmp Success 88 89 90GetModeInfo: 91 push es 92 push di 93 push ds 94 push si 95 push cx 96 97 DebugLog StrEnterGetModeInfo 98 99 and cx, ~0x4000 ; clear potentially set LFB bit in mode number 100 cmp cx, 0x00f1 101 je KnownMode1 102 DebugLog StrUnkownMode 103 jmp Hang 104KnownMode1: 105 ; target (es:di) set on input 106 push cs 107 pop ds 108 mov si, VbeModeInfo 109 ; source (ds:si) set now 110 111 mov cx, 256 112 cld 113 rep movsb 114 115 pop cx 116 pop si 117 pop ds 118 pop di 119 pop es 120 jmp Success 121 122 123%define ATT_ADDRESS_REGISTER 0x03c0 124%define VBE_DISPI_IOPORT_INDEX 0x01ce 125%define VBE_DISPI_IOPORT_DATA 0x01d0 126 127%define VBE_DISPI_INDEX_XRES 0x1 128%define VBE_DISPI_INDEX_YRES 0x2 129%define VBE_DISPI_INDEX_BPP 0x3 130%define VBE_DISPI_INDEX_ENABLE 0x4 131%define VBE_DISPI_INDEX_BANK 0x5 132%define VBE_DISPI_INDEX_VIRT_WIDTH 0x6 133%define VBE_DISPI_INDEX_VIRT_HEIGHT 0x7 134%define VBE_DISPI_INDEX_X_OFFSET 0x8 135%define VBE_DISPI_INDEX_Y_OFFSET 0x9 136 137%define VBE_DISPI_ENABLED 0x01 138%define VBE_DISPI_LFB_ENABLED 0x40 139 140%macro BochsWrite 2 141 push dx 142 push ax 143 144 mov dx, VBE_DISPI_IOPORT_INDEX 145 mov ax, %1 146 out dx, ax 147 148 mov dx, VBE_DISPI_IOPORT_DATA 149 mov ax, %2 150 out dx, ax 151 152 pop ax 153 pop dx 154%endmacro 155 156SetMode: 157 push dx 158 push ax 159 160 DebugLog StrEnterSetMode 161 162 cmp bx, 0x40f1 163 je KnownMode2 164 DebugLog StrUnkownMode 165 jmp Hang 166KnownMode2: 167 168 ; unblank 169 mov dx, ATT_ADDRESS_REGISTER 170 mov al, 0x20 171 out dx, al 172 173 BochsWrite VBE_DISPI_INDEX_ENABLE, 0 174 BochsWrite VBE_DISPI_INDEX_BANK, 0 175 BochsWrite VBE_DISPI_INDEX_X_OFFSET, 0 176 BochsWrite VBE_DISPI_INDEX_Y_OFFSET, 0 177 BochsWrite VBE_DISPI_INDEX_BPP, 32 178 BochsWrite VBE_DISPI_INDEX_XRES, 1024 179 BochsWrite VBE_DISPI_INDEX_VIRT_WIDTH, 1024 180 BochsWrite VBE_DISPI_INDEX_YRES, 768 181 BochsWrite VBE_DISPI_INDEX_VIRT_HEIGHT, 768 182 BochsWrite VBE_DISPI_INDEX_ENABLE, VBE_DISPI_ENABLED | VBE_DISPI_LFB_ENABLED 183 184 pop ax 185 pop dx 186 jmp Success 187 188 189GetMode: 190 DebugLog StrEnterGetMode 191 mov bx, 0x40f1 192 jmp Success 193 194 195GetPmCapabilities: 196 DebugLog StrGetPmCapabilities 197 jmp Unsupported 198 199 200ReadEdid: 201 DebugLog StrReadEdid 202 jmp Unsupported 203 204 205SetModeLegacy: 206 DebugLog StrEnterSetModeLegacy 207 208 cmp al, 0x03 209 je KnownMode3 210 cmp al, 0x12 211 je KnownMode4 212 DebugLog StrUnkownMode 213 jmp Hang 214KnownMode3: 215 mov al, 0x30 216 jmp SetModeLegacyDone 217KnownMode4: 218 mov al, 0x20 219SetModeLegacyDone: 220 DebugLog StrExitSuccess 221 iret 222 223 224Success: 225 DebugLog StrExitSuccess 226 mov ax, 0x004f 227 iret 228 229 230Unsupported: 231 DebugLog StrExitUnsupported 232 mov ax, 0x014f 233 iret 234 235 236%ifdef DEBUG 237PrintStringSi: 238 pusha 239 push ds ; save original 240 push cs 241 pop ds 242 mov dx, 0x0402 243PrintStringSiLoop: 244 lodsb 245 cmp al, 0 246 je PrintStringSiDone 247 out dx, al 248 jmp PrintStringSiLoop 249PrintStringSiDone: 250 pop ds ; restore original 251 popa 252 ret 253 254 255StrExitSuccess: 256 db 'Exit', 0x0a, 0 257 258StrExitUnsupported: 259 db 'Unsupported', 0x0a, 0 260 261StrUnkownFunction: 262 db 'Unknown Function', 0x0a, 0 263 264StrEnterGetInfo: 265 db 'GetInfo', 0x0a, 0 266 267StrEnterGetModeInfo: 268 db 'GetModeInfo', 0x0a, 0 269 270StrEnterGetMode: 271 db 'GetMode', 0x0a, 0 272 273StrEnterSetMode: 274 db 'SetMode', 0x0a, 0 275 276StrEnterSetModeLegacy: 277 db 'SetModeLegacy', 0x0a, 0 278 279StrUnkownMode: 280 db 'Unkown Mode', 0x0a, 0 281 282StrGetPmCapabilities: 283 db 'GetPmCapabilities', 0x0a, 0 284 285StrReadEdid: 286 db 'ReadEdid', 0x0a, 0 287%endif 288