Initial import.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
149
EdkModulePkg/Library/EdkDxeSalLib/Ipf/AsmEsalServiceLib.s
Normal file
149
EdkModulePkg/Library/EdkDxeSalLib/Ipf/AsmEsalServiceLib.s
Normal file
@@ -0,0 +1,149 @@
|
||||
//++
|
||||
// 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:
|
||||
//
|
||||
// EsalLib.s
|
||||
//
|
||||
// Abstract:
|
||||
//
|
||||
//
|
||||
// Revision History:
|
||||
//
|
||||
//--
|
||||
|
||||
.file "EsalLib.s"
|
||||
|
||||
#include "IpfMacro.i"
|
||||
|
||||
//
|
||||
// Exports
|
||||
//
|
||||
.global GetEsalEntryPoint
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//++
|
||||
// GetEsalEntryPoint
|
||||
//
|
||||
// Return Esal global and PSR register.
|
||||
//
|
||||
// On Entry :
|
||||
//
|
||||
//
|
||||
// Return Value:
|
||||
// r8 = EFI_SAL_SUCCESS
|
||||
// r9 = Physical Plabel
|
||||
// r10 = Virtual Plabel
|
||||
// r11 = psr
|
||||
//
|
||||
// As per static calling conventions.
|
||||
//
|
||||
//--
|
||||
//---------------------------------------------------------------------------
|
||||
PROCEDURE_ENTRY (GetEsalEntryPoint)
|
||||
|
||||
NESTED_SETUP (0,8,0,0)
|
||||
|
||||
EsalCalcStart:
|
||||
mov r8 = ip;;
|
||||
add r8 = (EsalEntryPoint - EsalCalcStart), r8;;
|
||||
mov r9 = r8;;
|
||||
add r10 = 0x10, r8;;
|
||||
mov r11 = psr;;
|
||||
mov r8 = r0;;
|
||||
|
||||
NESTED_RETURN
|
||||
|
||||
PROCEDURE_EXIT (GetEsalEntryPoint)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//++
|
||||
// SetEsalPhysicalEntryPoint
|
||||
//
|
||||
// Set the dispatcher entry point
|
||||
//
|
||||
// On Entry:
|
||||
// in0 = Physical address of Esal Dispatcher
|
||||
// in1 = Physical GP
|
||||
//
|
||||
// Return Value:
|
||||
// r8 = EFI_SAL_SUCCESS
|
||||
//
|
||||
// As per static calling conventions.
|
||||
//
|
||||
//--
|
||||
//---------------------------------------------------------------------------
|
||||
PROCEDURE_ENTRY (SetEsalPhysicalEntryPoint)
|
||||
|
||||
NESTED_SETUP (2,8,0,0)
|
||||
|
||||
EsalCalcStart1:
|
||||
mov r8 = ip;;
|
||||
add r8 = (EsalEntryPoint - EsalCalcStart1), r8;;
|
||||
st8 [r8] = in0;;
|
||||
add r8 = 0x08, r8;;
|
||||
st8 [r8] = in1;;
|
||||
mov r8 = r0;;
|
||||
|
||||
NESTED_RETURN
|
||||
|
||||
PROCEDURE_EXIT (SetEsalPhysicalEntryPoint)
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//++
|
||||
// SetEsalVirtualEntryPoint
|
||||
//
|
||||
// Register physical address of Esal globals.
|
||||
//
|
||||
// On Entry :
|
||||
// in0 = Virtual address of Esal Dispatcher
|
||||
// in1 = Virtual GP
|
||||
//
|
||||
// Return Value:
|
||||
// r8 = EFI_SAL_ERROR
|
||||
//
|
||||
// As per static calling conventions.
|
||||
//
|
||||
//--
|
||||
//---------------------------------------------------------------------------
|
||||
PROCEDURE_ENTRY (SetEsalVirtualEntryPoint)
|
||||
|
||||
NESTED_SETUP (2,8,0,0)
|
||||
|
||||
EsalCalcStart2:
|
||||
mov r8 = ip;;
|
||||
add r8 = (EsalEntryPoint - EsalCalcStart2), r8;;
|
||||
add r8 = 0x10, r8;;
|
||||
st8 [r8] = in0;;
|
||||
add r8 = 0x08, r8;;
|
||||
st8 [r8] = in1;;
|
||||
mov r8 = r0;;
|
||||
|
||||
NESTED_RETURN
|
||||
|
||||
PROCEDURE_EXIT (SetEsalVirtualEntryPoint)
|
||||
|
||||
|
||||
|
||||
|
||||
.align 32
|
||||
EsalEntryPoint:
|
||||
data8 0 // Physical Entry
|
||||
data8 0 // GP
|
||||
data8 0 // Virtual Entry
|
||||
data8 0 // GP
|
||||
|
||||
|
88
EdkModulePkg/Library/EdkDxeSalLib/Ipf/AsmIpfCpuCache.s
Normal file
88
EdkModulePkg/Library/EdkDxeSalLib/Ipf/AsmIpfCpuCache.s
Normal file
@@ -0,0 +1,88 @@
|
||||
//++
|
||||
// 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:
|
||||
//
|
||||
// IpfCpuCache.s
|
||||
//
|
||||
// Abstract:
|
||||
//
|
||||
// Contains Misc assembly procedures to support IPF CPU AP.
|
||||
//
|
||||
// Revision History:
|
||||
//
|
||||
//--
|
||||
|
||||
.file "IpfCpuCache.s"
|
||||
|
||||
#include "IpfMacro.i"
|
||||
#include "IpfDefines.h"
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//++
|
||||
// Flush Cache
|
||||
//
|
||||
// Arguments :
|
||||
|
||||
// Input = in0 = Starting Address to Flush.
|
||||
// Input = in1 = Length in bytes.
|
||||
// Input = b0 = return branch register.
|
||||
// On Entry :
|
||||
//
|
||||
// Return Value:
|
||||
//
|
||||
// VOID
|
||||
// SalFlushCache (
|
||||
// IN UINT64 BaseToFlush,
|
||||
// IN UINT64 LengthToFlush
|
||||
// );
|
||||
//
|
||||
//--
|
||||
//---------------------------------------------------------------------------
|
||||
PROCEDURE_ENTRY (SalFlushCache)
|
||||
|
||||
NESTED_SETUP (5,8,0,0)
|
||||
|
||||
mov loc2 = ar.lc
|
||||
|
||||
mov loc3 = in0 // Start address.
|
||||
mov loc4 = in1;; // Length in bytes.
|
||||
|
||||
cmp.eq p6,p7 = loc4, r0;; // If Length is zero then don't flush any cache
|
||||
(p6) br.spnt.many DoneFlushingC;;
|
||||
|
||||
add loc4 = loc4,loc3
|
||||
mov loc5 = 1;;
|
||||
sub loc4 = loc4, loc5 ;; // the End address to flush
|
||||
|
||||
dep loc3 = r0,loc3,0,5
|
||||
dep loc4 = r0,loc4,0,5;;
|
||||
shr loc3 = loc3,5
|
||||
shr loc4 = loc4,5;; // 32 byte cache line
|
||||
|
||||
sub loc4 = loc4,loc3;; // total flush count, It should be add 1 but
|
||||
// the br.cloop will first execute one time
|
||||
mov loc3 = in0
|
||||
mov loc5 = 32
|
||||
mov ar.lc = loc4;;
|
||||
|
||||
StillFlushingC:
|
||||
fc loc3;;
|
||||
sync.i;;
|
||||
srlz.i;;
|
||||
add loc3 = loc5,loc3;;
|
||||
br.cloop.sptk.few StillFlushingC;;
|
||||
|
||||
DoneFlushingC:
|
||||
mov ar.lc = loc2
|
||||
NESTED_RETURN
|
||||
|
||||
PROCEDURE_EXIT (SalFlushCache)
|
||||
|
199
EdkModulePkg/Library/EdkDxeSalLib/Ipf/EsalServiceLib.c
Normal file
199
EdkModulePkg/Library/EdkDxeSalLib/Ipf/EsalServiceLib.c
Normal file
@@ -0,0 +1,199 @@
|
||||
/*++
|
||||
|
||||
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:
|
||||
|
||||
EsalServiceLib.c
|
||||
|
||||
Abstract:
|
||||
|
||||
--*/
|
||||
|
||||
#include <Ipf/IpfDefines.h>
|
||||
|
||||
|
||||
STATIC EXTENDED_SAL_BOOT_SERVICE_PROTOCOL *mEsalBootService;
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
DxeSalLibConstruct (
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
||||
Status = gBS->LocateProtocol (&gEfiExtendedSalBootServiceProtocolGuid, NULL, &mEsalBootService);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
RegisterEsalFunction (
|
||||
IN UINT64 FunctionId,
|
||||
IN EFI_GUID *ClassGuid,
|
||||
IN SAL_INTERNAL_EXTENDED_SAL_PROC Function,
|
||||
IN VOID *ModuleGlobal
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Register ESAL Class Function and it's asociated global.
|
||||
This function is boot service only!
|
||||
|
||||
Arguments:
|
||||
FunctionId - ID of function to register
|
||||
ClassGuid - GUID of function class
|
||||
Function - Function to register under ClassGuid/FunctionId pair
|
||||
ModuleGlobal - Module global for Function.
|
||||
|
||||
Returns:
|
||||
EFI_SUCCESS - If ClassGuid/FunctionId Function was registered.
|
||||
|
||||
--*/
|
||||
{
|
||||
return mEsalBootService->AddExtendedSalProc (
|
||||
mEsalBootService,
|
||||
ClassGuid,
|
||||
FunctionId,
|
||||
Function,
|
||||
ModuleGlobal
|
||||
);
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
RegisterEsalClass (
|
||||
IN EFI_GUID *ClassGuid,
|
||||
IN VOID *ModuleGlobal,
|
||||
...
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Register ESAL Class and it's asociated global.
|
||||
This function is boot service only!
|
||||
|
||||
Arguments:
|
||||
ClassGuid - GUID of function class
|
||||
ModuleGlobal - Module global for Function.
|
||||
... - SAL_INTERNAL_EXTENDED_SAL_PROC and FunctionId pairs. NULL
|
||||
indicates the end of the list.
|
||||
|
||||
Returns:
|
||||
EFI_SUCCESS - All members of ClassGuid registered
|
||||
|
||||
--*/
|
||||
{
|
||||
VA_LIST Args;
|
||||
EFI_STATUS Status;
|
||||
SAL_INTERNAL_EXTENDED_SAL_PROC Function;
|
||||
UINT64 FunctionId;
|
||||
EFI_HANDLE NewHandle;
|
||||
|
||||
VA_START (Args, ModuleGlobal);
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
while (!EFI_ERROR (Status)) {
|
||||
Function = (SAL_INTERNAL_EXTENDED_SAL_PROC) VA_ARG (Args, SAL_INTERNAL_EXTENDED_SAL_PROC);
|
||||
if (Function == NULL) {
|
||||
break;
|
||||
}
|
||||
|
||||
FunctionId = VA_ARG (Args, UINT64);
|
||||
|
||||
Status = RegisterEsalFunction (FunctionId, ClassGuid, Function, ModuleGlobal);
|
||||
}
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
NewHandle = NULL;
|
||||
return gBS->InstallProtocolInterface (
|
||||
&NewHandle,
|
||||
ClassGuid,
|
||||
EFI_NATIVE_INTERFACE,
|
||||
NULL
|
||||
);
|
||||
}
|
||||
|
||||
SAL_RETURN_REGS
|
||||
EfiCallEsalService (
|
||||
IN EFI_GUID *ClassGuid,
|
||||
IN UINT64 FunctionId,
|
||||
IN UINT64 Arg2,
|
||||
IN UINT64 Arg3,
|
||||
IN UINT64 Arg4,
|
||||
IN UINT64 Arg5,
|
||||
IN UINT64 Arg6,
|
||||
IN UINT64 Arg7,
|
||||
IN UINT64 Arg8
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Call module that is not linked direclty to this module. This code is IP
|
||||
relative and hides the binding issues of virtual or physical calling. The
|
||||
function that gets dispatched has extra arguments that include the registered
|
||||
module global and a boolean flag to indicate if the system is in virutal mode.
|
||||
|
||||
Arguments:
|
||||
ClassGuid - GUID of function
|
||||
FunctionId - Function in ClassGuid to call
|
||||
Arg2 - Argument 2 ClassGuid/FunctionId defined
|
||||
Arg3 - Argument 3 ClassGuid/FunctionId defined
|
||||
Arg4 - Argument 4 ClassGuid/FunctionId defined
|
||||
Arg5 - Argument 5 ClassGuid/FunctionId defined
|
||||
Arg6 - Argument 6 ClassGuid/FunctionId defined
|
||||
Arg7 - Argument 7 ClassGuid/FunctionId defined
|
||||
Arg8 - Argument 8 ClassGuid/FunctionId defined
|
||||
|
||||
Returns:
|
||||
Status of ClassGuid/FuncitonId
|
||||
|
||||
--*/
|
||||
{
|
||||
SAL_RETURN_REGS ReturnReg;
|
||||
SAL_EXTENDED_SAL_PROC EsalProc;
|
||||
|
||||
ReturnReg = GetEsalEntryPoint ();
|
||||
if (ReturnReg.Status != EFI_SAL_SUCCESS) {
|
||||
return ReturnReg;
|
||||
}
|
||||
|
||||
if (ReturnReg.r11 & PSR_IT_MASK) {
|
||||
//
|
||||
// Virtual mode plabel to entry point
|
||||
//
|
||||
EsalProc = (SAL_EXTENDED_SAL_PROC) ReturnReg.r10;
|
||||
} else {
|
||||
//
|
||||
// Physical mode plabel to entry point
|
||||
//
|
||||
EsalProc = (SAL_EXTENDED_SAL_PROC) ReturnReg.r9;
|
||||
}
|
||||
|
||||
return EsalProc (
|
||||
ClassGuid,
|
||||
FunctionId,
|
||||
Arg2,
|
||||
Arg3,
|
||||
Arg4,
|
||||
Arg5,
|
||||
Arg6,
|
||||
Arg7,
|
||||
Arg8
|
||||
);
|
||||
}
|
Reference in New Issue
Block a user