Curle
4300dc655c
The lib/inc folders are from the GNU-EFI project. The documentation is from the uefi.org site. Yes, I know there are duplicate includes. I have a plan for them.
106 lines
2.3 KiB
C
106 lines
2.3 KiB
C
/*++
|
|
|
|
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);
|
|
}
|