Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers...
[reactos.git] / boot / freeldr / freeldr / ntldr / conversion.c
diff --git a/boot/freeldr/freeldr/ntldr/conversion.c b/boot/freeldr/freeldr/ntldr/conversion.c
new file mode 100644 (file)
index 0000000..520b304
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ * 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);
+    }
+}