diff options
3 files changed, 286 insertions, 0 deletions
diff --git a/EdkCompatibilityPkg/Foundation/Library/Thunk16/Thunk16Lib_Edk2.inf b/EdkCompatibilityPkg/Foundation/Library/Thunk16/Thunk16Lib_Edk2.inf index aef578e..86e0da1 100644 --- a/EdkCompatibilityPkg/Foundation/Library/Thunk16/Thunk16Lib_Edk2.inf +++ b/EdkCompatibilityPkg/Foundation/Library/Thunk16/Thunk16Lib_Edk2.inf @@ -35,8 +35,10 @@ COMPONENT_TYPE = LIBRARY [sources.x64]
X64/Thunk16.asm | MSFT
X64/Thunk16.asm | INTEL
+ X64/Thunk16.S | GCC
X64/Fx.asm | MSFT
X64/Fx.asm | INTEL
+ X64/Fx.S | GCC
[includes.common]
.
diff --git a/EdkCompatibilityPkg/Foundation/Library/Thunk16/X64/Fx.S b/EdkCompatibilityPkg/Foundation/Library/Thunk16/X64/Fx.S new file mode 100644 index 0000000..7b15f41 --- /dev/null +++ b/EdkCompatibilityPkg/Foundation/Library/Thunk16/X64/Fx.S @@ -0,0 +1,48 @@ +#***************************************************************************** +#* +#* Copyright (c) 2008, 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: +#* +#* Fx.S +#* +#* Abstract: +#* +#* AsmFxRestore and AsmFxSave function +#* +#***************************************************************************** +#include <EfiBind.h> + +.global ASM_PFX(AsmFxSave) +.global ASM_PFX(AsmFxRestore) + + .text + +#------------------------------------------------------------------------------ +# VOID +# AsmFxSave ( +# OUT IA32_FX_BUFFER *Buffer +# ); +#------------------------------------------------------------------------------ +ASM_PFX(AsmFxSave): + fxsave (%rcx) + retq + +#------------------------------------------------------------------------------ +# VOID +# AsmFxRestore ( +# IN CONST IA32_FX_BUFFER *Buffer +# ); +#------------------------------------------------------------------------------ + +ASM_PFX(AsmFxRestore): + fxrstor (%rcx) + retq +
\ No newline at end of file diff --git a/EdkCompatibilityPkg/Foundation/Library/Thunk16/X64/Thunk16.S b/EdkCompatibilityPkg/Foundation/Library/Thunk16/X64/Thunk16.S new file mode 100644 index 0000000..a8a94a4 --- /dev/null +++ b/EdkCompatibilityPkg/Foundation/Library/Thunk16/X64/Thunk16.S @@ -0,0 +1,236 @@ +#***************************************************************************** +#* +#* Copyright (c) 2008, 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.S +#* +#* Abstract: +#* +#* Real mode thunk +#* +#***************************************************************************** +#include <EfiBind.h> + + + + .data + +.globl ASM_PFX(mCode16Size) + +.data +mCode16Size: .long _Code16End - _Code16Addr + + +NullSegSel: .quad 0 +_16CsSegSel: + .word -1 + .word 0 + .byte 0 + .byte 0x9b + .byte 0x8f #16-bit segment + .byte 0 +_16DsSegSel: + .word -1 + .word 0 + .byte 0 + .byte 0x93 + .byte 0x8f #16-bit segment + .byte 0 + +_16Gdtr: + .word _16Gdtr - NullSegSel - 1 + .long NullSegSel + .code: + +#IA32_REGS STRUC 4t
+#_EDI DD ?
+#_ESI DD ?
+#_EBP DD ?
+#_ESP DD ?
+#_EBX DD ?
+#_EDX DD ?
+#_ECX DD ?
+#_EAX DD ?
+#_DS DW ?
+#_ES DW ?
+#_FS DW ?
+#_GS DW ?
+#_RFLAGS DQ ?
+#_EIP DD ?
+#_CS DW ?
+#_SS DW ?
+#IA32_REGS ENDS
+
+#_STK16 STRUC 1t
+#RetEip DD ?
+#RetCs DW ?
+#ThunkFlags DW ?
+#SavedGdtr FWORD ?
+#Resvd1 DW ?
+#SavedCr0 DD ?
+#SavedCr4 DD ?
+#_STK16 ENDS
+ +ASM_PFX(Thunk16): + push %rbp + push %rbx + push %rsi + push %rdi + push %r12 + push %r13 + push %r14 + push %r15 + pushq %fs + pushq %gs + movl %ds,%r12d + movl %es,%r13d + movl %ss,%r14d + mov %rsp,%r15 + mov %rcx,%rsi + movzwq 0x36(%rsi),%r10 #movzx r10, (IA32_REGS ptr [rsi])._SS + xor %rdi,%rdi + mov 0xc(%rsi),%edi #mov edi, (IA32_REGS ptr [rsi])._ESP + add $0xffffffffffffffb0,%rdi #add rdi, - sizeof (IA32_REGS) - sizeof (_STK16) + push %rdi + imul $0x10,%r10,%rax + add %rax,%rdi + pushq $0xe #push sizeof (IA32_REGS) / 4 + pop %rcx + rep movsl %ds:(%rsi),%es:(%rdi) + pop %rbx #rbx <- 16-bit stack offset + lea Label,%eax #42 <_Thunk16+0x42> + stos %eax,%es:(%rdi) + movl %cs,%eax #return segment + stos %ax,%es:(%rdi) + mov %edx,%eax #THUNK Flags + stos %ax,%es:(%rdi) + sgdt 0x58(%rsp) #save GDTR + mov 0x58(%rsp),%rax + stos %rax,%es:(%rdi) + mov %cr0,%rax #save CR0 + mov %eax,%esi #esi <- CR0 to set + stos %eax,%es:(%rdi) + mov %cr4,%rax #save CR4 + stos %eax,%es:(%rdi) + sidt 0x58(%rsp) #save IDTR + and $0x7ffffffe,%esi #clear PE & PG bits + mov %r10,%rdi #rdi <- 16-bit stack segment + shl $0x10,%r8 + push %r8 #far jmp address + lea Label_16Bit,%eax + push %rax + movw $0x8,0x4(%rsp) + lgdt _16Gdtr #bugbug: may not match. + lret +Label_16Bit: + .byte 0x66 + movl $0xc0000080,%ecx + mov %rsi,%cr0 #disable PE & PG + rdmsr + and $0xfe,%ah + wrmsr #clear LME bit + mov %cr4,%rax + and $0xcf,%al #clear PAE & PSE + mov %rax,%cr4 + lret + +Label: + xor %rax,%rax + movl %ss,%eax + shl $0x4,%eax + add %esp,%eax + mov %r15,%rsp + lidt 0x58(%rsp) + movl %r12d,%ds + movl %r13d,%es + movl %r14d,%ss + popq %gs + popq %fs + pop %r15 + pop %r14 + pop %r13 + pop %r12 + pop %rdi + pop %rsi + pop %rbx + pop %rbp + retq + + + .align 0x10 + +_Code16Addr: +ASM_PFX(RealMode): + movl %edi,%ss + mov %bx,%sp #set up 16-bit stack + .byte 0x2e + .byte 0x0f + .byte 0x01 + .byte 0x1e
+ .word _16Idtr - _Code16Addr #lidt _16Idtr
+ .byte 0x66 + .byte 0x61 #popad
+ .byte 0x1f #pop ds
+ .byte 0x07 #pop es + popq %fs
+ popq %gs
+ add $0x8,%esp #skip RFLAGS
+ .byte 0x67 #test [esp + 0eh], 1 + .byte 0xf7 + .byte 0x44 + .byte 0x24 + .byte 0x0e + .byte 0x01 + .byte 0x00 + jz 1f + pushfq #pushf, actually +1: + .byte 0x0e #push cs + .byte 0x68 #push /iw + .word FarCallRet - _Code16Addr + jz 2f + .byte 0x66 + ljmp *6(%esp) +2: + .byte 0x66 + ljmp *4(%esp) +FarCallRet: + .byte 0x66 + push $0x00 #push a dword of zero + .byte 0x66 + pushf #pushfd, actually + pushq %gs + pushq %fs + .byte 0x06 #push %es + .byte 0x1e #push %ds + .byte 0x66 + .byte 0x60 + cli + .byte 0x66 #sizeof (IA32_REGS) = 13 * 4 = 52 + lgdt 64(%esp) #lgdt (_STK16 ptr [esp + sizeof (IA32_REGS)]).SavedGdtr + .byte 0x66 + mov 76(%esp), %eax + mov %rax, %cr4 + .byte 0x66 + mov $0xc0000080, %ecx + rdmsr + orb $1, %ah + wrmsr + .byte 0x66 + mov 72(%esp), %eax + mov %rax, %cr0 #restore CR0 + .byte 0x66 + ljmpl *52(%esp) + +_16Idtr: + .word 0x3ff #FWORD (1 SHL 10) - 1 + .byte 0x00 |