Add in the 1st version of ECP.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2832 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
//++
|
||||
// Copyright (c) 2007, 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:
|
||||
//
|
||||
// HWAccess.s
|
||||
//
|
||||
// Abstract:
|
||||
//
|
||||
// Contains an implementation of Read/Write Kr7 for the Itanium-based architecture.
|
||||
//
|
||||
//
|
||||
//
|
||||
// Revision History:
|
||||
//
|
||||
//--
|
||||
|
||||
.file "HWAccess.s"
|
||||
#include "IpfMacro.i"
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
//++
|
||||
//VOID
|
||||
//AsmWriteKr7 (
|
||||
// UINT64
|
||||
// );
|
||||
//
|
||||
// This routine saves the given input value into the kernel register 7
|
||||
//
|
||||
// Arguments :
|
||||
//
|
||||
// On Entry : 64 bit value to be saved.
|
||||
//
|
||||
// Return Value: None
|
||||
//
|
||||
//--
|
||||
//----------------------------------------------------------------------------------
|
||||
PROCEDURE_ENTRY (AsmWriteKr7)
|
||||
NESTED_SETUP (1,2,0,0)
|
||||
mov ar.k7 = in0;;
|
||||
NESTED_RETURN
|
||||
|
||||
PROCEDURE_EXIT (AsmWriteKr7)
|
||||
|
||||
//---------------------------------------------------------------------------------
|
||||
//++
|
||||
//UINT64
|
||||
//AsmReadKr7 (
|
||||
// VOID
|
||||
// );
|
||||
//
|
||||
// This routine returns the value of the kernel register 7
|
||||
//
|
||||
// Arguments :
|
||||
//
|
||||
// On Entry : None
|
||||
//
|
||||
// Return Value: 64bit Value of the register.
|
||||
//
|
||||
//--
|
||||
//----------------------------------------------------------------------------------
|
||||
PROCEDURE_ENTRY (AsmReadKr7)
|
||||
NESTED_SETUP (0,2,0,0)
|
||||
mov r8 = ar.k7;;
|
||||
NESTED_RETURN
|
||||
PROCEDURE_EXIT (AsmReadKr7)
|
||||
//----------------------------------------------------------------------------------
|
||||
|
||||
|
@@ -0,0 +1,268 @@
|
||||
/*++
|
||||
|
||||
Copyright (c) 2004 - 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:
|
||||
|
||||
PeCoffLoaderEx.c
|
||||
|
||||
Abstract:
|
||||
|
||||
Fixes Intel Itanium(TM) specific relocation types
|
||||
|
||||
|
||||
Revision History
|
||||
|
||||
--*/
|
||||
|
||||
#include "TianoCommon.h"
|
||||
#include "EfiImage.h"
|
||||
|
||||
#define EXT_IMM64(Value, Address, Size, InstPos, ValPos) \
|
||||
Value |= (((UINT64)((*(Address) >> InstPos) & (((UINT64)1 << Size) - 1))) << ValPos)
|
||||
|
||||
#define INS_IMM64(Value, Address, Size, InstPos, ValPos) \
|
||||
*(UINT32*)Address = (*(UINT32*)Address & ~(((1 << Size) - 1) << InstPos)) | \
|
||||
((UINT32)((((UINT64)Value >> ValPos) & (((UINT64)1 << Size) - 1))) << InstPos)
|
||||
|
||||
#define IMM64_IMM7B_INST_WORD_X 3
|
||||
#define IMM64_IMM7B_SIZE_X 7
|
||||
#define IMM64_IMM7B_INST_WORD_POS_X 4
|
||||
#define IMM64_IMM7B_VAL_POS_X 0
|
||||
|
||||
#define IMM64_IMM9D_INST_WORD_X 3
|
||||
#define IMM64_IMM9D_SIZE_X 9
|
||||
#define IMM64_IMM9D_INST_WORD_POS_X 18
|
||||
#define IMM64_IMM9D_VAL_POS_X 7
|
||||
|
||||
#define IMM64_IMM5C_INST_WORD_X 3
|
||||
#define IMM64_IMM5C_SIZE_X 5
|
||||
#define IMM64_IMM5C_INST_WORD_POS_X 13
|
||||
#define IMM64_IMM5C_VAL_POS_X 16
|
||||
|
||||
#define IMM64_IC_INST_WORD_X 3
|
||||
#define IMM64_IC_SIZE_X 1
|
||||
#define IMM64_IC_INST_WORD_POS_X 12
|
||||
#define IMM64_IC_VAL_POS_X 21
|
||||
|
||||
#define IMM64_IMM41a_INST_WORD_X 1
|
||||
#define IMM64_IMM41a_SIZE_X 10
|
||||
#define IMM64_IMM41a_INST_WORD_POS_X 14
|
||||
#define IMM64_IMM41a_VAL_POS_X 22
|
||||
|
||||
#define IMM64_IMM41b_INST_WORD_X 1
|
||||
#define IMM64_IMM41b_SIZE_X 8
|
||||
#define IMM64_IMM41b_INST_WORD_POS_X 24
|
||||
#define IMM64_IMM41b_VAL_POS_X 32
|
||||
|
||||
#define IMM64_IMM41c_INST_WORD_X 2
|
||||
#define IMM64_IMM41c_SIZE_X 23
|
||||
#define IMM64_IMM41c_INST_WORD_POS_X 0
|
||||
#define IMM64_IMM41c_VAL_POS_X 40
|
||||
|
||||
#define IMM64_SIGN_INST_WORD_X 3
|
||||
#define IMM64_SIGN_SIZE_X 1
|
||||
#define IMM64_SIGN_INST_WORD_POS_X 27
|
||||
#define IMM64_SIGN_VAL_POS_X 63
|
||||
|
||||
EFI_STATUS
|
||||
PeCoffLoaderRelocateImageEx (
|
||||
IN UINT16 *Reloc,
|
||||
IN OUT CHAR8 *Fixup,
|
||||
IN OUT CHAR8 **FixupData,
|
||||
IN UINT64 Adjust
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Performs an Itanium-based specific relocation fixup
|
||||
|
||||
Arguments:
|
||||
|
||||
Reloc - Pointer to the relocation record
|
||||
|
||||
Fixup - Pointer to the address to fix up
|
||||
|
||||
FixupData - Pointer to a buffer to log the fixups
|
||||
|
||||
Adjust - The offset to adjust the fixup
|
||||
|
||||
Returns:
|
||||
|
||||
Status code
|
||||
|
||||
--*/
|
||||
{
|
||||
UINT64 *F64;
|
||||
UINT64 FixupVal;
|
||||
|
||||
switch ((*Reloc) >> 12) {
|
||||
|
||||
case EFI_IMAGE_REL_BASED_IA64_IMM64:
|
||||
|
||||
//
|
||||
// Align it to bundle address before fixing up the
|
||||
// 64-bit immediate value of the movl instruction.
|
||||
//
|
||||
|
||||
Fixup = (CHAR8 *)((UINTN) Fixup & (UINTN) ~(15));
|
||||
FixupVal = (UINT64)0;
|
||||
|
||||
//
|
||||
// Extract the lower 32 bits of IMM64 from bundle
|
||||
//
|
||||
EXT_IMM64(FixupVal,
|
||||
(UINT32 *)Fixup + IMM64_IMM7B_INST_WORD_X,
|
||||
IMM64_IMM7B_SIZE_X,
|
||||
IMM64_IMM7B_INST_WORD_POS_X,
|
||||
IMM64_IMM7B_VAL_POS_X
|
||||
);
|
||||
|
||||
EXT_IMM64(FixupVal,
|
||||
(UINT32 *)Fixup + IMM64_IMM9D_INST_WORD_X,
|
||||
IMM64_IMM9D_SIZE_X,
|
||||
IMM64_IMM9D_INST_WORD_POS_X,
|
||||
IMM64_IMM9D_VAL_POS_X
|
||||
);
|
||||
|
||||
EXT_IMM64(FixupVal,
|
||||
(UINT32 *)Fixup + IMM64_IMM5C_INST_WORD_X,
|
||||
IMM64_IMM5C_SIZE_X,
|
||||
IMM64_IMM5C_INST_WORD_POS_X,
|
||||
IMM64_IMM5C_VAL_POS_X
|
||||
);
|
||||
|
||||
EXT_IMM64(FixupVal,
|
||||
(UINT32 *)Fixup + IMM64_IC_INST_WORD_X,
|
||||
IMM64_IC_SIZE_X,
|
||||
IMM64_IC_INST_WORD_POS_X,
|
||||
IMM64_IC_VAL_POS_X
|
||||
);
|
||||
|
||||
EXT_IMM64(FixupVal,
|
||||
(UINT32 *)Fixup + IMM64_IMM41a_INST_WORD_X,
|
||||
IMM64_IMM41a_SIZE_X,
|
||||
IMM64_IMM41a_INST_WORD_POS_X,
|
||||
IMM64_IMM41a_VAL_POS_X
|
||||
);
|
||||
|
||||
//
|
||||
// Update 64-bit address
|
||||
//
|
||||
FixupVal += Adjust;
|
||||
|
||||
//
|
||||
// Insert IMM64 into bundle
|
||||
//
|
||||
INS_IMM64(FixupVal,
|
||||
((UINT32 *)Fixup + IMM64_IMM7B_INST_WORD_X),
|
||||
IMM64_IMM7B_SIZE_X,
|
||||
IMM64_IMM7B_INST_WORD_POS_X,
|
||||
IMM64_IMM7B_VAL_POS_X
|
||||
);
|
||||
|
||||
INS_IMM64(FixupVal,
|
||||
((UINT32 *)Fixup + IMM64_IMM9D_INST_WORD_X),
|
||||
IMM64_IMM9D_SIZE_X,
|
||||
IMM64_IMM9D_INST_WORD_POS_X,
|
||||
IMM64_IMM9D_VAL_POS_X
|
||||
);
|
||||
|
||||
INS_IMM64(FixupVal,
|
||||
((UINT32 *)Fixup + IMM64_IMM5C_INST_WORD_X),
|
||||
IMM64_IMM5C_SIZE_X,
|
||||
IMM64_IMM5C_INST_WORD_POS_X,
|
||||
IMM64_IMM5C_VAL_POS_X
|
||||
);
|
||||
|
||||
INS_IMM64(FixupVal,
|
||||
((UINT32 *)Fixup + IMM64_IC_INST_WORD_X),
|
||||
IMM64_IC_SIZE_X,
|
||||
IMM64_IC_INST_WORD_POS_X,
|
||||
IMM64_IC_VAL_POS_X
|
||||
);
|
||||
|
||||
INS_IMM64(FixupVal,
|
||||
((UINT32 *)Fixup + IMM64_IMM41a_INST_WORD_X),
|
||||
IMM64_IMM41a_SIZE_X,
|
||||
IMM64_IMM41a_INST_WORD_POS_X,
|
||||
IMM64_IMM41a_VAL_POS_X
|
||||
);
|
||||
|
||||
INS_IMM64(FixupVal,
|
||||
((UINT32 *)Fixup + IMM64_IMM41b_INST_WORD_X),
|
||||
IMM64_IMM41b_SIZE_X,
|
||||
IMM64_IMM41b_INST_WORD_POS_X,
|
||||
IMM64_IMM41b_VAL_POS_X
|
||||
);
|
||||
|
||||
INS_IMM64(FixupVal,
|
||||
((UINT32 *)Fixup + IMM64_IMM41c_INST_WORD_X),
|
||||
IMM64_IMM41c_SIZE_X,
|
||||
IMM64_IMM41c_INST_WORD_POS_X,
|
||||
IMM64_IMM41c_VAL_POS_X
|
||||
);
|
||||
|
||||
INS_IMM64(FixupVal,
|
||||
((UINT32 *)Fixup + IMM64_SIGN_INST_WORD_X),
|
||||
IMM64_SIGN_SIZE_X,
|
||||
IMM64_SIGN_INST_WORD_POS_X,
|
||||
IMM64_SIGN_VAL_POS_X
|
||||
);
|
||||
|
||||
F64 = (UINT64 *) Fixup;
|
||||
if (*FixupData != NULL) {
|
||||
*FixupData = ALIGN_POINTER(*FixupData, sizeof(UINT64));
|
||||
*(UINT64 *)(*FixupData) = *F64;
|
||||
*FixupData = *FixupData + sizeof(UINT64);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
PeCoffLoaderImageFormatSupported (
|
||||
IN UINT16 Machine
|
||||
)
|
||||
/*++
|
||||
Routine Description:
|
||||
|
||||
Returns TRUE if the machine type of PE/COFF image is supported. Supported
|
||||
does not mean the image can be executed it means the PE/COFF loader supports
|
||||
loading and relocating of the image type. It's up to the caller to support
|
||||
the entry point.
|
||||
|
||||
This function implies the basic PE/COFF loader/relocator supports IPF, EBC,
|
||||
images. Calling the entry point in a correct mannor is up to the
|
||||
consumer of this library.
|
||||
|
||||
Arguments:
|
||||
|
||||
Machine - Machine type from the PE Header.
|
||||
|
||||
Returns:
|
||||
|
||||
TRUE - if this PE/COFF loader can load the image
|
||||
FALSE - if this PE/COFF loader cannot load the image
|
||||
|
||||
--*/
|
||||
{
|
||||
if ((Machine == EFI_IMAGE_MACHINE_IA64) || (Machine == EFI_IMAGE_MACHINE_EBC)) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
@@ -0,0 +1,87 @@
|
||||
/*++
|
||||
|
||||
Copyright (c) 2004 - 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:
|
||||
|
||||
PeCoffLoaderEx.h
|
||||
|
||||
Abstract:
|
||||
|
||||
Fixes Intel Itanium(TM) specific relocation types
|
||||
|
||||
|
||||
Revision History
|
||||
|
||||
--*/
|
||||
|
||||
#ifndef _PE_COFF_LOADER_EX_H_
|
||||
#define _PE_COFF_LOADER_EX_H_
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
PeCoffLoaderRelocateImageEx (
|
||||
IN UINT16 *Reloc,
|
||||
IN OUT CHAR8 *Fixup,
|
||||
IN OUT CHAR8 **FixupData,
|
||||
IN UINT64 Adjust
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Performs an Itanium-based specific relocation fixup
|
||||
|
||||
Arguments:
|
||||
|
||||
Reloc - Pointer to the relocation record
|
||||
|
||||
Fixup - Pointer to the address to fix up
|
||||
|
||||
FixupData - Pointer to a buffer to log the fixups
|
||||
|
||||
Adjust - The offset to adjust the fixup
|
||||
|
||||
Returns:
|
||||
|
||||
Status code
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
BOOLEAN
|
||||
PeCoffLoaderImageFormatSupported (
|
||||
IN UINT16 Machine
|
||||
)
|
||||
/*++
|
||||
Routine Description:
|
||||
|
||||
Returns TRUE if the machine type of PE/COFF image is supported. Supported
|
||||
does not mean the image can be executed it means the PE/COFF loader supports
|
||||
loading and relocating of the image type. It's up to the caller to support
|
||||
the entry point.
|
||||
|
||||
This function implies the basic PE/COFF loader/relocator supports IPF, EBC,
|
||||
images. Calling the entry point in a correct mannor is up to the
|
||||
consumer of this library.
|
||||
|
||||
Arguments:
|
||||
|
||||
Machine - Machine type from the PE Header.
|
||||
|
||||
Returns:
|
||||
|
||||
TRUE - if this PE/COFF loader can load the image
|
||||
FALSE - if this PE/COFF loader cannot load the image
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
#endif
|
@@ -0,0 +1,108 @@
|
||||
/*++
|
||||
|
||||
Copyright 2007, 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:
|
||||
|
||||
PeiServicePointer.c
|
||||
|
||||
Abstract:
|
||||
|
||||
--*/
|
||||
|
||||
#include "Tiano.h"
|
||||
#include "PeiApi.h"
|
||||
#include "PeiLib.h"
|
||||
|
||||
|
||||
#if (PI_SPECIFICATION_VERSION >= 0x00010000)
|
||||
|
||||
VOID
|
||||
SetPeiServicesTablePointer (
|
||||
IN EFI_PEI_SERVICES **PeiServices
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Save PeiService pointer so that it can be retrieved anywhere.
|
||||
|
||||
Arguments:
|
||||
|
||||
PeiServices - The direct pointer to PeiServiceTable.
|
||||
PhyscialAddress - The physcial address of variable PeiServices.
|
||||
|
||||
Returns:
|
||||
NONE
|
||||
|
||||
--*/
|
||||
|
||||
{
|
||||
//
|
||||
// For Itanium Processor Family processors, the EFI_PEI_SERVICES**
|
||||
// is stored in kernel register7.
|
||||
//
|
||||
AsmWriteKr7((UINT64)(UINTN)PeiServices);
|
||||
}
|
||||
|
||||
|
||||
EFI_PEI_SERVICES **
|
||||
GetPeiServicesTablePointer (
|
||||
VOID
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Get PeiService pointer.
|
||||
|
||||
Arguments:
|
||||
|
||||
NONE.
|
||||
|
||||
Returns:
|
||||
The direct pointer to PeiServiceTable.
|
||||
|
||||
--*/
|
||||
|
||||
{
|
||||
//
|
||||
// For Itanium Processor Family processors, the EFI_PEI_SERVICES**
|
||||
// is stored in kernel register7.
|
||||
//
|
||||
return (EFI_PEI_SERVICES **)(UINTN)AsmReadKr7();
|
||||
}
|
||||
|
||||
VOID
|
||||
MigrateIdtTable (
|
||||
IN EFI_PEI_SERVICES **PeiServices
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Migrate IDT from CAR to real memory where preceded with 4 bytes for
|
||||
storing PeiService pointer.
|
||||
|
||||
Arguments:
|
||||
|
||||
PeiServices - The direct pointer to PeiServiceTable.
|
||||
|
||||
Returns:
|
||||
|
||||
NONE.
|
||||
|
||||
--*/
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
#endif
|
@@ -0,0 +1,61 @@
|
||||
//++
|
||||
// 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:
|
||||
//
|
||||
// PerformancePrimitives.s
|
||||
//
|
||||
// Abstract:
|
||||
//
|
||||
//
|
||||
// Revision History:
|
||||
//
|
||||
//--
|
||||
|
||||
.file "PerformancePrimitives.s"
|
||||
|
||||
#include "IpfMacro.i"
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//++
|
||||
// GetTimerValue
|
||||
//
|
||||
// Implementation of CPU-based time service
|
||||
//
|
||||
// On Entry :
|
||||
// EFI_STATUS
|
||||
// GetTimerValue (
|
||||
// OUT UINT64 *TimerValue
|
||||
// )
|
||||
//
|
||||
// Return Value:
|
||||
// r8 = Status
|
||||
// r9 = 0
|
||||
// r10 = 0
|
||||
// r11 = 0
|
||||
//
|
||||
// As per static calling conventions.
|
||||
//
|
||||
//--
|
||||
//---------------------------------------------------------------------------
|
||||
PROCEDURE_ENTRY (GetTimerValue)
|
||||
|
||||
NESTED_SETUP (1,8,0,0)
|
||||
mov r8 = ar.itc;;
|
||||
st8 [r32]= r8
|
||||
mov r8 = r0
|
||||
mov r9 = r0
|
||||
mov r10 = r0
|
||||
mov r11 = r0
|
||||
NESTED_RETURN
|
||||
|
||||
PROCEDURE_EXIT (GetTimerValue)
|
||||
//---------------------------------------------------------------------------
|
||||
|
@@ -0,0 +1,122 @@
|
||||
//++
|
||||
// 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:
|
||||
//
|
||||
// SwitchStack.s
|
||||
//
|
||||
// Abstract:
|
||||
//
|
||||
// Contains an implementation of a stack switch for the Itanium-based architecture.
|
||||
//
|
||||
//
|
||||
//
|
||||
// Revision History:
|
||||
//
|
||||
//--
|
||||
|
||||
.file "SwitchStack.s"
|
||||
|
||||
#include <asm.h>
|
||||
#include <ia_64gen.h>
|
||||
|
||||
// Define hardware RSE Configuration Register
|
||||
//
|
||||
// RS Configuration (RSC) bit field positions
|
||||
|
||||
#define RSC_MODE 0
|
||||
#define RSC_PL 2
|
||||
#define RSC_BE 4
|
||||
// RSC bits 5-15 reserved
|
||||
#define RSC_MBZ0 5
|
||||
#define RSC_MBZ0_V 0x3ff
|
||||
#define RSC_LOADRS 16
|
||||
#define RSC_LOADRS_LEN 14
|
||||
// RSC bits 30-63 reserved
|
||||
#define RSC_MBZ1 30
|
||||
#define RSC_MBZ1_V 0x3ffffffffULL
|
||||
|
||||
// RSC modes
|
||||
// Lazy
|
||||
#define RSC_MODE_LY (0x0)
|
||||
// Store intensive
|
||||
#define RSC_MODE_SI (0x1)
|
||||
// Load intensive
|
||||
#define RSC_MODE_LI (0x2)
|
||||
// Eager
|
||||
#define RSC_MODE_EA (0x3)
|
||||
|
||||
// RSC Endian bit values
|
||||
#define RSC_BE_LITTLE 0
|
||||
#define RSC_BE_BIG 1
|
||||
|
||||
// RSC while in kernel: enabled, little endian, pl = 0, eager mode
|
||||
#define RSC_KERNEL ((RSC_MODE_EA<<RSC_MODE) | (RSC_BE_LITTLE<<RSC_BE))
|
||||
// Lazy RSC in kernel: enabled, little endian, pl = 0, lazy mode
|
||||
#define RSC_KERNEL_LAZ ((RSC_MODE_LY<<RSC_MODE) | (RSC_BE_LITTLE<<RSC_BE))
|
||||
// RSE disabled: disabled, pl = 0, little endian, eager mode
|
||||
#define RSC_KERNEL_DISABLED ((RSC_MODE_LY<<RSC_MODE) | (RSC_BE_LITTLE<<RSC_BE))
|
||||
|
||||
|
||||
//VOID
|
||||
//SwitchStacks (
|
||||
// VOID *ContinuationFunction,
|
||||
// UINTN Parameter,
|
||||
// UINTN NewTopOfStack,
|
||||
// UINTN NewBSPStore OPTIONAL
|
||||
//)
|
||||
///*++
|
||||
//
|
||||
//Input Arguments
|
||||
//
|
||||
// ContinuationFunction - This is a pointer to the PLABEL of the function that should be called once the
|
||||
// new stack has been created.
|
||||
// Parameter - The parameter to pass to the continuation function
|
||||
// NewTopOfStack - This is the new top of the memory stack for ensuing code. This is mandatory and
|
||||
// should be non-zero
|
||||
// NewBSPStore - This is the new BSP store for the ensuing code. It is optional on IA-32 and mandatory on Itanium-based platform.
|
||||
//
|
||||
//--*/
|
||||
|
||||
PROCEDURE_ENTRY(SwitchStacks)
|
||||
|
||||
mov r16 = -0x10;;
|
||||
and r16 = r34, r16;; // get new stack value in R16, 0 the last nibble.
|
||||
mov r15 = r35;; // Get new BspStore into R15
|
||||
mov r13 = r32;; // this is a pointer to the PLABEL of the continuation function.
|
||||
mov r17 = r33;; // this is the parameter to pass to the continuation function
|
||||
|
||||
alloc r11=0,0,0,0 // Set 0-size frame
|
||||
;;
|
||||
flushrs;;
|
||||
|
||||
mov r21 = RSC_KERNEL_DISABLED // for rse disable
|
||||
;;
|
||||
mov ar.rsc = r21 // turn off RSE
|
||||
|
||||
add sp = r0, r16;; // transfer to the EFI stack
|
||||
mov ar.bspstore = r15 // switch to EFI BSP
|
||||
invala // change of ar.bspstore needs invala.
|
||||
|
||||
mov r18 = RSC_KERNEL_LAZ // RSC enabled, Lazy mode
|
||||
;;
|
||||
mov ar.rsc = r18 // turn rse on, in kernel mode
|
||||
;;
|
||||
alloc r11=0,0,1,0;; // alloc 0 outs going to ensuing DXE IPL service
|
||||
mov out0 = r17
|
||||
ld8 r16 = [r13],8;; // r16 = address of continuation function from the PLABEL
|
||||
ld8 gp = [r13] // gp = gp of continuation function from the PLABEL
|
||||
mov b6 = r16
|
||||
;;
|
||||
br.call.sptk.few b0=b6;; // Call the continuation function
|
||||
;;
|
||||
PROCEDURE_EXIT(SwitchStacks)
|
||||
|
||||
|
35
EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/Ipf/asm.h
Normal file
35
EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/Ipf/asm.h
Normal file
@@ -0,0 +1,35 @@
|
||||
//
|
||||
//
|
||||
// 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:
|
||||
//
|
||||
// asm.h
|
||||
//
|
||||
// Abstract:
|
||||
//
|
||||
// This module contains generic macros for an assembly writer.
|
||||
//
|
||||
//
|
||||
// Revision History
|
||||
//
|
||||
#ifndef _ASM_H
|
||||
#define _ASM_H
|
||||
|
||||
#define TRUE 1
|
||||
#define FALSE 0
|
||||
#define PROCEDURE_ENTRY(name) .##text; \
|
||||
.##type name, @function; \
|
||||
.##proc name; \
|
||||
name::
|
||||
|
||||
#define PROCEDURE_EXIT(name) .##endp name
|
||||
|
||||
#endif // _ASM_H
|
112
EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/Ipf/efijump.h
Normal file
112
EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/Ipf/efijump.h
Normal file
@@ -0,0 +1,112 @@
|
||||
/*++
|
||||
|
||||
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:
|
||||
|
||||
EfiJump.h
|
||||
|
||||
Abstract:
|
||||
|
||||
This is the Setjump/Longjump pair for an IA32 processor.
|
||||
|
||||
--*/
|
||||
|
||||
#ifndef _EFI_JUMP_H_
|
||||
#define _EFI_JUMP_H_
|
||||
|
||||
#include EFI_GUID_DEFINITION (PeiTransferControl)
|
||||
|
||||
//
|
||||
// NOTE:Set/LongJump needs to have this buffer start
|
||||
// at 16 byte boundary. Either fix the structure
|
||||
// which call this buffer or fix inside SetJump/LongJump
|
||||
// Choosing 1K buffer storage for now
|
||||
//
|
||||
typedef struct {
|
||||
CHAR8 Buffer[1024];
|
||||
} EFI_JUMP_BUFFER;
|
||||
|
||||
EFI_STATUS
|
||||
SetJump (
|
||||
IN EFI_PEI_TRANSFER_CONTROL_PROTOCOL *This,
|
||||
IN EFI_JUMP_BUFFER *Jump
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
SetJump stores the current register set in the area pointed to
|
||||
by "save". It returns zero. Subsequent calls to "LongJump" will
|
||||
restore the registers and return non-zero to the same location.
|
||||
On entry, r32 contains the pointer to the jmp_buffer
|
||||
|
||||
Arguments:
|
||||
|
||||
This - Calling context
|
||||
Jump - Jump buffer
|
||||
|
||||
Returns:
|
||||
|
||||
Status code
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
EFI_STATUS
|
||||
LongJump (
|
||||
IN EFI_PEI_TRANSFER_CONTROL_PROTOCOL *This,
|
||||
IN EFI_JUMP_BUFFER *Jump
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
LongJump initializes the register set to the values saved by a
|
||||
previous 'SetJump' and jumps to the return location saved by that
|
||||
'SetJump'. This has the effect of unwinding the stack and returning
|
||||
for a second time to the 'SetJump'.
|
||||
|
||||
Arguments:
|
||||
|
||||
This - Calling context
|
||||
Jump - Jump buffer
|
||||
|
||||
Returns:
|
||||
|
||||
Status code
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
VOID
|
||||
RtPioICacheFlush (
|
||||
IN VOID *StartAddress,
|
||||
IN UINTN SizeInBytes
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Flushing the CPU instruction cache.
|
||||
|
||||
Arguments:
|
||||
|
||||
StartAddress - Start address to flush
|
||||
SizeInBytes - Length in bytes to flush
|
||||
|
||||
Returns:
|
||||
|
||||
None
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
#endif
|
214
EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/Ipf/ia_64gen.h
Normal file
214
EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/Ipf/ia_64gen.h
Normal file
@@ -0,0 +1,214 @@
|
||||
//
|
||||
//
|
||||
//
|
||||
// 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: ia_64gen.h
|
||||
//
|
||||
//
|
||||
//Abstract:
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//Revision History
|
||||
//
|
||||
//
|
||||
#ifndef _IA64GEN_H
|
||||
#define _IA64GEN_H
|
||||
|
||||
#define TT_UNAT 0
|
||||
#define C_PSR 0
|
||||
#define J_UNAT 0
|
||||
#define T_TYPE 0
|
||||
#define T_IPSR 0x8
|
||||
#define T_ISR 0x10
|
||||
#define T_IIP 0x18
|
||||
#define T_IFA 0x20
|
||||
#define T_IIPA 0x28
|
||||
#define T_IFS 0x30
|
||||
#define T_IIM 0x38
|
||||
#define T_RSC 0x40
|
||||
#define T_BSP 0x48
|
||||
#define T_BSPSTORE 0x50
|
||||
#define T_RNAT 0x58
|
||||
#define T_PFS 0x60
|
||||
#define T_KBSPSTORE 0x68
|
||||
#define T_UNAT 0x70
|
||||
#define T_CCV 0x78
|
||||
#define T_DCR 0x80
|
||||
#define T_PREDS 0x88
|
||||
#define T_NATS 0x90
|
||||
#define T_R1 0x98
|
||||
#define T_GP 0x98
|
||||
#define T_R2 0xa0
|
||||
#define T_R3 0xa8
|
||||
#define T_R4 0xb0
|
||||
#define T_R5 0xb8
|
||||
#define T_R6 0xc0
|
||||
#define T_R7 0xc8
|
||||
#define T_R8 0xd0
|
||||
#define T_R9 0xd8
|
||||
#define T_R10 0xe0
|
||||
#define T_R11 0xe8
|
||||
#define T_R12 0xf0
|
||||
#define T_SP 0xf0
|
||||
#define T_R13 0xf8
|
||||
#define T_R14 0x100
|
||||
#define T_R15 0x108
|
||||
#define T_R16 0x110
|
||||
#define T_R17 0x118
|
||||
#define T_R18 0x120
|
||||
#define T_R19 0x128
|
||||
#define T_R20 0x130
|
||||
#define T_R21 0x138
|
||||
#define T_R22 0x140
|
||||
#define T_R23 0x148
|
||||
#define T_R24 0x150
|
||||
#define T_R25 0x158
|
||||
#define T_R26 0x160
|
||||
#define T_R27 0x168
|
||||
#define T_R28 0x170
|
||||
#define T_R29 0x178
|
||||
#define T_R30 0x180
|
||||
#define T_R31 0x188
|
||||
#define T_F2 0x1f0
|
||||
#define T_F3 0x200
|
||||
#define T_F4 0x210
|
||||
#define T_F5 0x220
|
||||
#define T_F6 0x230
|
||||
#define T_F7 0x240
|
||||
#define T_F8 0x250
|
||||
#define T_F9 0x260
|
||||
#define T_F10 0x270
|
||||
#define T_F11 0x280
|
||||
#define T_F12 0x290
|
||||
#define T_F13 0x2a0
|
||||
#define T_F14 0x2b0
|
||||
#define T_F15 0x2c0
|
||||
#define T_F16 0x2d0
|
||||
#define T_F17 0x2e0
|
||||
#define T_F18 0x2f0
|
||||
#define T_F19 0x300
|
||||
#define T_F20 0x310
|
||||
#define T_F21 0x320
|
||||
#define T_F22 0x330
|
||||
#define T_F23 0x340
|
||||
#define T_F24 0x350
|
||||
#define T_F25 0x360
|
||||
#define T_F26 0x370
|
||||
#define T_F27 0x380
|
||||
#define T_F28 0x390
|
||||
#define T_F29 0x3a0
|
||||
#define T_F30 0x3b0
|
||||
#define T_F31 0x3c0
|
||||
#define T_FPSR 0x1e0
|
||||
#define T_B0 0x190
|
||||
#define T_B1 0x198
|
||||
#define T_B2 0x1a0
|
||||
#define T_B3 0x1a8
|
||||
#define T_B4 0x1b0
|
||||
#define T_B5 0x1b8
|
||||
#define T_B6 0x1c0
|
||||
#define T_B7 0x1c8
|
||||
#define T_EC 0x1d0
|
||||
#define T_LC 0x1d8
|
||||
#define J_NATS 0x8
|
||||
#define J_PFS 0x10
|
||||
#define J_BSP 0x18
|
||||
#define J_RNAT 0x20
|
||||
#define J_PREDS 0x28
|
||||
#define J_LC 0x30
|
||||
#define J_R4 0x38
|
||||
#define J_R5 0x40
|
||||
#define J_R6 0x48
|
||||
#define J_R7 0x50
|
||||
#define J_SP 0x58
|
||||
#define J_F2 0x60
|
||||
#define J_F3 0x70
|
||||
#define J_F4 0x80
|
||||
#define J_F5 0x90
|
||||
#define J_F16 0xa0
|
||||
#define J_F17 0xb0
|
||||
#define J_F18 0xc0
|
||||
#define J_F19 0xd0
|
||||
#define J_F20 0xe0
|
||||
#define J_F21 0xf0
|
||||
#define J_F22 0x100
|
||||
#define J_F23 0x110
|
||||
#define J_F24 0x120
|
||||
#define J_F25 0x130
|
||||
#define J_F26 0x140
|
||||
#define J_F27 0x150
|
||||
#define J_F28 0x160
|
||||
#define J_F29 0x170
|
||||
#define J_F30 0x180
|
||||
#define J_F31 0x190
|
||||
#define J_FPSR 0x1a0
|
||||
#define J_B0 0x1a8
|
||||
#define J_B1 0x1b0
|
||||
#define J_B2 0x1b8
|
||||
#define J_B3 0x1c0
|
||||
#define J_B4 0x1c8
|
||||
#define J_B5 0x1d0
|
||||
#define TRAP_FRAME_LENGTH 0x3d0
|
||||
#define C_UNAT 0x28
|
||||
#define C_NATS 0x30
|
||||
#define C_PFS 0x8
|
||||
#define C_BSPSTORE 0x10
|
||||
#define C_RNAT 0x18
|
||||
#define C_RSC 0x20
|
||||
#define C_PREDS 0x38
|
||||
#define C_LC 0x40
|
||||
#define C_DCR 0x48
|
||||
#define C_R1 0x50
|
||||
#define C_GP 0x50
|
||||
#define C_R4 0x58
|
||||
#define C_R5 0x60
|
||||
#define C_R6 0x68
|
||||
#define C_R7 0x70
|
||||
#define C_SP 0x78
|
||||
#define C_R13 0x80
|
||||
#define C_F2 0x90
|
||||
#define C_F3 0xa0
|
||||
#define C_F4 0xb0
|
||||
#define C_F5 0xc0
|
||||
#define C_F16 0xd0
|
||||
#define C_F17 0xe0
|
||||
#define C_F18 0xf0
|
||||
#define C_F19 0x100
|
||||
#define C_F20 0x110
|
||||
#define C_F21 0x120
|
||||
#define C_F22 0x130
|
||||
#define C_F23 0x140
|
||||
#define C_F24 0x150
|
||||
#define C_F25 0x160
|
||||
#define C_F26 0x170
|
||||
#define C_F27 0x180
|
||||
#define C_F28 0x190
|
||||
#define C_F29 0x1a0
|
||||
#define C_F30 0x1b0
|
||||
#define C_F31 0x1c0
|
||||
#define C_FPSR 0x1d0
|
||||
#define C_B0 0x1d8
|
||||
#define C_B1 0x1e0
|
||||
#define C_B2 0x1e8
|
||||
#define C_B3 0x1f0
|
||||
#define C_B4 0x1f8
|
||||
#define C_B5 0x200
|
||||
#define TT_R2 0x8
|
||||
#define TT_R3 0x10
|
||||
#define TT_R8 0x18
|
||||
#define TT_R9 0x20
|
||||
#define TT_R10 0x28
|
||||
#define TT_R11 0x30
|
||||
#define TT_R14 0x38
|
||||
|
||||
#endif _IA64GEN_H
|
139
EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/Ipf/math.c
Normal file
139
EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/Ipf/math.c
Normal file
@@ -0,0 +1,139 @@
|
||||
/*++
|
||||
|
||||
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:
|
||||
|
||||
math.c
|
||||
|
||||
Abstract:
|
||||
|
||||
64-bit Math worker functions for Intel Itanium(TM) processors.
|
||||
|
||||
--*/
|
||||
|
||||
#include "Tiano.h"
|
||||
#include "Pei.h"
|
||||
#include "PeiLib.h"
|
||||
|
||||
UINT64
|
||||
LShiftU64 (
|
||||
IN UINT64 Operand,
|
||||
IN UINTN Count
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
This routine allows a 64 bit value to be left shifted by 32 bits and
|
||||
returns the shifted value.
|
||||
Count is valid up 63. (Only Bits 0-5 is valid for Count)
|
||||
|
||||
Arguments:
|
||||
|
||||
Operand - Value to be shifted
|
||||
Count - Number of times to shift left.
|
||||
|
||||
Returns:
|
||||
|
||||
Value shifted left identified by the Count.
|
||||
|
||||
--*/
|
||||
{
|
||||
return Operand << Count;
|
||||
}
|
||||
|
||||
UINT64
|
||||
RShiftU64 (
|
||||
IN UINT64 Operand,
|
||||
IN UINTN Count
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
This routine allows a 64 bit value to be right shifted by 32 bits and returns the
|
||||
shifted value.
|
||||
Count is valid up 63. (Only Bits 0-5 is valid for Count)
|
||||
|
||||
Arguments:
|
||||
|
||||
Operand - Value to be shifted
|
||||
Count - Number of times to shift right.
|
||||
|
||||
Returns:
|
||||
|
||||
Value shifted right identified by the Count.
|
||||
|
||||
--*/
|
||||
{
|
||||
return Operand >> Count;
|
||||
}
|
||||
|
||||
UINT64
|
||||
MultU64x32 (
|
||||
IN UINT64 Multiplicand,
|
||||
IN UINTN Multiplier
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
This routine allows a 64 bit value to be multiplied with a 32 bit
|
||||
value returns 64bit result.
|
||||
No checking if the result is greater than 64bits
|
||||
|
||||
Arguments:
|
||||
|
||||
Multiplicand - multiplicand
|
||||
Multiplier - multiplier
|
||||
|
||||
Returns:
|
||||
|
||||
Multiplicand * Multiplier
|
||||
|
||||
--*/
|
||||
{
|
||||
return Multiplicand * Multiplier;
|
||||
}
|
||||
|
||||
UINT64
|
||||
DivU64x32 (
|
||||
IN UINT64 Dividend,
|
||||
IN UINTN Divisor,
|
||||
OUT UINTN *Remainder OPTIONAL
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
This routine allows a 64 bit value to be divided with a 32 bit value returns
|
||||
64bit result and the Remainder.
|
||||
N.B. only works for 31bit divisors!!
|
||||
|
||||
Arguments:
|
||||
|
||||
Dividend - dividend
|
||||
Divisor - divisor
|
||||
Remainder - buffer for remainder
|
||||
|
||||
Returns:
|
||||
|
||||
Dividend / Divisor
|
||||
Remainder = Dividend mod Divisor
|
||||
|
||||
--*/
|
||||
{
|
||||
if (Remainder) {
|
||||
*Remainder = Dividend % Divisor;
|
||||
}
|
||||
|
||||
return Dividend / Divisor;
|
||||
}
|
106
EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/Ipf/pioflush.s
Normal file
106
EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/Ipf/pioflush.s
Normal file
@@ -0,0 +1,106 @@
|
||||
//++
|
||||
// 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:
|
||||
//
|
||||
// pioflush.s
|
||||
//
|
||||
// Abstract:
|
||||
//
|
||||
//
|
||||
// Revision History:
|
||||
//
|
||||
//--
|
||||
|
||||
.file "pioflush.c"
|
||||
.radix D
|
||||
.section .text, "ax", "progbits"
|
||||
.align 32
|
||||
.section .pdata, "a", "progbits"
|
||||
.align 4
|
||||
.section .xdata, "a", "progbits"
|
||||
.align 8
|
||||
.section .data, "wa", "progbits"
|
||||
.align 16
|
||||
.section .rdata, "a", "progbits"
|
||||
.align 16
|
||||
.section .bss, "wa", "nobits"
|
||||
.align 16
|
||||
.section .tls$, "was", "progbits"
|
||||
.align 16
|
||||
.section .sdata, "was", "progbits"
|
||||
.align 16
|
||||
.section .sbss, "was", "nobits"
|
||||
.align 16
|
||||
.section .srdata, "as", "progbits"
|
||||
.align 16
|
||||
.section .rdata, "a", "progbits"
|
||||
.align 16
|
||||
.section .rtcode, "ax", "progbits"
|
||||
.align 32
|
||||
.type RtPioICacheFlush# ,@function
|
||||
.global RtPioICacheFlush#
|
||||
// Function compile flags: /Ogsy
|
||||
.section .rtcode
|
||||
|
||||
// Begin code for function: RtPioICacheFlush:
|
||||
.proc RtPioICacheFlush#
|
||||
.align 32
|
||||
RtPioICacheFlush:
|
||||
// File e:\tmp\pioflush.c
|
||||
{ .mii //R-Addr: 0X00
|
||||
alloc r3=2, 0, 0, 0 //11, 00000002H
|
||||
cmp4.leu p0,p6=32, r33;; //15, 00000020H
|
||||
(p6) mov r33=32;; //16, 00000020H
|
||||
}
|
||||
{ .mii //R-Addr: 0X010
|
||||
nop.m 0
|
||||
zxt4 r29=r33;; //21
|
||||
dep.z r30=r29, 0, 5;; //21, 00000005H
|
||||
}
|
||||
{ .mii //R-Addr: 0X020
|
||||
cmp4.eq p0,p7=r0, r30 //21
|
||||
shr.u r28=r29, 5;; //19, 00000005H
|
||||
(p7) adds r28=1, r28;; //22, 00000001H
|
||||
}
|
||||
{ .mii //R-Addr: 0X030
|
||||
nop.m 0
|
||||
shl r27=r28, 5;; //25, 00000005H
|
||||
zxt4 r26=r27;; //25
|
||||
}
|
||||
{ .mfb //R-Addr: 0X040
|
||||
add r31=r26, r32 //25
|
||||
nop.f 0
|
||||
nop.b 0
|
||||
}
|
||||
$L143:
|
||||
{ .mii //R-Addr: 0X050
|
||||
fc r32 //27
|
||||
adds r32=32, r32;; //28, 00000020H
|
||||
cmp.ltu p14,p15=r32, r31 //29
|
||||
}
|
||||
{ .mfb //R-Addr: 0X060
|
||||
nop.m 0
|
||||
nop.f 0
|
||||
(p14) br.cond.dptk.few $L143#;; //29, 880000/120000
|
||||
}
|
||||
{ .mmi
|
||||
sync.i;;
|
||||
srlz.i
|
||||
nop.i 0;;
|
||||
}
|
||||
{ .mfb //R-Addr: 0X070
|
||||
nop.m 0
|
||||
nop.f 0
|
||||
br.ret.sptk.few b0;; //31
|
||||
}
|
||||
// End code for function:
|
||||
.endp RtPioICacheFlush#
|
||||
// END
|
@@ -0,0 +1,118 @@
|
||||
/*++
|
||||
|
||||
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:
|
||||
|
||||
Processor.c
|
||||
|
||||
Abstract:
|
||||
|
||||
--*/
|
||||
|
||||
#include "Tiano.h"
|
||||
#include "EfiJump.h"
|
||||
#include "PeiHob.h"
|
||||
#include EFI_GUID_DEFINITION (PeiFlushInstructionCache)
|
||||
#include EFI_GUID_DEFINITION (PeiTransferControl)
|
||||
|
||||
EFI_STATUS
|
||||
WinNtFlushInstructionCacheFlush (
|
||||
IN EFI_PEI_FLUSH_INSTRUCTION_CACHE_PROTOCOL *This,
|
||||
IN EFI_PHYSICAL_ADDRESS Start,
|
||||
IN UINT64 Length
|
||||
);
|
||||
|
||||
EFI_PEI_TRANSFER_CONTROL_PROTOCOL mTransferControl = {
|
||||
SetJump,
|
||||
LongJump,
|
||||
sizeof (EFI_JUMP_BUFFER)
|
||||
};
|
||||
|
||||
EFI_PEI_FLUSH_INSTRUCTION_CACHE_PROTOCOL mFlushInstructionCache = {
|
||||
WinNtFlushInstructionCacheFlush
|
||||
};
|
||||
|
||||
EFI_STATUS
|
||||
InstallEfiPeiTransferControl (
|
||||
IN OUT EFI_PEI_TRANSFER_CONTROL_PROTOCOL **This
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Installs the pointer to the transfer control mechanism
|
||||
|
||||
Arguments:
|
||||
|
||||
This - Pointer to transfer control mechanism.
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_SUCCESS - Successfully installed.
|
||||
|
||||
--*/
|
||||
{
|
||||
*This = &mTransferControl;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
InstallEfiPeiFlushInstructionCache (
|
||||
IN OUT EFI_PEI_FLUSH_INSTRUCTION_CACHE_PROTOCOL **This
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Installs the pointer to the flush instruction cache mechanism
|
||||
|
||||
Arguments:
|
||||
|
||||
This - Pointer to flush instruction cache mechanism.
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_SUCCESS - Successfully installed
|
||||
|
||||
--*/
|
||||
{
|
||||
*This = &mFlushInstructionCache;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
WinNtFlushInstructionCacheFlush (
|
||||
IN EFI_PEI_FLUSH_INSTRUCTION_CACHE_PROTOCOL *This,
|
||||
IN EFI_PHYSICAL_ADDRESS Start,
|
||||
IN UINT64 Length
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
This routine would provide support for flushing the CPU instruction cache.
|
||||
|
||||
Arguments:
|
||||
|
||||
This - Pointer to CPU Architectural Protocol interface
|
||||
Start - Start adddress in memory to flush
|
||||
Length - Length of memory to flush
|
||||
|
||||
Returns:
|
||||
|
||||
Status
|
||||
EFI_SUCCESS
|
||||
|
||||
--*/
|
||||
{
|
||||
RtPioICacheFlush ((UINT8 *) Start, (UINTN) Length);
|
||||
return EFI_SUCCESS;
|
||||
}
|
325
EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/Ipf/setjmp.s
Normal file
325
EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/Ipf/setjmp.s
Normal file
@@ -0,0 +1,325 @@
|
||||
//++
|
||||
// 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:
|
||||
//
|
||||
// setjmp.s
|
||||
//
|
||||
// Abstract:
|
||||
//
|
||||
// Contains an implementation of setjmp and longjmp for the
|
||||
// Itanium-based architecture.
|
||||
//
|
||||
//
|
||||
//
|
||||
// Revision History:
|
||||
//
|
||||
//--
|
||||
|
||||
.file "setjmp.s"
|
||||
|
||||
#include <asm.h>
|
||||
#include <ia_64gen.h>
|
||||
|
||||
// int SetJump(struct jmp_buffer save)
|
||||
//
|
||||
// Setup a non-local goto.
|
||||
//
|
||||
// Description:
|
||||
//
|
||||
// SetJump stores the current register set in the area pointed to
|
||||
// by "save". It returns zero. Subsequent calls to "LongJump" will
|
||||
// restore the registers and return non-zero to the same location.
|
||||
//
|
||||
// On entry, r32 contains the pointer to the jmp_buffer
|
||||
//
|
||||
|
||||
PROCEDURE_ENTRY(SetJump)
|
||||
//
|
||||
// Make sure buffer is aligned at 16byte boundary
|
||||
//
|
||||
mov r32 = r33
|
||||
|
||||
add r10 = -0x10,r0 ;; // mask the lower 4 bits
|
||||
and r32 = r32, r10;;
|
||||
add r32 = 0x10, r32;; // move to next 16 byte boundary
|
||||
|
||||
add r10 = J_PREDS, r32 // skip Unats & pfs save area
|
||||
add r11 = J_BSP, r32
|
||||
//
|
||||
// save immediate context
|
||||
//
|
||||
mov r2 = ar.bsp // save backing store pointer
|
||||
mov r3 = pr // save predicates
|
||||
;;
|
||||
//
|
||||
// save user Unat register
|
||||
//
|
||||
mov r16 = ar.lc // save loop count register
|
||||
mov r14 = ar.unat // save user Unat register
|
||||
|
||||
st8 [r10] = r3, J_LC-J_PREDS
|
||||
st8 [r11] = r2, J_R4-J_BSP
|
||||
;;
|
||||
st8 [r10] = r16, J_R5-J_LC
|
||||
st8 [r32] = r14, J_NATS // Note: Unat at the
|
||||
// beginning of the save area
|
||||
mov r15 = ar.pfs
|
||||
;;
|
||||
//
|
||||
// save preserved general registers & NaT's
|
||||
//
|
||||
st8.spill [r11] = r4, J_R6-J_R4
|
||||
;;
|
||||
st8.spill [r10] = r5, J_R7-J_R5
|
||||
;;
|
||||
st8.spill [r11] = r6, J_SP-J_R6
|
||||
;;
|
||||
st8.spill [r10] = r7, J_F3-J_R7
|
||||
;;
|
||||
st8.spill [r11] = sp, J_F2-J_SP
|
||||
;;
|
||||
//
|
||||
// save spilled Unat and pfs registers
|
||||
//
|
||||
mov r2 = ar.unat // save Unat register after spill
|
||||
;;
|
||||
st8 [r32] = r2, J_PFS-J_NATS // save unat for spilled regs
|
||||
;;
|
||||
st8 [r32] = r15 // save pfs
|
||||
//
|
||||
// save floating registers
|
||||
//
|
||||
stf.spill [r11] = f2, J_F4-J_F2
|
||||
stf.spill [r10] = f3, J_F5-J_F3
|
||||
;;
|
||||
stf.spill [r11] = f4, J_F16-J_F4
|
||||
stf.spill [r10] = f5, J_F17-J_F5
|
||||
;;
|
||||
stf.spill [r11] = f16, J_F18-J_F16
|
||||
stf.spill [r10] = f17, J_F19-J_F17
|
||||
;;
|
||||
stf.spill [r11] = f18, J_F20-J_F18
|
||||
stf.spill [r10] = f19, J_F21-J_F19
|
||||
;;
|
||||
stf.spill [r11] = f20, J_F22-J_F20
|
||||
stf.spill [r10] = f21, J_F23-J_F21
|
||||
;;
|
||||
stf.spill [r11] = f22, J_F24-J_F22
|
||||
stf.spill [r10] = f23, J_F25-J_F23
|
||||
;;
|
||||
stf.spill [r11] = f24, J_F26-J_F24
|
||||
stf.spill [r10] = f25, J_F27-J_F25
|
||||
;;
|
||||
stf.spill [r11] = f26, J_F28-J_F26
|
||||
stf.spill [r10] = f27, J_F29-J_F27
|
||||
;;
|
||||
stf.spill [r11] = f28, J_F30-J_F28
|
||||
stf.spill [r10] = f29, J_F31-J_F29
|
||||
;;
|
||||
stf.spill [r11] = f30, J_FPSR-J_F30
|
||||
stf.spill [r10] = f31, J_B0-J_F31 // size of f31 + fpsr
|
||||
//
|
||||
// save FPSR register & branch registers
|
||||
//
|
||||
mov r2 = ar.fpsr // save fpsr register
|
||||
mov r3 = b0
|
||||
;;
|
||||
st8 [r11] = r2, J_B1-J_FPSR
|
||||
st8 [r10] = r3, J_B2-J_B0
|
||||
mov r2 = b1
|
||||
mov r3 = b2
|
||||
;;
|
||||
st8 [r11] = r2, J_B3-J_B1
|
||||
st8 [r10] = r3, J_B4-J_B2
|
||||
mov r2 = b3
|
||||
mov r3 = b4
|
||||
;;
|
||||
st8 [r11] = r2, J_B5-J_B3
|
||||
st8 [r10] = r3
|
||||
mov r2 = b5
|
||||
;;
|
||||
st8 [r11] = r2
|
||||
;;
|
||||
//
|
||||
// return
|
||||
//
|
||||
mov r8 = r0 // return 0 from setjmp
|
||||
mov ar.unat = r14 // restore unat
|
||||
br.ret.sptk b0
|
||||
|
||||
PROCEDURE_EXIT(SetJump)
|
||||
|
||||
|
||||
//
|
||||
// void LongJump(struct jmp_buffer *)
|
||||
//
|
||||
// Perform a non-local goto.
|
||||
//
|
||||
// Description:
|
||||
//
|
||||
// LongJump initializes the register set to the values saved by a
|
||||
// previous 'SetJump' and jumps to the return location saved by that
|
||||
// 'SetJump'. This has the effect of unwinding the stack and returning
|
||||
// for a second time to the 'SetJump'.
|
||||
//
|
||||
|
||||
PROCEDURE_ENTRY(LongJump)
|
||||
//
|
||||
// Make sure buffer is aligned at 16byte boundary
|
||||
//
|
||||
mov r32 = r33
|
||||
|
||||
add r10 = -0x10,r0 ;; // mask the lower 4 bits
|
||||
and r32 = r32, r10;;
|
||||
add r32 = 0x10, r32;; // move to next 16 byte boundary
|
||||
|
||||
//
|
||||
// caching the return value as we do invala in the end
|
||||
//
|
||||
/// mov r8 = r33 // return value
|
||||
mov r8 = 1 // For now return hard coded 1
|
||||
|
||||
//
|
||||
// get immediate context
|
||||
//
|
||||
mov r14 = ar.rsc // get user RSC conf
|
||||
add r10 = J_PFS, r32 // get address of pfs
|
||||
add r11 = J_NATS, r32
|
||||
;;
|
||||
ld8 r15 = [r10], J_BSP-J_PFS // get pfs
|
||||
ld8 r2 = [r11], J_LC-J_NATS // get unat for spilled regs
|
||||
;;
|
||||
mov ar.unat = r2
|
||||
;;
|
||||
ld8 r16 = [r10], J_PREDS-J_BSP // get backing store pointer
|
||||
mov ar.rsc = r0 // put RSE in enforced lazy
|
||||
mov ar.pfs = r15
|
||||
;;
|
||||
|
||||
//
|
||||
// while returning from longjmp the BSPSTORE and BSP needs to be
|
||||
// same and discard all the registers allocated after we did
|
||||
// setjmp. Also, we need to generate the RNAT register since we
|
||||
// did not flushed the RSE on setjmp.
|
||||
//
|
||||
mov r17 = ar.bspstore // get current BSPSTORE
|
||||
;;
|
||||
cmp.ltu p6,p7 = r17, r16 // is it less than BSP of
|
||||
(p6) br.spnt.few .flush_rse
|
||||
mov r19 = ar.rnat // get current RNAT
|
||||
;;
|
||||
loadrs // invalidate dirty regs
|
||||
br.sptk.many .restore_rnat // restore RNAT
|
||||
|
||||
.flush_rse:
|
||||
flushrs
|
||||
;;
|
||||
mov r19 = ar.rnat // get current RNAT
|
||||
mov r17 = r16 // current BSPSTORE
|
||||
;;
|
||||
.restore_rnat:
|
||||
//
|
||||
// check if RNAT is saved between saved BSP and curr BSPSTORE
|
||||
//
|
||||
dep r18 = 1,r16,3,6 // get RNAT address
|
||||
;;
|
||||
cmp.ltu p8,p9 = r18, r17 // RNAT saved on RSE
|
||||
;;
|
||||
(p8) ld8 r19 = [r18] // get RNAT from RSE
|
||||
;;
|
||||
mov ar.bspstore = r16 // set new BSPSTORE
|
||||
;;
|
||||
mov ar.rnat = r19 // restore RNAT
|
||||
mov ar.rsc = r14 // restore RSC conf
|
||||
|
||||
|
||||
ld8 r3 = [r11], J_R4-J_LC // get lc register
|
||||
ld8 r2 = [r10], J_R5-J_PREDS // get predicates
|
||||
;;
|
||||
mov pr = r2, -1
|
||||
mov ar.lc = r3
|
||||
//
|
||||
// restore preserved general registers & NaT's
|
||||
//
|
||||
ld8.fill r4 = [r11], J_R6-J_R4
|
||||
;;
|
||||
ld8.fill r5 = [r10], J_R7-J_R5
|
||||
ld8.fill r6 = [r11], J_SP-J_R6
|
||||
;;
|
||||
ld8.fill r7 = [r10], J_F2-J_R7
|
||||
ld8.fill sp = [r11], J_F3-J_SP
|
||||
;;
|
||||
//
|
||||
// restore floating registers
|
||||
//
|
||||
ldf.fill f2 = [r10], J_F4-J_F2
|
||||
ldf.fill f3 = [r11], J_F5-J_F3
|
||||
;;
|
||||
ldf.fill f4 = [r10], J_F16-J_F4
|
||||
ldf.fill f5 = [r11], J_F17-J_F5
|
||||
;;
|
||||
ldf.fill f16 = [r10], J_F18-J_F16
|
||||
ldf.fill f17 = [r11], J_F19-J_F17
|
||||
;;
|
||||
ldf.fill f18 = [r10], J_F20-J_F18
|
||||
ldf.fill f19 = [r11], J_F21-J_F19
|
||||
;;
|
||||
ldf.fill f20 = [r10], J_F22-J_F20
|
||||
ldf.fill f21 = [r11], J_F23-J_F21
|
||||
;;
|
||||
ldf.fill f22 = [r10], J_F24-J_F22
|
||||
ldf.fill f23 = [r11], J_F25-J_F23
|
||||
;;
|
||||
ldf.fill f24 = [r10], J_F26-J_F24
|
||||
ldf.fill f25 = [r11], J_F27-J_F25
|
||||
;;
|
||||
ldf.fill f26 = [r10], J_F28-J_F26
|
||||
ldf.fill f27 = [r11], J_F29-J_F27
|
||||
;;
|
||||
ldf.fill f28 = [r10], J_F30-J_F28
|
||||
ldf.fill f29 = [r11], J_F31-J_F29
|
||||
;;
|
||||
ldf.fill f30 = [r10], J_FPSR-J_F30
|
||||
ldf.fill f31 = [r11], J_B0-J_F31 ;;
|
||||
|
||||
//
|
||||
// restore branch registers and fpsr
|
||||
//
|
||||
ld8 r16 = [r10], J_B1-J_FPSR // get fpsr
|
||||
ld8 r17 = [r11], J_B2-J_B0 // get return pointer
|
||||
;;
|
||||
mov ar.fpsr = r16
|
||||
mov b0 = r17
|
||||
ld8 r2 = [r10], J_B3-J_B1
|
||||
ld8 r3 = [r11], J_B4-J_B2
|
||||
;;
|
||||
mov b1 = r2
|
||||
mov b2 = r3
|
||||
ld8 r2 = [r10], J_B5-J_B3
|
||||
ld8 r3 = [r11]
|
||||
;;
|
||||
mov b3 = r2
|
||||
mov b4 = r3
|
||||
ld8 r2 = [r10]
|
||||
ld8 r21 = [r32] // get user unat
|
||||
;;
|
||||
mov b5 = r2
|
||||
mov ar.unat = r21
|
||||
|
||||
//
|
||||
// invalidate ALAT
|
||||
//
|
||||
invala ;;
|
||||
|
||||
br.ret.sptk b0
|
||||
PROCEDURE_EXIT(LongJump)
|
||||
|
||||
|
Reference in New Issue
Block a user