[ARMLLB]: Add support for ATAG_REVISION.
[reactos.git] / reactos / boot / armllb / envir.c
index 47ff888..0b1c451 100644 (file)
@@ -9,12 +9,14 @@
 #include "precomp.h"
 
 ULONG LlbEnvHwPageSize;
-ULONG LlbEnvHwMemStart;
-ULONG LlbEnvHwMemSize;
-ULONG LlbEnvRamDiskStart;
-ULONG LlbEnvRamDiskSize;
+ULONG LlbEnvHwMemStart = 0;
+ULONG LlbEnvHwMemSize = 0;
+ULONG LlbEnvRamDiskStart = 0;
+ULONG LlbEnvRamDiskSize = 0;
+ULONG LlbEnvHwRevision;
 CHAR LlbEnvCmdLine[256];
-
+CHAR LlbValueData[32];
+    
 VOID
 NTAPI
 LlbEnvParseArguments(IN PATAG Arguments)
@@ -34,11 +36,17 @@ LlbEnvParseArguments(IN PATAG Arguments)
                 LlbEnvHwPageSize = Atag->u.Core.PageSize;
                 break;
                 
+            case ATAG_REVISION:
+
+                /* Save page size */
+                LlbEnvHwRevision = Atag->u.Revision.Rev;
+                break;
+                
             case ATAG_MEM:
             
                 /* Save RAM start and size */
-                LlbEnvHwMemStart = Atag->u.Mem.Start;
-                LlbEnvHwMemSize = Atag->u.Mem.Size;
+                if (!LlbEnvHwMemStart) LlbEnvHwMemStart = Atag->u.Mem.Start;
+                LlbEnvHwMemSize += Atag->u.Mem.Size;
                 break;
                 
             case ATAG_INITRD2:
@@ -46,6 +54,16 @@ LlbEnvParseArguments(IN PATAG Arguments)
                 /* Save RAMDISK start and size */
                 LlbEnvRamDiskStart = Atag->u.InitRd2.Start;
                 LlbEnvRamDiskSize = Atag->u.InitRd2.Size;
+                
+#ifdef _BEAGLE_
+                /* Make sure it's 16MB-aligned */
+                LlbEnvRamDiskSize = (LlbEnvRamDiskSize + (16 * 1024 * 1024) - 1) 
+                                    &~ ((16 * 1024 * 1024) - 1);
+                
+                /* The RAMDISK actually starts 16MB later */
+                LlbEnvRamDiskStart += 16 * 1024 * 1024;
+                LlbEnvRamDiskSize  -= 16 * 1024 * 1024;
+#endif
                 break;
                 
             case ATAG_CMDLINE:
@@ -59,7 +77,7 @@ LlbEnvParseArguments(IN PATAG Arguments)
             /* Nothing left to handle */
             case ATAG_NONE:
             default:
-                return;
+                break;
         }
         
         /* Next tag */
@@ -67,8 +85,11 @@ LlbEnvParseArguments(IN PATAG Arguments)
     }
     
     /* For debugging */
-    DbgPrint("[BOOTROM] PageSize: %dKB RAM: %dMB CMDLINE: %s\n",
-             LlbEnvHwPageSize / 1024, LlbEnvHwMemSize / 1024 / 1024, LlbEnvCmdLine);
+    DbgPrint("[BOOTROM] Board Revision: %lx PageSize: %dKB RAM: %dMB CMDLINE: %s\n"
+             "[RAMDISK] Base: %lx Size: %dMB\n",
+             LlbEnvHwRevision,
+             LlbEnvHwPageSize / 1024, LlbEnvHwMemSize / 1024 / 1024, LlbEnvCmdLine,
+             LlbEnvRamDiskStart, LlbEnvRamDiskSize / 1024 / 1024);
 }
 
 VOID
@@ -105,14 +126,35 @@ PCHAR
 NTAPI
 LlbEnvRead(IN PCHAR ValueName)
 {
-    PCHAR ValueData;
+    PCHAR ValuePointer;
+    ULONG Length = 0;
     
     /* Search for the value name */
-    ValueData = strstr(LlbEnvCmdLine, ValueName);
-    if (ValueData) ValueData += strlen(ValueName) + 1;
+    ValuePointer = strstr(LlbEnvCmdLine, ValueName);
+    if (ValuePointer)
+    {
+        /* Get the value data and its length */
+        ValuePointer += strlen(ValueName) + 1;
+        if (strchr(ValuePointer, ','))
+        {
+            /* Stop before next parameter */
+            Length = strchr(ValuePointer, ',') - ValuePointer;
+        }
+        else
+        {
+            /* Stop before the string ends */
+            Length = strlen(ValuePointer);
+        }
+        
+        /* Copy it */
+        strncpy(LlbValueData, ValuePointer, Length);
+    }
+    
+    /* Terminate the data */
+    LlbValueData[Length] = ANSI_NULL;
 
     /* Return the data */
-    return ValueData;
+    return LlbValueData;
 }
 
 /* EOF */