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