Ard Biesheuvel
2015-06-29 10:46:08 UTC
Hello all,
I am running into another problem with the implementation of the UEFI
2.5 Properties Table feature. It splits PE/COFF images into separate
but adjacent memory regions, only to be able to assign different
permissions to .text and .data sections. This is working fine at boot
time.
However, at runtime, after calling virtual address map, this breaks
down completely. Since the virtual mapping supplied to
SetVirtualAddressMap() does not have to guarantee adjacency between
code and data regions (of which the OS does not know whether they
belong together or not), reapplying the relocations corrupts the
memory image and breaks the runtime services.
For example, this region
0x00005eeb1000-0x00005eeb6fff [Runtime Code]
0x00005eeb7000-0x00005eec0fff [Runtime Data]
is mapped on AARCH64 as
EFI remap 0x000000005eeb1000 => 00000000440a1000
EFI remap 0x000000005eeb7000 => 00000000440b7000
which retains the relative alignment, but adds a 64 KB offset to the
second regions so that the regions can still be mapped with different
permissions when the OS is executing with a 64 KB page size.
As far as I can tell, this is in accordance with the spec, and was
working fine until I tried to enable the properties table feature.
With that enabled, the two above regions could actually describe one
single PE/COFF image in memory, and the 64 KB offset results in the
relocations to be applied incorrectly.
I looked at PeCoffLoaderRelocateImageForRuntime () but to me, it is
not very obvious how to solve this. Obviously, our PE/COFF
implementation is not complete since it assumes file offset == memory
offset for sections, but this does not hold anymore for UEFI 2.5
I would also like to point out again that this is another result of
the fact that this series was pushed through with any review or
testing outside of the Intel firmware team. For features of this
magnitude and complexity, more scrutiny and testing is obviously
required.
Kind regards,
Ard.
I am running into another problem with the implementation of the UEFI
2.5 Properties Table feature. It splits PE/COFF images into separate
but adjacent memory regions, only to be able to assign different
permissions to .text and .data sections. This is working fine at boot
time.
However, at runtime, after calling virtual address map, this breaks
down completely. Since the virtual mapping supplied to
SetVirtualAddressMap() does not have to guarantee adjacency between
code and data regions (of which the OS does not know whether they
belong together or not), reapplying the relocations corrupts the
memory image and breaks the runtime services.
For example, this region
0x00005eeb1000-0x00005eeb6fff [Runtime Code]
0x00005eeb7000-0x00005eec0fff [Runtime Data]
is mapped on AARCH64 as
EFI remap 0x000000005eeb1000 => 00000000440a1000
EFI remap 0x000000005eeb7000 => 00000000440b7000
which retains the relative alignment, but adds a 64 KB offset to the
second regions so that the regions can still be mapped with different
permissions when the OS is executing with a 64 KB page size.
As far as I can tell, this is in accordance with the spec, and was
working fine until I tried to enable the properties table feature.
With that enabled, the two above regions could actually describe one
single PE/COFF image in memory, and the 64 KB offset results in the
relocations to be applied incorrectly.
I looked at PeCoffLoaderRelocateImageForRuntime () but to me, it is
not very obvious how to solve this. Obviously, our PE/COFF
implementation is not complete since it assumes file offset == memory
offset for sections, but this does not hold anymore for UEFI 2.5
I would also like to point out again that this is another result of
the fact that this series was pushed through with any review or
testing outside of the Intel firmware team. For features of this
magnitude and complexity, more scrutiny and testing is obviously
required.
Kind regards,
Ard.