- Add new type of debug print for windows loader
[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
15 #define NDEBUG
16 #include <debug.h>
17
18 /* FUNCTIONS **************************************************************/
19
20 /* Arch-specific addresses translation implementation */
21 PVOID
22 VaToPa(PVOID Va)
23 {
24 return (PVOID)((ULONG_PTR)Va & ~KSEG0_BASE);
25 }
26
27 PVOID
28 PaToVa(PVOID Pa)
29 {
30 return (PVOID)((ULONG_PTR)Pa | KSEG0_BASE);
31 }
32
33 VOID
34 List_PaToVa(LIST_ENTRY *ListEntry)
35 {
36 LIST_ENTRY *ListHead = ListEntry;
37 LIST_ENTRY *Next = ListEntry->Flink;
38 LIST_ENTRY *NextPA;
39
40 //Print(L"\n\nList_Entry: %X, First Next: %X\n", ListEntry, Next);
41 //
42 // Walk through the whole list
43 //
44 if (Next != NULL)
45 {
46 while (Next != PaToVa(ListHead))
47 {
48 NextPA = VaToPa(Next);
49 //Print(L"Current: %X, Flink: %X, Blink: %X\n", Next, NextPA->Flink, NextPA->Blink);
50
51 NextPA->Flink = PaToVa((PVOID)NextPA->Flink);
52 NextPA->Blink = PaToVa((PVOID)NextPA->Blink);
53
54 //Print(L"After converting Flink: %X, Blink: %X\n", NextPA->Flink, NextPA->Blink);
55
56 Next = NextPA->Flink;
57 }
58
59 //
60 // Finally convert first Flink/Blink
61 //
62 ListEntry->Flink = PaToVa((PVOID)ListEntry->Flink);
63 if (ListEntry->Blink)
64 ListEntry->Blink = PaToVa((PVOID)ListEntry->Blink);
65 }
66 }
67
68 // This function converts only Child->Child, and calls itself for each Sibling
69 VOID
70 ConvertConfigToVA(PCONFIGURATION_COMPONENT_DATA Start)
71 {
72 PCONFIGURATION_COMPONENT_DATA Child;
73 PCONFIGURATION_COMPONENT_DATA Sibling;
74
75 DbgPrint((DPRINT_WINDOWS, "ConvertConfigToVA(Start 0x%X)", Start));
76 Child = Start;
77
78 while (Child != NULL)
79 {
80 if (Child->ConfigurationData)
81 Child->ConfigurationData = PaToVa(Child->ConfigurationData);
82
83 if (Child->Child)
84 Child->Child = PaToVa(Child->Child);
85
86 if (Child->Parent)
87 Child->Parent = PaToVa(Child->Parent);
88
89 if (Child->Sibling)
90 Child->Sibling = PaToVa(Child->Sibling);
91
92 DbgPrint((DPRINT_WINDOWS, "Device 0x%X class %d", Child, Child->ComponentEntry.Class));
93
94 // If the child has a sibling list, then search the sibling list
95 // for an entry that matches the specified class, type, and key.
96 Sibling = Child->Sibling;
97 while (Sibling != NULL)
98 {
99 if (Sibling->ConfigurationData)
100 Sibling->ConfigurationData = PaToVa(Sibling->ConfigurationData);
101
102 if (Sibling->Child)
103 Sibling->Child = PaToVa(Sibling->Child);
104
105 if (Sibling->Parent)
106 Sibling->Parent = PaToVa(Sibling->Parent);
107
108 if (Sibling->Sibling)
109 Sibling->Sibling = PaToVa(Sibling->Sibling);
110
111 DbgPrint((DPRINT_WINDOWS, "Device 0x%X class %d", Sibling, Sibling->ComponentEntry.Class));
112
113 // If the sibling has a child tree, then search the child tree
114 // for an entry that matches the specified class, type, and key.
115 if (VaToPa(Sibling->Child) != NULL)
116 ConvertConfigToVA(VaToPa(Sibling->Child));
117
118 Sibling = VaToPa(Sibling->Sibling);
119 }
120
121 Child = VaToPa(Child->Child);
122 }
123 }