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