Ejemplo n.º 1
0
Archivo: Pcd.c Proyecto: b-man/edk2
/**
  Retrieves the next valid PCD token namespace for a given namespace.

  Gets the next valid token namespace for a given namespace. This is useful to traverse the valid
  token namespaces on a platform.

  @param[in, out]   Guid    An indirect pointer to EFI_GUID. On input it designates a known token
                            namespace from which the search will start. On output, it designates the next valid
                            token namespace on the platform. If *Guid is NULL, then the GUID of the first token
                            space of the current platform is returned. If the search cannot locate the next valid
                            token namespace, an error is returned and the value of *Guid is undefined.

  @retval  EFI_SUCCESS      The PCD service retrieved the value requested.
  @retval  EFI_NOT_FOUND    The PCD service could not find the next valid token namespace.

**/
EFI_STATUS
EFIAPI
DxePcdGetNextTokenSpace (
  IN OUT CONST EFI_GUID               **Guid
  )
{
  UINTN               Idx;
  UINTN               Idx2;
  UINTN               Idx3;
  UINTN               PeiTokenSpaceTableSize;
  UINTN               DxeTokenSpaceTableSize;
  EFI_GUID            **PeiTokenSpaceTable;
  EFI_GUID            **DxeTokenSpaceTable;
  BOOLEAN             Match;
  BOOLEAN             PeiExMapTableEmpty;
  BOOLEAN             DxeExMapTableEmpty;

  ASSERT (Guid != NULL);

  PeiExMapTableEmpty = mPeiExMapTableEmpty;
  DxeExMapTableEmpty = mDxeExMapTableEmpty;

  if (PeiExMapTableEmpty && DxeExMapTableEmpty) {
    return EFI_NOT_FOUND;
  }

  if (TmpTokenSpaceBuffer[0] == NULL) {
    PeiTokenSpaceTableSize = 0;

    if (!PeiExMapTableEmpty) {
      PeiTokenSpaceTableSize = mPeiExMapppingTableSize / sizeof(DYNAMICEX_MAPPING);
      PeiTokenSpaceTable = GetDistinctTokenSpace (&PeiTokenSpaceTableSize,
                            (DYNAMICEX_MAPPING *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->ExMapTableOffset),
                            (EFI_GUID *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->GuidTableOffset)
                            );
      CopyMem (TmpTokenSpaceBuffer, PeiTokenSpaceTable, sizeof (EFI_GUID*) * PeiTokenSpaceTableSize);
      TmpTokenSpaceBufferCount = PeiTokenSpaceTableSize;
      FreePool (PeiTokenSpaceTable);
    }

    if (!DxeExMapTableEmpty) {
      DxeTokenSpaceTableSize = mDxeExMapppingTableSize / sizeof(DYNAMICEX_MAPPING);
      DxeTokenSpaceTable = GetDistinctTokenSpace (&DxeTokenSpaceTableSize,
                            (DYNAMICEX_MAPPING *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->ExMapTableOffset),
                            (EFI_GUID *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->GuidTableOffset)
                            );

      //
      // Make sure EFI_GUID in DxeTokenSpaceTable does not exist in PeiTokenSpaceTable
      //
      for (Idx2 = 0, Idx3 = PeiTokenSpaceTableSize; Idx2 < DxeTokenSpaceTableSize; Idx2++) {
        Match = FALSE;
        for (Idx = 0; Idx < PeiTokenSpaceTableSize; Idx++) {
          if (CompareGuid (TmpTokenSpaceBuffer[Idx], DxeTokenSpaceTable[Idx2])) {
            Match = TRUE;
            break;
          }
        }
        if (!Match) {
          TmpTokenSpaceBuffer[Idx3++] = DxeTokenSpaceTable[Idx2];
        }
      }

      TmpTokenSpaceBufferCount = Idx3;
      FreePool (DxeTokenSpaceTable);
    }
  }

  if (*Guid == NULL) {
    *Guid = TmpTokenSpaceBuffer[0];
    return EFI_SUCCESS;
  }

  for (Idx = 0; Idx < TmpTokenSpaceBufferCount; Idx++) {
    if (CompareGuid (*Guid, TmpTokenSpaceBuffer[Idx])) {
      if (Idx == TmpTokenSpaceBufferCount - 1) {
        //
        // It has been the last token namespace.
        //
        *Guid = NULL;
        return EFI_NOT_FOUND;
      } else {
        Idx++;
        *Guid = TmpTokenSpaceBuffer[Idx];
        return EFI_SUCCESS;
      }
    }
  }

  return EFI_NOT_FOUND;
}
Ejemplo n.º 2
0
/**
  Get next token space in PCD database according to given token space guid.

  @param Guid            Given token space guid. If NULL, then Guid will be set to
                         the first PCD token space in PCD database, If not NULL, then
                         Guid will be set to next PCD token space.

  @retval EFI_UNSUPPORTED
  @retval EFI_NOT_FOUND   If PCD database has no token space table or can not find given
                          token space in PCD database.
  @retval EFI_SUCCESS     Success to get next token space guid.
**/
EFI_STATUS
EFIAPI
DxePcdGetNextTokenSpace (
    IN OUT CONST EFI_GUID               **Guid
)
{
    UINTN               Idx;
    UINTN               Idx2;
    UINTN               Idx3;
    UINTN               PeiTokenSpaceTableSize;
    UINTN               DxeTokenSpaceTableSize;
    EFI_GUID            **PeiTokenSpaceTable;
    EFI_GUID            **DxeTokenSpaceTable;
    BOOLEAN             Match;
    BOOLEAN             PeiExMapTableEmpty;
    BOOLEAN             DxeExMapTableEmpty;

    ASSERT (Guid != NULL);

    PeiExMapTableEmpty = PEI_EXMAP_TABLE_EMPTY;
    DxeExMapTableEmpty = DXE_EXMAP_TABLE_EMPTY;

    if (PeiExMapTableEmpty && DxeExMapTableEmpty) {
        if (*Guid != NULL) {
            return EFI_NOT_FOUND;
        } else {
            return EFI_SUCCESS;
        }
    }


    if (TmpTokenSpaceBuffer[0] == NULL) {
        PeiTokenSpaceTableSize = 0;

        if (!PeiExMapTableEmpty) {
            PeiTokenSpaceTableSize = PEI_EXMAPPING_TABLE_SIZE;
            PeiTokenSpaceTable = GetDistinctTokenSpace (&PeiTokenSpaceTableSize,
                                 mPcdDatabase->PeiDb.Init.ExMapTable,
                                 mPcdDatabase->PeiDb.Init.GuidTable
                                                       );
            CopyMem (TmpTokenSpaceBuffer, PeiTokenSpaceTable, sizeof (EFI_GUID*) * PeiTokenSpaceTableSize);
        }

        if (!DxeExMapTableEmpty) {
            DxeTokenSpaceTableSize = DXE_EXMAPPING_TABLE_SIZE;
            DxeTokenSpaceTable = GetDistinctTokenSpace (&DxeTokenSpaceTableSize,
                                 mPcdDatabase->DxeDb.Init.ExMapTable,
                                 mPcdDatabase->DxeDb.Init.GuidTable
                                                       );

            //
            // Make sure EFI_GUID in DxeTokenSpaceTable does not exist in PeiTokenSpaceTable
            //
            for (Idx2 = 0, Idx3 = PeiTokenSpaceTableSize; Idx2 < DxeTokenSpaceTableSize; Idx2++) {
                Match = FALSE;
                for (Idx = 0; Idx < PeiTokenSpaceTableSize; Idx++) {
                    if (CompareGuid (TmpTokenSpaceBuffer[Idx], DxeTokenSpaceTable[Idx2])) {
                        Match = TRUE;
                        break;
                    }
                }
                if (!Match) {
                    TmpTokenSpaceBuffer[Idx3++] = DxeTokenSpaceTable[Idx2];
                }
            }
        }
    }

    if (*Guid == NULL) {
        *Guid = TmpTokenSpaceBuffer[0];
        return EFI_SUCCESS;
    }

    for (Idx = 0; Idx < (PEI_EXMAPPING_TABLE_SIZE + DXE_EXMAPPING_TABLE_SIZE); Idx++) {
        if(CompareGuid (*Guid, TmpTokenSpaceBuffer[Idx])) {
            Idx++;
            *Guid = TmpTokenSpaceBuffer[Idx];
            return EFI_SUCCESS;
        }
    }

    return EFI_NOT_FOUND;
}