[FREELDR] Minor fixes.
[reactos.git] / boot / freeldr / freeldr / ntldr / conversion.c
1 /*
2 * PROJECT: EFI Windows Loader
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: boot/freeldr/freeldr/windows/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 DBG_DEFAULT_CHANNEL(WINDOWS);
17
18 /* FUNCTIONS **************************************************************/
19
20 VOID
21 List_PaToVa(_In_ PLIST_ENTRY ListHeadPa)
22 {
23 PLIST_ENTRY EntryPa, NextPa;
24
25 /* List must be properly initialized */
26 ASSERT(ListHeadPa->Flink != 0);
27 ASSERT(ListHeadPa->Blink != 0);
28
29 /* Loop the list in physical address space */
30 EntryPa = ListHeadPa->Flink;
31 while (EntryPa != ListHeadPa)
32 {
33 /* Save the physical address of the next entry */
34 NextPa = EntryPa->Flink;
35
36 /* Convert the addresses of this entry */
37 EntryPa->Flink = PaToVa(EntryPa->Flink);
38 EntryPa->Blink = PaToVa(EntryPa->Blink);
39
40 /* Go to the next entry */
41 EntryPa = NextPa;
42 }
43
44 /* Finally convert the list head */
45 ListHeadPa->Flink = PaToVa(ListHeadPa->Flink);
46 ListHeadPa->Blink = PaToVa(ListHeadPa->Blink);
47 }
48
49 // This function converts only Child->Child, and calls itself for each Sibling
50 VOID
51 ConvertConfigToVA(PCONFIGURATION_COMPONENT_DATA Start)
52 {
53 PCONFIGURATION_COMPONENT_DATA Child;
54 PCONFIGURATION_COMPONENT_DATA Sibling;
55
56 TRACE("ConvertConfigToVA(Start 0x%X)\n", Start);
57 Child = Start;
58
59 while (Child != NULL)
60 {
61 if (Child->ConfigurationData)
62 Child->ConfigurationData = PaToVa(Child->ConfigurationData);
63
64 if (Child->Child)
65 Child->Child = PaToVa(Child->Child);
66
67 if (Child->Parent)
68 Child->Parent = PaToVa(Child->Parent);
69
70 if (Child->Sibling)
71 Child->Sibling = PaToVa(Child->Sibling);
72
73 if (Child->ComponentEntry.Identifier)
74 Child->ComponentEntry.Identifier = PaToVa(Child->ComponentEntry.Identifier);
75
76 TRACE("Device 0x%X class %d type %d id '%s', parent %p\n", Child,
77 Child->ComponentEntry.Class, Child->ComponentEntry.Type, VaToPa(Child->ComponentEntry.Identifier), Child->Parent);
78
79 // Go through siblings list
80 Sibling = VaToPa(Child->Sibling);
81 while (Sibling != NULL)
82 {
83 if (Sibling->ConfigurationData)
84 Sibling->ConfigurationData = PaToVa(Sibling->ConfigurationData);
85
86 if (Sibling->Child)
87 Sibling->Child = PaToVa(Sibling->Child);
88
89 if (Sibling->Parent)
90 Sibling->Parent = PaToVa(Sibling->Parent);
91
92 if (Sibling->Sibling)
93 Sibling->Sibling = PaToVa(Sibling->Sibling);
94
95 if (Sibling->ComponentEntry.Identifier)
96 Sibling->ComponentEntry.Identifier = PaToVa(Sibling->ComponentEntry.Identifier);
97
98 TRACE("Device 0x%X class %d type %d id '%s', parent %p\n", Sibling,
99 Sibling->ComponentEntry.Class, Sibling->ComponentEntry.Type, VaToPa(Sibling->ComponentEntry.Identifier), Sibling->Parent);
100
101 // Recurse into the Child tree
102 if (VaToPa(Sibling->Child) != NULL)
103 ConvertConfigToVA(VaToPa(Sibling->Child));
104
105 Sibling = VaToPa(Sibling->Sibling);
106 }
107
108 // Go to the next child
109 Child = VaToPa(Child->Child);
110 }
111 }