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