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