From 21a54a4d0b552fe62e6aed6f68ef55a2aa9253e4 Mon Sep 17 00:00:00 2001 From: qwang12 Date: Thu, 28 Aug 2008 15:08:59 +0000 Subject: [PATCH] Add .S file for X64 GCC tool-chain for Thunk16. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5751 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Library/Thunk16/Thunk16Lib_Edk2.inf | 2 + .../Foundation/Library/Thunk16/X64/Fx.S | 48 ++++ .../Foundation/Library/Thunk16/X64/Thunk16.S | 236 ++++++++++++++++++ 3 files changed, 286 insertions(+) create mode 100644 EdkCompatibilityPkg/Foundation/Library/Thunk16/X64/Fx.S create mode 100644 EdkCompatibilityPkg/Foundation/Library/Thunk16/X64/Thunk16.S diff --git a/EdkCompatibilityPkg/Foundation/Library/Thunk16/Thunk16Lib_Edk2.inf b/EdkCompatibilityPkg/Foundation/Library/Thunk16/Thunk16Lib_Edk2.inf index aef578e4cd..86e0da1981 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 0000000000..7b15f41631 --- /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 + +.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 0000000000..a8a94a4fa9 --- /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 + + + + .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