[ros-diffs] [sir_richard] 47677: [HAL]: Implement system bus address translation.

sir_richard at svn.reactos.org sir_richard at svn.reactos.org
Mon Jun 7 22:59:01 CEST 2010


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/bus/sysbus.c?rev=47677&r1=47676&r2=47677&view=diff
==============================================================================
--- 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;
 }
 




More information about the Ros-diffs mailing list