Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162/* * PROJECT: ReactOS Boot Loader * LICENSE: BSD - See COPYING.ARM in the top level directory * FILE: boot/armllb/envir.c * PURPOSE: LLB Environment Variable Routines * PROGRAMMERS: ReactOS Portable Systems Group */
#include "precomp.h"
ULONG LlbEnvHwPageSize;ULONG LlbEnvHwMemStart = 0;ULONG LlbEnvHwMemSize = 0;ULONG LlbEnvRamDiskStart = 0;ULONG LlbEnvRamDiskSize = 0;ULONG LlbEnvHwRevision;CHAR LlbEnvCmdLine[256];CHAR LlbValueData[32];
VOIDNTAPILlbEnvParseArguments(IN PATAG Arguments){ PATAG Atag;
/* Parse the ATAGs */ Atag = Arguments; while (Atag->Hdr.Size) { /* Check tag type */ switch (Atag->Hdr.Tag) { case ATAG_CORE:
/* Save page size */ 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 */ if (!LlbEnvHwMemStart) LlbEnvHwMemStart = Atag->u.Mem.Start; LlbEnvHwMemSize += Atag->u.Mem.Size; break;
case ATAG_INITRD2:
/* 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:
/* Save command line */ strncpy(LlbEnvCmdLine, Atag->u.CmdLine.CmdLine, Atag->Hdr.Size * sizeof(ULONG)); break;
/* Nothing left to handle */ case ATAG_NONE: default: break; }
/* Next tag */ Atag = (PATAG)((PULONG)Atag + Atag->Hdr.Size); }
/* For debugging */ 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);}
VOIDNTAPILlbEnvGetMemoryInformation(IN PULONG Base, IN PULONG Size){ /* Return RAM information */ *Base = LlbEnvHwMemStart; *Size = LlbEnvHwMemSize;}
BOOLEANNTAPILlbEnvGetRamDiskInformation(IN PULONG Base, IN PULONG Size){ /* Do we have a ramdisk? */ if (LlbEnvRamDiskSize == 0) { /* No */ *Base = 0; *Size = 0; return FALSE; }
/* Return ramdisk information */ *Base = LlbEnvRamDiskStart; *Size = LlbEnvRamDiskSize; return TRUE;}
PCHARNTAPILlbEnvRead(IN PCHAR ValueName){ PCHAR ValuePointer; ULONG Length = 0;
/* Search for the value name */ 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 LlbValueData;}
/* EOF */