summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>2008-08-23 11:25:00 +0000
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>2008-08-23 11:25:00 +0000
commit822a6944bcfc11b562bf6599a4649ddd285dc08a (patch)
tree1d95c37dc66e959b0f8bbcb79b3d8f830b4755a6
parent78d41186a52d63dafad39e251700c58ae4674e9c (diff)
downloadedk2-platforms-822a6944bcfc11b562bf6599a4649ddd285dc08a.tar.xz
Add .S (for GCC) file for Pei/PeiLib/PeiLib_Edk2.inf.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5721 6f19259b-4bc3-4df7-8a09-765794883524
-rw-r--r--EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/PeiLib_Edk2.inf3
-rw-r--r--EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/ia32/ProcessorAsms.S207
-rw-r--r--EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/ia32/ReadIdt.S69
-rw-r--r--EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/ia32/WriteIdt.S50
4 files changed, 329 insertions, 0 deletions
diff --git a/EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/PeiLib_Edk2.inf b/EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/PeiLib_Edk2.inf
index da93a1c28d..3816b061e9 100644
--- a/EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/PeiLib_Edk2.inf
+++ b/EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/PeiLib_Edk2.inf
@@ -42,13 +42,16 @@ COMPONENT_TYPE = LIBRARY
ia32/Processor.c
ia32/ProcessorAsms.Asm |MSFT
ia32/ProcessorAsms.Asm |INTEL
+ ia32/ProcessorAsms.S |GCC
ia32/SupportItpDebug.asm |MSFT
ia32/SupportItpDebug.asm |INTEL
ia32/EfiJump.h
ia32/ReadIdt.asm |MSFT
ia32/ReadIdt.asm |INTEL
+ ia32/ReadIdt.S |GCC
ia32/WriteIdt.asm |MSFT
ia32/WriteIdt.asm |INTEL
+ ia32/WriteIdt.S |GCC
ia32/PeiServicePointer.c
[sources.x64]
diff --git a/EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/ia32/ProcessorAsms.S b/EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/ia32/ProcessorAsms.S
new file mode 100644
index 0000000000..d878b3b8b2
--- /dev/null
+++ b/EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/ia32/ProcessorAsms.S
@@ -0,0 +1,207 @@
+#
+# Copyright (c) 2004, 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:
+#
+# ProcessorAsms.Asm
+#
+#
+#
+#include "EfiBind.h"
+#------------------------------------------------------------------------------
+
+ .686P:
+ .MMX:
+ #.MODEL SMALL
+ .CODE:
+#------------------------------------------------------------------------------
+
+.globl ASM_PFX(TransferControlSetJump)
+.globl ASM_PFX(TransferControlLongJump)
+.globl ASM_PFX(SwitchStacks)
+.globl ASM_PFX(SwitchIplStacks)
+
+.equ EFI_SUCCESS, 0
+.equ EFI_WARN_RETURN_FROM_LONG_JUMP, 5
+
+#
+# typedef struct {
+# UINT32 ebx;
+# UINT32 esi;
+# UINT32 edi;
+# UINT32 ebp;
+# UINT32 esp;
+# UINT32 eip;
+#} EFI_JUMP_BUFFER;
+#
+
+#typedef
+#EFI_STATUS
+#(EFIAPI *EFI_PEI_TRANSFER_CONTROL_SET_JUMP) (
+# IN EFI_PEI_TRANSFER_CONTROL_PROTOCOL *This,
+# OUT EFI_JUMP_BUFFER *Context
+# );
+#
+#Routine Description:
+#
+# This routine implements the IA32 variant of the SetJump call. Its
+# responsibility is to store system state information for a possible
+# subsequent LongJump.
+#
+#Arguments:
+#
+# Pointer to CPU context save buffer.
+#
+#Returns:
+#
+# EFI_SUCCESS
+#
+ASM_PFX(TransferControlSetJump):
+ push %ebp
+ mov %esp,%ebp
+ mov 0x8(%ebp),%eax
+ mov 0xc(%ebp),%ecx
+ mov %ebx,(%ecx)
+ mov %esi,0x4(%ecx)
+ mov %edi,0x8(%ecx)
+ mov 0x0(%ebp),%eax
+ mov %eax,0xc(%ecx)
+ lea 0x4(%ebp),%eax
+ mov %eax,0x10(%ecx)
+ mov 0x4(%ebp),%eax
+ mov %eax,0x14(%ecx)
+ mov $0x0,%eax
+ leave
+ ret
+
+#typedef
+#EFI_STATUS
+#(EFIAPI *EFI_PEI_TRANSFER_CONTROL_LONG_JUMP) (
+# IN EFI_PEI_TRANSFER_CONTROL_PROTOCOL *This,
+# IN EFI_JUMP_BUFFER *Context
+# );
+#
+# Routine Description:
+#
+# This routine implements the IA32 variant of the LongJump call. Its
+# responsibility is restore the system state to the Context Buffer and
+# pass control back.
+#
+# Arguments:
+#
+# Pointer to CPU context save buffer.
+#
+# Returns:
+#
+# EFI_WARN_RETURN_FROM_LONG_JUMP
+#
+
+ASM_PFX(TransferControlLongJump):
+ push %ebp
+ mov %esp,%ebp
+ push %ebx
+ push %esi
+ push %edi
+ mov 0x8(%ebp),%eax
+ mov $0x5,%eax
+ mov 0xc(%ebp),%ecx
+ mov (%ecx),%ebx
+ mov 0x4(%ecx),%esi
+ mov 0x8(%ecx),%edi
+ mov 0xc(%ecx),%ebp
+ mov 0x10(%ecx),%esp
+ add $0x4,%esp
+ jmp *0x14(%ecx)
+ mov $0x5,%eax
+ pop %edi
+ pop %esi
+ pop %ebx
+ leave
+ ret
+
+#
+# Routine Description:
+# This allows the caller to switch the stack and goes to the new entry point
+#
+# Arguments:
+# EntryPoint - Pointer to the location to enter
+# Parameter - Parameter to pass in
+# NewStack - New Location of the stack
+# NewBsp - New BSP
+#
+# Returns:
+#
+# Nothing. Goes to the Entry Point passing in the new parameters
+#
+#SwitchStacks PROC C \
+# EntryPoint:PTR DWORD, \
+# Parameter:DWORD, \
+# NewStack:PTR DWORD, \
+# NewBsp:PTR DWORD
+ASM_PFX(SwitchStacks):
+ push %ebp
+ mov %esp,%ebp
+ push %ebx
+ mov 0x14(%ebp),%eax
+ mov 0xc(%ebp),%ebx
+ mov 0x8(%ebp),%ecx
+ mov 0x10(%ebp),%eax
+ mov %eax,%esp
+ push %ebx
+ push $0x0
+ jmp *%ecx
+ pop %ebx
+ leave
+ ret
+
+
+
+
+#
+# Routine Description:
+# This allows the caller to switch the stack and goes to the new entry point
+#
+# Arguments:
+# EntryPoint - Pointer to the location to enter
+# Parameter1/Parameter2 - Parameter to pass in
+# NewStack - New Location of the stack
+# NewBsp - New BSP
+#
+# Returns:
+#
+# Nothing. Goes to the Entry Point passing in the new parameters
+#
+#SwitchIplStacks PROC C \
+# EntryPoint:PTR DWORD, \
+# Parameter1:DWORD, \
+# Parameter2:DWORD, \
+# NewStack:PTR DWORD, \
+# NewBsp:PTR DWORD
+ASM_PFX(SwitchIplStacks):
+ push %ebp
+ mov %esp,%ebp
+ push %ebx
+ mov 0x18(%ebp),%eax
+ mov 0xc(%ebp),%ebx
+ mov 0x10(%ebp),%edx
+ mov 0x8(%ebp),%ecx
+ mov 0x14(%ebp),%eax
+ mov %eax,%esp
+ push %edx
+ push %ebx
+ call *%ecx
+ pop %ebx
+ leave
+ ret
+
+#SwitchIplStacks ENDP
+
+
+
diff --git a/EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/ia32/ReadIdt.S b/EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/ia32/ReadIdt.S
new file mode 100644
index 0000000000..0abd84f902
--- /dev/null
+++ b/EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/ia32/ReadIdt.S
@@ -0,0 +1,69 @@
+#------------------------------------------------------------------------------
+#
+# 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:
+#
+# ReadIdtBase.Asm
+#
+# Abstract:
+#
+# ReadIdtBase function
+#
+# Notes:
+#
+#include "EfiBind.h"
+#------------------------------------------------------------------------------
+
+ .586:
+ #.MODEL flat,C
+ .code:
+
+.globl ASM_PFX(ReadIdtBasea)
+.globl ASM_PFX(ReadIdtLimita)
+
+#------------------------------------------------------------------------------
+# UINTN
+# ReadIdtBase (
+# void
+# )
+#
+# Abstract: Returns physical address of IDTR
+#
+ASM_PFX(ReadIdtBasea):
+ push %ebp
+ mov %esp,%ebp
+ add $0xfffffff8,%esp
+ sidtl 0xfffffffa(%ebp)
+ mov 0xfffffffc(%ebp),%eax
+ leave
+ ret
+
+
+
+#------------------------------------------------------------------------------
+# UINT16
+# ReadIdtLimit (
+# void
+# )
+#
+# Abstract: Returns Limit of IDTR
+#
+ASM_PFX(ReadIdtLimita):
+ push %ebp
+ mov %esp,%ebp
+ add $0xfffffff8,%esp
+ sidtl 0xfffffffa(%ebp)
+ mov 0xfffffffa(%ebp),%ax
+ leave
+ ret
+
+
+
diff --git a/EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/ia32/WriteIdt.S b/EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/ia32/WriteIdt.S
new file mode 100644
index 0000000000..5d072c4921
--- /dev/null
+++ b/EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/ia32/WriteIdt.S
@@ -0,0 +1,50 @@
+#------------------------------------------------------------------------------
+#
+# 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:
+#
+# WriteIdt.Asm
+#
+# Abstract:
+#
+# SetIdtBase function
+#
+# Notes:
+#
+#include "EfiBind.h"
+#------------------------------------------------------------------------------
+
+ .586:
+ #.MODEL flat,C
+ .code:
+#------------------------------------------------------------------------------
+
+.globl ASM_PFX(SetIdtBase)
+
+# void
+# SetIdtBase (
+# UINT32 IdtBase,
+# UINT16 IdtLimit
+# )
+#
+# Abstract: Set IDTR with the given physical address
+#
+ASM_PFX(SetIdtBase):
+ push %ebp
+ mov %esp,%ebp
+ add $0xfffffff8,%esp
+ mov 0x8(%ebp),%eax
+ mov 0xc(%ebp),%cx
+ mov %eax,0xfffffffc(%ebp)
+ mov %cx,0xfffffffa(%ebp)
+ lidtl 0xfffffffa(%ebp)
+ leave
+ ret