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)
9 /* INCLUDES ***************************************************************/
13 //#include <ndk/ldrtypes.h>
16 DBG_DEFAULT_CHANNEL(WINDOWS
);
18 /* FUNCTIONS **************************************************************/
21 List_PaToVa(_In_ PLIST_ENTRY ListHeadPa
)
23 PLIST_ENTRY EntryPa
, NextPa
;
25 /* List must be properly initialized */
26 ASSERT(ListHeadPa
->Flink
!= 0);
27 ASSERT(ListHeadPa
->Blink
!= 0);
29 /* Loop the list in physical address space */
30 EntryPa
= ListHeadPa
->Flink
;
31 while (EntryPa
!= ListHeadPa
)
33 /* Save the physical address of the next entry */
34 NextPa
= EntryPa
->Flink
;
36 /* Convert the addresses of this entry */
37 EntryPa
->Flink
= PaToVa(EntryPa
->Flink
);
38 EntryPa
->Blink
= PaToVa(EntryPa
->Blink
);
40 /* Go to the next entry */
44 /* Finally convert the list head */
45 ListHeadPa
->Flink
= PaToVa(ListHeadPa
->Flink
);
46 ListHeadPa
->Blink
= PaToVa(ListHeadPa
->Blink
);
49 // This function converts only Child->Child, and calls itself for each Sibling
51 ConvertConfigToVA(PCONFIGURATION_COMPONENT_DATA Start
)
53 PCONFIGURATION_COMPONENT_DATA Child
;
54 PCONFIGURATION_COMPONENT_DATA Sibling
;
56 TRACE("ConvertConfigToVA(Start 0x%X)\n", Start
);
61 if (Child
->ConfigurationData
)
62 Child
->ConfigurationData
= PaToVa(Child
->ConfigurationData
);
65 Child
->Child
= PaToVa(Child
->Child
);
68 Child
->Parent
= PaToVa(Child
->Parent
);
71 Child
->Sibling
= PaToVa(Child
->Sibling
);
73 if (Child
->ComponentEntry
.Identifier
)
74 Child
->ComponentEntry
.Identifier
= PaToVa(Child
->ComponentEntry
.Identifier
);
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
);
79 // Go through siblings list
80 Sibling
= VaToPa(Child
->Sibling
);
81 while (Sibling
!= NULL
)
83 if (Sibling
->ConfigurationData
)
84 Sibling
->ConfigurationData
= PaToVa(Sibling
->ConfigurationData
);
87 Sibling
->Child
= PaToVa(Sibling
->Child
);
90 Sibling
->Parent
= PaToVa(Sibling
->Parent
);
93 Sibling
->Sibling
= PaToVa(Sibling
->Sibling
);
95 if (Sibling
->ComponentEntry
.Identifier
)
96 Sibling
->ComponentEntry
.Identifier
= PaToVa(Sibling
->ComponentEntry
.Identifier
);
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
);
101 // Recurse into the Child tree
102 if (VaToPa(Sibling
->Child
) != NULL
)
103 ConvertConfigToVA(VaToPa(Sibling
->Child
));
105 Sibling
= VaToPa(Sibling
->Sibling
);
108 // Go to the next child
109 Child
= VaToPa(Child
->Child
);