reactos/boot/armllb/envir.c

161 lines
4.1 KiB
C

/*
* 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];
VOID
NTAPI
LlbEnvParseArguments(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);
}
VOID
NTAPI
LlbEnvGetMemoryInformation(IN PULONG Base,
IN PULONG Size)
{
/* Return RAM information */
*Base = LlbEnvHwMemStart;
*Size = LlbEnvHwMemSize;
}
BOOLEAN
NTAPI
LlbEnvGetRamDiskInformation(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;
}
PCHAR
NTAPI
LlbEnvRead(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 */