Add PeiServiceTablePointerLib that uses KR1 to save/restore the PEI Services Table Pointer

This library is only valid for Ipf

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1993 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
mdkinney 2006-11-22 00:41:04 +00:00
parent 9cbd688b1e
commit 9e95f418cc
4 changed files with 237 additions and 0 deletions

View File

@ -0,0 +1,47 @@
//++
//
// Copyright (c) 2006 Intel Corporation. All rights reserved
// This software and associated documentation (if any) is furnished
// under a license and may only be used or copied in accordance
// with the terms of the license. Except as permitted by such
// license, no part of this software or documentation may be
// reproduced, stored in a retrieval system, or transmitted in any
// form or by any means without the express written consent of
// Intel Corporation.
//
//
// Module Name:
//
// ReadKr1.s
//
// Abstract:
//
// Contains assembly code for read Kr1.
//
//--
.file "ReadKr1.s"
#include "IpfMacro.i"
//---------------------------------------------------------------------------------
//++
// AsmReadKr1
//
// This routine is used to get KR1. KR1 is used to store Pei Service Table
// Pointer in archeture.
//
// Arguments :
//
// On Entry : None.
//
// Return Value: Pei Services Table.
//
//--
//----------------------------------------------------------------------------------
PROCEDURE_ENTRY (AsmReadKr1)
mov r8 = ar.k1;; // Pei Services Table Pointer
br.ret.dpnt b0;;
PROCEDURE_EXIT (AsmReadKr1)

View File

@ -0,0 +1,48 @@
//++
//
// Copyright (c) 2006 Intel Corporation. All rights reserved
// This software and associated documentation (if any) is furnished
// under a license and may only be used or copied in accordance
// with the terms of the license. Except as permitted by such
// license, no part of this software or documentation may be
// reproduced, stored in a retrieval system, or transmitted in any
// form or by any means without the express written consent of
// Intel Corporation.
//
//
// Module Name:
//
// WriteKr1.s
//
// Abstract:
//
// Contains assembly code for write Kr1.
//
//--
.file "WriteKr1.s"
#include "IpfMacro.i"
//---------------------------------------------------------------------------------
//++
// AsmWriteKr1
//
// This routine is used to Write KR1. KR1 is used to store Pei Service Table
// Pointer in archeture.
//
// Arguments : r32 Pei Services Table Pointer
//
// On Entry : None.
//
// Return Value: None.
//
//--
//----------------------------------------------------------------------------------
PROCEDURE_ENTRY (AsmWriteKr1)
mov ar.k1 = r32;; // Pei Services Table Pointer
br.ret.dpnt b0;;
PROCEDURE_EXIT (AsmWriteKr1)

View File

@ -0,0 +1,91 @@
/*++
Copyright (c) 2006 Intel Corporation. All rights reserved
This software and associated documentation (if any) is furnished
under a license and may only be used or copied in accordance
with the terms of the license. Except as permitted by such
license, no part of this software or documentation may be
reproduced, stored in a retrieval system, or transmitted in any
form or by any means without the express written consent of
Intel Corporation.
Module Name:
PeiServicesTablePointer.c
Abstract:
PEI Services Table Pointer Library.
--*/
/**
Reads the current value of Kr1.
@return The current value of Kr1.
**/
UINT64
EFIAPI
AsmReadKr1 (
VOID
);
/**
Writes the current value of Kr1.
@param Value The 64-bit value to write to Kr1.
**/
VOID
EFIAPI
AsmWriteKr1 (
IN UINT64 Value
);
/**
The function returns the pointer to PeiServices.
The function returns the pointer to PeiServices.
It will ASSERT() if the pointer to PeiServices is NULL.
@retval The pointer to PeiServices.
**/
EFI_PEI_SERVICES **
EFIAPI
GetPeiServicesTablePointer (
VOID
)
{
EFI_PEI_SERVICES **PeiServices;
PeiServices = (EFI_PEI_SERVICES **)(UINTN)AsmReadKr1 ();
ASSERT (PeiServices != NULL);
return PeiServices;
}
/**
The constructor function caches the pointer to PEI services.
The constructor function caches the pointer to PEI services.
It will always return EFI_SUCCESS.
@param FfsHeader Pointer to FFS header the loaded driver.
@param PeiServices Pointer to the PEI services.
@retval EFI_SUCCESS The constructor always returns EFI_SUCCESS.
**/
EFI_STATUS
EFIAPI
PeiServicesTablePointerLibConstructor (
IN EFI_FFS_FILE_HEADER *FfsHeader,
IN EFI_PEI_SERVICES **PeiServices
)
{
AsmWriteKr1 ((UINT64)(UINTN)PeiServices);
return EFI_SUCCESS;
}

View File

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?>
<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0">
<MsaHeader>
<ModuleName>PeiServicesTablePointerLibKr1</ModuleName>
<ModuleType>PEIM</ModuleType>
<GuidValue>C5F16B67-888F-44ba-ABDB-C2354FB63C49</GuidValue>
<Version>1.0</Version>
<Abstract>Component description file for IPF KR1 Pei Services Table Pointer Library</Abstract>
<Description>PEI Services Table Library implementation that retrieves a pointer to the PEI
Services Table from the KR1 register on IPF.</Description>
<Copyright>Copyright (c) 2006, Intel Corporation.</Copyright>
<License>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.</License>
<Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052</Specification>
</MsaHeader>
<ModuleDefinitions>
<SupportedArchitectures>IPF</SupportedArchitectures>
<BinaryModule>false</BinaryModule>
<OutputFileBasename>PeiServicesTablePointerLibKr1</OutputFileBasename>
</ModuleDefinitions>
<LibraryClassDefinitions>
<LibraryClass Usage="ALWAYS_PRODUCED">
<Keyword>PeiServicesTablePointerLib</Keyword>
</LibraryClass>
<LibraryClass Usage="ALWAYS_CONSUMED">
<Keyword>BaseLib</Keyword>
</LibraryClass>
<LibraryClass Usage="ALWAYS_CONSUMED">
<Keyword>DebugLib</Keyword>
</LibraryClass>
</LibraryClassDefinitions>
<SourceFiles>
<Filename>PeiServicesTablePointer.c</Filename>
<Filename SupArchList="IPF">Ipf/ReadKr1.s</Filename>
<Filename SupArchList="IPF">Ipf/WriteKr1.s</Filename>
</SourceFiles>
<PackageDependencies>
<Package PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
</PackageDependencies>
<Externs>
<Specification>EFI_SPECIFICATION_VERSION 0x00020000</Specification>
<Specification>EDK_RELEASE_VERSION 0x00020000</Specification>
<Extern>
<Constructor>PeiServicesTablePointerLibConstructor</Constructor>
</Extern>
</Externs>
</ModuleSurfaceArea>