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