[BOOTMGFW]

- Fix more device I/O bugs.
- Silence some dbgprints.
- Implement DiskOpen and DiskClose.
- Refactor block cache in its own file.
- We successfully open our boot device (which appears as a floppy, as expected with the new UEFI boot)!

svn path=/trunk/; revision=69153
This commit is contained in:
Alex Ionescu 2015-09-09 16:50:05 +00:00
parent c1c6314688
commit ef4c84c805
6 changed files with 755 additions and 662 deletions

View file

@ -19,6 +19,7 @@ list(APPEND BOOTLIB_SOURCE
lib/mm/blkalloc.c
lib/mm/descriptor.c
lib/platform/time.c
lib/io/blkcache.c
lib/io/io.c
lib/io/device.c
lib/io/file.c

View file

@ -50,6 +50,8 @@ BmFwInitializeBootDirectoryPath (
Status = BlpDeviceOpen(BlpBootDevice, 1u, 0, &DeviceHandle);
if (!NT_SUCCESS(Status))
{
EfiPrintf(L"Device open failed: %lx\r\n", Status);
EfiStall(2000000);
goto Quickie;
}
@ -176,9 +178,6 @@ BmMain (
goto Quickie;
}
EfiPrintf(L"We are A-OK!\n");
EfiStall(10000000);
/* Get the application identifier */
AppIdentifier = BlGetApplicationIdentifier();
if (!AppIdentifier)
@ -195,7 +194,7 @@ BmMain (
//Status = BmOpenDataStore(&BcdHandle);
EfiPrintf(L"We are A-OK!\n");
EfiPrintf(L"We are A-OK!\r\n");
EfiStall(10000000);
Quickie:

View file

@ -81,6 +81,8 @@
#define BL_FS_REGISTER_AT_HEAD_FLAG 1
#define BL_BLOCK_DEVICE_REMOVABLE_FLAG 0x01
#define BL_MEMORY_CLASS_SHIFT 28
/* ENUMERATIONS **************************************************************/
@ -899,6 +901,11 @@ BlDestroyLibrary (
VOID
);
NTSTATUS
BcInitialize (
VOID
);
/* FIRMWARE ROUTINES *********************************************************/
VOID

View file

@ -0,0 +1,111 @@
/*
* COPYRIGHT: See COPYING.ARM in the top level directory
* PROJECT: ReactOS UEFI Boot Library
* FILE: boot/environ/lib/io/blkcache.c
* PURPOSE: Boot Library Block Cache Management Routines
* PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org)
*/
/* INCLUDES ******************************************************************/
#include "bl.h"
/* DATA VARIABLES ************************************************************/
ULONG BcpBlockAllocatorHandle;
ULONG BcpHashTableId;
/* FUNCTIONS *****************************************************************/
NTSTATUS
BcpDestroy (
VOID
)
{
//BcpPurgeCacheEntries();
//return BlpMmDeleteBlockAllocator(BcpBlockAllocatorHandle);
EfiPrintf(L"Destructor for block cache not yet implemented\r\n");
return STATUS_NOT_IMPLEMENTED;
}
BOOLEAN
BcpCompareKey (
_In_ PBL_HASH_ENTRY Entry1,
_In_ PBL_HASH_ENTRY Entry2
)
{
PULONG Value1, Value2;
Value1 = Entry1->Value;
Value2 = Entry2->Value;
return Entry1->Size == Entry2->Size && Entry1->Flags == Entry2->Flags && *Value1 == *Value2 && Value1[1] == Value2[1] && Value1[2] == Value2[2];
}
ULONG
BcpHashFunction (
_In_ PBL_HASH_ENTRY Entry,
_In_ ULONG TableSize
)
{
ULONG i, j, ValueHash;
PUCHAR ValueBuffer;
j = 0;
ValueHash = 0;
i = 0;
ValueBuffer = Entry->Value;
do
{
ValueHash += ValueBuffer[i++];
} while (i < 8);
do
{
ValueHash += ValueBuffer[j++ + 8];
} while (j < 4);
return ValueHash % TableSize;
}
NTSTATUS
BcInitialize (
VOID
)
{
NTSTATUS Status;
Status = BlHtCreate(50, BcpHashFunction, BcpCompareKey, &BcpHashTableId);
if (!NT_SUCCESS(Status))
{
goto Quickie;
}
BcpBlockAllocatorHandle = BlpMmCreateBlockAllocator();
if (BcpBlockAllocatorHandle == -1)
{
Status = STATUS_UNSUCCESSFUL;
goto Quickie;
}
Status = BlpIoRegisterDestroyRoutine(BcpDestroy);
if (Status >= 0)
{
return Status;
}
Quickie:
EfiPrintf(L"Failure path not yet implemented\n");
#if 0
if (BcpHashTableId != -1)
{
BlHtDestroy(BcpHashTableId);
}
if (BcpBlockAllocatorHandle != -1)
{
BlpMmDeleteBlockAllocator(BcpBlockAllocatorHandle);
}
#endif
return Status;
}

File diff suppressed because it is too large Load diff

View file

@ -653,7 +653,7 @@ BlMmAllocateHeap (
BusyEntry->BufferNext.P = MmHapDecodeLink(BusyEntry->BufferNext);
/* Return the entry's data buffer */
EfiPrintf(L"Returning buffer at 0x%p\r\n", &BusyEntry->Buffer);
//EfiPrintf(L"Returning buffer at 0x%p\r\n", &BusyEntry->Buffer);
return &BusyEntry->Buffer;
}
@ -673,7 +673,7 @@ BlMmFreeHeap (
}
/* Get the heap header */
EfiPrintf(L"Freeing entry at: %p\r\n", Buffer);
//EfiPrintf(L"Freeing entry at: %p\r\n", Buffer);
if (Buffer)
{
/* Don't free heap until we discover the corruption */