mirror of https://github.com/acidanthera/audk.git
Update the code to follow UEFI spec, process date/time/ref value type as buffer type when in an expression.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Eric Dong <eric.dong@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15690 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
f449affebd
commit
40578d09d1
|
@ -2,7 +2,7 @@
|
||||||
Implementation for handling the User Interface option processing.
|
Implementation for handling the User Interface option processing.
|
||||||
|
|
||||||
|
|
||||||
Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
@ -98,6 +98,107 @@ HiiValueToUINT64 (
|
||||||
return RetVal;
|
return RetVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Check whether this value type can be transfer to EFI_IFR_TYPE_BUFFER type.
|
||||||
|
|
||||||
|
EFI_IFR_TYPE_REF, EFI_IFR_TYPE_DATE and EFI_IFR_TYPE_TIME are converted to
|
||||||
|
EFI_IFR_TYPE_BUFFER when do the value compare.
|
||||||
|
|
||||||
|
@param Value Expression value to compare on.
|
||||||
|
|
||||||
|
@retval TRUE This value type can be transter to EFI_IFR_TYPE_BUFFER type.
|
||||||
|
@retval FALSE This value type can't be transter to EFI_IFR_TYPE_BUFFER type.
|
||||||
|
|
||||||
|
**/
|
||||||
|
BOOLEAN
|
||||||
|
IsTypeInBuffer (
|
||||||
|
IN EFI_HII_VALUE *Value
|
||||||
|
)
|
||||||
|
{
|
||||||
|
switch (Value->Type) {
|
||||||
|
case EFI_IFR_TYPE_BUFFER:
|
||||||
|
case EFI_IFR_TYPE_DATE:
|
||||||
|
case EFI_IFR_TYPE_TIME:
|
||||||
|
case EFI_IFR_TYPE_REF:
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Check whether this value type can be transfer to EFI_IFR_TYPE_UINT64
|
||||||
|
|
||||||
|
@param Value Expression value to compare on.
|
||||||
|
|
||||||
|
@retval TRUE This value type can be transter to EFI_IFR_TYPE_BUFFER type.
|
||||||
|
@retval FALSE This value type can't be transter to EFI_IFR_TYPE_BUFFER type.
|
||||||
|
|
||||||
|
**/
|
||||||
|
BOOLEAN
|
||||||
|
IsTypeInUINT64 (
|
||||||
|
IN EFI_HII_VALUE *Value
|
||||||
|
)
|
||||||
|
{
|
||||||
|
switch (Value->Type) {
|
||||||
|
case EFI_IFR_TYPE_NUM_SIZE_8:
|
||||||
|
case EFI_IFR_TYPE_NUM_SIZE_16:
|
||||||
|
case EFI_IFR_TYPE_NUM_SIZE_32:
|
||||||
|
case EFI_IFR_TYPE_NUM_SIZE_64:
|
||||||
|
case EFI_IFR_TYPE_BOOLEAN:
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Return the buffer length and buffer pointer for this value.
|
||||||
|
|
||||||
|
EFI_IFR_TYPE_REF, EFI_IFR_TYPE_DATE and EFI_IFR_TYPE_TIME are converted to
|
||||||
|
EFI_IFR_TYPE_BUFFER when do the value compare.
|
||||||
|
|
||||||
|
@param Value Expression value to compare on.
|
||||||
|
@param Buf Return the buffer pointer.
|
||||||
|
@param BufLen Return the buffer length.
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
GetBufAndLenForValue (
|
||||||
|
IN EFI_HII_VALUE *Value,
|
||||||
|
OUT UINT8 **Buf,
|
||||||
|
OUT UINT16 *BufLen
|
||||||
|
)
|
||||||
|
{
|
||||||
|
switch (Value->Type) {
|
||||||
|
case EFI_IFR_TYPE_BUFFER:
|
||||||
|
*Buf = Value->Buffer;
|
||||||
|
*BufLen = Value->BufferLen;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EFI_IFR_TYPE_DATE:
|
||||||
|
*Buf = (UINT8 *) (&Value->Value.date);
|
||||||
|
*BufLen = (UINT16) sizeof (EFI_HII_DATE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EFI_IFR_TYPE_TIME:
|
||||||
|
*Buf = (UINT8 *) (&Value->Value.time);
|
||||||
|
*BufLen = (UINT16) sizeof (EFI_HII_TIME);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EFI_IFR_TYPE_REF:
|
||||||
|
*Buf = (UINT8 *) (&Value->Value.ref);
|
||||||
|
*BufLen = (UINT16) sizeof (EFI_HII_REF);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
*Buf = NULL;
|
||||||
|
*BufLen = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Compare two Hii value.
|
Compare two Hii value.
|
||||||
|
|
||||||
|
@ -125,21 +226,12 @@ CompareHiiValue (
|
||||||
CHAR16 *Str1;
|
CHAR16 *Str1;
|
||||||
CHAR16 *Str2;
|
CHAR16 *Str2;
|
||||||
UINTN Len;
|
UINTN Len;
|
||||||
|
UINT8 *Buf1;
|
||||||
|
UINT16 Buf1Len;
|
||||||
|
UINT8 *Buf2;
|
||||||
|
UINT16 Buf2Len;
|
||||||
|
|
||||||
if (Value1->Type >= EFI_IFR_TYPE_OTHER || Value2->Type >= EFI_IFR_TYPE_OTHER ) {
|
if (Value1->Type == EFI_IFR_TYPE_STRING && Value2->Type == EFI_IFR_TYPE_STRING) {
|
||||||
if (Value1->Type != EFI_IFR_TYPE_BUFFER && Value2->Type != EFI_IFR_TYPE_BUFFER) {
|
|
||||||
return EFI_UNSUPPORTED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Value1->Type == EFI_IFR_TYPE_STRING || Value2->Type == EFI_IFR_TYPE_STRING ) {
|
|
||||||
if (Value1->Type != Value2->Type) {
|
|
||||||
//
|
|
||||||
// Both Operator should be type of String
|
|
||||||
//
|
|
||||||
return EFI_UNSUPPORTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Value1->Value.string == 0 || Value2->Value.string == 0) {
|
if (Value1->Value.string == 0 || Value2->Value.string == 0) {
|
||||||
//
|
//
|
||||||
// StringId 0 is reserved
|
// StringId 0 is reserved
|
||||||
|
@ -174,22 +266,21 @@ CompareHiiValue (
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Value1->Type == EFI_IFR_TYPE_BUFFER || Value2->Type == EFI_IFR_TYPE_BUFFER ) {
|
//
|
||||||
if (Value1->Type != Value2->Type) {
|
// Take types(date, time, ref, buffer) as buffer
|
||||||
//
|
//
|
||||||
// Both Operator should be type of Buffer.
|
if (IsTypeInBuffer(Value1) && IsTypeInBuffer(Value2)) {
|
||||||
//
|
GetBufAndLenForValue(Value1, &Buf1, &Buf1Len);
|
||||||
return EFI_UNSUPPORTED;
|
GetBufAndLenForValue(Value2, &Buf2, &Buf2Len);
|
||||||
}
|
|
||||||
Len = Value1->BufferLen > Value2->BufferLen ? Value2->BufferLen : Value1->BufferLen;
|
Len = Buf1Len > Buf2Len ? Buf2Len : Buf1Len;
|
||||||
*Result = CompareMem (Value1->Buffer, Value2->Buffer, Len);
|
*Result = CompareMem (Buf1, Buf2, Len);
|
||||||
if ((*Result == 0) && (Value1->BufferLen != Value2->BufferLen))
|
if ((*Result == 0) && (Buf1Len != Buf2Len)) {
|
||||||
{
|
|
||||||
//
|
//
|
||||||
// In this case, means base on samll number buffer, the data is same
|
// In this case, means base on samll number buffer, the data is same
|
||||||
// So which value has more data, which value is bigger.
|
// So which value has more data, which value is bigger.
|
||||||
//
|
//
|
||||||
*Result = Value1->BufferLen > Value2->BufferLen ? 1 : -1;
|
*Result = Buf1Len > Buf2Len ? 1 : -1;
|
||||||
}
|
}
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -197,16 +288,19 @@ CompareHiiValue (
|
||||||
//
|
//
|
||||||
// Take remain types(integer, boolean, date/time) as integer
|
// Take remain types(integer, boolean, date/time) as integer
|
||||||
//
|
//
|
||||||
Temp64 = HiiValueToUINT64(Value1) - HiiValueToUINT64(Value2);
|
if (IsTypeInUINT64(Value1) && IsTypeInUINT64(Value2)) {
|
||||||
if (Temp64 > 0) {
|
Temp64 = HiiValueToUINT64(Value1) - HiiValueToUINT64(Value2);
|
||||||
*Result = 1;
|
if (Temp64 > 0) {
|
||||||
} else if (Temp64 < 0) {
|
*Result = 1;
|
||||||
*Result = -1;
|
} else if (Temp64 < 0) {
|
||||||
} else {
|
*Result = -1;
|
||||||
*Result = 0;
|
} else {
|
||||||
|
*Result = 0;
|
||||||
|
}
|
||||||
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/** @file
|
/** @file
|
||||||
Utility functions for expression evaluation.
|
Utility functions for expression evaluation.
|
||||||
|
|
||||||
Copyright (c) 2007 - 2013, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
@ -988,6 +988,129 @@ IfrStrToUpper (
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Check whether this value type can be transfer to EFI_IFR_TYPE_BUFFER type.
|
||||||
|
|
||||||
|
EFI_IFR_TYPE_REF, EFI_IFR_TYPE_DATE and EFI_IFR_TYPE_TIME are converted to
|
||||||
|
EFI_IFR_TYPE_BUFFER when do the value compare.
|
||||||
|
|
||||||
|
@param Value Expression value to compare on.
|
||||||
|
|
||||||
|
@retval TRUE This value type can be transter to EFI_IFR_TYPE_BUFFER type.
|
||||||
|
@retval FALSE This value type can't be transter to EFI_IFR_TYPE_BUFFER type.
|
||||||
|
|
||||||
|
**/
|
||||||
|
BOOLEAN
|
||||||
|
IsTypeInBuffer (
|
||||||
|
IN EFI_HII_VALUE *Value
|
||||||
|
)
|
||||||
|
{
|
||||||
|
switch (Value->Type) {
|
||||||
|
case EFI_IFR_TYPE_BUFFER:
|
||||||
|
case EFI_IFR_TYPE_DATE:
|
||||||
|
case EFI_IFR_TYPE_TIME:
|
||||||
|
case EFI_IFR_TYPE_REF:
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Check whether this value type can be transfer to EFI_IFR_TYPE_UINT64
|
||||||
|
|
||||||
|
@param Value Expression value to compare on.
|
||||||
|
|
||||||
|
@retval TRUE This value type can be transter to EFI_IFR_TYPE_BUFFER type.
|
||||||
|
@retval FALSE This value type can't be transter to EFI_IFR_TYPE_BUFFER type.
|
||||||
|
|
||||||
|
**/
|
||||||
|
BOOLEAN
|
||||||
|
IsTypeInUINT64 (
|
||||||
|
IN EFI_HII_VALUE *Value
|
||||||
|
)
|
||||||
|
{
|
||||||
|
switch (Value->Type) {
|
||||||
|
case EFI_IFR_TYPE_NUM_SIZE_8:
|
||||||
|
case EFI_IFR_TYPE_NUM_SIZE_16:
|
||||||
|
case EFI_IFR_TYPE_NUM_SIZE_32:
|
||||||
|
case EFI_IFR_TYPE_NUM_SIZE_64:
|
||||||
|
case EFI_IFR_TYPE_BOOLEAN:
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Return the buffer length for this value.
|
||||||
|
|
||||||
|
EFI_IFR_TYPE_REF, EFI_IFR_TYPE_DATE and EFI_IFR_TYPE_TIME are converted to
|
||||||
|
EFI_IFR_TYPE_BUFFER when do the value compare.
|
||||||
|
|
||||||
|
@param Value Expression value to compare on.
|
||||||
|
|
||||||
|
@retval BufLen Return the buffer length.
|
||||||
|
|
||||||
|
**/
|
||||||
|
UINT16
|
||||||
|
GetLengthForValue (
|
||||||
|
IN EFI_HII_VALUE *Value
|
||||||
|
)
|
||||||
|
{
|
||||||
|
switch (Value->Type) {
|
||||||
|
case EFI_IFR_TYPE_BUFFER:
|
||||||
|
return Value->BufferLen;
|
||||||
|
|
||||||
|
case EFI_IFR_TYPE_DATE:
|
||||||
|
return (UINT16) sizeof (EFI_HII_DATE);
|
||||||
|
|
||||||
|
case EFI_IFR_TYPE_TIME:
|
||||||
|
return (UINT16) sizeof (EFI_HII_TIME);
|
||||||
|
|
||||||
|
case EFI_IFR_TYPE_REF:
|
||||||
|
return (UINT16) sizeof (EFI_HII_REF);
|
||||||
|
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Return the buffer pointer for this value.
|
||||||
|
|
||||||
|
EFI_IFR_TYPE_REF, EFI_IFR_TYPE_DATE and EFI_IFR_TYPE_TIME are converted to
|
||||||
|
EFI_IFR_TYPE_BUFFER when do the value compare.
|
||||||
|
|
||||||
|
@param Value Expression value to compare on.
|
||||||
|
|
||||||
|
@retval Buf Return the buffer pointer.
|
||||||
|
|
||||||
|
**/
|
||||||
|
UINT8 *
|
||||||
|
GetBufferForValue (
|
||||||
|
IN EFI_HII_VALUE *Value
|
||||||
|
)
|
||||||
|
{
|
||||||
|
switch (Value->Type) {
|
||||||
|
case EFI_IFR_TYPE_BUFFER:
|
||||||
|
return Value->Buffer;
|
||||||
|
|
||||||
|
case EFI_IFR_TYPE_DATE:
|
||||||
|
return (UINT8 *) (&Value->Value.date);
|
||||||
|
|
||||||
|
case EFI_IFR_TYPE_TIME:
|
||||||
|
return (UINT8 *) (&Value->Value.time);
|
||||||
|
|
||||||
|
case EFI_IFR_TYPE_REF:
|
||||||
|
return (UINT8 *) (&Value->Value.ref);
|
||||||
|
|
||||||
|
default:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Evaluate opcode EFI_IFR_TO_STRING.
|
Evaluate opcode EFI_IFR_TO_STRING.
|
||||||
|
@ -1013,6 +1136,8 @@ IfrToString (
|
||||||
CHAR16 *PrintFormat;
|
CHAR16 *PrintFormat;
|
||||||
CHAR16 Buffer[MAXIMUM_VALUE_CHARACTERS];
|
CHAR16 Buffer[MAXIMUM_VALUE_CHARACTERS];
|
||||||
UINT8 *TmpBuf;
|
UINT8 *TmpBuf;
|
||||||
|
UINT8 *SrcBuf;
|
||||||
|
UINTN SrcLen;
|
||||||
UINTN BufferSize;
|
UINTN BufferSize;
|
||||||
|
|
||||||
Status = PopExpression (&Value);
|
Status = PopExpression (&Value);
|
||||||
|
@ -1057,24 +1182,37 @@ IfrToString (
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EFI_IFR_TYPE_BUFFER:
|
case EFI_IFR_TYPE_BUFFER:
|
||||||
|
case EFI_IFR_TYPE_DATE:
|
||||||
|
case EFI_IFR_TYPE_TIME:
|
||||||
|
case EFI_IFR_TYPE_REF:
|
||||||
//
|
//
|
||||||
// + 3 is base on the unicode format, the length may be odd number,
|
// + 3 is base on the unicode format, the length may be odd number,
|
||||||
// so need 1 byte to align, also need 2 bytes for L'\0'.
|
// so need 1 byte to align, also need 2 bytes for L'\0'.
|
||||||
//
|
//
|
||||||
TmpBuf = AllocateZeroPool (Value.BufferLen + 3);
|
if (Value.Type == EFI_IFR_TYPE_BUFFER) {
|
||||||
|
SrcLen = Value.BufferLen;
|
||||||
|
SrcBuf = Value.Buffer;
|
||||||
|
} else {
|
||||||
|
SrcBuf = GetBufferForValue(&Value);
|
||||||
|
SrcLen = GetLengthForValue(&Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
TmpBuf = AllocateZeroPool (SrcLen + 3);
|
||||||
ASSERT (TmpBuf != NULL);
|
ASSERT (TmpBuf != NULL);
|
||||||
if (Format == EFI_IFR_STRING_ASCII) {
|
if (Format == EFI_IFR_STRING_ASCII) {
|
||||||
CopyMem (TmpBuf, Value.Buffer, Value.BufferLen);
|
CopyMem (TmpBuf, SrcBuf, SrcLen);
|
||||||
PrintFormat = L"%a";
|
PrintFormat = L"%a";
|
||||||
} else {
|
} else {
|
||||||
// Format == EFI_IFR_STRING_UNICODE
|
// Format == EFI_IFR_STRING_UNICODE
|
||||||
CopyMem (TmpBuf, Value.Buffer, Value.BufferLen * sizeof (CHAR16));
|
CopyMem (TmpBuf, SrcBuf, SrcLen * sizeof (CHAR16));
|
||||||
PrintFormat = L"%s";
|
PrintFormat = L"%s";
|
||||||
}
|
}
|
||||||
UnicodeSPrint (Buffer, sizeof (Buffer), PrintFormat, Value.Buffer);
|
UnicodeSPrint (Buffer, sizeof (Buffer), PrintFormat, TmpBuf);
|
||||||
String = Buffer;
|
String = Buffer;
|
||||||
FreePool (TmpBuf);
|
FreePool (TmpBuf);
|
||||||
FreePool (Value.Buffer);
|
if (Value.Type == EFI_IFR_TYPE_BUFFER) {
|
||||||
|
FreePool (Value.Buffer);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -1114,7 +1252,7 @@ IfrToUint (
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Value.Type >= EFI_IFR_TYPE_OTHER && Value.Type != EFI_IFR_TYPE_BUFFER) {
|
if (Value.Type >= EFI_IFR_TYPE_OTHER && !IsTypeInBuffer(&Value)) {
|
||||||
Result->Type = EFI_IFR_TYPE_UNDEFINED;
|
Result->Type = EFI_IFR_TYPE_UNDEFINED;
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -1140,14 +1278,18 @@ IfrToUint (
|
||||||
Result->Value.u64 = StrDecimalToUint64 (String);
|
Result->Value.u64 = StrDecimalToUint64 (String);
|
||||||
}
|
}
|
||||||
FreePool (String);
|
FreePool (String);
|
||||||
} else if (Value.Type == EFI_IFR_TYPE_BUFFER) {
|
} else if (IsTypeInBuffer(&Value)) {
|
||||||
if (Value.BufferLen > 8) {
|
if (GetLengthForValue (&Value) > 8) {
|
||||||
FreePool (Value.Buffer);
|
if (Value.Type == EFI_IFR_TYPE_BUFFER) {
|
||||||
|
FreePool (Value.Buffer);
|
||||||
|
}
|
||||||
Result->Type = EFI_IFR_TYPE_UNDEFINED;
|
Result->Type = EFI_IFR_TYPE_UNDEFINED;
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
Result->Value.u64 = *(UINT64*) Value.Buffer;
|
Result->Value.u64 = *(UINT64*) GetBufferForValue (&Value);
|
||||||
FreePool (Value.Buffer);
|
if (Value.Type == EFI_IFR_TYPE_BUFFER) {
|
||||||
|
FreePool (Value.Buffer);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
CopyMem (Result, &Value, sizeof (EFI_HII_VALUE));
|
CopyMem (Result, &Value, sizeof (EFI_HII_VALUE));
|
||||||
}
|
}
|
||||||
|
@ -1179,6 +1321,8 @@ IfrCatenate (
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
CHAR16 *StringPtr;
|
CHAR16 *StringPtr;
|
||||||
UINTN Size;
|
UINTN Size;
|
||||||
|
UINT16 Length0;
|
||||||
|
UINT16 Length1;
|
||||||
|
|
||||||
//
|
//
|
||||||
// String[0] - The second string
|
// String[0] - The second string
|
||||||
|
@ -1201,7 +1345,7 @@ IfrCatenate (
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Index = 0; Index < 2; Index++) {
|
for (Index = 0; Index < 2; Index++) {
|
||||||
if (Value[Index].Type != EFI_IFR_TYPE_STRING && Value[Index].Type != EFI_IFR_TYPE_BUFFER) {
|
if (Value[Index].Type != EFI_IFR_TYPE_STRING && !IsTypeInBuffer(&Value[Index])) {
|
||||||
Result->Type = EFI_IFR_TYPE_UNDEFINED;
|
Result->Type = EFI_IFR_TYPE_UNDEFINED;
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
goto Done;
|
goto Done;
|
||||||
|
@ -1227,13 +1371,15 @@ IfrCatenate (
|
||||||
Result->Value.string = NewString (StringPtr, FormSet->HiiHandle);
|
Result->Value.string = NewString (StringPtr, FormSet->HiiHandle);
|
||||||
} else {
|
} else {
|
||||||
Result->Type = EFI_IFR_TYPE_BUFFER;
|
Result->Type = EFI_IFR_TYPE_BUFFER;
|
||||||
Result->BufferLen = (UINT16) (Value[0].BufferLen + Value[1].BufferLen);
|
Length0 = GetLengthForValue(&Value[0]);
|
||||||
|
Length1 = GetLengthForValue(&Value[1]);
|
||||||
|
Result->BufferLen = (UINT16) (Length0 + Length1);
|
||||||
|
|
||||||
Result->Buffer = AllocateZeroPool (Result->BufferLen);
|
Result->Buffer = AllocateZeroPool (Result->BufferLen);
|
||||||
ASSERT (Result->Buffer != NULL);
|
ASSERT (Result->Buffer != NULL);
|
||||||
|
|
||||||
CopyMem (Result->Buffer, Value[0].Buffer, Value[0].BufferLen);
|
CopyMem (Result->Buffer, GetBufferForValue(&Value[0]), Length0);
|
||||||
CopyMem (&Result->Buffer[Value[0].BufferLen], Value[1].Buffer, Value[1].BufferLen);
|
CopyMem (&Result->Buffer[Length0], GetBufferForValue(&Value[1]), Length1);
|
||||||
}
|
}
|
||||||
Done:
|
Done:
|
||||||
if (Value[0].Buffer != NULL) {
|
if (Value[0].Buffer != NULL) {
|
||||||
|
@ -1447,6 +1593,7 @@ IfrMid (
|
||||||
UINTN Length;
|
UINTN Length;
|
||||||
CHAR16 *SubString;
|
CHAR16 *SubString;
|
||||||
UINT16 BufferLen;
|
UINT16 BufferLen;
|
||||||
|
UINT8 *Buffer;
|
||||||
|
|
||||||
ZeroMem (Value, sizeof (Value));
|
ZeroMem (Value, sizeof (Value));
|
||||||
|
|
||||||
|
@ -1477,7 +1624,7 @@ IfrMid (
|
||||||
}
|
}
|
||||||
Base = (UINTN) Value[1].Value.u64;
|
Base = (UINTN) Value[1].Value.u64;
|
||||||
|
|
||||||
if (Value[2].Type != EFI_IFR_TYPE_STRING && Value[2].Type != EFI_IFR_TYPE_BUFFER) {
|
if (Value[2].Type != EFI_IFR_TYPE_STRING && !IsTypeInBuffer(&Value[2])) {
|
||||||
Result->Type = EFI_IFR_TYPE_UNDEFINED;
|
Result->Type = EFI_IFR_TYPE_UNDEFINED;
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -1501,8 +1648,9 @@ IfrMid (
|
||||||
|
|
||||||
FreePool (String);
|
FreePool (String);
|
||||||
} else {
|
} else {
|
||||||
BufferLen = Value[2].BufferLen;
|
BufferLen = GetLengthForValue (&Value[2]);
|
||||||
|
Buffer = GetBufferForValue (&Value[2]);
|
||||||
|
|
||||||
Result->Type = EFI_IFR_TYPE_BUFFER;
|
Result->Type = EFI_IFR_TYPE_BUFFER;
|
||||||
if (Length == 0 || Base >= BufferLen) {
|
if (Length == 0 || Base >= BufferLen) {
|
||||||
Result->BufferLen = 0;
|
Result->BufferLen = 0;
|
||||||
|
@ -1511,10 +1659,12 @@ IfrMid (
|
||||||
Result->BufferLen = (UINT16)((BufferLen - Base) < Length ? (BufferLen - Base) : Length);
|
Result->BufferLen = (UINT16)((BufferLen - Base) < Length ? (BufferLen - Base) : Length);
|
||||||
Result->Buffer = AllocateZeroPool (Result->BufferLen);
|
Result->Buffer = AllocateZeroPool (Result->BufferLen);
|
||||||
ASSERT (Result->Buffer != NULL);
|
ASSERT (Result->Buffer != NULL);
|
||||||
CopyMem (Result->Buffer, &Value[2].Buffer[Base], Result->BufferLen);
|
CopyMem (Result->Buffer, &Buffer[Base], Result->BufferLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool (Value[2].Buffer);
|
if (Value[2].Type == EFI_IFR_TYPE_BUFFER) {
|
||||||
|
FreePool (Value[2].Buffer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
|
@ -1876,21 +2026,12 @@ CompareHiiValue (
|
||||||
CHAR16 *Str1;
|
CHAR16 *Str1;
|
||||||
CHAR16 *Str2;
|
CHAR16 *Str2;
|
||||||
UINTN Len;
|
UINTN Len;
|
||||||
|
UINT8 *Buf1;
|
||||||
|
UINT16 Buf1Len;
|
||||||
|
UINT8 *Buf2;
|
||||||
|
UINT16 Buf2Len;
|
||||||
|
|
||||||
if (Value1->Type >= EFI_IFR_TYPE_OTHER || Value2->Type >= EFI_IFR_TYPE_OTHER ) {
|
if (Value1->Type == EFI_IFR_TYPE_STRING && Value2->Type == EFI_IFR_TYPE_STRING) {
|
||||||
if (Value1->Type != EFI_IFR_TYPE_BUFFER && Value2->Type != EFI_IFR_TYPE_BUFFER) {
|
|
||||||
return EFI_UNSUPPORTED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Value1->Type == EFI_IFR_TYPE_STRING || Value2->Type == EFI_IFR_TYPE_STRING ) {
|
|
||||||
if (Value1->Type != Value2->Type) {
|
|
||||||
//
|
|
||||||
// Both Operator should be type of String
|
|
||||||
//
|
|
||||||
return EFI_UNSUPPORTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Value1->Value.string == 0 || Value2->Value.string == 0) {
|
if (Value1->Value.string == 0 || Value2->Value.string == 0) {
|
||||||
//
|
//
|
||||||
// StringId 0 is reserved
|
// StringId 0 is reserved
|
||||||
|
@ -1925,39 +2066,44 @@ CompareHiiValue (
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Value1->Type == EFI_IFR_TYPE_BUFFER || Value2->Type == EFI_IFR_TYPE_BUFFER ) {
|
//
|
||||||
if (Value1->Type != Value2->Type) {
|
// Take types(date, time, ref, buffer) as buffer
|
||||||
//
|
//
|
||||||
// Both Operator should be type of Buffer.
|
if (IsTypeInBuffer(Value1) && IsTypeInBuffer(Value2)) {
|
||||||
//
|
Buf1 = GetBufferForValue(Value1);
|
||||||
return EFI_UNSUPPORTED;
|
Buf1Len = GetLengthForValue(Value1);
|
||||||
}
|
Buf2 = GetBufferForValue(Value2);
|
||||||
Len = Value1->BufferLen > Value2->BufferLen ? Value2->BufferLen : Value1->BufferLen;
|
Buf2Len = GetLengthForValue(Value2);
|
||||||
*Result = CompareMem (Value1->Buffer, Value2->Buffer, Len);
|
|
||||||
if ((*Result == 0) && (Value1->BufferLen != Value2->BufferLen))
|
Len = Buf1Len > Buf2Len ? Buf2Len : Buf1Len;
|
||||||
{
|
*Result = CompareMem (Buf1, Buf2, Len);
|
||||||
|
if ((*Result == 0) && (Buf1Len != Buf2Len)) {
|
||||||
//
|
//
|
||||||
// In this case, means base on samll number buffer, the data is same
|
// In this case, means base on samll number buffer, the data is same
|
||||||
// So which value has more data, which value is bigger.
|
// So which value has more data, which value is bigger.
|
||||||
//
|
//
|
||||||
*Result = Value1->BufferLen > Value2->BufferLen ? 1 : -1;
|
*Result = Buf1Len > Buf2Len ? 1 : -1;
|
||||||
}
|
}
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Take remain types(integer, boolean, date/time) as integer
|
// Take types(integer, boolean) as integer
|
||||||
//
|
//
|
||||||
Temp64 = HiiValueToUINT64(Value1) - HiiValueToUINT64(Value2);
|
if (IsTypeInUINT64(Value1) && IsTypeInUINT64(Value2)) {
|
||||||
if (Temp64 > 0) {
|
Temp64 = HiiValueToUINT64(Value1) - HiiValueToUINT64(Value2);
|
||||||
*Result = 1;
|
if (Temp64 > 0) {
|
||||||
} else if (Temp64 < 0) {
|
*Result = 1;
|
||||||
*Result = -1;
|
} else if (Temp64 < 0) {
|
||||||
} else {
|
*Result = -1;
|
||||||
*Result = 0;
|
} else {
|
||||||
|
*Result = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2572,7 +2718,7 @@ EvaluateExpression (
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto Done;
|
goto Done;
|
||||||
}
|
}
|
||||||
if (Value->Type != EFI_IFR_TYPE_STRING && Value->Type != EFI_IFR_TYPE_BUFFER) {
|
if (Value->Type != EFI_IFR_TYPE_STRING && !IsTypeInBuffer (Value)) {
|
||||||
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -2589,7 +2735,7 @@ EvaluateExpression (
|
||||||
FreePool (StrPtr);
|
FreePool (StrPtr);
|
||||||
} else {
|
} else {
|
||||||
Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;
|
Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;
|
||||||
Value->Value.u64 = Value->BufferLen;
|
Value->Value.u64 = GetLengthForValue(Value);
|
||||||
FreePool (Value->Buffer);
|
FreePool (Value->Buffer);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -2680,7 +2826,7 @@ EvaluateExpression (
|
||||||
// When converting from an unsigned integer, zero will be converted to
|
// When converting from an unsigned integer, zero will be converted to
|
||||||
// FALSE and any other value will be converted to TRUE.
|
// FALSE and any other value will be converted to TRUE.
|
||||||
//
|
//
|
||||||
Value->Value.b = (BOOLEAN) (Value->Value.u64 != 0);
|
Value->Value.b = (BOOLEAN) (HiiValueToUINT64(Value) != 0);
|
||||||
|
|
||||||
Value->Type = EFI_IFR_TYPE_BOOLEAN;
|
Value->Type = EFI_IFR_TYPE_BOOLEAN;
|
||||||
} else if (Value->Type == EFI_IFR_TYPE_STRING) {
|
} else if (Value->Type == EFI_IFR_TYPE_STRING) {
|
||||||
|
@ -2781,7 +2927,7 @@ EvaluateExpression (
|
||||||
}
|
}
|
||||||
|
|
||||||
Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;
|
Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;
|
||||||
Value->Value.u64 = ~Value->Value.u64;
|
Value->Value.u64 = ~ HiiValueToUINT64(Value);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EFI_IFR_SET_OP:
|
case EFI_IFR_SET_OP:
|
||||||
|
@ -2945,40 +3091,40 @@ EvaluateExpression (
|
||||||
|
|
||||||
switch (OpCode->Operand) {
|
switch (OpCode->Operand) {
|
||||||
case EFI_IFR_ADD_OP:
|
case EFI_IFR_ADD_OP:
|
||||||
Value->Value.u64 = Data1.Value.u64 + Data2.Value.u64;
|
Value->Value.u64 = HiiValueToUINT64(&Data1) + HiiValueToUINT64(&Data2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EFI_IFR_SUBTRACT_OP:
|
case EFI_IFR_SUBTRACT_OP:
|
||||||
Value->Value.u64 = Data1.Value.u64 - Data2.Value.u64;
|
Value->Value.u64 = HiiValueToUINT64(&Data1) - HiiValueToUINT64(&Data2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EFI_IFR_MULTIPLY_OP:
|
case EFI_IFR_MULTIPLY_OP:
|
||||||
Value->Value.u64 = MultU64x32 (Data1.Value.u64, (UINT32) Data2.Value.u64);
|
Value->Value.u64 = MultU64x32 (HiiValueToUINT64(&Data1), (UINT32) HiiValueToUINT64(&Data2));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EFI_IFR_DIVIDE_OP:
|
case EFI_IFR_DIVIDE_OP:
|
||||||
Value->Value.u64 = DivU64x32 (Data1.Value.u64, (UINT32) Data2.Value.u64);
|
Value->Value.u64 = DivU64x32 (HiiValueToUINT64(&Data1), (UINT32) HiiValueToUINT64(&Data2));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EFI_IFR_MODULO_OP:
|
case EFI_IFR_MODULO_OP:
|
||||||
DivU64x32Remainder (Data1.Value.u64, (UINT32) Data2.Value.u64, &TempValue);
|
DivU64x32Remainder (HiiValueToUINT64(&Data1), (UINT32) HiiValueToUINT64(&Data2), &TempValue);
|
||||||
Value->Value.u64 = TempValue;
|
Value->Value.u64 = TempValue;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EFI_IFR_BITWISE_AND_OP:
|
case EFI_IFR_BITWISE_AND_OP:
|
||||||
Value->Value.u64 = Data1.Value.u64 & Data2.Value.u64;
|
Value->Value.u64 = HiiValueToUINT64(&Data1) & HiiValueToUINT64(&Data2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EFI_IFR_BITWISE_OR_OP:
|
case EFI_IFR_BITWISE_OR_OP:
|
||||||
Value->Value.u64 = Data1.Value.u64 | Data2.Value.u64;
|
Value->Value.u64 = HiiValueToUINT64(&Data1) | HiiValueToUINT64(&Data2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EFI_IFR_SHIFT_LEFT_OP:
|
case EFI_IFR_SHIFT_LEFT_OP:
|
||||||
Value->Value.u64 = LShiftU64 (Data1.Value.u64, (UINTN) Data2.Value.u64);
|
Value->Value.u64 = LShiftU64 (HiiValueToUINT64(&Data1), (UINTN) HiiValueToUINT64(&Data2));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EFI_IFR_SHIFT_RIGHT_OP:
|
case EFI_IFR_SHIFT_RIGHT_OP:
|
||||||
Value->Value.u64 = RShiftU64 (Data1.Value.u64, (UINTN) Data2.Value.u64);
|
Value->Value.u64 = RShiftU64 (HiiValueToUINT64(&Data1), (UINTN) HiiValueToUINT64(&Data2));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -3045,14 +3191,14 @@ EvaluateExpression (
|
||||||
|
|
||||||
if (Data2.Type > EFI_IFR_TYPE_BOOLEAN &&
|
if (Data2.Type > EFI_IFR_TYPE_BOOLEAN &&
|
||||||
Data2.Type != EFI_IFR_TYPE_STRING &&
|
Data2.Type != EFI_IFR_TYPE_STRING &&
|
||||||
Data2.Type != EFI_IFR_TYPE_BUFFER) {
|
!IsTypeInBuffer(&Data2)) {
|
||||||
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Data1.Type > EFI_IFR_TYPE_BOOLEAN &&
|
if (Data1.Type > EFI_IFR_TYPE_BOOLEAN &&
|
||||||
Data1.Type != EFI_IFR_TYPE_STRING &&
|
Data1.Type != EFI_IFR_TYPE_STRING &&
|
||||||
Data1.Type != EFI_IFR_TYPE_BUFFER) {
|
!IsTypeInBuffer(&Data1)) {
|
||||||
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -3060,6 +3206,8 @@ EvaluateExpression (
|
||||||
Status = CompareHiiValue (&Data1, &Data2, &Result, FormSet->HiiHandle);
|
Status = CompareHiiValue (&Data1, &Data2, &Result, FormSet->HiiHandle);
|
||||||
if (Data1.Type == EFI_IFR_TYPE_BUFFER) {
|
if (Data1.Type == EFI_IFR_TYPE_BUFFER) {
|
||||||
FreePool (Data1.Buffer);
|
FreePool (Data1.Buffer);
|
||||||
|
}
|
||||||
|
if (Data2.Type == EFI_IFR_TYPE_BUFFER) {
|
||||||
FreePool (Data2.Buffer);
|
FreePool (Data2.Buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue