[FREELDR]: VaToPa/PaToVa are assuming all architectures have VA at PA | KSEG0_BASE...
[reactos.git] / reactos / boot / freeldr / freeldr / windows / conversion.c
index 8d29c1e..2f58a5f 100644 (file)
-/*\r
- * PROJECT:         EFI Windows Loader\r
- * LICENSE:         GPL - See COPYING in the top level directory\r
- * FILE:            freeldr/winldr/conversion.c\r
- * PURPOSE:         Physical <-> Virtual addressing mode conversions\r
- * PROGRAMMERS:     Aleksey Bragin (aleksey@reactos.org)\r
- */\r
-\r
-/* INCLUDES ***************************************************************/\r
-\r
-#include <freeldr.h>\r
-\r
-//#include <ndk/ldrtypes.h>\r
-\r
-#define NDEBUG\r
-#include <debug.h>\r
-\r
-/* FUNCTIONS **************************************************************/\r
-\r
-/* Arch-specific addresses translation implementation */\r
-PVOID\r
-VaToPa(PVOID Va)\r
-{\r
-       return (PVOID)((ULONG_PTR)Va & ~KSEG0_BASE);\r
-}\r
-\r
-PVOID\r
-PaToVa(PVOID Pa)\r
-{\r
-       return (PVOID)((ULONG_PTR)Pa | KSEG0_BASE);\r
-}\r
-\r
-VOID\r
-List_PaToVa(LIST_ENTRY *ListEntry)\r
-{\r
-       LIST_ENTRY *ListHead = ListEntry;\r
-       LIST_ENTRY *Next = ListEntry->Flink;\r
-       LIST_ENTRY *NextPA;\r
-\r
-       //Print(L"\n\nList_Entry: %X, First Next: %X\n", ListEntry, Next);\r
-       //\r
-       // Walk through the whole list\r
-       //\r
-       if (Next != NULL)\r
-       {\r
-               while (Next != PaToVa(ListHead))\r
-               {\r
-                       NextPA = VaToPa(Next);\r
-                       //Print(L"Current: %X, Flink: %X, Blink: %X\n", Next, NextPA->Flink, NextPA->Blink);\r
-\r
-                       NextPA->Flink = PaToVa((PVOID)NextPA->Flink);\r
-                       NextPA->Blink = PaToVa((PVOID)NextPA->Blink);\r
-\r
-                       //Print(L"After converting Flink: %X, Blink: %X\n", NextPA->Flink, NextPA->Blink);\r
-\r
-                       Next = NextPA->Flink;\r
-               }\r
-\r
-               //\r
-               // Finally convert first Flink/Blink\r
-               //\r
-               ListEntry->Flink = PaToVa((PVOID)ListEntry->Flink);\r
-               if (ListEntry->Blink)\r
-                       ListEntry->Blink = PaToVa((PVOID)ListEntry->Blink);\r
-       }\r
-}\r
-\r
-// This function converts only Child->Child, and calls itself for each Sibling\r
-VOID\r
-ConvertConfigToVA(PCONFIGURATION_COMPONENT_DATA Start)\r
-{\r
-       PCONFIGURATION_COMPONENT_DATA Child;\r
-       PCONFIGURATION_COMPONENT_DATA Sibling;\r
-\r
-       DbgPrint((DPRINT_WINDOWS, "ConvertConfigToVA(Start 0x%X)", Start));\r
-       Child = Start;\r
-\r
-       while (Child != NULL)\r
-       {\r
-               if (Child->ConfigurationData)\r
-                       Child->ConfigurationData = PaToVa(Child->ConfigurationData);\r
-\r
-               if (Child->Child)\r
-                       Child->Child = PaToVa(Child->Child);\r
-\r
-               if (Child->Parent)\r
-                       Child->Parent = PaToVa(Child->Parent);\r
-\r
-               if (Child->Sibling)\r
-                       Child->Sibling = PaToVa(Child->Sibling);\r
-\r
-               DbgPrint((DPRINT_WINDOWS, "Device 0x%X class %d", Child, Child->ComponentEntry.Class));\r
-\r
-               // If the child has a sibling list, then search the sibling list\r
-               // for an entry that matches the specified class, type, and key.\r
-               Sibling = Child->Sibling;\r
-               while (Sibling != NULL)\r
-               {\r
-                       if (Sibling->ConfigurationData)\r
-                               Sibling->ConfigurationData = PaToVa(Sibling->ConfigurationData);\r
-\r
-                       if (Sibling->Child)\r
-                               Sibling->Child = PaToVa(Sibling->Child);\r
-\r
-                       if (Sibling->Parent)\r
-                               Sibling->Parent = PaToVa(Sibling->Parent);\r
-\r
-                       if (Sibling->Sibling)\r
-                               Sibling->Sibling = PaToVa(Sibling->Sibling);\r
-\r
-                       DbgPrint((DPRINT_WINDOWS, "Device 0x%X class %d", Sibling, Sibling->ComponentEntry.Class));\r
-\r
-                       // If the sibling has a child tree, then search the child tree\r
-                       // for an entry that matches the specified class, type, and key.\r
-                       if (VaToPa(Sibling->Child) != NULL)\r
-                               ConvertConfigToVA(VaToPa(Sibling->Child));\r
-\r
-                       Sibling = VaToPa(Sibling->Sibling);\r
-               }\r
-\r
-               Child = VaToPa(Child->Child);\r
-       }\r
-}\r
+/*
+ * PROJECT:         EFI Windows Loader
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            freeldr/winldr/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>
+
+/* FUNCTIONS **************************************************************/
+
+#ifndef _ZOOM2_
+/* Arch-specific addresses translation implementation */
+PVOID
+VaToPa(PVOID Va)
+{
+       return (PVOID)((ULONG_PTR)Va & ~KSEG0_BASE);
+}
+
+PVOID
+PaToVa(PVOID Pa)
+{
+       return (PVOID)((ULONG_PTR)Pa | KSEG0_BASE);
+}
+#else
+PVOID
+VaToPa(PVOID Va)
+{
+    return Va;
+}
+
+PVOID
+PaToVa(PVOID Pa)
+{
+    return Pa;
+}
+#endif
+
+VOID
+List_PaToVa(LIST_ENTRY *ListEntry)
+{
+       LIST_ENTRY *ListHead = ListEntry;
+       LIST_ENTRY *Next = ListEntry->Flink;
+       LIST_ENTRY *NextPA;
+
+       //Print(L"\n\nList_Entry: %X, First Next: %X\n", ListEntry, Next);
+       //
+       // Walk through the whole list
+       //
+       if (Next != NULL)
+       {
+               while (Next != PaToVa(ListHead))
+               {
+                       NextPA = VaToPa(Next);
+                       //Print(L"Current: %X, Flink: %X, Blink: %X\n", Next, NextPA->Flink, NextPA->Blink);
+
+                       NextPA->Flink = PaToVa((PVOID)NextPA->Flink);
+                       NextPA->Blink = PaToVa((PVOID)NextPA->Blink);
+
+                       //Print(L"After converting Flink: %X, Blink: %X\n", NextPA->Flink, NextPA->Blink);
+
+                       Next = NextPA->Flink;
+               }
+
+               //
+               // Finally convert first Flink/Blink
+               //
+               ListEntry->Flink = PaToVa((PVOID)ListEntry->Flink);
+               if (ListEntry->Blink)
+                       ListEntry->Blink = PaToVa((PVOID)ListEntry->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;
+
+       DPRINTM(DPRINT_WINDOWS, "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);
+
+               DPRINTM(DPRINT_WINDOWS, "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);
+
+                       DPRINTM(DPRINT_WINDOWS, "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);
+       }
+}