mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-01 12:53:27 +01:00
377 lines
11 KiB
C
377 lines
11 KiB
C
|
/** @file
|
||
|
HII internal header file.
|
||
|
|
||
|
Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
|
||
|
(C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
|
||
|
Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||
|
|
||
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||
|
|
||
|
**/
|
||
|
|
||
|
#ifndef HII_INTERNAL_H_
|
||
|
#define HII_INTERNAL_H_
|
||
|
|
||
|
#include <Uefi.h>
|
||
|
|
||
|
#include <Protocol/UnicodeCollation.h>
|
||
|
#include <Protocol/HiiConfigRouting.h>
|
||
|
#include <Protocol/HiiDatabase.h>
|
||
|
#include <Protocol/UserManager.h>
|
||
|
#include <Protocol/DevicePathFromText.h>
|
||
|
#include <Protocol/RegularExpressionProtocol.h>
|
||
|
|
||
|
#include <Guid/MdeModuleHii.h>
|
||
|
#include <Guid/ZeroGuid.h>
|
||
|
#include <Guid/HiiPlatformSetupFormset.h>
|
||
|
#include <Guid/HiiFormMapMethodGuid.h>
|
||
|
|
||
|
#include <Library/PrintLib.h>
|
||
|
#include <Library/DebugLib.h>
|
||
|
#include <Library/BaseMemoryLib.h>
|
||
|
#include <Library/UefiRuntimeServicesTableLib.h>
|
||
|
#include <Library/UefiBootServicesTableLib.h>
|
||
|
#include <Library/MemoryAllocationLib.h>
|
||
|
#include <Library/HiiLib.h>
|
||
|
#include <Library/DevicePathLib.h>
|
||
|
#include <Library/UefiLib.h>
|
||
|
|
||
|
#include "HiiExpression.h"
|
||
|
#include <Library/HiiUtilityLib.h>
|
||
|
|
||
|
#define EXPRESSION_STACK_SIZE_INCREMENT 0x100
|
||
|
#define EFI_IFR_SPECIFICATION_VERSION (UINT16) (((EFI_SYSTEM_TABLE_REVISION >> 16) << 8) | (((EFI_SYSTEM_TABLE_REVISION & 0xFFFF) / 10) << 4) | ((EFI_SYSTEM_TABLE_REVISION & 0xFFFF) % 10))
|
||
|
|
||
|
///
|
||
|
/// Definition of HII_FORM_CONFIG_REQUEST
|
||
|
//
|
||
|
typedef struct {
|
||
|
UINTN Signature;
|
||
|
LIST_ENTRY Link;
|
||
|
|
||
|
CHAR16 *ConfigRequest; ///< <ConfigRequest> = <ConfigHdr> + <RequestElement>
|
||
|
CHAR16 *ConfigAltResp; ///< Alt config response string for this ConfigRequest.
|
||
|
UINTN ElementCount; ///< Number of <RequestElement> in the <ConfigRequest>
|
||
|
UINTN SpareStrLen;
|
||
|
CHAR16 *RestoreConfigRequest; ///< When submit form fail, the element need to be restored
|
||
|
CHAR16 *SyncConfigRequest; ///< When submit form fail, the element need to be synced
|
||
|
|
||
|
HII_FORMSET_STORAGE *Storage;
|
||
|
} HII_FORM_CONFIG_REQUEST;
|
||
|
|
||
|
#define HII_FORM_CONFIG_REQUEST_SIGNATURE SIGNATURE_32 ('F', 'C', 'R', 'S')
|
||
|
#define HII_FORM_CONFIG_REQUEST_FROM_LINK(a) CR (a, HII_FORM_CONFIG_REQUEST, Link, HII_FORM_CONFIG_REQUEST_SIGNATURE)
|
||
|
|
||
|
///
|
||
|
/// Incremental string length of ConfigRequest
|
||
|
///
|
||
|
#define CONFIG_REQUEST_STRING_INCREMENTAL 1024
|
||
|
|
||
|
/**
|
||
|
Allocate new memory and then copy the Unicode string Source to Destination.
|
||
|
|
||
|
@param[in,out] Dest Location to copy string
|
||
|
@param[in] Src String to copy
|
||
|
|
||
|
**/
|
||
|
VOID
|
||
|
NewStringCopy (
|
||
|
IN OUT CHAR16 **Dest,
|
||
|
IN CHAR16 *Src
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Set Value of given Name in a NameValue Storage.
|
||
|
|
||
|
@param[in] Storage The NameValue Storage.
|
||
|
@param[in] Name The Name.
|
||
|
@param[in] Value The Value to set.
|
||
|
@param[out] ReturnNode The node use the input name.
|
||
|
|
||
|
@retval EFI_SUCCESS Value found for given Name.
|
||
|
@retval EFI_NOT_FOUND No such Name found in NameValue storage.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
SetValueByName (
|
||
|
IN HII_FORMSET_STORAGE *Storage,
|
||
|
IN CHAR16 *Name,
|
||
|
IN CHAR16 *Value,
|
||
|
OUT HII_NAME_VALUE_NODE **ReturnNode
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Get bit field value from the buffer and then set the value for the question.
|
||
|
Note: Data type UINT32 can cover all the bit field value.
|
||
|
|
||
|
@param[in] Question The question refer to bit field.
|
||
|
@param[in] Buffer Point to the buffer which the question value get from.
|
||
|
@param[out] QuestionValue The Question Value retrieved from Bits.
|
||
|
|
||
|
**/
|
||
|
VOID
|
||
|
GetBitsQuestionValue (
|
||
|
IN HII_STATEMENT *Question,
|
||
|
IN UINT8 *Buffer,
|
||
|
OUT HII_STATEMENT_VALUE *QuestionValue
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Set bit field value to the buffer.
|
||
|
Note: Data type UINT32 can cover all the bit field value.
|
||
|
|
||
|
@param[in] Question The question refer to bit field.
|
||
|
@param[in,out] Buffer Point to the buffer which the question value set to.
|
||
|
@param[in] Value The bit field value need to set.
|
||
|
|
||
|
**/
|
||
|
VOID
|
||
|
SetBitsQuestionValue (
|
||
|
IN HII_STATEMENT *Question,
|
||
|
IN OUT UINT8 *Buffer,
|
||
|
IN UINT32 Value
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Convert the buffer value to HiiValue.
|
||
|
|
||
|
@param[in] Question The question.
|
||
|
@param[in] Value Unicode buffer save the question value.
|
||
|
@param[out] QuestionValue The Question Value retrieved from Buffer.
|
||
|
|
||
|
@retval Status whether convert the value success.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
BufferToQuestionValue (
|
||
|
IN HII_STATEMENT *Question,
|
||
|
IN CHAR16 *Value,
|
||
|
OUT HII_STATEMENT_VALUE *QuestionValue
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Get the string based on the StringId and HII Package List Handle.
|
||
|
|
||
|
@param[in] Token The String's ID.
|
||
|
@param[in] HiiHandle The package list in the HII database to search for
|
||
|
the specified string.
|
||
|
|
||
|
@return The output string.
|
||
|
|
||
|
**/
|
||
|
CHAR16 *
|
||
|
GetTokenString (
|
||
|
IN EFI_STRING_ID Token,
|
||
|
IN EFI_HII_HANDLE HiiHandle
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Converts the unicode character of the string from uppercase to lowercase.
|
||
|
This is a internal function.
|
||
|
|
||
|
@param[in] ConfigString String to be converted
|
||
|
|
||
|
**/
|
||
|
VOID
|
||
|
EFIAPI
|
||
|
HiiStringToLowercase (
|
||
|
IN EFI_STRING ConfigString
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Evaluate if the result is a non-zero value.
|
||
|
|
||
|
@param[in] Result The result to be evaluated.
|
||
|
|
||
|
@retval TRUE It is a non-zero value.
|
||
|
@retval FALSE It is a zero value.
|
||
|
|
||
|
**/
|
||
|
BOOLEAN
|
||
|
IsHiiValueTrue (
|
||
|
IN EFI_HII_VALUE *Result
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Set a new string to string package.
|
||
|
|
||
|
@param[in] String A pointer to the Null-terminated Unicode string
|
||
|
to add or update in the String Package associated
|
||
|
with HiiHandle.
|
||
|
@param[in] HiiHandle A handle that was previously registered in the
|
||
|
HII Database.
|
||
|
|
||
|
@return the Id for this new string.
|
||
|
|
||
|
**/
|
||
|
EFI_STRING_ID
|
||
|
NewHiiString (
|
||
|
IN CHAR16 *String,
|
||
|
IN EFI_HII_HANDLE HiiHandle
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Perform nosubmitif check for a Form.
|
||
|
|
||
|
@param[in] FormSet FormSet data structure.
|
||
|
@param[in] Form Form data structure.
|
||
|
@param[in] Question The Question to be validated.
|
||
|
|
||
|
@retval EFI_SUCCESS Form validation pass.
|
||
|
@retval other Form validation failed.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
ValidateNoSubmit (
|
||
|
IN HII_FORMSET *FormSet,
|
||
|
IN HII_FORM *Form,
|
||
|
IN HII_STATEMENT *Question
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Perform NoSubmit check for each Form in FormSet.
|
||
|
|
||
|
@param[in] FormSet FormSet data structure.
|
||
|
@param[in,out] CurrentForm Current input form data structure.
|
||
|
@param[out] Statement The statement for this check.
|
||
|
|
||
|
@retval EFI_SUCCESS Form validation pass.
|
||
|
@retval other Form validation failed.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
NoSubmitCheck (
|
||
|
IN HII_FORMSET *FormSet,
|
||
|
IN OUT HII_FORM **CurrentForm,
|
||
|
OUT HII_STATEMENT **Statement
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Convert setting of Buffer Storage or NameValue Storage to <ConfigResp>.
|
||
|
|
||
|
@param[in] Storage The Storage to be converted.
|
||
|
@param[in] ConfigResp The returned <ConfigResp>.
|
||
|
@param[in] ConfigRequest The ConfigRequest string.
|
||
|
|
||
|
@retval EFI_SUCCESS Convert success.
|
||
|
@retval EFI_INVALID_PARAMETER Incorrect storage type.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
StorageToConfigResp (
|
||
|
IN HII_FORMSET_STORAGE *Storage,
|
||
|
IN CHAR16 **ConfigResp,
|
||
|
IN CHAR16 *ConfigRequest
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Convert <ConfigResp> to settings in Buffer Storage or NameValue Storage.
|
||
|
|
||
|
@param[in] Storage The Storage to receive the settings.
|
||
|
@param[in] ConfigResp The <ConfigResp> to be converted.
|
||
|
|
||
|
@retval EFI_SUCCESS Convert success.
|
||
|
@retval EFI_INVALID_PARAMETER Incorrect storage type.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
ConfigRespToStorage (
|
||
|
IN HII_FORMSET_STORAGE *Storage,
|
||
|
IN CHAR16 *ConfigResp
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Fetch the Ifr binary data of a FormSet.
|
||
|
|
||
|
@param[in] Handle PackageList Handle
|
||
|
@param[in,out] FormSetGuid On input, GUID or class GUID of a formset. If not
|
||
|
specified (NULL or zero GUID), take the first
|
||
|
FormSet with class GUID EFI_HII_PLATFORM_SETUP_FORMSET_GUID
|
||
|
found in package list.
|
||
|
On output, GUID of the formset found(if not NULL).
|
||
|
@param[out] BinaryLength The length of the FormSet IFR binary.
|
||
|
@param[out] BinaryData The buffer designed to receive the FormSet.
|
||
|
|
||
|
@retval EFI_SUCCESS Buffer filled with the requested FormSet.
|
||
|
BufferLength was updated.
|
||
|
@retval EFI_INVALID_PARAMETER The handle is unknown.
|
||
|
@retval EFI_NOT_FOUND A form or FormSet on the requested handle cannot
|
||
|
be found with the requested FormId.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
GetIfrBinaryData (
|
||
|
IN EFI_HII_HANDLE Handle,
|
||
|
IN OUT EFI_GUID *FormSetGuid,
|
||
|
OUT UINTN *BinaryLength,
|
||
|
OUT UINT8 **BinaryData
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Fill storage with settings requested from Configuration Driver.
|
||
|
|
||
|
@param[in] FormSet FormSet data structure.
|
||
|
@param[in] Storage Buffer Storage.
|
||
|
|
||
|
**/
|
||
|
VOID
|
||
|
LoadFormSetStorage (
|
||
|
IN HII_FORMSET *FormSet,
|
||
|
IN HII_FORMSET_STORAGE *Storage
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Free resources of a Form.
|
||
|
|
||
|
@param[in] FormSet Pointer of the FormSet
|
||
|
@param[in,out] Form Pointer of the Form.
|
||
|
|
||
|
**/
|
||
|
VOID
|
||
|
DestroyForm (
|
||
|
IN HII_FORMSET *FormSet,
|
||
|
IN OUT HII_FORM *Form
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Get formset storage based on the input varstoreid info.
|
||
|
|
||
|
@param[in] FormSet Pointer of the current FormSet.
|
||
|
@param[in] VarStoreId Varstore ID info.
|
||
|
|
||
|
@return Pointer to a HII_FORMSET_STORAGE data structure.
|
||
|
|
||
|
**/
|
||
|
HII_FORMSET_STORAGE *
|
||
|
GetFstStgFromVarId (
|
||
|
IN HII_FORMSET *FormSet,
|
||
|
IN EFI_VARSTORE_ID VarStoreId
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Zero extend integer/boolean/date/time to UINT64 for comparing.
|
||
|
|
||
|
@param[in] Value HII Value to be converted.
|
||
|
|
||
|
**/
|
||
|
VOID
|
||
|
ExtendValueToU64 (
|
||
|
IN HII_STATEMENT_VALUE *Value
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Parse opcodes in the formset IFR binary.
|
||
|
|
||
|
@param[in] FormSet Pointer of the FormSet data structure.
|
||
|
|
||
|
@retval EFI_SUCCESS Opcode parse success.
|
||
|
@retval Other Opcode parse fail.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
ParseOpCodes (
|
||
|
IN HII_FORMSET *FormSet
|
||
|
);
|
||
|
|
||
|
#endif // HII_INTERNAL_H_
|