1 /* 2 * PROJECT: ReactOS Boot Loader 3 * LICENSE: BSD - See COPYING.ARM in the top level directory 4 * FILE: boot/armllb/envir.c 5 * PURPOSE: LLB Environment Variable Routines 6 * PROGRAMMERS: ReactOS Portable Systems Group 7 */ 8 9 #include "precomp.h" 10 11 ULONG LlbEnvHwPageSize; 12 ULONG LlbEnvHwMemStart = 0; 13 ULONG LlbEnvHwMemSize = 0; 14 ULONG LlbEnvRamDiskStart = 0; 15 ULONG LlbEnvRamDiskSize = 0; 16 ULONG LlbEnvHwRevision; 17 CHAR LlbEnvCmdLine[256]; 18 CHAR LlbValueData[32]; 19 20 VOID 21 NTAPI 22 LlbEnvParseArguments(IN PATAG Arguments) 23 { 24 PATAG Atag; 25 26 /* Parse the ATAGs */ 27 Atag = Arguments; 28 while (Atag->Hdr.Size) 29 { 30 /* Check tag type */ 31 switch (Atag->Hdr.Tag) 32 { 33 case ATAG_CORE: 34 35 /* Save page size */ 36 LlbEnvHwPageSize = Atag->u.Core.PageSize; 37 break; 38 39 case ATAG_REVISION: 40 41 /* Save page size */ 42 LlbEnvHwRevision = Atag->u.Revision.Rev; 43 break; 44 45 case ATAG_MEM: 46 47 /* Save RAM start and size */ 48 if (!LlbEnvHwMemStart) LlbEnvHwMemStart = Atag->u.Mem.Start; 49 LlbEnvHwMemSize += Atag->u.Mem.Size; 50 break; 51 52 case ATAG_INITRD2: 53 54 /* Save RAMDISK start and size */ 55 LlbEnvRamDiskStart = Atag->u.InitRd2.Start; 56 LlbEnvRamDiskSize = Atag->u.InitRd2.Size; 57 58 #ifdef _BEAGLE_ 59 /* Make sure it's 16MB-aligned */ 60 LlbEnvRamDiskSize = (LlbEnvRamDiskSize + (16 * 1024 * 1024) - 1) 61 &~ ((16 * 1024 * 1024) - 1); 62 63 /* The RAMDISK actually starts 16MB later */ 64 LlbEnvRamDiskStart += 16 * 1024 * 1024; 65 LlbEnvRamDiskSize -= 16 * 1024 * 1024; 66 #endif 67 break; 68 69 case ATAG_CMDLINE: 70 71 /* Save command line */ 72 strncpy(LlbEnvCmdLine, 73 Atag->u.CmdLine.CmdLine, 74 Atag->Hdr.Size * sizeof(ULONG)); 75 break; 76 77 /* Nothing left to handle */ 78 case ATAG_NONE: 79 default: 80 break; 81 } 82 83 /* Next tag */ 84 Atag = (PATAG)((PULONG)Atag + Atag->Hdr.Size); 85 } 86 87 /* For debugging */ 88 DbgPrint("[BOOTROM] Board Revision: %lx PageSize: %dKB RAM: %dMB CMDLINE: %s\n" 89 "[RAMDISK] Base: %lx Size: %dMB\n", 90 LlbEnvHwRevision, 91 LlbEnvHwPageSize / 1024, LlbEnvHwMemSize / 1024 / 1024, LlbEnvCmdLine, 92 LlbEnvRamDiskStart, LlbEnvRamDiskSize / 1024 / 1024); 93 } 94 95 VOID 96 NTAPI 97 LlbEnvGetMemoryInformation(IN PULONG Base, 98 IN PULONG Size) 99 { 100 /* Return RAM information */ 101 *Base = LlbEnvHwMemStart; 102 *Size = LlbEnvHwMemSize; 103 } 104 105 BOOLEAN 106 NTAPI 107 LlbEnvGetRamDiskInformation(IN PULONG Base, 108 IN PULONG Size) 109 { 110 /* Do we have a ramdisk? */ 111 if (LlbEnvRamDiskSize == 0) 112 { 113 /* No */ 114 *Base = 0; 115 *Size = 0; 116 return FALSE; 117 } 118 119 /* Return ramdisk information */ 120 *Base = LlbEnvRamDiskStart; 121 *Size = LlbEnvRamDiskSize; 122 return TRUE; 123 } 124 125 PCHAR 126 NTAPI 127 LlbEnvRead(IN PCHAR ValueName) 128 { 129 PCHAR ValuePointer; 130 ULONG Length = 0; 131 132 /* Search for the value name */ 133 ValuePointer = strstr(LlbEnvCmdLine, ValueName); 134 if (ValuePointer) 135 { 136 /* Get the value data and its length */ 137 ValuePointer += strlen(ValueName) + 1; 138 if (strchr(ValuePointer, ',')) 139 { 140 /* Stop before next parameter */ 141 Length = strchr(ValuePointer, ',') - ValuePointer; 142 } 143 else 144 { 145 /* Stop before the string ends */ 146 Length = strlen(ValuePointer); 147 } 148 149 /* Copy it */ 150 strncpy(LlbValueData, ValuePointer, Length); 151 } 152 153 /* Terminate the data */ 154 LlbValueData[Length] = ANSI_NULL; 155 156 /* Return the data */ 157 return LlbValueData; 158 } 159 160 /* EOF */ 161 162