- SVN maintenance.
[reactos.git] / reactos / boot / freeldr / freeldr / windows / conversion.c
1 /*
2 * PROJECT: EFI Windows Loader
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: freeldr/winldr/conversion.c
5 * PURPOSE: Physical <-> Virtual addressing mode conversions
6 * PROGRAMMERS: Aleksey Bragin (aleksey@reactos.org)
7 */
8
9 /* INCLUDES ***************************************************************/
10
11 #include <freeldr.h>
12
13 //#include <ndk/ldrtypes.h>
14 #include <debug.h>
15
16 /* FUNCTIONS **************************************************************/
17
18 /* Arch-specific addresses translation implementation */
19 PVOID
20 VaToPa(PVOID Va)
21 {
22 return (PVOID)((ULONG_PTR)Va & ~KSEG0_BASE);
23 }
24
25 PVOID
26 PaToVa(PVOID Pa)
27 {
28 return (PVOID)((ULONG_PTR)Pa | KSEG0_BASE);
29 }
30
31 VOID
32 List_PaToVa(LIST_ENTRY *ListEntry)
33 {
34 LIST_ENTRY *ListHead = ListEntry;
35 LIST_ENTRY *Next = ListEntry->Flink;
36 LIST_ENTRY *NextPA;
37
38 //Print(L"\n\nList_Entry: %X, First Next: %X\n", ListEntry, Next);
39 //
40 // Walk through the whole list
41 //
42 if (Next != NULL)
43 {
44 while (Next != PaToVa(ListHead))
45 {
46 NextPA = VaToPa(Next);
47 //Print(L"Current: %X, Flink: %X, Blink: %X\n", Next, NextPA->Flink, NextPA->Blink);
48
49 NextPA->Flink = PaToVa((PVOID)NextPA->Flink);
50 NextPA->Blink = PaToVa((PVOID)NextPA->Blink);
51
52 //Print(L"After converting Flink: %X, Blink: %X\n", NextPA->Flink, NextPA->Blink);
53
54 Next = NextPA->Flink;
55 }
56
57 //
58 // Finally convert first Flink/Blink
59 //
60 ListEntry->Flink = PaToVa((PVOID)ListEntry->Flink);
61 if (ListEntry->Blink)
62 ListEntry->Blink = PaToVa((PVOID)ListEntry->Blink);
63 }
64 }
65
66 // This function converts only Child->Child, and calls itself for each Sibling
67 VOID
68 ConvertConfigToVA(PCONFIGURATION_COMPONENT_DATA Start)
69 {
70 PCONFIGURATION_COMPONENT_DATA Child;
71 PCONFIGURATION_COMPONENT_DATA Sibling;
72
73 DbgPrint((DPRINT_WINDOWS, "ConvertConfigToVA(Start 0x%X)\n", Start));
74 Child = Start;
75
76 while (Child != NULL)
77 {
78 if (Child->ConfigurationData)
79 Child->ConfigurationData = PaToVa(Child->ConfigurationData);
80
81 if (Child->Child)
82 Child->Child = PaToVa(Child->Child);
83
84 if (Child->Parent)
85 Child->Parent = PaToVa(Child->Parent);
86
87 if (Child->Sibling)
88 Child->Sibling = PaToVa(Child->Sibling);
89
90 if (Child->ComponentEntry.Identifier)
91 Child->ComponentEntry.Identifier = PaToVa(Child->ComponentEntry.Identifier);
92
93 DbgPrint((DPRINT_WINDOWS, "Device 0x%X class %d type %d id '%s', parent %p\n", Child,
94 Child->ComponentEntry.Class, Child->ComponentEntry.Type, VaToPa(Child->ComponentEntry.Identifier), Child->Parent));
95
96 // Go through siblings list
97 Sibling = VaToPa(Child->Sibling);
98 while (Sibling != NULL)
99 {
100 if (Sibling->ConfigurationData)
101 Sibling->ConfigurationData = PaToVa(Sibling->ConfigurationData);
102
103 if (Sibling->Child)
104 Sibling->Child = PaToVa(Sibling->Child);
105
106 if (Sibling->Parent)
107 Sibling->Parent = PaToVa(Sibling->Parent);
108
109 if (Sibling->Sibling)
110 Sibling->Sibling = PaToVa(Sibling->Sibling);
111
112 if (Sibling->ComponentEntry.Identifier)
113 Sibling->ComponentEntry.Identifier = PaToVa(Sibling->ComponentEntry.Identifier);
114
115 DbgPrint((DPRINT_WINDOWS, "Device 0x%X class %d type %d id '%s', parent %p\n", Sibling,
116 Sibling->ComponentEntry.Class, Sibling->ComponentEntry.Type, VaToPa(Sibling->ComponentEntry.Identifier), Sibling->Parent));
117
118 // Recurse into the Child tree
119 if (VaToPa(Sibling->Child) != NULL)
120 ConvertConfigToVA(VaToPa(Sibling->Child));
121
122 Sibling = VaToPa(Sibling->Sibling);
123 }
124
125 // Go to the next child
126 Child = VaToPa(Child->Child);
127 }
128 }