mirror of https://github.com/acidanthera/audk.git
288 lines
5.8 KiB
NASM
288 lines
5.8 KiB
NASM
;------------------------------------------------------------------------------
|
|
; @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
|