From 0b6cb335fa82b399cfa92350a631d0c242926994 Mon Sep 17 00:00:00 2001 From: ydong10 Date: Fri, 25 Jan 2013 02:00:22 +0000 Subject: Fixed some alignment faults in IPF platform Signed-off-by: Eric Dong Reviewed-by: Carsey Jaben git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@14081 6f19259b-4bc3-4df7-8a09-765794883524 --- .../SmbiosView/PrintInfo.c | 6 ++-- ShellPkg/Library/UefiShellLib/UefiShellLib.c | 35 ++++++++++++++++++++-- 2 files changed, 36 insertions(+), 5 deletions(-) (limited to 'ShellPkg/Library') diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c index 3aea96b..9ae5a0c 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c @@ -249,7 +249,7 @@ SmbiosPrintStructure ( PRINT_PENDING_STRING (Struct, Type0, BiosReleaseDate); ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIOS_SIZE), gShellDebug1HiiHandle, 64 * (Struct->Type0->BiosSize + 1)); - DisplayBiosCharacteristics (*(UINT64 *) &(Struct->Type0->BiosCharacteristics), Option); + DisplayBiosCharacteristics (ReadUnaligned64 ((UINT64 *) (UINTN) &(Struct->Type0->BiosCharacteristics)), Option); if (Struct->Hdr->Length > 0x12) { DisplayBiosCharacteristicsExt1 (Struct->Type0->BIOSCharacteristicsExtensionBytes[0], Option); @@ -416,7 +416,7 @@ SmbiosPrintStructure ( PRINT_STRUCT_VALUE_H (Struct, Type7, InstalledSize); PRINT_STRUCT_VALUE_H (Struct, Type7, SupportedSRAMType); PRINT_STRUCT_VALUE_H (Struct, Type7, CurrentSRAMType); - DisplayCacheSRAMType (*(UINT16 *) &(Struct->Type7->CurrentSRAMType), Option); + DisplayCacheSRAMType (ReadUnaligned16 ((UINT16 *) (UINTN) &(Struct->Type7->CurrentSRAMType)), Option); PRINT_STRUCT_VALUE_H (Struct, Type7, CacheSpeed); DisplayCacheErrCorrectingType (Struct->Type7->ErrorCorrectionType, Option); DisplayCacheSystemCacheType (Struct->Type7->SystemCacheType, Option); @@ -633,7 +633,7 @@ SmbiosPrintStructure ( PRINT_PENDING_STRING (Struct, Type17, DeviceLocator); PRINT_PENDING_STRING (Struct, Type17, BankLocator); DisplayMemoryDeviceType (Struct->Type17->MemoryType, Option); - DisplayMemoryDeviceTypeDetail (*(UINT16 *) &(Struct->Type17->TypeDetail), Option); + DisplayMemoryDeviceTypeDetail (ReadUnaligned16 ((UINT16 *) (UINTN) &(Struct->Type17->TypeDetail)), Option); PRINT_STRUCT_VALUE_H (Struct, Type17, Speed); PRINT_PENDING_STRING (Struct, Type17, Manufacturer); PRINT_PENDING_STRING (Struct, Type17, SerialNumber); diff --git a/ShellPkg/Library/UefiShellLib/UefiShellLib.c b/ShellPkg/Library/UefiShellLib/UefiShellLib.c index 222bd98..103ddfb 100644 --- a/ShellPkg/Library/UefiShellLib/UefiShellLib.c +++ b/ShellPkg/Library/UefiShellLib/UefiShellLib.c @@ -486,6 +486,8 @@ ShellOpenFileByDevicePath( EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *EfiSimpleFileSystemProtocol; EFI_FILE_PROTOCOL *Handle1; EFI_FILE_PROTOCOL *Handle2; + CHAR16 *FnafPathName; + UINTN PathLen; if (FilePath == NULL || FileHandle == NULL || DeviceHandle == NULL) { return (EFI_INVALID_PARAMETER); @@ -552,12 +554,35 @@ ShellOpenFileByDevicePath( Handle1 = NULL; // + // File Name Alignment Fix (FNAF) + // Handle2->Open may be incapable of handling a unaligned CHAR16 data. + // The structure pointed to by FilePath may be not CHAR16 aligned. + // This code copies the potentially unaligned PathName data from the + // FilePath structure to the aligned FnafPathName for use in the + // calls to Handl2->Open. + // + + // + // Determine length of PathName, in bytes. + // + PathLen = DevicePathNodeLength (*FilePath) - SIZE_OF_FILEPATH_DEVICE_PATH; + + // + // Allocate memory for the aligned copy of the string Extra allocation is to allow for forced alignment + // Copy bytes from possibly unaligned location to aligned location + // + FnafPathName = AllocateCopyPool(PathLen, (UINT8 *)((FILEPATH_DEVICE_PATH*)*FilePath)->PathName); + if (FnafPathName == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + // // Try to test opening an existing file // Status = Handle2->Open ( Handle2, &Handle1, - ((FILEPATH_DEVICE_PATH*)*FilePath)->PathName, + FnafPathName, OpenMode &~EFI_FILE_MODE_CREATE, 0 ); @@ -569,11 +594,17 @@ ShellOpenFileByDevicePath( Status = Handle2->Open ( Handle2, &Handle1, - ((FILEPATH_DEVICE_PATH*)*FilePath)->PathName, + FnafPathName, OpenMode, Attributes ); } + + // + // Free the alignment buffer + // + FreePool(FnafPathName); + // // Close the last node // -- cgit v1.1