]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/PeiPalLib/PeiPalLib.c
1. Rename following library instances according to MDE Library Spec:
[mirror_edk2.git] / MdePkg / Library / PeiPalLib / PeiPalLib.c
diff --git a/MdePkg/Library/PeiPalLib/PeiPalLib.c b/MdePkg/Library/PeiPalLib/PeiPalLib.c
new file mode 100644 (file)
index 0000000..07f9f38
--- /dev/null
@@ -0,0 +1,101 @@
+/** @file\r
+  PAL Call Services Function.\r
+\r
+  Copyright (c) 2006 - 2008 Intel Corporation. All rights reserved\r
+  This software and associated documentation (if any) is furnished\r
+  under a license and may only be used or copied in accordance\r
+  with the terms of the license. Except as permitted by such\r
+  license, no part of this software or documentation may be\r
+  reproduced, stored in a retrieval system, or transmitted in any\r
+  form or by any means without the express written consent of\r
+  Intel Corporation.\r
+\r
+  Module Name:  PalCallLib.c\r
+\r
+**/\r
+\r
+\r
+#include <PiPei.h>\r
+\r
+#include <Ppi/SecPlatformInformation.h>\r
+\r
+#include <Library/PalCallLib.h>\r
+#include <Library/PeiServicesTablePointerLib.h>\r
+#include <Library/PeiServicesLib.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/DebugLib.h>\r
+\r
+/**\r
+  Makes a PAL procedure call.\r
+\r
+  This is a wrapper function to make a PAL procedure call.  Based on the Index value,\r
+  this API will make static or stacked PAL call. Architected procedures may be designated\r
+  as required or optional.  If a PAL procedure is specified as optional, a unique return\r
+  code of 0xFFFFFFFFFFFFFFFF is returned in the Status field of the PAL_CALL_RETURN structure.\r
+  This indicates that the procedure is not present in this PAL implementation.  It is the\r
+  caller's responsibility to check for this return code after calling any optional PAL\r
+  procedure. No parameter checking is performed on the 4 input parameters, but there are\r
+  some common rules that the caller should follow when making a PAL call.  Any address\r
+  passed to PAL as buffers for return parameters must be 8-byte aligned.  Unaligned addresses\r
+  may cause undefined results.  For those parameters defined as reserved or some fields\r
+  defined as reserved must be zero filled or the invalid argument return value may be\r
+  returned or undefined result may occur during the execution of the procedure.\r
+  This function is only available on IPF.\r
+\r
+  @param  Index  The PAL procedure Index number.\r
+  @param  Arg2   The 2nd parameter for PAL procedure calls.\r
+  @param  Arg3   The 3rd parameter for PAL procedure calls.\r
+  @param  Arg4   The 4th parameter for PAL procedure calls.\r
+\r
+  @return Structure returned from the PAL Call procedure, including the status and return value.\r
+\r
+**/\r
+PAL_CALL_RETURN\r
+EFIAPI\r
+PalCall (\r
+  IN UINT64                  Index,\r
+  IN UINT64                  Arg2,\r
+  IN UINT64                  Arg3,\r
+  IN UINT64                  Arg4\r
+  )\r
+{\r
+  UINT64                            PalCallAddress;\r
+  PAL_CALL_RETURN                   ReturnVal;\r
+  CONST EFI_PEI_SERVICES            **PeiServices;\r
+  EFI_STATUS                        Status;\r
+  EFI_SEC_PLATFORM_INFORMATION_PPI  *SecPlatformPpi;\r
+  IPF_HANDOFF_STATUS                IpfStatus;\r
+  UINT64                            RecordSize;\r
+\r
+  //\r
+  // Get PEI Service Table Pointer\r
+  //\r
+  PeiServices = GetPeiServicesTablePointer ();\r
+\r
+  //\r
+  // Locate SEC Platform Information PPI\r
+  //\r
+  Status = PeiServicesLocatePpi (\r
+             &gEfiSecPlatformInformationPpiGuid,\r
+             0,\r
+             NULL,\r
+             (VOID **)&SecPlatformPpi\r
+             );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  //\r
+  // Retrieve PAL call address from platform information reported by the PPI\r
+  //\r
+  RecordSize = sizeof (IpfStatus);\r
+  SecPlatformPpi->PlatformInformation (\r
+                    PeiServices,\r
+                    &RecordSize,\r
+                    (EFI_SEC_PLATFORM_INFORMATION_RECORD *) &IpfStatus\r
+                    );\r
+  PalCallAddress = IpfStatus.PalCallAddress;\r
+\r
+  ReturnVal = AsmPalCall (PalCallAddress, Index, Arg2, Arg3, Arg4);\r
+\r
+  return ReturnVal;\r
+}\r
+\r