mirror of https://github.com/acidanthera/audk.git
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
This commit is contained in:
parent
b59923ae17
commit
21a54a4d0b
|
@ -35,8 +35,10 @@ COMPONENT_TYPE = LIBRARY
|
||||||
[sources.x64]
|
[sources.x64]
|
||||||
X64/Thunk16.asm | MSFT
|
X64/Thunk16.asm | MSFT
|
||||||
X64/Thunk16.asm | INTEL
|
X64/Thunk16.asm | INTEL
|
||||||
|
X64/Thunk16.S | GCC
|
||||||
X64/Fx.asm | MSFT
|
X64/Fx.asm | MSFT
|
||||||
X64/Fx.asm | INTEL
|
X64/Fx.asm | INTEL
|
||||||
|
X64/Fx.S | GCC
|
||||||
|
|
||||||
[includes.common]
|
[includes.common]
|
||||||
.
|
.
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
Loading…
Reference in New Issue