Fixed some alignment faults in IPF platform

Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Carsey Jaben <jaben.carsey@intel.com>




git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@14081 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
ydong10 2013-01-25 02:00:22 +00:00
parent cc7f6cf32f
commit 0b6cb335fa
2 changed files with 36 additions and 5 deletions

View File

@ -249,7 +249,7 @@ SmbiosPrintStructure (
PRINT_PENDING_STRING (Struct, Type0, BiosReleaseDate); PRINT_PENDING_STRING (Struct, Type0, BiosReleaseDate);
ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIOS_SIZE), gShellDebug1HiiHandle, 64 * (Struct->Type0->BiosSize + 1)); 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) { if (Struct->Hdr->Length > 0x12) {
DisplayBiosCharacteristicsExt1 (Struct->Type0->BIOSCharacteristicsExtensionBytes[0], Option); DisplayBiosCharacteristicsExt1 (Struct->Type0->BIOSCharacteristicsExtensionBytes[0], Option);
@ -416,7 +416,7 @@ SmbiosPrintStructure (
PRINT_STRUCT_VALUE_H (Struct, Type7, InstalledSize); PRINT_STRUCT_VALUE_H (Struct, Type7, InstalledSize);
PRINT_STRUCT_VALUE_H (Struct, Type7, SupportedSRAMType); PRINT_STRUCT_VALUE_H (Struct, Type7, SupportedSRAMType);
PRINT_STRUCT_VALUE_H (Struct, Type7, CurrentSRAMType); 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); PRINT_STRUCT_VALUE_H (Struct, Type7, CacheSpeed);
DisplayCacheErrCorrectingType (Struct->Type7->ErrorCorrectionType, Option); DisplayCacheErrCorrectingType (Struct->Type7->ErrorCorrectionType, Option);
DisplayCacheSystemCacheType (Struct->Type7->SystemCacheType, Option); DisplayCacheSystemCacheType (Struct->Type7->SystemCacheType, Option);
@ -633,7 +633,7 @@ SmbiosPrintStructure (
PRINT_PENDING_STRING (Struct, Type17, DeviceLocator); PRINT_PENDING_STRING (Struct, Type17, DeviceLocator);
PRINT_PENDING_STRING (Struct, Type17, BankLocator); PRINT_PENDING_STRING (Struct, Type17, BankLocator);
DisplayMemoryDeviceType (Struct->Type17->MemoryType, Option); 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_STRUCT_VALUE_H (Struct, Type17, Speed);
PRINT_PENDING_STRING (Struct, Type17, Manufacturer); PRINT_PENDING_STRING (Struct, Type17, Manufacturer);
PRINT_PENDING_STRING (Struct, Type17, SerialNumber); PRINT_PENDING_STRING (Struct, Type17, SerialNumber);

View File

@ -486,6 +486,8 @@ ShellOpenFileByDevicePath(
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *EfiSimpleFileSystemProtocol; EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *EfiSimpleFileSystemProtocol;
EFI_FILE_PROTOCOL *Handle1; EFI_FILE_PROTOCOL *Handle1;
EFI_FILE_PROTOCOL *Handle2; EFI_FILE_PROTOCOL *Handle2;
CHAR16 *FnafPathName;
UINTN PathLen;
if (FilePath == NULL || FileHandle == NULL || DeviceHandle == NULL) { if (FilePath == NULL || FileHandle == NULL || DeviceHandle == NULL) {
return (EFI_INVALID_PARAMETER); return (EFI_INVALID_PARAMETER);
@ -551,13 +553,36 @@ ShellOpenFileByDevicePath(
Handle2 = Handle1; Handle2 = Handle1;
Handle1 = NULL; 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 // Try to test opening an existing file
// //
Status = Handle2->Open ( Status = Handle2->Open (
Handle2, Handle2,
&Handle1, &Handle1,
((FILEPATH_DEVICE_PATH*)*FilePath)->PathName, FnafPathName,
OpenMode &~EFI_FILE_MODE_CREATE, OpenMode &~EFI_FILE_MODE_CREATE,
0 0
); );
@ -569,11 +594,17 @@ ShellOpenFileByDevicePath(
Status = Handle2->Open ( Status = Handle2->Open (
Handle2, Handle2,
&Handle1, &Handle1,
((FILEPATH_DEVICE_PATH*)*FilePath)->PathName, FnafPathName,
OpenMode, OpenMode,
Attributes Attributes
); );
} }
//
// Free the alignment buffer
//
FreePool(FnafPathName);
// //
// Close the last node // Close the last node
// //