mirror of https://github.com/acidanthera/audk.git
Missed a fix in the Cpu Driver. Added some more debug for Execption handling and clean up some uncached stuff.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9789 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
f4d7c87220
commit
d4f167a92a
|
@ -311,7 +311,16 @@ CommonCExceptionHandler (
|
||||||
// you need to subtact out the size of the PE/COFF header to get
|
// you need to subtact out the size of the PE/COFF header to get
|
||||||
// get the offset that matches the link map.
|
// get the offset that matches the link map.
|
||||||
//
|
//
|
||||||
DEBUG ((EFI_D_ERROR, "loadded at 0x%08x (PE/COFF offset) 0x%x (ELF or Mach-O offset) 0x%x", ImageBase, Offset, Offset - PeCoffSizeOfHeader));
|
DEBUG ((EFI_D_ERROR, "loaded at 0x%08x (PE/COFF offset) 0x%x (ELF or Mach-O offset) 0x%x", ImageBase, Offset, Offset - PeCoffSizeOfHeader));
|
||||||
|
|
||||||
|
// If we come from an image it is safe to show the instruction. We know it should not fault
|
||||||
|
if ((SystemContext.SystemContextArm->CPSR & 0x20) == 0) {
|
||||||
|
// ARM
|
||||||
|
DEBUG ((EFI_D_ERROR, "\nFaulting Instruction 0x%08x", *(UINT32 *)(UINTN)SystemContext.SystemContextArm->PC));
|
||||||
|
} else {
|
||||||
|
// Thumb
|
||||||
|
DEBUG ((EFI_D_ERROR, "\nFaulting Instruction 0x%04x", *(UINT16 *)(UINTN)SystemContext.SystemContextArm->PC));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
DEBUG_CODE_END ();
|
DEBUG_CODE_END ();
|
||||||
DEBUG ((EFI_D_ERROR, "\n R0 0x%08x R1 0x%08x R2 0x%08x R3 0x%08x\n", SystemContext.SystemContextArm->R0, SystemContext.SystemContextArm->R1, SystemContext.SystemContextArm->R2, SystemContext.SystemContextArm->R3));
|
DEBUG ((EFI_D_ERROR, "\n R0 0x%08x R1 0x%08x R2 0x%08x R3 0x%08x\n", SystemContext.SystemContextArm->R0, SystemContext.SystemContextArm->R1, SystemContext.SystemContextArm->R2, SystemContext.SystemContextArm->R3));
|
||||||
|
|
|
@ -440,36 +440,37 @@ UpdatePageEntries (
|
||||||
|
|
||||||
// EntryMask: bitmask of values to change (1 = change this value, 0 = leave alone)
|
// EntryMask: bitmask of values to change (1 = change this value, 0 = leave alone)
|
||||||
// EntryValue: values at bit positions specified by EntryMask
|
// EntryValue: values at bit positions specified by EntryMask
|
||||||
|
EntryMask = ARM_PAGE_DESC_TYPE_MASK;
|
||||||
|
EntryValue = ARM_PAGE_TYPE_SMALL;
|
||||||
// Although the PI spec is unclear on this the GCD guarantees that only
|
// Although the PI spec is unclear on this the GCD guarantees that only
|
||||||
// one Attribute bit is set at a time, so we can safely use a switch statement
|
// one Attribute bit is set at a time, so we can safely use a switch statement
|
||||||
switch (Attributes) {
|
switch (Attributes) {
|
||||||
case EFI_MEMORY_UC:
|
case EFI_MEMORY_UC:
|
||||||
// modify cacheability attributes
|
// modify cacheability attributes
|
||||||
EntryMask = ARM_SMALL_PAGE_TEX_MASK | ARM_PAGE_C | ARM_PAGE_B;
|
EntryMask |= ARM_SMALL_PAGE_TEX_MASK | ARM_PAGE_C | ARM_PAGE_B;
|
||||||
// map to strongly ordered
|
// map to strongly ordered
|
||||||
EntryValue = 0; // TEX[2:0] = 0, C=0, B=0
|
EntryValue |= 0; // TEX[2:0] = 0, C=0, B=0
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EFI_MEMORY_WC:
|
case EFI_MEMORY_WC:
|
||||||
// modify cacheability attributes
|
// modify cacheability attributes
|
||||||
EntryMask = ARM_SMALL_PAGE_TEX_MASK | ARM_PAGE_C | ARM_PAGE_B;
|
EntryMask |= ARM_SMALL_PAGE_TEX_MASK | ARM_PAGE_C | ARM_PAGE_B;
|
||||||
// map to normal non-cachable
|
// map to normal non-cachable
|
||||||
EntryValue = (0x1 << ARM_SMALL_PAGE_TEX_SHIFT); // TEX [2:0]= 001 = 0x2, B=0, C=0
|
EntryValue |= (0x1 << ARM_SMALL_PAGE_TEX_SHIFT); // TEX [2:0]= 001 = 0x2, B=0, C=0
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EFI_MEMORY_WT:
|
case EFI_MEMORY_WT:
|
||||||
// modify cacheability attributes
|
// modify cacheability attributes
|
||||||
EntryMask = ARM_SMALL_PAGE_TEX_MASK | ARM_PAGE_C | ARM_PAGE_B;
|
EntryMask |= ARM_SMALL_PAGE_TEX_MASK | ARM_PAGE_C | ARM_PAGE_B;
|
||||||
// write through with no-allocate
|
// write through with no-allocate
|
||||||
EntryValue = ARM_PAGE_C; // TEX [2:0] = 0, C=1, B=0
|
EntryValue |= ARM_PAGE_C; // TEX [2:0] = 0, C=1, B=0
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EFI_MEMORY_WB:
|
case EFI_MEMORY_WB:
|
||||||
// modify cacheability attributes
|
// modify cacheability attributes
|
||||||
EntryMask = ARM_SMALL_PAGE_TEX_MASK | ARM_PAGE_C | ARM_PAGE_B;
|
EntryMask |= ARM_SMALL_PAGE_TEX_MASK | ARM_PAGE_C | ARM_PAGE_B;
|
||||||
// write back (with allocate)
|
// write back (with allocate)
|
||||||
EntryValue = (0x1 << ARM_SMALL_PAGE_TEX_SHIFT) | ARM_PAGE_C | ARM_PAGE_B; // TEX [2:0] = 001, C=1, B=1
|
EntryValue |= (0x1 << ARM_SMALL_PAGE_TEX_SHIFT) | ARM_PAGE_C | ARM_PAGE_B; // TEX [2:0] = 001, C=1, B=1
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EFI_MEMORY_WP:
|
case EFI_MEMORY_WP:
|
||||||
|
@ -477,8 +478,7 @@ UpdatePageEntries (
|
||||||
case EFI_MEMORY_UCE:
|
case EFI_MEMORY_UCE:
|
||||||
// cannot be implemented UEFI definition unclear for ARM
|
// cannot be implemented UEFI definition unclear for ARM
|
||||||
// Cause a page fault if these ranges are accessed.
|
// Cause a page fault if these ranges are accessed.
|
||||||
EntryMask = 0x3;
|
EntryValue = ARM_PAGE_TYPE_FAULT;
|
||||||
EntryValue = 0;
|
|
||||||
DEBUG ((EFI_D_PAGE, "SetMemoryAttributes(): setting page %lx with unsupported attribute %x will page fault on access\n", BaseAddress, Attributes));
|
DEBUG ((EFI_D_PAGE, "SetMemoryAttributes(): setting page %lx with unsupported attribute %x will page fault on access\n", BaseAddress, Attributes));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -861,8 +861,9 @@ CpuReconvertPagesPages (
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
DEBUG ((EFI_D_ERROR, "CpuReconvertPagesPages(%lx, %x, %lx, %lx)\n", Address, Length, VirtualMask, Attributes));
|
||||||
//
|
ASSERT (FALSE);
|
||||||
|
//
|
||||||
// Unmap the alaised Address
|
// Unmap the alaised Address
|
||||||
//
|
//
|
||||||
Status = SetMemoryAttributes (Address | VirtualMask, Length, EFI_MEMORY_WP, 0);
|
Status = SetMemoryAttributes (Address | VirtualMask, Length, EFI_MEMORY_WP, 0);
|
||||||
|
|
|
@ -292,7 +292,7 @@ UncachedFreeAlignedPages (
|
||||||
Status = gVirtualUncachedPages->RevertPages (gVirtualUncachedPages, Memory, Pages * EFI_PAGE_SIZE, PcdGet64 (PcdArmUncachedMemoryMask), gAttributes);
|
Status = gVirtualUncachedPages->RevertPages (gVirtualUncachedPages, Memory, Pages * EFI_PAGE_SIZE, PcdGet64 (PcdArmUncachedMemoryMask), gAttributes);
|
||||||
|
|
||||||
|
|
||||||
Status = gBS->FreePages ((EFI_PHYSICAL_ADDRESS) (UINTN) Buffer, Pages);
|
Status = gBS->FreePages ((EFI_PHYSICAL_ADDRESS) (UINTN) Memory, Pages);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -207,7 +207,7 @@ UncachedInternalAllocateAlignedPages (
|
||||||
}
|
}
|
||||||
|
|
||||||
if (AlignedMemory != 0) {
|
if (AlignedMemory != 0) {
|
||||||
FlushCache(AlignedMemory, EFI_PAGES_TO_SIZE(Pages));
|
FlushCache (AlignedMemory, EFI_PAGES_TO_SIZE(Pages));
|
||||||
AlignedMemory = (UINTN)ConvertToUncachedAddress((VOID *)AlignedMemory);
|
AlignedMemory = (UINTN)ConvertToUncachedAddress((VOID *)AlignedMemory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -318,7 +318,7 @@ UncachedInternalAllocateAlignedPool (
|
||||||
*FreePointer = RawAddress;
|
*FreePointer = RawAddress;
|
||||||
|
|
||||||
if (AlignedAddress != 0) {
|
if (AlignedAddress != 0) {
|
||||||
FlushCache(AlignedAddress, AllocationSize);
|
FlushCache (AlignedAddress, AllocationSize);
|
||||||
AlignedAddress = (UINTN)ConvertToUncachedAddress((VOID *)AlignedAddress);
|
AlignedAddress = (UINTN)ConvertToUncachedAddress((VOID *)AlignedAddress);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -318,11 +318,6 @@ PciIoUnmap (
|
||||||
// Make sure we read buffer from uncached memory and not the cache
|
// Make sure we read buffer from uncached memory and not the cache
|
||||||
//
|
//
|
||||||
gCpu->FlushDataCache (gCpu, Map->HostAddress, Map->NumberOfBytes, EfiCpuFlushTypeInvalidate);
|
gCpu->FlushDataCache (gCpu, Map->HostAddress, Map->NumberOfBytes, EfiCpuFlushTypeInvalidate);
|
||||||
} else if (Map->Operation == EfiPciOperationBusMasterCommonBuffer) {
|
|
||||||
//
|
|
||||||
// CPU was using uncached address, so anything in the cached range is bogus
|
|
||||||
//
|
|
||||||
gCpu->FlushDataCache (gCpu, Map->DeviceAddress, Map->NumberOfBytes, EfiCpuFlushTypeInvalidate);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool (Map);
|
FreePool (Map);
|
||||||
|
|
Loading…
Reference in New Issue