mirror of
https://github.com/reactos/reactos.git
synced 2024-06-28 08:51:29 +00:00
112 lines
3.5 KiB
C
112 lines
3.5 KiB
C
/*
|
|
* 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);
|
|
}
|
|
}
|