4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUtility functions for expression evaluation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCopyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThis program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncare licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncwhich accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynchttp://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "Setup.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Global stack used to evaluate boolean expresions
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_HII_VALUE *mOpCodeScopeStack = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_HII_VALUE *mOpCodeScopeStackEnd = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_HII_VALUE *mOpCodeScopeStackPointer = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_HII_VALUE *mExpressionEvaluationStack = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_HII_VALUE *mExpressionEvaluationStackEnd = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_HII_VALUE *mExpressionEvaluationStackPointer = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINTN mExpressionEvaluationStackOffset = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_HII_VALUE *mCurrentExpressionStack = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_HII_VALUE *mCurrentExpressionEnd = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_HII_VALUE *mCurrentExpressionPointer = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_HII_VALUE *mMapExpressionListStack = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_HII_VALUE *mMapExpressionListEnd = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_HII_VALUE *mMapExpressionListPointer = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFORM_EXPRESSION **mFormExpressionStack = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFORM_EXPRESSION **mFormExpressionEnd = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFORM_EXPRESSION **mFormExpressionPointer = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFORM_EXPRESSION **mStatementExpressionStack = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFORM_EXPRESSION **mStatementExpressionEnd = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFORM_EXPRESSION **mStatementExpressionPointer = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFORM_EXPRESSION **mOptionExpressionStack = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFORM_EXPRESSION **mOptionExpressionEnd = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFORM_EXPRESSION **mOptionExpressionPointer = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Unicode collation protocol interface
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_UNICODE_COLLATION_PROTOCOL *mUnicodeCollation = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_USER_MANAGER_PROTOCOL *mUserManager = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Grow size of the stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This is an internal function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Stack On input: old stack; On output: new stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StackPtr On input: old stack pointer; On output: new stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StackEnd On input: old stack end; On output: new stack end
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Grow stack success.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES No enough memory for stack space.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGrowStack (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT EFI_HII_VALUE **Stack,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT EFI_HII_VALUE **StackPtr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT EFI_HII_VALUE **StackEnd
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_VALUE *NewStack;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = EXPRESSION_STACK_SIZE_INCREMENT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StackPtr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = Size + (*StackEnd - *Stack);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewStack = AllocatePool (Size * sizeof (EFI_HII_VALUE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewStack == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StackPtr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Copy from Old Stack to the New Stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewStack,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Stack,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (*StackEnd - *Stack) * sizeof (EFI_HII_VALUE)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free The Old Stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (*Stack);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Make the Stack pointer point to the old data in the new stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *StackPtr = NewStack + (*StackPtr - *Stack);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Stack = NewStack;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *StackEnd = NewStack + Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Push an element onto the Boolean Stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Stack On input: old stack; On output: new stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StackPtr On input: old stack pointer; On output: new stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StackEnd On input: old stack end; On output: new stack end
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Data Data to push.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Push stack success.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPushStack (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT EFI_HII_VALUE **Stack,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT EFI_HII_VALUE **StackPtr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT EFI_HII_VALUE **StackEnd,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HII_VALUE *Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check for a stack overflow condition
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StackPtr >= *StackEnd) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Grow the stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = GrowStack (Stack, StackPtr, StackEnd);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Push the item onto the stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (*StackPtr, Data, sizeof (EFI_HII_VALUE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Data->Type == EFI_IFR_TYPE_BUFFER) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (*StackPtr)->Buffer = AllocateCopyPool(Data->BufferLen, Data->Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT ((*StackPtr)->Buffer != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *StackPtr = *StackPtr + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pop an element from the stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Stack On input: old stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StackPtr On input: old stack pointer; On output: new stack pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Data Data to pop.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The value was popped onto the stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ACCESS_DENIED The pop operation underflowed the stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPopStack (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HII_VALUE *Stack,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT EFI_HII_VALUE **StackPtr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_HII_VALUE *Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check for a stack underflow condition
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StackPtr == Stack) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_ACCESS_DENIED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Pop the item off the stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *StackPtr = *StackPtr - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (Data, *StackPtr, sizeof (EFI_HII_VALUE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reset stack pointer to begin of the stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncResetCurrentExpressionStack (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mCurrentExpressionPointer = mCurrentExpressionStack;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mFormExpressionPointer = mFormExpressionStack;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mStatementExpressionPointer = mStatementExpressionStack;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mOptionExpressionPointer = mOptionExpressionStack;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Push current expression onto the Stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Pointer Pointer to current expression.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The value was pushed onto the stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES There is not enough system memory to grow the stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPushCurrentExpression (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_VALUE Data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data.Type = EFI_IFR_TYPE_NUM_SIZE_64;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data.Value.u64 = (UINT64) (UINTN) Pointer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PushStack (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mCurrentExpressionStack,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mCurrentExpressionPointer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mCurrentExpressionEnd,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pop current expression from the Stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Pointer Pointer to current expression to be pop.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The value was pushed onto the stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES There is not enough system memory to grow the stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPopCurrentExpression (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT VOID **Pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_VALUE Data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopStack (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mCurrentExpressionStack,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mCurrentExpressionPointer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Pointer = (VOID *) (UINTN) Data.Value.u64;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reset stack pointer to begin of the stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncResetMapExpressionListStack (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mMapExpressionListPointer = mMapExpressionListStack;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Grow size of the stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This is an internal function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Stack On input: old stack; On output: new stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StackPtr On input: old stack pointer; On output: new stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StackEnd On input: old stack end; On output: new stack end
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param MemberSize The stack member size.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Grow stack success.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES No enough memory for stack space.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGrowConditionalStack (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT FORM_EXPRESSION ***Stack,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT FORM_EXPRESSION ***StackPtr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT FORM_EXPRESSION ***StackEnd,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN MemberSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FORM_EXPRESSION **NewStack;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = EXPRESSION_STACK_SIZE_INCREMENT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StackPtr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = Size + (*StackEnd - *Stack);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewStack = AllocatePool (Size * MemberSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewStack == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StackPtr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Copy from Old Stack to the New Stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewStack,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Stack,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (*StackEnd - *Stack) * MemberSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free The Old Stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (*Stack);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Make the Stack pointer point to the old data in the new stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *StackPtr = NewStack + (*StackPtr - *Stack);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Stack = NewStack;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *StackEnd = NewStack + Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Push an element onto the Stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Stack On input: old stack; On output: new stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StackPtr On input: old stack pointer; On output: new stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StackEnd On input: old stack end; On output: new stack end
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Data Data to push.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Push stack success.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPushConditionalStack (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT FORM_EXPRESSION ***Stack,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT FORM_EXPRESSION ***StackPtr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT FORM_EXPRESSION ***StackEnd,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN FORM_EXPRESSION **Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check for a stack overflow condition
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StackPtr >= *StackEnd) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Grow the stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = GrowConditionalStack (Stack, StackPtr, StackEnd, sizeof (FORM_EXPRESSION *));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Push the item onto the stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (*StackPtr, Data, sizeof (FORM_EXPRESSION *));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *StackPtr = *StackPtr + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pop an element from the stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Stack On input: old stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StackPtr On input: old stack pointer; On output: new stack pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Data Data to pop.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The value was popped onto the stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ACCESS_DENIED The pop operation underflowed the stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPopConditionalStack (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN FORM_EXPRESSION **Stack,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT FORM_EXPRESSION ***StackPtr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT FORM_EXPRESSION **Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check for a stack underflow condition
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StackPtr == Stack) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_ACCESS_DENIED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Pop the item off the stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *StackPtr = *StackPtr - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (Data, *StackPtr, sizeof (FORM_EXPRESSION *));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get the expression list count.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Level Which type this expression belong to. Form,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync statement or option?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval >=0 The expression count
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval -1 Input parameter error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncINTN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGetConditionalExpressionCount (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EXPRESS_LEVEL Level
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Level) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case ExpressForm:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return mFormExpressionPointer - mFormExpressionStack;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case ExpressStatement:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return mStatementExpressionPointer - mStatementExpressionStack;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case ExpressOption:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return mOptionExpressionPointer - mOptionExpressionStack;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return -1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get the expression Buffer pointer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Level Which type this expression belong to. Form,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync statement or option?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval The start pointer of the expression buffer or NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFORM_EXPRESSION **
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGetConditionalExpressionList (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EXPRESS_LEVEL Level
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Level) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case ExpressForm:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return mFormExpressionStack;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case ExpressStatement:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return mStatementExpressionStack;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case ExpressOption:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return mOptionExpressionStack;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Push the expression options onto the Stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Pointer Pointer to the current expression.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Level Which type this expression belong to. Form,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync statement or option?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The value was pushed onto the stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES There is not enough system memory to grow the stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPushConditionalExpression (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN FORM_EXPRESSION *Pointer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EXPRESS_LEVEL Level
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Level) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case ExpressForm:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PushConditionalStack (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mFormExpressionStack,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mFormExpressionPointer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mFormExpressionEnd,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case ExpressStatement:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PushConditionalStack (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mStatementExpressionStack,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mStatementExpressionPointer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mStatementExpressionEnd,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case ExpressOption:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PushConditionalStack (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mOptionExpressionStack,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mOptionExpressionPointer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mOptionExpressionEnd,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pop the expression options from the Stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Level Which type this expression belong to. Form,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync statement or option?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The value was pushed onto the stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES There is not enough system memory to grow the stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPopConditionalExpression (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EXPRESS_LEVEL Level
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FORM_EXPRESSION *Pointer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Level) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case ExpressForm:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PopConditionalStack (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mFormExpressionStack,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mFormExpressionPointer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case ExpressStatement:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PopConditionalStack (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mStatementExpressionStack,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mStatementExpressionPointer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case ExpressOption:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PopConditionalStack (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mOptionExpressionStack,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mOptionExpressionPointer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Push the list of map expression onto the Stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Pointer Pointer to the list of map expression to be pushed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The value was pushed onto the stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES There is not enough system memory to grow the stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPushMapExpressionList (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_VALUE Data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data.Type = EFI_IFR_TYPE_NUM_SIZE_64;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data.Value.u64 = (UINT64) (UINTN) Pointer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PushStack (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mMapExpressionListStack,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mMapExpressionListPointer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mMapExpressionListEnd,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pop the list of map expression from the Stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Pointer Pointer to the list of map expression to be pop.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The value was pushed onto the stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES There is not enough system memory to grow the stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPopMapExpressionList (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT VOID **Pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_VALUE Data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopStack (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mMapExpressionListStack,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mMapExpressionListPointer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Pointer = (VOID *) (UINTN) Data.Value.u64;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reset stack pointer to begin of the stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncResetScopeStack (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mOpCodeScopeStackPointer = mOpCodeScopeStack;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Push an Operand onto the Stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Operand Operand to push.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The value was pushed onto the stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES There is not enough system memory to grow the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPushScope (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Operand
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_VALUE Data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data.Type = EFI_IFR_TYPE_NUM_SIZE_8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data.Value.u8 = Operand;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PushStack (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mOpCodeScopeStack,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mOpCodeScopeStackPointer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mOpCodeScopeStackEnd,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pop an Operand from the Stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Operand Operand to pop.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The value was pushed onto the stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES There is not enough system memory to grow the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPopScope (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT8 *Operand
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_VALUE Data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopStack (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mOpCodeScopeStack,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mOpCodeScopeStackPointer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Operand = Data.Value.u8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Push an Expression value onto the Stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Value Expression value to push.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The value was pushed onto the stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES There is not enough system memory to grow the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPushExpression (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HII_VALUE *Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PushStack (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mExpressionEvaluationStack,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mExpressionEvaluationStackPointer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mExpressionEvaluationStackEnd,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pop an Expression value from the stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Value Expression value to pop.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The value was popped onto the stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ACCESS_DENIED The pop operation underflowed the stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPopExpression (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_HII_VALUE *Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PopStack (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mExpressionEvaluationStack + mExpressionEvaluationStackOffset,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mExpressionEvaluationStackPointer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get current stack offset from stack start.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return Stack offset to stack start.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINTN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSaveExpressionEvaluationStackOffset (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN TempStackOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempStackOffset = mExpressionEvaluationStackOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mExpressionEvaluationStackOffset = mExpressionEvaluationStackPointer - mExpressionEvaluationStack;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return TempStackOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Restore stack offset based on input stack offset
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StackOffset Offset to stack start.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRestoreExpressionEvaluationStackOffset (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN StackOffset
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mExpressionEvaluationStackOffset = StackOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get Form given its FormId.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FormSet The formset which contains this form.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FormId Id of this form.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Pointer The form.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL Specified Form is not found in the formset.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFORM_BROWSER_FORM *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIdToForm (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN FORM_BROWSER_FORMSET *FormSet,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 FormId
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FORM_BROWSER_FORM *Form;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = GetFirstNode (&FormSet->FormListHead);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsNull (&FormSet->FormListHead, Link)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Form = FORM_BROWSER_FORM_FROM_LINK (Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Form->FormId == FormId) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Form;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = GetNextNode (&FormSet->FormListHead, Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Search a Question in Form scope using its QuestionId.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Form The form which contains this Question.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param QuestionId Id of this Question.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Pointer The Question.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL Specified Question not found in the form.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFORM_BROWSER_STATEMENT *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIdToQuestion2 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN FORM_BROWSER_FORM *Form,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 QuestionId
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FORM_BROWSER_STATEMENT *Question;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (QuestionId == 0 || Form == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The value of zero is reserved
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = GetFirstNode (&Form->StatementListHead);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsNull (&Form->StatementListHead, Link)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Question = FORM_BROWSER_STATEMENT_FROM_LINK (Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Question->QuestionId == QuestionId) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Question;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = GetNextNode (&Form->StatementListHead, Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Search a Question in Formset scope using its QuestionId.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FormSet The formset which contains this form.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Form The form which contains this Question.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param QuestionId Id of this Question.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Pointer The Question.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL Specified Question not found in the form.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFORM_BROWSER_STATEMENT *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIdToQuestion (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN FORM_BROWSER_FORMSET *FormSet,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN FORM_BROWSER_FORM *Form,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 QuestionId
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FORM_BROWSER_STATEMENT *Question;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Search in the form scope first
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Question = IdToQuestion2 (Form, QuestionId);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Question != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Question;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Search in the formset scope
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = GetFirstNode (&FormSet->FormListHead);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsNull (&FormSet->FormListHead, Link)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Form = FORM_BROWSER_FORM_FROM_LINK (Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Question = IdToQuestion2 (Form, QuestionId);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Question != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // EFI variable storage may be updated by Callback() asynchronous,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // to keep synchronous, always reload the Question Value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Question->Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetQuestionValue (FormSet, Form, Question, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Question;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = GetNextNode (&FormSet->FormListHead, Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get Expression given its RuleId.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Form The form which contains this Expression.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param RuleId Id of this Expression.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Pointer The Expression.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL Specified Expression not found in the form.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFORM_EXPRESSION *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRuleIdToExpression (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN FORM_BROWSER_FORM *Form,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 RuleId
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FORM_EXPRESSION *Expression;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = GetFirstNode (&Form->ExpressionListHead);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsNull (&Form->ExpressionListHead, Link)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Expression = FORM_EXPRESSION_FROM_LINK (Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Expression->Type == EFI_HII_EXPRESSION_RULE && Expression->RuleId == RuleId) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Expression;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = GetNextNode (&Form->ExpressionListHead, Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Locate the Unicode Collation Protocol interface for later use.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Protocol interface initialize success.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other Protocol interface initialize failed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInitializeUnicodeCollationProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mUnicodeCollation != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // BUGBUG: Proper impelmentation is to locate all Unicode Collation Protocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // instances first and then select one which support English language.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Current implementation just pick the first instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->LocateProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiUnicodeCollation2ProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &mUnicodeCollation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Convert the input Unicode character to upper.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param String Th Unicode character to be converted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIfrStrToUpper (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 *String
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*String != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((*String >= 'a') && (*String <= 'z')) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *String = (UINT16) ((*String) & ((UINT16) ~0x20));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Evaluate opcode EFI_IFR_TO_STRING.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FormSet Formset which contains this opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Format String format in EFI_IFR_TO_STRING.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Result Evaluation result for this opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Opcode evaluation success.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other Opcode evaluation failed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIfrToString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN FORM_BROWSER_FORMSET *FormSet,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Format,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_HII_VALUE *Result
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_VALUE Value;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *String;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *PrintFormat;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 Buffer[MAXIMUM_VALUE_CHARACTERS];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *TmpBuf;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN BufferSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (&Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Value.Type) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_TYPE_NUM_SIZE_8:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_TYPE_NUM_SIZE_16:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_TYPE_NUM_SIZE_32:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_TYPE_NUM_SIZE_64:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferSize = MAXIMUM_VALUE_CHARACTERS * sizeof (CHAR16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Format) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_STRING_UNSIGNED_DEC:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_STRING_SIGNED_DEC:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintFormat = L"%ld";
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_STRING_LOWERCASE_HEX:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintFormat = L"%lx";
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_STRING_UPPERCASE_HEX:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintFormat = L"%lX";
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint (Buffer, BufferSize, PrintFormat, Value.Value.u64);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String = Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_TYPE_STRING:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (Result, &Value, sizeof (EFI_HII_VALUE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_TYPE_BOOLEAN:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String = (Value.Value.b) ? L"True" : L"False";
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_TYPE_BUFFER:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // + 3 is base on the unicode format, the length may be odd number,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // so need 1 byte to align, also need 2 bytes for L'\0'.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TmpBuf = AllocateZeroPool (Value.BufferLen + 3);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (TmpBuf != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Format == EFI_IFR_STRING_ASCII) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (TmpBuf, Value.Buffer, Value.BufferLen);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintFormat = L"%a";
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Format == EFI_IFR_STRING_UNICODE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (TmpBuf, Value.Buffer, Value.BufferLen * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintFormat = L"%s";
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint (Buffer, MAXIMUM_VALUE_CHARACTERS, PrintFormat, Value.Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String = Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (TmpBuf);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Value.Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Type = EFI_IFR_TYPE_STRING;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Value.string = NewString (String, FormSet->HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Evaluate opcode EFI_IFR_TO_UINT.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FormSet Formset which contains this opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Result Evaluation result for this opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Opcode evaluation success.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other Opcode evaluation failed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIfrToUint (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN FORM_BROWSER_FORMSET *FormSet,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_HII_VALUE *Result
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_VALUE Value;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *String;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (&Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value.Type >= EFI_IFR_TYPE_OTHER && Value.Type != EFI_IFR_TYPE_BUFFER) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value.Type == EFI_IFR_TYPE_STRING) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String = GetToken (Value.Value.string, FormSet->HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrStrToUpper (String);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = StrStr (String, L"0X");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringPtr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Hex string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Value.u64 = StrHexToUint64 (String);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // decimal string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Value.u64 = StrDecimalToUint64 (String);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (String);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (Value.Type == EFI_IFR_TYPE_BUFFER) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value.BufferLen > 8) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Value.Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Value.u64 = *(UINT64*) Value.Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Value.Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (Result, &Value, sizeof (EFI_HII_VALUE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Type = EFI_IFR_TYPE_NUM_SIZE_64;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Evaluate opcode EFI_IFR_CATENATE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FormSet Formset which contains this opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Result Evaluation result for this opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Opcode evaluation success.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other Opcode evaluation failed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIfrCatenate (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN FORM_BROWSER_FORMSET *FormSet,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_HII_VALUE *Result
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_VALUE Value[2];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *String[2];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // String[0] - The second string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // String[1] - The first string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String[0] = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String[1] = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (Value, sizeof (Value));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (&Value[0]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (&Value[1]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < 2; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value[Index].Type != EFI_IFR_TYPE_STRING && Value[Index].Type != EFI_IFR_TYPE_BUFFER) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value[Index].Type == EFI_IFR_TYPE_STRING) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String[Index] = GetToken (Value[Index].Value.string, FormSet->HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String[Index] == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value[0].Type == EFI_IFR_TYPE_STRING) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = StrSize (String[0]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr= AllocatePool (StrSize (String[1]) + Size);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (StringPtr != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy (StringPtr, String[1]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat (StringPtr, String[0]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Type = EFI_IFR_TYPE_STRING;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Value.string = NewString (StringPtr, FormSet->HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Type = EFI_IFR_TYPE_BUFFER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->BufferLen = (UINT16) (Value[0].BufferLen + Value[1].BufferLen);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Buffer = AllocateZeroPool (Result->BufferLen);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Result->Buffer != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (Result->Buffer, Value[0].Buffer, Value[0].BufferLen);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&Result->Buffer[Value[0].BufferLen], Value[1].Buffer, Value[1].BufferLen);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDone:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value[0].Buffer != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Value[0].Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value[1].Buffer != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Value[1].Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String[0] != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (String[0]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String[1] != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (String[1]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringPtr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (StringPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Evaluate opcode EFI_IFR_MATCH.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FormSet Formset which contains this opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Result Evaluation result for this opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Opcode evaluation success.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other Opcode evaluation failed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIfrMatch (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN FORM_BROWSER_FORMSET *FormSet,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_HII_VALUE *Result
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_VALUE Value[2];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *String[2];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // String[0] - The string to search
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // String[1] - pattern
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String[0] = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String[1] = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (Value, sizeof (Value));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (&Value[0]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (&Value[1]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < 2; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value[Index].Type != EFI_IFR_TYPE_STRING) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String[Index] = GetToken (Value[Index].Value.string, FormSet->HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String [Index] == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Type = EFI_IFR_TYPE_BOOLEAN;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Value.b = mUnicodeCollation->MetaiMatch (mUnicodeCollation, String[0], String[1]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDone:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String[0] != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (String[0]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String[1] != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (String[1]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Evaluate opcode EFI_IFR_FIND.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FormSet Formset which contains this opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Format Case sensitive or insensitive.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Result Evaluation result for this opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Opcode evaluation success.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other Opcode evaluation failed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIfrFind (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN FORM_BROWSER_FORMSET *FormSet,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Format,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_HII_VALUE *Result
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_VALUE Value[3];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *String[2];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Base;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (Value, sizeof (Value));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Format > EFI_IFR_FF_CASE_INSENSITIVE) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (&Value[0]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (&Value[1]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (&Value[2]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value[0].Type > EFI_IFR_TYPE_NUM_SIZE_64) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Base = (UINTN) Value[0].Value.u64;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // String[0] - sub-string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // String[1] - The string to search
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String[0] = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String[1] = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < 2; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value[Index + 1].Type != EFI_IFR_TYPE_STRING) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String[Index] = GetToken (Value[Index + 1].Value.string, FormSet->HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String[Index] == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Format == EFI_IFR_FF_CASE_INSENSITIVE) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Case insensitive, convert both string to upper case
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrStrToUpper (String[Index]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Type = EFI_IFR_TYPE_NUM_SIZE_64;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Base >= StrLen (String[1])) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Value.u64 = 0xFFFFFFFFFFFFFFFFULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = StrStr (String[1] + Base, String[0]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Value.u64 = (StringPtr == NULL) ? 0xFFFFFFFFFFFFFFFFULL : (StringPtr - String[1]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDone:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String[0] != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (String[0]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String[1] != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (String[1]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Evaluate opcode EFI_IFR_MID.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FormSet Formset which contains this opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Result Evaluation result for this opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Opcode evaluation success.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other Opcode evaluation failed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIfrMid (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN FORM_BROWSER_FORMSET *FormSet,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_HII_VALUE *Result
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_VALUE Value[3];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *String;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Base;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *SubString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 BufferLen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (Value, sizeof (Value));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (&Value[0]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (&Value[1]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (&Value[2]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value[0].Type > EFI_IFR_TYPE_NUM_SIZE_64) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length = (UINTN) Value[0].Value.u64;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value[1].Type > EFI_IFR_TYPE_NUM_SIZE_64) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Base = (UINTN) Value[1].Value.u64;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value[2].Type != EFI_IFR_TYPE_STRING && Value[2].Type != EFI_IFR_TYPE_BUFFER) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value[2].Type == EFI_IFR_TYPE_STRING) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String = GetToken (Value[2].Value.string, FormSet->HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Length == 0 || Base >= StrLen (String)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SubString = gEmptyString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SubString = String + Base;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Base + Length) < StrLen (String)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SubString[Length] = L'\0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Type = EFI_IFR_TYPE_STRING;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Value.string = NewString (SubString, FormSet->HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (String);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer = Value[2].Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferLen = Value[2].BufferLen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Type = EFI_IFR_TYPE_BUFFER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Length == 0 || Base >= BufferLen) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->BufferLen = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Buffer = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->BufferLen = (UINT16)((BufferLen - Base) < Length ? (BufferLen - Base) : Length);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Buffer = AllocateZeroPool (Result->BufferLen);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Result->Buffer != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (Result->Buffer, &Value[2].Buffer[Base], Result->BufferLen);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Value[2].Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Evaluate opcode EFI_IFR_TOKEN.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FormSet Formset which contains this opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Result Evaluation result for this opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Opcode evaluation success.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other Opcode evaluation failed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIfrToken (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN FORM_BROWSER_FORMSET *FormSet,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_HII_VALUE *Result
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_VALUE Value[3];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *String[2];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Count;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *Delimiter;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *SubString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (Value, sizeof (Value));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (&Value[0]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (&Value[1]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (&Value[2]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value[0].Type > EFI_IFR_TYPE_NUM_SIZE_64) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count = (UINTN) Value[0].Value.u64;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // String[0] - Delimiter
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // String[1] - The string to search
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String[0] = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String[1] = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < 2; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value[Index + 1].Type != EFI_IFR_TYPE_STRING) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String[Index] = GetToken (Value[Index + 1].Value.string, FormSet->HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String[Index] == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Delimiter = String[0];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SubString = String[1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (Count > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SubString = StrStr (SubString, Delimiter);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SubString != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Skip over the delimiter
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SubString = SubString + StrLen (Delimiter);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SubString == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // nth delimited sub-string not found, push an empty string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SubString = gEmptyString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Put a NULL terminator for nth delimited sub-string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = StrStr (SubString, Delimiter);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringPtr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *StringPtr = L'\0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Type = EFI_IFR_TYPE_STRING;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Value.string = NewString (SubString, FormSet->HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDone:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String[0] != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (String[0]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String[1] != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (String[1]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Evaluate opcode EFI_IFR_SPAN.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FormSet Formset which contains this opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Flags FIRST_MATCHING or FIRST_NON_MATCHING.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Result Evaluation result for this opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Opcode evaluation success.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other Opcode evaluation failed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIfrSpan (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN FORM_BROWSER_FORMSET *FormSet,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Flags,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_HII_VALUE *Result
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_VALUE Value[3];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *String[2];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *Charset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Base;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN Found;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (Value, sizeof (Value));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (&Value[0]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (&Value[1]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (&Value[2]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value[0].Type > EFI_IFR_TYPE_NUM_SIZE_64) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Base = (UINTN) Value[0].Value.u64;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // String[0] - Charset
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // String[1] - The string to search
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String[0] = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String[1] = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < 2; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value[Index + 1].Type != EFI_IFR_TYPE_STRING) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String[Index] = GetToken (Value[Index + 1].Value.string, FormSet->HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String [Index] == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Base >= StrLen (String[1])) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Found = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = String[1] + Base;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Charset = String[0];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*StringPtr != 0 && !Found) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (Charset[Index] != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StringPtr >= Charset[Index] && *StringPtr <= Charset[Index + 1]) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Flags == EFI_IFR_FLAGS_FIRST_MATCHING) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Found = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Flags == EFI_IFR_FLAGS_FIRST_NON_MATCHING) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Found = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Skip characters pair representing low-end of a range and high-end of a range
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index += 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!Found) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Type = EFI_IFR_TYPE_NUM_SIZE_64;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result->Value.u64 = StringPtr - String[1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDone:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String[0] != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (String[0]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String[1] != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (String[1]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Zero extend integer/boolean/date/time to UINT64 for comparing.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Value HII Value to be converted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncExtendValueToU64 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HII_VALUE *Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 Temp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Temp = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Value->Type) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_TYPE_NUM_SIZE_8:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Temp = Value->Value.u8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_TYPE_NUM_SIZE_16:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Temp = Value->Value.u16;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_TYPE_NUM_SIZE_32:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Temp = Value->Value.u32;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_TYPE_BOOLEAN:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Temp = Value->Value.b;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_TYPE_TIME:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Temp = Value->Value.u32 & 0xffffff;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_TYPE_DATE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Temp = Value->Value.u32;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.u64 = Temp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Compare two Hii value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Value1 Expression value to compare on left-hand.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Value2 Expression value to compare on right-hand.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Result Return value after compare.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync retval 0 Two operators equal.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Positive value if Value1 is greater than Value2.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync retval Negative value if Value1 is less than Value2.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param HiiHandle Only required for string compare.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval other Could not perform compare on two values.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Compare the value success.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCompareHiiValue (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HII_VALUE *Value1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HII_VALUE *Value2,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT INTN *Result,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HII_HANDLE HiiHandle OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INT64 Temp64;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *Str1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *Str2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Len;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value1->Type >= EFI_IFR_TYPE_OTHER || Value2->Type >= EFI_IFR_TYPE_OTHER ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value1->Type != EFI_IFR_TYPE_BUFFER && Value2->Type != EFI_IFR_TYPE_BUFFER) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value1->Type == EFI_IFR_TYPE_STRING || Value2->Type == EFI_IFR_TYPE_STRING ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value1->Type != Value2->Type) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Both Operator should be type of String
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value1->Value.string == 0 || Value2->Value.string == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // StringId 0 is reserved
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value1->Value.string == Value2->Value.string) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Result = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Str1 = GetToken (Value1->Value.string, HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Str1 == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // String not found
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Str2 = GetToken (Value2->Value.string, HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Str2 == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Str1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Result = StrCmp (Str1, Str2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Str1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Str2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value1->Type == EFI_IFR_TYPE_BUFFER || Value2->Type == EFI_IFR_TYPE_BUFFER ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value1->Type != Value2->Type) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Both Operator should be type of Buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Len = Value1->BufferLen > Value2->BufferLen ? Value2->BufferLen : Value1->BufferLen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Result = CompareMem (Value1->Buffer, Value2->Buffer, Len);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((*Result == 0) && (Value1->BufferLen != Value2->BufferLen))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // In this case, means base on samll number buffer, the data is same
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // So which value has more data, which value is bigger.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Result = Value1->BufferLen > Value2->BufferLen ? 1 : -1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Take remain types(integer, boolean, date/time) as integer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Temp64 = (INT64) (Value1->Value.u64 - Value2->Value.u64);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Temp64 > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Result = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (Temp64 < 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Result = -1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Result = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Check if current user has the privilege specified by the permissions GUID.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Guid A GUID specifying setup access permissions.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE Current user has the privilege.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE Current user does not have the privilege.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCheckUserPrivilege (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GUID *Guid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_USER_PROFILE_HANDLE UserProfileHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_USER_INFO_HANDLE UserInfoHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_USER_INFO *UserInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_GUID *UserPermissionsGuid;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN UserInfoSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN AccessControlDataSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_USER_INFO_ACCESS_CONTROL *AccessControl;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN RemainSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mUserManager == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->LocateProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiUserManagerProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &mUserManager
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /// If the system does not support user management, then it is assumed that
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /// all users have admin privilege and evaluation of each EFI_IFR_SECURITY
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /// op-code is always TRUE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = mUserManager->Current (mUserManager, &UserProfileHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /// Enumerate all user information of the current user profile
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /// to look for any EFI_USER_INFO_ACCESS_SETUP record.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (UserInfoHandle = NULL;;) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = mUserManager->GetNextInfo (mUserManager, UserProfileHandle, &UserInfoHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UserInfoSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = mUserManager->GetInfo (mUserManager, UserProfileHandle, UserInfoHandle, NULL, &UserInfoSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status != EFI_BUFFER_TOO_SMALL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UserInfo = (EFI_USER_INFO *) AllocatePool (UserInfoSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (UserInfo == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = mUserManager->GetInfo (mUserManager, UserProfileHandle, UserInfoHandle, UserInfo, &UserInfoSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UserInfo->InfoType != EFI_USER_INFO_ACCESS_POLICY_RECORD ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UserInfo->InfoSize <= sizeof (EFI_USER_INFO)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (UserInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemainSize = UserInfo->InfoSize - sizeof (EFI_USER_INFO);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AccessControl = (EFI_USER_INFO_ACCESS_CONTROL *)(UserInfo + 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (RemainSize >= sizeof (EFI_USER_INFO_ACCESS_CONTROL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (RemainSize < AccessControl->Size || AccessControl->Size < sizeof (EFI_USER_INFO_ACCESS_CONTROL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AccessControl->Type == EFI_USER_INFO_ACCESS_SETUP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /// Check if current user has the privilege specified by the permissions GUID.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UserPermissionsGuid = (EFI_GUID *)(AccessControl + 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AccessControlDataSize = AccessControl->Size - sizeof (EFI_USER_INFO_ACCESS_CONTROL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (AccessControlDataSize >= sizeof (EFI_GUID)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CompareGuid (Guid, UserPermissionsGuid)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (UserInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UserPermissionsGuid++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AccessControlDataSize -= sizeof (EFI_GUID);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemainSize -= AccessControl->Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AccessControl = (EFI_USER_INFO_ACCESS_CONTROL *)((UINT8 *)AccessControl + AccessControl->Size);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (UserInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get question value from the predefined formset.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DevicePath The driver's device path which produece the formset data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param InputHiiHandle The hii handle associate with the formset data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FormSetGuid The formset guid which include the question.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param QuestionId The question id which need to get value from.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Value The return data about question's value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE Get the question value success.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE Get the question value failed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGetQuestionValueFromForm (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HII_HANDLE InputHiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GUID *FormSetGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_QUESTION_ID QuestionId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_HII_VALUE *Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE DriverHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE Handle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_HANDLE *HiiHandles;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_HANDLE HiiHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FORM_BROWSER_STATEMENT *Question;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FORM_BROWSER_FORMSET *FormSet;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FORM_BROWSER_FORM *Form;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN GetTheVal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The input parameter DevicePath or InputHiiHandle must have one valid input.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT ((DevicePath != NULL && InputHiiHandle == NULL) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (DevicePath == NULL && InputHiiHandle != NULL) );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetTheVal = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DriverHandle = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Question = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Form = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get HiiHandle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DevicePath != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // 1. Get Driver handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->LocateDevicePath (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiDevicePathProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DriverHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status) || (DriverHandle == NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // 2. Get Hii handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandles = HiiGetHiiHandles (NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HiiHandles == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; HiiHandles[Index] != NULL; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = mHiiDatabase->GetPackageListHandle (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mHiiDatabase,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandles[Index],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status) && (Handle == DriverHandle)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle = HiiHandles[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (HiiHandles);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle = InputHiiHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (HiiHandle != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the formset data include this question.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FormSet = AllocateZeroPool (sizeof (FORM_BROWSER_FORMSET));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (FormSet != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = InitializeFormSet(HiiHandle, FormSetGuid, FormSet, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetTheVal = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Base on the Question Id to get the question info.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Question = IdToQuestion(FormSet, NULL, QuestionId);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Question == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetTheVal = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Search form in the formset scope
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = GetFirstNode (&FormSet->FormListHead);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsNull (&FormSet->FormListHead, Link)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Form = FORM_BROWSER_FORM_FROM_LINK (Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Question = IdToQuestion2 (Form, QuestionId);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Question != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = GetNextNode (&FormSet->FormListHead, Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Form = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Form != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the question value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = GetQuestionValue(FormSet, Form, Question, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetTheVal = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (Value, &Question->HiiValue, sizeof (EFI_HII_VALUE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDone:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Clean the formset structure and restore the global parameter.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FormSet != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DestroyFormSet (FormSet);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return GetTheVal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Evaluate the result of a HII expression.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Expression is NULL, then ASSERT.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FormSet FormSet associated with this expression.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Form Form associated with this expression.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Expression Expression to be evaluated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The expression evaluated successfuly
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND The Question which referenced by a QuestionId
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync could not be found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES There is not enough system memory to grow the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ACCESS_DENIED The pop operation underflowed the stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Syntax error with the Expression
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEvaluateExpression (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN FORM_BROWSER_FORMSET *FormSet,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN FORM_BROWSER_FORM *Form,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT FORM_EXPRESSION *Expression
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EXPRESSION_OPCODE *OpCode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FORM_BROWSER_STATEMENT *Question;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FORM_BROWSER_STATEMENT *Question2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_VALUE Data1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_VALUE Data2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_VALUE Data3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FORM_EXPRESSION *RuleExpression;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_VALUE *Value;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INTN Result;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *StrPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *NameValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 TempValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *SubExpressionLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FORM_EXPRESSION *SubExpression;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN StackOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN TempLength;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 TempStr[5];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 DigitUint8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *TempBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_TIME EfiTime;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_VALUE QuestionVal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Save current stack offset.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StackOffset = SaveExpressionEvaluationStackOffset ();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Expression != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Expression->Result.Type = EFI_IFR_TYPE_OTHER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = GetFirstNode (&Expression->OpCodeListHead);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsNull (&Expression->OpCodeListHead, Link)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode = EXPRESSION_OPCODE_FROM_LINK (Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = GetNextNode (&Expression->OpCodeListHead, Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&Data1, sizeof (EFI_HII_VALUE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&Data2, sizeof (EFI_HII_VALUE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&Data3, sizeof (EFI_HII_VALUE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value = &Data3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_BOOLEAN;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (OpCode->Operand) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Built-in functions
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_EQ_ID_VAL_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Question = IdToQuestion (FormSet, Form, OpCode->QuestionId);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Question == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = CompareHiiValue (&Question->HiiValue, &OpCode->Value, &Result, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status == EFI_UNSUPPORTED) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.b = (BOOLEAN) ((Result == 0) ? TRUE : FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_EQ_ID_ID_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Question = IdToQuestion (FormSet, Form, OpCode->QuestionId);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Question == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Question2 = IdToQuestion (FormSet, Form, OpCode->QuestionId2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Question2 == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = CompareHiiValue (&Question->HiiValue, &Question2->HiiValue, &Result, FormSet->HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status == EFI_UNSUPPORTED) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.b = (BOOLEAN) ((Result == 0) ? TRUE : FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_EQ_ID_LIST_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Question = IdToQuestion (FormSet, Form, OpCode->QuestionId);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Question == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.b = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index =0; Index < OpCode->ListLength; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Question->HiiValue.Value.u16 == OpCode->ValueList[Index]) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.b = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_DUP_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PushExpression (Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_QUESTION_REF1_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_THIS_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Question = IdToQuestion (FormSet, Form, OpCode->QuestionId);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Question == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value = &Question->HiiValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_SECURITY_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.b = CheckUserPrivilege (&OpCode->Guid);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_GET_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get Value from VarStore buffer, EFI VarStore, Name/Value VarStore.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.u8 = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OpCode->VarStorage != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (OpCode->VarStorage->Type) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_HII_VARSTORE_BUFFER:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get value from Edit Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = OpCode->ValueType;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&Value->Value, OpCode->VarStorage->EditBuffer + OpCode->VarStoreInfo.VarOffset, OpCode->ValueWidth);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_HII_VARSTORE_NAME_VALUE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OpCode->ValueType != EFI_IFR_TYPE_STRING) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get value from string except for STRING value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = GetValueByName (OpCode->VarStorage, OpCode->ValueName, &StrPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (StrPtr != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempLength = StrLen (StrPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OpCode->ValueWidth >= ((TempLength + 1) / 2)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = OpCode->ValueType;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempBuffer = (UINT8 *) &Value->Value;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (TempStr, sizeof (TempStr));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < TempLength; Index ++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempStr[0] = StrPtr[TempLength - Index - 1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DigitUint8 = (UINT8) StrHexToUint64 (TempStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Index & 1) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempBuffer [Index/2] = DigitUint8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempBuffer [Index/2] = (UINT8) ((DigitUint8 << 4) + TempBuffer [Index/2]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_HII_VARSTORE_EFI_VARIABLE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get value from variable.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempLength = OpCode->ValueWidth;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = OpCode->ValueType;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gRT->GetVariable (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode->ValueName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &OpCode->VarStorage->Guid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &TempLength,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Value->Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.u8 = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Not recognize storage.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // For Time/Date Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OpCode->ValueType != EFI_IFR_TYPE_DATE && OpCode->ValueType != EFI_IFR_TYPE_TIME) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Only support Data/Time data when storage doesn't exist.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gRT->GetTime (&EfiTime, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OpCode->ValueType == EFI_IFR_TYPE_DATE) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (OpCode->VarStoreInfo.VarOffset) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 0x00:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_NUM_SIZE_16;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.u16 = EfiTime.Year;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 0x02:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.u8 = EfiTime.Month;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 0x03:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.u8 = EfiTime.Day;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Invalid Date field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (OpCode->VarStoreInfo.VarOffset) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 0x00:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.u8 = EfiTime.Hour;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 0x01:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.u8 = EfiTime.Minute;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 0x02:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.u8 = EfiTime.Second;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Invalid Time field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_QUESTION_REF3_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // EFI_IFR_QUESTION_REF3
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Pop an expression from the expression stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Validate the expression value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Value->Type > EFI_IFR_TYPE_NUM_SIZE_64) || (Value->Value.u64 > 0xffff)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OpCode->DevicePath != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrPtr = GetToken (OpCode->DevicePath, FormSet->HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrPtr == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!GetQuestionValueFromForm((EFI_DEVICE_PATH_PROTOCOL*)StrPtr, NULL, &OpCode->Guid, Value->Value.u16, &QuestionVal)){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value = &QuestionVal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (CompareGuid (&OpCode->Guid, &gZeroGuid) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!GetQuestionValueFromForm(NULL, FormSet->HiiHandle, &OpCode->Guid, Value->Value.u16, &QuestionVal)){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value = &QuestionVal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Question = IdToQuestion (FormSet, Form, Value->Value.u16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Question == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // push the questions' value on to the expression stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value = &Question->HiiValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_RULE_REF_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Find expression for this rule
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RuleExpression = RuleIdToExpression (Form, OpCode->RuleId);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (RuleExpression == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Evaluate this rule expression
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EvaluateExpression (FormSet, Form, RuleExpression);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status) || RuleExpression->Result.Type == EFI_IFR_TYPE_UNDEFINED) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value = &RuleExpression->Result;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_STRING_REF1_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_STRING;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.string = OpCode->Value.Value.string;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Constant
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_TRUE_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_FALSE_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_ONE_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_ONES_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_UINT8_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_UINT16_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_UINT32_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_UINT64_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_UNDEFINED_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_VERSION_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_ZERO_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value = &OpCode->Value;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // unary-op
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_LENGTH_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value->Type != EFI_IFR_TYPE_STRING && Value->Type != EFI_IFR_TYPE_BUFFER) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value->Type == EFI_IFR_TYPE_STRING) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrPtr = GetToken (Value->Value.string, FormSet->HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrPtr == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.u64 = StrLen (StrPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (StrPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.u64 = Value->BufferLen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Value->Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_NOT_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value->Type != EFI_IFR_TYPE_BOOLEAN) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.b = (BOOLEAN) (!Value->Value.b);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_QUESTION_REF2_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Pop an expression from the expression stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Validate the expression value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Value->Type > EFI_IFR_TYPE_NUM_SIZE_64) || (Value->Value.u64 > 0xffff)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Question = IdToQuestion (FormSet, Form, Value->Value.u16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Question == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value = &Question->HiiValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_STRING_REF2_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Pop an expression from the expression stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Validate the expression value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Value->Type > EFI_IFR_TYPE_NUM_SIZE_64) || (Value->Value.u64 > 0xffff)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_STRING;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrPtr = GetToken (Value->Value.u16, FormSet->HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrPtr == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If String not exit, push an empty string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.string = NewString (gEmptyString, FormSet->HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index = (UINT16) Value->Value.u64;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.string = Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (StrPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_TO_BOOLEAN_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Pop an expression from the expression stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert an expression to a Boolean
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value->Type <= EFI_IFR_TYPE_DATE) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // When converting from an unsigned integer, zero will be converted to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // FALSE and any other value will be converted to TRUE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.b = (BOOLEAN) (Value->Value.u64 != 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_BOOLEAN;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (Value->Type == EFI_IFR_TYPE_STRING) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // When converting from a string, if case-insensitive compare
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // with "true" is True, then push True. If a case-insensitive compare
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // with "false" is True, then push False. Otherwise, push Undefined.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrPtr = GetToken (Value->Value.string, FormSet->HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrPtr == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrStrToUpper (StrPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrCmp (StrPtr, L"TRUE") == 0){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.b = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_BOOLEAN;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (StrCmp (StrPtr, L"FALSE") == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.b = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_BOOLEAN;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (StrPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (Value->Type == EFI_IFR_TYPE_BUFFER) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // When converting from a buffer, if the buffer is all zeroes,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // then push False. Otherwise push True.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index =0; Index < Value->BufferLen; Index ++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value->Buffer[Index] != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Index >= Value->BufferLen) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.b = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.b = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_BOOLEAN;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Value->Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_TO_STRING_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = IfrToString (FormSet, OpCode->Format, Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_TO_UINT_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = IfrToUint (FormSet, Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_TO_LOWER_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_TO_UPPER_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = InitializeUnicodeCollationProtocol ();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value->Type != EFI_IFR_TYPE_STRING) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrPtr = GetToken (Value->Value.string, FormSet->HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrPtr == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OpCode->Operand == EFI_IFR_TO_LOWER_OP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mUnicodeCollation->StrLwr (mUnicodeCollation, StrPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mUnicodeCollation->StrUpr (mUnicodeCollation, StrPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.string = NewString (StrPtr, FormSet->HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (StrPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_BITWISE_NOT_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Pop an expression from the expression stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value->Type > EFI_IFR_TYPE_DATE) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.u64 = ~Value->Value.u64;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_SET_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Pop an expression from the expression stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data1.Type = EFI_IFR_TYPE_BOOLEAN;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data1.Value.b = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set value to var storage buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OpCode->VarStorage != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (OpCode->VarStorage->Type) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_HII_VARSTORE_BUFFER:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (OpCode->VarStorage->EditBuffer + OpCode->VarStoreInfo.VarOffset, &Value->Value, OpCode->ValueWidth);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data1.Value.b = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_HII_VARSTORE_NAME_VALUE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OpCode->ValueType != EFI_IFR_TYPE_STRING) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NameValue = AllocateZeroPool ((OpCode->ValueWidth * 2 + 1) * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Value != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert Buffer to Hex String
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempBuffer = (UINT8 *) &Value->Value + OpCode->ValueWidth - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrPtr = NameValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < OpCode->ValueWidth; Index ++, TempBuffer --) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrPtr += UnicodeValueToString (StrPtr, PREFIX_ZERO | RADIX_HEX, *TempBuffer, 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = SetValueByName (OpCode->VarStorage, OpCode->ValueName, NameValue, TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (NameValue);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data1.Value.b = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_HII_VARSTORE_EFI_VARIABLE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gRT->SetVariable (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode->ValueName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &OpCode->VarStorage->Guid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode->VarStorage->Attributes,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode->ValueWidth,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Value->Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data1.Value.b = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Not recognize storage.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // For Time/Date Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OpCode->ValueType != EFI_IFR_TYPE_DATE && OpCode->ValueType != EFI_IFR_TYPE_TIME) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Only support Data/Time data when storage doesn't exist.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gRT->GetTime (&EfiTime, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OpCode->ValueType == EFI_IFR_TYPE_DATE) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (OpCode->VarStoreInfo.VarOffset) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 0x00:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiTime.Year = Value->Value.u16;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 0x02:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiTime.Month = Value->Value.u8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 0x03:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiTime.Day = Value->Value.u8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Invalid Date field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (OpCode->VarStoreInfo.VarOffset) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 0x00:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiTime.Hour = Value->Value.u8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 0x01:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiTime.Minute = Value->Value.u8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 0x02:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiTime.Second = Value->Value.u8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Invalid Time field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gRT->SetTime (&EfiTime);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data1.Value.b = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value = &Data1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // binary-op
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_ADD_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_SUBTRACT_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_MULTIPLY_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_DIVIDE_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_MODULO_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_BITWISE_AND_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_BITWISE_OR_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_SHIFT_LEFT_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_SHIFT_RIGHT_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Pop an expression from the expression stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (&Data2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Pop another expression from the expression stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (&Data1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Data2.Type > EFI_IFR_TYPE_DATE) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Data1.Type > EFI_IFR_TYPE_DATE) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (OpCode->Operand) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_ADD_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.u64 = Data1.Value.u64 + Data2.Value.u64;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_SUBTRACT_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.u64 = Data1.Value.u64 - Data2.Value.u64;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_MULTIPLY_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.u64 = MultU64x32 (Data1.Value.u64, (UINT32) Data2.Value.u64);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_DIVIDE_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.u64 = DivU64x32 (Data1.Value.u64, (UINT32) Data2.Value.u64);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_MODULO_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DivU64x32Remainder (Data1.Value.u64, (UINT32) Data2.Value.u64, &TempValue);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.u64 = TempValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_BITWISE_AND_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.u64 = Data1.Value.u64 & Data2.Value.u64;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_BITWISE_OR_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.u64 = Data1.Value.u64 | Data2.Value.u64;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_SHIFT_LEFT_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.u64 = LShiftU64 (Data1.Value.u64, (UINTN) Data2.Value.u64);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_SHIFT_RIGHT_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.u64 = RShiftU64 (Data1.Value.u64, (UINTN) Data2.Value.u64);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_AND_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_OR_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Two Boolean operator
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (&Data2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Pop another expression from the expression stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (&Data1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Data2.Type != EFI_IFR_TYPE_BOOLEAN) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Data1.Type != EFI_IFR_TYPE_BOOLEAN) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OpCode->Operand == EFI_IFR_AND_OP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.b = (BOOLEAN) (Data1.Value.b && Data2.Value.b);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.b = (BOOLEAN) (Data1.Value.b || Data2.Value.b);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_EQUAL_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_NOT_EQUAL_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_GREATER_EQUAL_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_GREATER_THAN_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_LESS_EQUAL_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_LESS_THAN_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Compare two integer, string, boolean or date/time
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (&Data2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Pop another expression from the expression stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (&Data1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Data2.Type > EFI_IFR_TYPE_BOOLEAN &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data2.Type != EFI_IFR_TYPE_STRING &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data2.Type != EFI_IFR_TYPE_BUFFER) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Data1.Type > EFI_IFR_TYPE_BOOLEAN &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data1.Type != EFI_IFR_TYPE_STRING &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data1.Type != EFI_IFR_TYPE_BUFFER) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = CompareHiiValue (&Data1, &Data2, &Result, FormSet->HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Data1.Type == EFI_IFR_TYPE_BUFFER) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Data1.Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Data2.Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status == EFI_UNSUPPORTED) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (OpCode->Operand) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_EQUAL_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.b = (BOOLEAN) ((Result == 0) ? TRUE : FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_NOT_EQUAL_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.b = (BOOLEAN) ((Result != 0) ? TRUE : FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_GREATER_EQUAL_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.b = (BOOLEAN) ((Result >= 0) ? TRUE : FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_GREATER_THAN_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.b = (BOOLEAN) ((Result > 0) ? TRUE : FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_LESS_EQUAL_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.b = (BOOLEAN) ((Result <= 0) ? TRUE : FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_LESS_THAN_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.b = (BOOLEAN) ((Result < 0) ? TRUE : FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_MATCH_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = InitializeUnicodeCollationProtocol ();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = IfrMatch (FormSet, Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_CATENATE_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = IfrCatenate (FormSet, Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // ternary-op
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_CONDITIONAL_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Pop third expression from the expression stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (&Data3);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Pop second expression from the expression stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (&Data2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Pop first expression from the expression stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (&Data1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Data1.Type != EFI_IFR_TYPE_BOOLEAN) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Data1.Value.b) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value = &Data3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value = &Data2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_FIND_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = IfrFind (FormSet, OpCode->Format, Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_MID_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = IfrMid (FormSet, Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_TOKEN_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = IfrToken (FormSet, Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_SPAN_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = IfrSpan (FormSet, OpCode->Flags, Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_MAP_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Pop the check value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (&Data1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check MapExpression list is valid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OpCode->MapExpressionList.ForwardLink == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Go through map expression list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SubExpressionLink = GetFirstNode(&OpCode->MapExpressionList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsNull (&OpCode->MapExpressionList, SubExpressionLink)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SubExpression = FORM_EXPRESSION_FROM_LINK (SubExpressionLink);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Evaluate the first expression in this pair.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EvaluateExpression (FormSet, Form, SubExpression);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Compare the expression value with current value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((CompareHiiValue (&Data1, &SubExpression->Result, &Result, NULL) == EFI_SUCCESS) && (Result == 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Try get the map value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SubExpressionLink = GetNextNode (&OpCode->MapExpressionList, SubExpressionLink);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNull (&OpCode->MapExpressionList, SubExpressionLink)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SubExpression = FORM_EXPRESSION_FROM_LINK (SubExpressionLink);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EvaluateExpression (FormSet, Form, SubExpression);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value = &SubExpression->Result;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Skip the second expression on this pair.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SubExpressionLink = GetNextNode (&OpCode->MapExpressionList, SubExpressionLink);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNull (&OpCode->MapExpressionList, SubExpressionLink)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Goto the first expression on next pair.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SubExpressionLink = GetNextNode (&OpCode->MapExpressionList, SubExpressionLink);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // No map value is found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNull (&OpCode->MapExpressionList, SubExpressionLink)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Type = EFI_IFR_TYPE_UNDEFINED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value->Value.u8 = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status) || Value->Type == EFI_IFR_TYPE_UNDEFINED) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PushExpression (Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Pop the final result from expression stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value = &Data1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PopExpression (Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // After evaluating an expression, there should be only one value left on the expression stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (PopExpression (Value) != EFI_ACCESS_DENIED) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDone:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RestoreExpressionEvaluationStackOffset (StackOffset);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&Expression->Result, Value, sizeof (EFI_HII_VALUE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Return the result of the expression list. Check the expression list and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return the highest priority express result.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Priority: DisableIf > SuppressIf > GrayOutIf > FALSE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param ExpList The input expression list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Evaluate Whether need to evaluate the expression first.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FormSet FormSet associated with this expression.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Form Form associated with this expression.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EXPRESS_RESULT Return the higher priority express result.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DisableIf > SuppressIf > GrayOutIf > FALSE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEXPRESS_RESULT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEvaluateExpressionList (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN FORM_EXPRESSION_LIST *ExpList,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN BOOLEAN Evaluate,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN FORM_BROWSER_FORMSET *FormSet, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN FORM_BROWSER_FORM *Form OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EXPRESS_RESULT ReturnVal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EXPRESS_RESULT CompareOne;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ExpList == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ExpressFalse;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(ExpList->Signature == FORM_EXPRESSION_LIST_SIGNATURE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether need to evaluate the expression first.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Evaluate) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (ExpList->Count > Index) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EvaluateExpression (FormSet, Form, ExpList->Expression[Index++]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ExpressFalse;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Run the list of expressions.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ReturnVal = ExpressFalse;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < ExpList->Count; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ExpList->Expression[Index]->Result.Type == EFI_IFR_TYPE_BOOLEAN &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ExpList->Expression[Index]->Result.Value.b) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (ExpList->Expression[Index]->Type) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_HII_EXPRESSION_SUPPRESS_IF:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CompareOne = ExpressSuppress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_HII_EXPRESSION_GRAY_OUT_IF:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CompareOne = ExpressGrayOut;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_HII_EXPRESSION_DISABLE_IF:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CompareOne = ExpressDisable;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ExpressFalse;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ReturnVal = ReturnVal < CompareOne ? CompareOne : ReturnVal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ReturnVal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}