mirror of https://github.com/acidanthera/audk.git
192 lines
5.8 KiB
ArmAsm
192 lines
5.8 KiB
ArmAsm
#------------------------------------------------------------------------------
|
|
#
|
|
# Copyright (c) 2006, Intel Corporation
|
|
# All rights reserved. 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.
|
|
#
|
|
# Module Name:
|
|
#
|
|
# Thunk.asm
|
|
#
|
|
# Abstract:
|
|
#
|
|
# Real mode thunk
|
|
#
|
|
#------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
MISMATCH: "EXTERNDEF C mCode16Size:DWORD"
|
|
|
|
MISMATCH: "CONST SEGMENT FLAT "DATA" READONLY"
|
|
|
|
MISMATCH: "mCode16Size DD _TEXT16SIZE"
|
|
|
|
MISMATCH: "CONSTS"
|
|
|
|
MISMATCH: "_DATA SEGMENT FLAT "DATA""
|
|
|
|
MISMATCH: "NullSegSel DQ 0"
|
|
MISMATCH: "_16BitCsSel LABEL QWORD"
|
|
.word -1
|
|
.word 0
|
|
.byte 0
|
|
.byte 0x9b
|
|
.byte 0x8f # 16-bit segment
|
|
.byte 0
|
|
|
|
MISMATCH: "_16Gdtr LABEL FWORD"
|
|
MISMATCH: " DW $ - offset NullSegSel - 1"
|
|
MISMATCH: " DD offset NullSegSel"
|
|
|
|
MISMATCH: "_DATAS"
|
|
|
|
MISMATCH: "_TEXT SEGMENT FLAT "CODE" PARA"
|
|
|
|
MISMATCH: "IA32_REGS STRUC 4t"
|
|
MISMATCH: "_EDI DD ?"
|
|
MISMATCH: "_ESI DD ?"
|
|
MISMATCH: "_EBP DD ?"
|
|
MISMATCH: "_ESP DD ?"
|
|
MISMATCH: "_EBX DD ?"
|
|
MISMATCH: "_EDX DD ?"
|
|
MISMATCH: "_ECX DD ?"
|
|
MISMATCH: "_EAX DD ?"
|
|
MISMATCH: "_DS DW ?"
|
|
MISMATCH: "_ES DW ?"
|
|
MISMATCH: "_FS DW ?"
|
|
MISMATCH: "_GS DW ?"
|
|
MISMATCH: "_EFLAGS DD ?"
|
|
MISMATCH: "_EIP DD ?"
|
|
MISMATCH: "_CS DW ?"
|
|
MISMATCH: "_SS DW ?"
|
|
MISMATCH: "IA32_REGSS"
|
|
|
|
MISMATCH: "_STK16 STRUC 1t"
|
|
MISMATCH: "RetEip DD ?"
|
|
MISMATCH: "RetCs DW ?"
|
|
MISMATCH: "ThunkFlags DW ?"
|
|
MISMATCH: "SavedEsp DD ?"
|
|
MISMATCH: "SavedSs DW ?"
|
|
MISMATCH: "SavedGdtr FWORD ?"
|
|
MISMATCH: "SavedCr0 DD ?"
|
|
MISMATCH: "SavedCr4 DD ?"
|
|
MISMATCH: "_STK16S"
|
|
|
|
.global _InternalAsmThunk16
|
|
MISMATCH: "_InternalAsmThunk16: USES ebp ebx esi edi ds es fs gs"
|
|
MISMATCH: " ASSUME esi:PTR IA32_REGS"
|
|
movl 36(%esp),%esi
|
|
MISMATCH: " movzx edx, [esi]._SS"
|
|
movl $[esi]._ESP, %edi
|
|
MISMATCH: " add edi, - sizeof (_STK16) - sizeof (IA32_REGS)"
|
|
pushl %edi # save stack offset
|
|
imull $16,%edx,%eax # eax <- edx*16
|
|
addl %eax,%edi # edi <- linear address of 16-bit stack
|
|
MISMATCH: " push sizeof (IA32_REGS) / 4"
|
|
popl %ecx
|
|
rep
|
|
movsl # copy context to 16-bit stack
|
|
popl %ebx # ebx <- 16-bit stack offset
|
|
MISMATCH: " mov eax, offset @F "
|
|
stosl
|
|
movl %cs,%eax # return segment
|
|
stosw
|
|
movl 40(%esp),%eax # THUNK flags
|
|
stosw
|
|
movl %esp,%eax
|
|
stosl # save esp
|
|
movl %ss,%eax # save ss
|
|
stosw
|
|
MISMATCH: " sgdt fword ptr [edi] "
|
|
MISMATCH: " sidt fword ptr [esp + 36] "
|
|
movl %cr0, %esi
|
|
movl %esi,6(%edi) # save CR0
|
|
MISMATCH: " and esi, NOT 80000001h "
|
|
movl %cr4, %eax
|
|
movl %eax,10(%edi) # save CR4
|
|
MISMATCH: " and al, NOT 30h "
|
|
movl %edx,%edi # edi <- 16-bit stack segment
|
|
movl 44(%esp),%edx
|
|
shll $16,%edx
|
|
pushl %edx
|
|
MISMATCH: " lgdt _16Gdtr "
|
|
.byte 0xea
|
|
MISMATCH: " DD offset @16Bit"
|
|
.word 8 # jmp far 8:@16Bit
|
|
@16Bit:
|
|
movl %esi, %cr0 # disable protected mode
|
|
movl %eax, %cr4 # disable PAE & PSE
|
|
lret
|
|
@@:
|
|
movl %ss,%eax
|
|
shll $4,%eax
|
|
addl %esp,%eax # eax <- address of 16-bit stack
|
|
MISMATCH: " lss esp, fword ptr (_STK16 ptr [esp + sizeof (IA32_REGS)]).SavedEsp"
|
|
MISMATCH: " lidt fword ptr [esp + 36] "
|
|
ret
|
|
|
|
|
|
MISMATCH: "_TEXTS"
|
|
|
|
MISMATCH: "_TEXT16 SEGMENT USE16 "CODE" PARA"
|
|
|
|
.global _Code16Addr
|
|
MISMATCH: "_Code16Addr: C"
|
|
|
|
|
|
.global RealMode
|
|
RealMode:
|
|
MISMATCH: " ASSUME bp:PTR _STK16"
|
|
movw %di,%ss # set up stack
|
|
movl %ebx,%esp
|
|
MISMATCH: " lidt fword ptr cs:[_16Idtr - _Code16Addr]"
|
|
popal
|
|
popl %ds
|
|
popl %es
|
|
popl %fs
|
|
popl %gs
|
|
addw $4,%sp # skip EFlags
|
|
MISMATCH: " test (_STK16 ptr [esp + 8]).ThunkFlags, 1"
|
|
jz @F
|
|
pushf
|
|
@@:
|
|
pushw %cs
|
|
MISMATCH: " push @FarCallRet - _Code16Addr"
|
|
jz @F
|
|
MISMATCH: " jmp fword ptr [esp + 6]"
|
|
@@:
|
|
MISMATCH: " jmp fword ptr [esp + 4]"
|
|
@FarCallRet:
|
|
pushfl
|
|
pushw %gs
|
|
pushw %fs
|
|
pushw %es
|
|
pushw %ds
|
|
pushal
|
|
cli
|
|
MISMATCH: " lea bp, [esp + sizeof (IA32_REGS)]"
|
|
.byte 0x66
|
|
MISMATCH: " lgdt [bp].SavedGdtr"
|
|
movl $[bp].SavedCr4, %eax
|
|
movl %eax, %cr4
|
|
movl $[bp].SavedCr0, %eax
|
|
movl %eax, %cr0 # restore CR0
|
|
MISMATCH: " jmp fword ptr [bp].RetEip"
|
|
|
|
|
|
MISMATCH: "_16Idtr FWORD (1 SHL 10) - 1"
|
|
|
|
_TEXT16:
|
|
|
|
MISMATCH: "_TEXT16SIZE = _TEXT16- _Code16Addr"
|
|
|
|
MISMATCH: "_TEXT16S"
|
|
|
|
|