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