From c1e2752c99eacd81b4860091947584c8190914a2 Mon Sep 17 00:00:00 2001 From: ydong10 Date: Sun, 1 Apr 2012 07:28:09 +0000 Subject: When transfer from Unicode to hex number, current code only consider the 0-9 case, not include the A-F case, now update code to consider all. Signed-off-by: Dong Eric Reviewed-by: Ni Ruiyu git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13159 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Library/GenericBdsLib/BdsMisc.c | 34 ++++++++++++++++++---- 1 file changed, 29 insertions(+), 5 deletions(-) (limited to 'IntelFrameworkModulePkg/Library') diff --git a/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsMisc.c b/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsMisc.c index 904e968db9..15a47e1917 100644 --- a/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsMisc.c +++ b/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsMisc.c @@ -480,6 +480,30 @@ StrSizeEx ( return (Length + 1) * sizeof (*String); } +/** + Convert a single character to number. + It assumes the input Char is in the scope of L'0' ~ L'9' and L'A' ~ L'F' + + @param Char The input char which need to change to a hex number. + +**/ +UINTN +CharToUint ( + IN CHAR16 Char + ) +{ + if ((Char >= L'0') && (Char <= L'9')) { + return (UINTN) (Char - L'0'); + } + + if ((Char >= L'A') && (Char <= L'F')) { + return (UINTN) (Char - L'A' + 0xA); + } + + ASSERT (FALSE); + return 0; +} + /** Build the boot#### or driver#### option from the VariableName, the build boot#### or driver#### will also be linked to BdsCommonOptionList. @@ -613,11 +637,11 @@ BdsLibVariableToOption ( // Unicode stream to ASCII without any loss in meaning. // if (*VariableName == 'B') { - NumOff = (UINT8) (sizeof (L"Boot") / sizeof(CHAR16) - 1); - Option->BootCurrent = (UINT16) ((VariableName[NumOff] -'0') * 0x1000); - Option->BootCurrent = (UINT16) (Option->BootCurrent + ((VariableName[NumOff+1]-'0') * 0x100)); - Option->BootCurrent = (UINT16) (Option->BootCurrent + ((VariableName[NumOff+2]-'0') * 0x10)); - Option->BootCurrent = (UINT16) (Option->BootCurrent + ((VariableName[NumOff+3]-'0'))); + NumOff = (UINT8) (sizeof (L"Boot") / sizeof (CHAR16) - 1); + Option->BootCurrent = (UINT16) (CharToUint (VariableName[NumOff+0]) * 0x1000) + + (UINT16) (CharToUint (VariableName[NumOff+1]) * 0x100) + + (UINT16) (CharToUint (VariableName[NumOff+2]) * 0x10) + + (UINT16) (CharToUint (VariableName[NumOff+3]) * 0x1); } // // Insert active entry to BdsDeviceList -- cgit v1.2.3