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