mirror of
https://github.com/reactos/reactos.git
synced 2025-05-15 07:17:23 +00:00
- Flesh out more code.
- Support ATAG Linux/ARMBoot architecture defined-structures. These are used by all ARMBoot-compatible loaders (QEmu, U-boot, etc). - Read RAMDisk, RAM, Command Line from ATAGs (use -append boot-device=RAMDISK). - Make environment-get function read command-line. - Allocate RAM memory structure portably. - Validate board info on boot. svn path=/trunk/; revision=45386
This commit is contained in:
parent
e7ff33a8bc
commit
59e8be0b65
8 changed files with 216 additions and 21 deletions
|
@ -8,12 +8,111 @@
|
||||||
|
|
||||||
#include "precomp.h"
|
#include "precomp.h"
|
||||||
|
|
||||||
|
ULONG LlbEnvHwPageSize;
|
||||||
|
ULONG LlbEnvHwMemStart;
|
||||||
|
ULONG LlbEnvHwMemSize;
|
||||||
|
ULONG LlbEnvRamDiskStart;
|
||||||
|
ULONG LlbEnvRamDiskSize;
|
||||||
|
CHAR LlbEnvCmdLine[256];
|
||||||
|
|
||||||
|
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_MEM:
|
||||||
|
|
||||||
|
/* Save RAM start and size */
|
||||||
|
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;
|
||||||
|
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:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Next tag */
|
||||||
|
Atag = (PATAG)((PULONG)Atag + Atag->Hdr.Size);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* For debugging */
|
||||||
|
DbgPrint("[BOOTROM] PageSize: %dKB RAM: %dMB CMDLINE: %s\n",
|
||||||
|
LlbEnvHwPageSize / 1024, LlbEnvHwMemSize / 1024 / 1024, LlbEnvCmdLine);
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
PCHAR
|
||||||
NTAPI
|
NTAPI
|
||||||
LlbEnvRead(IN PCHAR ValueName)
|
LlbEnvRead(IN PCHAR ValueName)
|
||||||
{
|
{
|
||||||
/* FIXME: HACK */
|
PCHAR ValueData;
|
||||||
return "RAMDISK";
|
|
||||||
|
/* Search for the value name */
|
||||||
|
ValueData = strstr(LlbEnvCmdLine, ValueName);
|
||||||
|
if (ValueData) ValueData += strlen(ValueName) + 1;
|
||||||
|
|
||||||
|
/* Return the data */
|
||||||
|
return ValueData;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -40,9 +40,6 @@ VOID
|
||||||
NTAPI
|
NTAPI
|
||||||
LlbHwBuildMemoryMap(IN PBIOS_MEMORY_MAP MemoryMap)
|
LlbHwBuildMemoryMap(IN PBIOS_MEMORY_MAP MemoryMap)
|
||||||
{
|
{
|
||||||
/* For now, hard-code 128MB of RAM starting at 0x00000000 */
|
|
||||||
LlbAllocateMemoryEntry(BiosMemoryUsable, 0x00000000, 128 * 1024 * 1024);
|
|
||||||
|
|
||||||
/* Mark MMIO space as reserved */
|
/* Mark MMIO space as reserved */
|
||||||
LlbAllocateMemoryEntry(BiosMemoryReserved, 0x10000000, 128 * 1024 * 1024);
|
LlbAllocateMemoryEntry(BiosMemoryReserved, 0x10000000, 128 * 1024 * 1024);
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,8 +29,11 @@ POSLOADER_INIT
|
||||||
NTAPI
|
NTAPI
|
||||||
LlbHwLoadOsLoaderFromRam(VOID)
|
LlbHwLoadOsLoaderFromRam(VOID)
|
||||||
{
|
{
|
||||||
/* The OS Loader should have already been loaded by QEMU at the right place */
|
ULONG Base, Dummy;
|
||||||
return (POSLOADER_INIT)0x800000;
|
|
||||||
|
/* On versatile, the loader is loaded with the RAMDISK. Just get the address */
|
||||||
|
LlbEnvGetRamDiskInformation(&Base, &Dummy);
|
||||||
|
return (POSLOADER_INIT)Base;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
88
reactos/boot/armllb/inc/envir.h
Executable file
88
reactos/boot/armllb/inc/envir.h
Executable file
|
@ -0,0 +1,88 @@
|
||||||
|
/*
|
||||||
|
* PROJECT: ReactOS Boot Loader
|
||||||
|
* LICENSE: BSD - See COPYING.ARM in the top level directory
|
||||||
|
* FILE: boot/armllb/inc/envir.h
|
||||||
|
* PURPOSE: LLB Environment Functions
|
||||||
|
* PROGRAMMERS: ReactOS Portable Systems Group
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct _ATAG_HEADER
|
||||||
|
{
|
||||||
|
ULONG Size;
|
||||||
|
ULONG Tag;
|
||||||
|
} ATAG_HEADER, *PATAG_HEADER;
|
||||||
|
|
||||||
|
typedef struct _ATAG_CORE
|
||||||
|
{
|
||||||
|
ULONG Flags;
|
||||||
|
ULONG PageSize;
|
||||||
|
ULONG RootDev;
|
||||||
|
} ATAG_CORE, *PATAG_CORE;
|
||||||
|
|
||||||
|
typedef struct _ATAG_MEM
|
||||||
|
{
|
||||||
|
ULONG Size;
|
||||||
|
ULONG Start;
|
||||||
|
} ATAG_MEM, *PATAG_MEM;
|
||||||
|
|
||||||
|
typedef struct _ATAG_INITRD2
|
||||||
|
{
|
||||||
|
ULONG Start;
|
||||||
|
ULONG Size;
|
||||||
|
} ATAG_INITRD2, *PATAG_INITRD2;
|
||||||
|
|
||||||
|
typedef struct _ATAG_CMDLINE
|
||||||
|
{
|
||||||
|
CHAR CmdLine[ANYSIZE_ARRAY];
|
||||||
|
} ATAG_CMDLINE, *PATAG_CMDLINE;
|
||||||
|
|
||||||
|
typedef struct _ATAG
|
||||||
|
{
|
||||||
|
ATAG_HEADER Hdr;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
ATAG_CORE Core;
|
||||||
|
ATAG_MEM Mem;
|
||||||
|
ATAG_INITRD2 InitRd2;
|
||||||
|
ATAG_CMDLINE CmdLine;
|
||||||
|
} u;
|
||||||
|
} ATAG, *PATAG;
|
||||||
|
|
||||||
|
#define ATAG_NONE 0x00000000
|
||||||
|
#define ATAG_CORE 0x54410001
|
||||||
|
#define ATAG_MEM 0x54410002
|
||||||
|
#define ATAG_VIDEOTEXT 0x54410003
|
||||||
|
#define ATAG_RAMDISK 0x54410004
|
||||||
|
#define ATAG_INITRD2 0x54420005
|
||||||
|
#define ATAG_SERIAL 0x54410006
|
||||||
|
#define ATAG_REVISION 0x54410007
|
||||||
|
#define ATAG_VIDEOLFB 0x54410008
|
||||||
|
#define ATAG_CMDLINE 0x54410009
|
||||||
|
|
||||||
|
PCHAR
|
||||||
|
NTAPI
|
||||||
|
LlbEnvRead(
|
||||||
|
IN PCHAR Option
|
||||||
|
);
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
NTAPI
|
||||||
|
LlbEnvGetRamDiskInformation(
|
||||||
|
IN PULONG Base,
|
||||||
|
IN PULONG Size
|
||||||
|
);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
LlbEnvGetMemoryInformation(
|
||||||
|
IN PULONG Base,
|
||||||
|
IN PULONG Size
|
||||||
|
);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
LlbEnvParseArguments(
|
||||||
|
IN PATAG Arguments
|
||||||
|
);
|
||||||
|
|
||||||
|
/* EOF */
|
|
@ -97,10 +97,4 @@ LlbBoot(
|
||||||
IN PCHAR CommandLine
|
IN PCHAR CommandLine
|
||||||
);
|
);
|
||||||
|
|
||||||
PCHAR
|
|
||||||
NTAPI
|
|
||||||
LlbEnvRead(
|
|
||||||
IN PCHAR Option
|
|
||||||
);
|
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#include "serial.h"
|
#include "serial.h"
|
||||||
#include "video.h"
|
#include "video.h"
|
||||||
#include "keyboard.h"
|
#include "keyboard.h"
|
||||||
|
#include "envir.h"
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
DbgPrint(
|
DbgPrint(
|
||||||
|
|
|
@ -9,8 +9,16 @@
|
||||||
#include "precomp.h"
|
#include "precomp.h"
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
LlbStartup(VOID)
|
LlbStartup(IN ULONG Reserved,
|
||||||
|
IN ULONG BoardInfo,
|
||||||
|
IN PATAG Arguments)
|
||||||
{
|
{
|
||||||
|
/* Make sure we are booting on the correct kind of machine */
|
||||||
|
if (BoardInfo != LlbHwGetBoardType()) while (TRUE);
|
||||||
|
|
||||||
|
/* Either QEMU or U-Boot itself should send this information */
|
||||||
|
LlbEnvParseArguments(Arguments);
|
||||||
|
|
||||||
/* Initialize hardware components */
|
/* Initialize hardware components */
|
||||||
LlbHwInitialize();
|
LlbHwInitialize();
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,6 @@ NTAPI
|
||||||
LlbSetCommandLine(IN PCHAR CommandLine)
|
LlbSetCommandLine(IN PCHAR CommandLine)
|
||||||
{
|
{
|
||||||
/* Copy the command line in the ARM block */
|
/* Copy the command line in the ARM block */
|
||||||
printf("Command Line %s\n", CommandLine);
|
|
||||||
strcpy(ArmBlock.CommandLine, CommandLine);
|
strcpy(ArmBlock.CommandLine, CommandLine);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,11 +60,11 @@ LlbBuildArmBlock(VOID)
|
||||||
ArmBlock.UartRegisterBase = LlbHwGetUartBase(LlbHwGetSerialUart());
|
ArmBlock.UartRegisterBase = LlbHwGetUartBase(LlbHwGetSerialUart());
|
||||||
|
|
||||||
/* Debug */
|
/* Debug */
|
||||||
printf("Machine Identifier: %lx\nPCLK: %d\nTIMER 0: %p\nSERIAL UART: %p\n",
|
DbgPrint("Machine Identifier: %lx\nPCLK: %d\nTIMER 0: %p\nSERIAL UART: %p\n",
|
||||||
ArmBlock.BoardType,
|
ArmBlock.BoardType,
|
||||||
ArmBlock.ClockRate,
|
ArmBlock.ClockRate,
|
||||||
ArmBlock.TimerRegisterBase,
|
ArmBlock.TimerRegisterBase,
|
||||||
ArmBlock.UartRegisterBase);
|
ArmBlock.UartRegisterBase);
|
||||||
|
|
||||||
/* Now load the memory map */
|
/* Now load the memory map */
|
||||||
ArmBlock.MemoryMap = MemoryMap;
|
ArmBlock.MemoryMap = MemoryMap;
|
||||||
|
@ -80,10 +79,16 @@ VOID
|
||||||
NTAPI
|
NTAPI
|
||||||
LlbBuildMemoryMap(VOID)
|
LlbBuildMemoryMap(VOID)
|
||||||
{
|
{
|
||||||
|
ULONG Base, Size;
|
||||||
|
|
||||||
/* Zero out the memory map */
|
/* Zero out the memory map */
|
||||||
memset(MemoryMap, 0, sizeof(MemoryMap));
|
memset(MemoryMap, 0, sizeof(MemoryMap));
|
||||||
|
|
||||||
|
/* Query memory information */
|
||||||
|
LlbEnvGetMemoryInformation(&Base, &Size);
|
||||||
|
LlbAllocateMemoryEntry(BiosMemoryUsable, Base, Size);
|
||||||
|
|
||||||
/* Call the hardware-specific function */
|
/* Call the hardware-specific function for hardware-defined regions */
|
||||||
LlbHwBuildMemoryMap(MemoryMap);
|
LlbHwBuildMemoryMap(MemoryMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue