- Fix several interlocked list functions -- they should return NULL if the list is empty.

- Fix a bug in FreeLDR-ARM, we forgot to set the RegistryLength, resulting in a corrupted registry. We can now load the system registry.
- Enable code to handle DPC, Timer and Deferred Ready cleanup (portable code that's already written).
- Enable code to handle quantum end.
- We now load all the way to IoInitSystem!IopInitializeBootDrivers.


svn path=/trunk/; revision=34091
This commit is contained in:
ReactOS Portable Systems Group 2008-06-26 06:38:42 +00:00
parent e84c1a5512
commit 2b63244bc8
4 changed files with 33 additions and 20 deletions

View file

@ -1163,6 +1163,7 @@ ArmPrepareForReactOS(IN BOOLEAN Setup)
// Setup registry data
//
ArmLoaderBlock->RegistryBase = (PVOID)((ULONG_PTR)RegistryData | KSEG0_BASE);
ArmLoaderBlock->RegistryLength = RegistrySize;
//
// Create an MD for it

View file

@ -20,6 +20,8 @@ NTSTATUS
NTAPI
CmpInitializeMachineDependentConfiguration(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
//
// Nothing to do on ARM
//
return STATUS_SUCCESS;
}

View file

@ -136,7 +136,7 @@ ExfInterlockedInsertTailList(IN PLIST_ENTRY ListHead,
{
KIRQL OldIrql;
PLIST_ENTRY OldHead = NULL;
KeAcquireSpinLock(Lock,&OldIrql);
KeAcquireSpinLock(Lock, &OldIrql);
if (!IsListEmpty(ListHead)) OldHead = ListEntry->Blink;
InsertTailList(ListHead, ListEntry);
KeReleaseSpinLock(Lock, OldIrql);
@ -223,7 +223,7 @@ ExInterlockedInsertHeadList(IN PLIST_ENTRY ListHead,
{
KIRQL OldIrql;
PLIST_ENTRY OldHead = NULL;
KeAcquireSpinLock(Lock,&OldIrql);
KeAcquireSpinLock(Lock, &OldIrql);
if (!IsListEmpty(ListHead)) OldHead = ListEntry->Flink;
InsertHeadList(ListHead, ListEntry);
KeReleaseSpinLock(Lock, OldIrql);
@ -238,7 +238,7 @@ ExInterlockedInsertTailList(IN PLIST_ENTRY ListHead,
{
KIRQL OldIrql;
PLIST_ENTRY OldHead = NULL;
KeAcquireSpinLock(Lock,&OldIrql);
KeAcquireSpinLock(Lock, &OldIrql);
if (!IsListEmpty(ListHead)) OldHead = ListEntry->Blink;
InsertTailList(ListHead, ListEntry);
KeReleaseSpinLock(Lock, OldIrql);
@ -252,8 +252,8 @@ ExInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead,
{
KIRQL OldIrql;
PSINGLE_LIST_ENTRY OldHead = NULL;
KeAcquireSpinLock(Lock,&OldIrql);
OldHead = PopEntryList(ListHead);
KeAcquireSpinLock(Lock, &OldIrql);
if (!ListHead->Next) OldHead = PopEntryList(ListHead);
KeReleaseSpinLock(Lock, OldIrql);
return OldHead;
}
@ -266,8 +266,8 @@ ExInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead,
{
KIRQL OldIrql;
PSINGLE_LIST_ENTRY OldHead = NULL;
KeAcquireSpinLock(Lock,&OldIrql);
OldHead = PushEntryList(ListHead, ListEntry);
KeAcquireSpinLock(Lock, &OldIrql);
if (!ListHead->Next) OldHead = PushEntryList(ListHead, ListEntry);
KeReleaseSpinLock(Lock, OldIrql);
return OldHead;
}
@ -279,8 +279,8 @@ ExInterlockedRemoveHeadList(IN PLIST_ENTRY ListHead,
{
KIRQL OldIrql;
PLIST_ENTRY OldHead = NULL;
KeAcquireSpinLock(Lock,&OldIrql);
OldHead = RemoveHeadList(ListHead);
KeAcquireSpinLock(Lock, &OldIrql);
if (!IsListEmpty(ListHead)) OldHead = RemoveHeadList(ListHead);
KeReleaseSpinLock(Lock, OldIrql);
return OldHead;
}

View file

@ -25,6 +25,18 @@ KiSystemCall(
IN ULONG ArgumentCount
);
VOID
FASTCALL
KiRetireDpcList(
IN PKPRCB Prcb
);
VOID
FASTCALL
KiQuantumEnd(
VOID
);
/* FUNCTIONS ******************************************************************/
VOID
@ -58,10 +70,9 @@ KiIdleLoop(VOID)
HalClearSoftwareInterrupt(DISPATCH_LEVEL);
//
// FIXME: TODO
// Retire DPCs
//
DPRINT1("DPC/Timer Delivery!\n");
while (TRUE);
KiRetireDpcList(Prcb);
}
//
@ -242,10 +253,9 @@ KiDispatchInterrupt(VOID)
(Prcb->DeferredReadyListHead.Next))
{
//
// FIXME: TODO
// Retire DPCs
//
DPRINT1("DPC/Timer Delivery!\n");
while (TRUE);
KiRetireDpcList(Prcb);
}
//
@ -259,10 +269,10 @@ KiDispatchInterrupt(VOID)
if (Prcb->QuantumEnd)
{
//
// FIXME: TODO
// Handle quantum end
//
DPRINT1("Quantum End!\n");
while (TRUE);
Prcb->QuantumEnd = FALSE;
KiQuantumEnd();
return;
}