vm.c revision 1.1 1 1.1 jakllsch /* $NetBSD: vm.c,v 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