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