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