--- /dev/null
+/*
+ * PROJECT: EFI Windows Loader
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: boot/freeldr/freeldr/windows/conversion.c
+ * PURPOSE: Physical <-> Virtual addressing mode conversions
+ * PROGRAMMERS: Aleksey Bragin (aleksey@reactos.org)
+ */
+
+/* INCLUDES ***************************************************************/
+
+#include <freeldr.h>
+
+//#include <ndk/ldrtypes.h>
+#include <debug.h>
+
+DBG_DEFAULT_CHANNEL(WINDOWS);
+
+/* FUNCTIONS **************************************************************/
+
+VOID
+List_PaToVa(_In_ PLIST_ENTRY ListHeadPa)
+{
+ PLIST_ENTRY EntryPa, NextPa;
+
+ /* List must be properly initialized */
+ ASSERT(ListHeadPa->Flink != 0);
+ ASSERT(ListHeadPa->Blink != 0);
+
+ /* Loop the list in physical address space */
+ EntryPa = ListHeadPa->Flink;
+ while (EntryPa != ListHeadPa)
+ {
+ /* Save the physical address of the next entry */
+ NextPa = EntryPa->Flink;
+
+ /* Convert the addresses of this entry */
+ EntryPa->Flink = PaToVa(EntryPa->Flink);
+ EntryPa->Blink = PaToVa(EntryPa->Blink);
+
+ /* Go to the next entry */
+ EntryPa = NextPa;
+ }
+
+ /* Finally convert the list head */
+ ListHeadPa->Flink = PaToVa(ListHeadPa->Flink);
+ ListHeadPa->Blink = PaToVa(ListHeadPa->Blink);
+}
+
+// This function converts only Child->Child, and calls itself for each Sibling
+VOID
+ConvertConfigToVA(PCONFIGURATION_COMPONENT_DATA Start)
+{
+ PCONFIGURATION_COMPONENT_DATA Child;
+ PCONFIGURATION_COMPONENT_DATA Sibling;
+
+ TRACE("ConvertConfigToVA(Start 0x%X)\n", Start);
+ Child = Start;
+
+ while (Child != NULL)
+ {
+ if (Child->ConfigurationData)
+ Child->ConfigurationData = PaToVa(Child->ConfigurationData);
+
+ if (Child->Child)
+ Child->Child = PaToVa(Child->Child);
+
+ if (Child->Parent)
+ Child->Parent = PaToVa(Child->Parent);
+
+ if (Child->Sibling)
+ Child->Sibling = PaToVa(Child->Sibling);
+
+ if (Child->ComponentEntry.Identifier)
+ Child->ComponentEntry.Identifier = PaToVa(Child->ComponentEntry.Identifier);
+
+ TRACE("Device 0x%X class %d type %d id '%s', parent %p\n", Child,
+ Child->ComponentEntry.Class, Child->ComponentEntry.Type, VaToPa(Child->ComponentEntry.Identifier), Child->Parent);
+
+ // Go through siblings list
+ Sibling = VaToPa(Child->Sibling);
+ while (Sibling != NULL)
+ {
+ if (Sibling->ConfigurationData)
+ Sibling->ConfigurationData = PaToVa(Sibling->ConfigurationData);
+
+ if (Sibling->Child)
+ Sibling->Child = PaToVa(Sibling->Child);
+
+ if (Sibling->Parent)
+ Sibling->Parent = PaToVa(Sibling->Parent);
+
+ if (Sibling->Sibling)
+ Sibling->Sibling = PaToVa(Sibling->Sibling);
+
+ if (Sibling->ComponentEntry.Identifier)
+ Sibling->ComponentEntry.Identifier = PaToVa(Sibling->ComponentEntry.Identifier);
+
+ TRACE("Device 0x%X class %d type %d id '%s', parent %p\n", Sibling,
+ Sibling->ComponentEntry.Class, Sibling->ComponentEntry.Type, VaToPa(Sibling->ComponentEntry.Identifier), Sibling->Parent);
+
+ // Recurse into the Child tree
+ if (VaToPa(Sibling->Child) != NULL)
+ ConvertConfigToVA(VaToPa(Sibling->Child));
+
+ Sibling = VaToPa(Sibling->Sibling);
+ }
+
+ // Go to the next child
+ Child = VaToPa(Child->Child);
+ }
+}