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)
9 /* INCLUDES ***************************************************************/
13 //#include <ndk/ldrtypes.h>
16 /* FUNCTIONS **************************************************************/
19 /* Arch-specific addresses translation implementation */
23 return (PVOID
)((ULONG_PTR
)Va
& ~KSEG0_BASE
);
29 return (PVOID
)((ULONG_PTR
)Pa
| KSEG0_BASE
);
46 List_PaToVa(LIST_ENTRY
*ListEntry
)
48 LIST_ENTRY
*ListHead
= ListEntry
;
49 LIST_ENTRY
*Next
= ListEntry
->Flink
;
52 //Print(L"\n\nList_Entry: %X, First Next: %X\n", ListEntry, Next);
54 // Walk through the whole list
58 while (Next
!= PaToVa(ListHead
))
60 NextPA
= VaToPa(Next
);
61 //Print(L"Current: %X, Flink: %X, Blink: %X\n", Next, NextPA->Flink, NextPA->Blink);
63 NextPA
->Flink
= PaToVa((PVOID
)NextPA
->Flink
);
64 NextPA
->Blink
= PaToVa((PVOID
)NextPA
->Blink
);
66 //Print(L"After converting Flink: %X, Blink: %X\n", NextPA->Flink, NextPA->Blink);
72 // Finally convert first Flink/Blink
74 ListEntry
->Flink
= PaToVa((PVOID
)ListEntry
->Flink
);
76 ListEntry
->Blink
= PaToVa((PVOID
)ListEntry
->Blink
);
80 // This function converts only Child->Child, and calls itself for each Sibling
82 ConvertConfigToVA(PCONFIGURATION_COMPONENT_DATA Start
)
84 PCONFIGURATION_COMPONENT_DATA Child
;
85 PCONFIGURATION_COMPONENT_DATA Sibling
;
87 DPRINTM(DPRINT_WINDOWS
, "ConvertConfigToVA(Start 0x%X)\n", Start
);
92 if (Child
->ConfigurationData
)
93 Child
->ConfigurationData
= PaToVa(Child
->ConfigurationData
);
96 Child
->Child
= PaToVa(Child
->Child
);
99 Child
->Parent
= PaToVa(Child
->Parent
);
102 Child
->Sibling
= PaToVa(Child
->Sibling
);
104 if (Child
->ComponentEntry
.Identifier
)
105 Child
->ComponentEntry
.Identifier
= PaToVa(Child
->ComponentEntry
.Identifier
);
107 DPRINTM(DPRINT_WINDOWS
, "Device 0x%X class %d type %d id '%s', parent %p\n", Child
,
108 Child
->ComponentEntry
.Class
, Child
->ComponentEntry
.Type
, VaToPa(Child
->ComponentEntry
.Identifier
), Child
->Parent
);
110 // Go through siblings list
111 Sibling
= VaToPa(Child
->Sibling
);
112 while (Sibling
!= NULL
)
114 if (Sibling
->ConfigurationData
)
115 Sibling
->ConfigurationData
= PaToVa(Sibling
->ConfigurationData
);
118 Sibling
->Child
= PaToVa(Sibling
->Child
);
121 Sibling
->Parent
= PaToVa(Sibling
->Parent
);
123 if (Sibling
->Sibling
)
124 Sibling
->Sibling
= PaToVa(Sibling
->Sibling
);
126 if (Sibling
->ComponentEntry
.Identifier
)
127 Sibling
->ComponentEntry
.Identifier
= PaToVa(Sibling
->ComponentEntry
.Identifier
);
129 DPRINTM(DPRINT_WINDOWS
, "Device 0x%X class %d type %d id '%s', parent %p\n", Sibling
,
130 Sibling
->ComponentEntry
.Class
, Sibling
->ComponentEntry
.Type
, VaToPa(Sibling
->ComponentEntry
.Identifier
), Sibling
->Parent
);
132 // Recurse into the Child tree
133 if (VaToPa(Sibling
->Child
) != NULL
)
134 ConvertConfigToVA(VaToPa(Sibling
->Child
));
136 Sibling
= VaToPa(Sibling
->Sibling
);
139 // Go to the next child
140 Child
= VaToPa(Child
->Child
);