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