Author: sir_richard
Date: Mon Jun 7 22:59:00 2010
New Revision: 47677
URL:
http://svn.reactos.org/svn/reactos?rev=47677&view=rev
Log:
[HAL]: Implement system bus address translation.
Modified:
trunk/reactos/hal/halx86/generic/legacy/bus/sysbus.c
Modified: trunk/reactos/hal/halx86/generic/legacy/bus/sysbus.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/generic/legacy/…
==============================================================================
--- trunk/reactos/hal/halx86/generic/legacy/bus/sysbus.c [iso-8859-1] (original)
+++ trunk/reactos/hal/halx86/generic/legacy/bus/sysbus.c [iso-8859-1] Mon Jun 7 22:59:00
2010
@@ -24,8 +24,89 @@
IN OUT PULONG AddressSpace,
OUT PPHYSICAL_ADDRESS TranslatedAddress)
{
- DPRINT1("SYSTEM Translate\n");
- while (TRUE);
+ PSUPPORTED_RANGE Range = NULL;
+
+ /* Check what kind of address space this is */
+ switch (*AddressSpace)
+ {
+ /* Memory address */
+ case 0:
+
+ /* Loop all prefetech memory */
+ for (Range = &BusHandler->BusAddresses->PrefetchMemory;
+ Range;
+ Range = Range->Next)
+ {
+ /* Check if it's in a valid range */
+ if ((BusAddress.QuadPart >= Range->Base) &&
+ (BusAddress.QuadPart <= Range->Limit))
+ {
+ /* Get out */
+ break;
+ }
+ }
+
+ /* Check if we haven't found anything yet */
+ if (!Range)
+ {
+ /* Loop all bus memory */
+ for (Range = &BusHandler->BusAddresses->Memory;
+ Range;
+ Range = Range->Next)
+ {
+ /* Check if it's in a valid range */
+ if ((BusAddress.QuadPart >= Range->Base) &&
+ (BusAddress.QuadPart <= Range->Limit))
+ {
+ /* Get out */
+ break;
+ }
+ }
+ }
+
+ /* Done */
+ break;
+
+ /* I/O Space */
+ case 1:
+
+ /* Loop all bus I/O memory */
+ for (Range = &BusHandler->BusAddresses->IO;
+ Range;
+ Range = Range->Next)
+ {
+ /* Check if it's in a valid range */
+ if ((BusAddress.QuadPart >= Range->Base) &&
+ (BusAddress.QuadPart <= Range->Limit))
+ {
+ /* Get out */
+ break;
+ }
+ }
+
+ /* Done */
+ break;
+ }
+
+ /* Check if we found a range */
+ if (Range)
+ {
+ /* Do the translation and return the kind of address space this is */
+ TranslatedAddress->QuadPart = BusAddress.QuadPart + Range->SystemBase;
+ if ((TranslatedAddress->QuadPart != BusAddress.QuadPart) ||
+ (*AddressSpace != Range->SystemAddressSpace))
+ {
+ /* Different than what the old HAL would do */
+ DPRINT1("Translation of %I64x is %I64x %s\n",
+ BusAddress.QuadPart, TranslatedAddress->QuadPart,
+ Range->SystemAddressSpace ? "In I/O Space" : "In
RAM");
+ }
+ *AddressSpace = Range->SystemAddressSpace;
+ return TRUE;
+ }
+
+ /* Nothing found */
+ DPRINT1("Translation of %I64x failed!\n", BusAddress.QuadPart);
return FALSE;
}