123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- /*++
- Copyright (c) 1998 Intel Corporation
- Module Name:
- vm.c
- Abstract:
- EFI Hell to remap runtime address into the new virual address space
- that was registered by the OS for RT calls.
- So the code image needs to be relocated. All pointers need to be
- manually fixed up since the address map changes.
- GOOD LUCK NOT HAVING BUGS IN YOUR CODE! PLEASE TEST A LOT. MAKE SURE
- EXIT BOOTSERVICES OVER WRITES ALL BOOTSERVICE MEMORY & DATA SPACES WHEN
- YOU TEST.
- Revision History
- --*/
- #include "lib.h"
- #ifndef __GNUC__
- #pragma RUNTIME_CODE(RtLibEnableVirtualMappings)
- #endif
- VOID
- RUNTIMEFUNCTION
- RtLibEnableVirtualMappings (
- VOID
- )
- {
- EFI_CONVERT_POINTER ConvertPointer;
- //
- // If this copy of the lib is linked into the firmware, then
- // do not update the pointers yet.
- //
- if (!LibFwInstance) {
- //
- // Different components are updating to the new virtual
- // mappings at differnt times. The only function that
- // is safe to call at this notification is ConvertAddress
- //
- ConvertPointer = RT->ConvertPointer;
- //
- // Fix any pointers that the lib created, that may be needed
- // during runtime.
- //
- ConvertPointer (EFI_INTERNAL_PTR, (VOID **)&RT);
- ConvertPointer (EFI_OPTIONAL_PTR, (VOID **)&LibRuntimeDebugOut);
- ConvertPointer (EFI_INTERNAL_PTR, (VOID **)&LibRuntimeRaiseTPL);
- ConvertPointer (EFI_INTERNAL_PTR, (VOID **)&LibRuntimeRestoreTPL);
- // that was it :^)
- }
- }
- #ifndef __GNUC__
- #pragma RUNTIME_CODE(RtConvertList)
- #endif
- VOID
- RUNTIMEFUNCTION
- RtConvertList (
- IN UINTN DebugDisposition,
- IN OUT LIST_ENTRY *ListHead
- )
- {
- LIST_ENTRY *Link;
- LIST_ENTRY *NextLink;
- EFI_CONVERT_POINTER ConvertPointer;
- ConvertPointer = RT->ConvertPointer;
- //
- // Convert all the Flink & Blink pointers in the list
- //
- Link = ListHead;
- do {
- NextLink = Link->Flink;
- ConvertPointer (
- Link->Flink == ListHead ? DebugDisposition : 0,
- (VOID **)&Link->Flink
- );
- ConvertPointer (
- Link->Blink == ListHead ? DebugDisposition : 0,
- (VOID **)&Link->Blink
- );
- Link = NextLink;
- } while (Link != ListHead);
- }
|