Home | History | Annotate | Download | only in runtime
      1 /*++
      2 
      3 Copyright (c) 1998  Intel Corporation
      4 
      5 Module Name:
      6 
      7     vm.c
      8 
      9 Abstract:
     10 
     11     EFI Hell to remap runtime address into the new virual address space
     12     that was registered by the OS for RT calls.
     13 
     14     So the code image needs to be relocated. All pointers need to be
     15     manually fixed up since the address map changes.
     16 
     17     GOOD LUCK NOT HAVING BUGS IN YOUR CODE! PLEASE TEST A LOT. MAKE SURE
     18     EXIT BOOTSERVICES OVER WRITES ALL BOOTSERVICE MEMORY & DATA SPACES WHEN
     19     YOU TEST.
     20 
     21 Revision History
     22 
     23 --*/
     24 
     25 #include "lib.h"
     26 
     27 #ifndef __GNUC__
     28 #pragma RUNTIME_CODE(RtLibEnableVirtualMappings)
     29 #endif
     30 VOID
     31 RUNTIMEFUNCTION
     32 RtLibEnableVirtualMappings (
     33     VOID
     34     )
     35 {
     36     EFI_CONVERT_POINTER     ConvertPointer;
     37 
     38     //
     39     // If this copy of the lib is linked into the firmware, then
     40     // do not update the pointers yet.
     41     //
     42 
     43     if (!LibFwInstance) {
     44 
     45         //
     46         // Different components are updating to the new virtual
     47         // mappings at differnt times.  The only function that
     48         // is safe to call at this notification is ConvertAddress
     49         //
     50 
     51         ConvertPointer = RT->ConvertPointer;
     52 
     53         //
     54         // Fix any pointers that the lib created, that may be needed
     55         // during runtime.
     56         //
     57 
     58         ConvertPointer (EFI_INTERNAL_PTR, (VOID **)&RT);
     59         ConvertPointer (EFI_OPTIONAL_PTR, (VOID **)&LibRuntimeDebugOut);
     60 
     61         ConvertPointer (EFI_INTERNAL_PTR, (VOID **)&LibRuntimeRaiseTPL);
     62         ConvertPointer (EFI_INTERNAL_PTR, (VOID **)&LibRuntimeRestoreTPL);
     63 
     64         // that was it :^)
     65     }
     66 }
     67 
     68 
     69 #ifndef __GNUC__
     70 #pragma RUNTIME_CODE(RtConvertList)
     71 #endif
     72 VOID
     73 RUNTIMEFUNCTION
     74 RtConvertList (
     75     IN UINTN                DebugDisposition,
     76     IN OUT LIST_ENTRY       *ListHead
     77     )
     78 {
     79     LIST_ENTRY              *Link;
     80     LIST_ENTRY              *NextLink;
     81     EFI_CONVERT_POINTER     ConvertPointer;
     82 
     83     ConvertPointer = RT->ConvertPointer;
     84 
     85     //
     86     // Convert all the Flink & Blink pointers in the list
     87     //
     88 
     89     Link = ListHead;
     90     do {
     91         NextLink = Link->Flink;
     92 
     93         ConvertPointer (
     94             Link->Flink == ListHead ? DebugDisposition : 0,
     95             (VOID **)&Link->Flink
     96             );
     97 
     98         ConvertPointer (
     99             Link->Blink == ListHead ? DebugDisposition : 0,
    100             (VOID **)&Link->Blink
    101             );
    102 
    103         Link = NextLink;
    104     } while (Link != ListHead);
    105 }
    106