- Implement KiApcInterrupt -- ACPs now work!

- Change some infinite loops to ASSERTs since bugchecks now work and we can better differentiate stubs versus loops versus unimplemented code.
- Add back the system call debug prints -- total hack to make the stack work.
- Add support for the ARC Disk Information/Signature in FreeLDR.
- We've reached a major, major milestone here folks -- the kernel bugchecks because no boot device was found (since we don't have any working drivers yet).
- We have a lot of stuff to fix before continuing, and code review will take some time.


svn path=/trunk/; revision=34121
This commit is contained in:
ReactOS Portable Systems Group 2008-06-27 04:19:50 +00:00
parent 7675e2b8be
commit 445028acf9
4 changed files with 141 additions and 31 deletions

View file

@ -1056,7 +1056,12 @@ ArmPrepareForReactOS(IN BOOLEAN Setup)
ULONG Dummy, i;
PLDR_DATA_TABLE_ENTRY LdrEntry;
PLIST_ENTRY NextEntry, OldEntry;
PARC_DISK_INFORMATION ArcDiskInformation;
PARC_DISK_SIGNATURE ArcDiskSignature;
ULONG ArcDiskCount = 0, Checksum = 0;
PMASTER_BOOT_RECORD Mbr;
PULONG Buffer;
//
// Allocate the ARM Shared Heap
//
@ -1240,10 +1245,6 @@ ArmPrepareForReactOS(IN BOOLEAN Setup)
LdrEntry->BaseDllName.Buffer = (PVOID)((ULONG_PTR)LdrEntry->BaseDllName.Buffer | KSEG0_BASE);
InsertTailList(&ArmLoaderBlock->LoadOrderListHead, &LdrEntry->InLoadOrderLinks);
//
// TODO: Setup boot-driver data
//
//
// Build descriptors for the drivers loaded
//
@ -1261,7 +1262,6 @@ ArmPrepareForReactOS(IN BOOLEAN Setup)
if (Status != STATUS_SUCCESS) return;
}
//
// Loop driver list
//
@ -1488,6 +1488,75 @@ ArmPrepareForReactOS(IN BOOLEAN Setup)
//
NextEntry->Flink = (PVOID)((ULONG_PTR)NextEntry->Flink | KSEG0_BASE);
NextEntry->Blink = (PVOID)((ULONG_PTR)NextEntry->Blink | KSEG0_BASE);
//
// Allocate ARC disk structure
//
ArcDiskInformation = ArmAllocateFromSharedHeap(sizeof(ARC_DISK_INFORMATION));
InitializeListHead(&ArcDiskInformation->DiskSignatureListHead);
ArmLoaderBlock->ArcDiskInformation = (PVOID)((ULONG_PTR)ArcDiskInformation | KSEG0_BASE);
//
// Read the MBR
//
MachDiskReadLogicalSectors(0x49, 0ULL, 1, (PVOID)DISKREADBUFFER);
Buffer = (ULONG*)DISKREADBUFFER;
Mbr = (PMASTER_BOOT_RECORD)DISKREADBUFFER;
//
// Calculate the MBR checksum
//
for (i = 0; i < 128; i++) Checksum += Buffer[i];
Checksum = ~Checksum + 1;
//
// Allocate a disk signature and fill it out
//
ArcDiskSignature = ArmAllocateFromSharedHeap(sizeof(ARC_DISK_SIGNATURE));
ArcDiskSignature->Signature = Mbr->Signature;
ArcDiskSignature->CheckSum = Checksum;
//
// Allocare a string for the name and fill it out
//
ArcDiskSignature->ArcName = ArmAllocateFromSharedHeap(256);
sprintf(ArcDiskSignature->ArcName, "multi(0)disk(0)rdisk(%lu)", ArcDiskCount++);
ArcDiskSignature->ArcName = (PVOID)((ULONG_PTR)ArcDiskSignature->ArcName | KSEG0_BASE);
//
// Insert the descriptor into the list
//
InsertTailList(&ArcDiskInformation->DiskSignatureListHead,
&ArcDiskSignature->ListEntry);
//
// Loop ARC disk list
//
NextEntry = ArcDiskInformation->DiskSignatureListHead.Flink;
while (NextEntry != &ArcDiskInformation->DiskSignatureListHead)
{
//
// Remember the physical entry
//
OldEntry = NextEntry->Flink;
//
// Edit the data
//
NextEntry->Flink = (PVOID)((ULONG_PTR)NextEntry->Flink | KSEG0_BASE);
NextEntry->Blink = (PVOID)((ULONG_PTR)NextEntry->Blink | KSEG0_BASE);
//
// Keep looping
//
NextEntry = OldEntry;
}
//
// Now edit the root itself
//
NextEntry->Flink = (PVOID)((ULONG_PTR)NextEntry->Flink | KSEG0_BASE);
NextEntry->Blink = (PVOID)((ULONG_PTR)NextEntry->Blink | KSEG0_BASE);
}
VOID

View file

@ -23,8 +23,13 @@ extern PVOID KiArmVectorTable;
/* FUNCTIONS ******************************************************************/
//
// FIXME: Header cleanup
//
VOID
KiIdleLoop(VOID);
KiIdleLoop(
VOID
);
VOID
DebugService(IN ULONG ServiceType,
@ -34,7 +39,7 @@ DebugService(IN ULONG ServiceType,
IN ULONG Level)
{
//
// ARM Bring-up Hack
// FIXME: ARM Bring-up Hack
//
void arm_kprintf(const char *fmt, ...);
arm_kprintf("%s", Buffer);
@ -230,7 +235,7 @@ KiInitializeKernel(IN PKPROCESS InitProcess,
else
{
//
// FIXME
// FIXME: No MP Support
//
DPRINT1("ARM MPCore not supported\n");
}

View file

@ -46,7 +46,6 @@ GENERATE_ARM_STUB KeSwitchKernelStack
//
// Traps, Debugging and Execeptions
//
GENERATE_ARM_STUB KiApcInterrupt
GENERATE_ARM_STUB KiPassiveRelease
GENERATE_ARM_STUB KiInterruptTemplate
GENERATE_ARM_STUB KiUnexpectedInterrupt

View file

@ -102,7 +102,7 @@ KiIdleLoop(VOID)
DPRINT1("Swapping context!\n");
KiSwapContext(OldThread, NewThread);
DPRINT1("Back\n");
while (TRUE);
ASSERT(FALSE);
}
else
{
@ -160,7 +160,7 @@ KiSwapContextInternal(IN PKTHREAD OldThread,
// FIXME: TODO
//
DPRINT1("WMI Tracing not supported\n");
while (TRUE);
ASSERT(FALSE);
}
//
@ -180,7 +180,7 @@ KiSwapContextInternal(IN PKTHREAD OldThread,
// FIXME: TODO
//
DPRINT1("Address space switch not implemented\n");
while (TRUE);
ASSERT(FALSE);
}
}
@ -210,7 +210,7 @@ KiSwapContextInternal(IN PKTHREAD OldThread,
// FIXME: FAIL
//
DPRINT1("DPCS ACTIVE!!!\n");
while (TRUE);
ASSERT(FALSE);
}
//
@ -222,7 +222,7 @@ KiSwapContextInternal(IN PKTHREAD OldThread,
// FIXME: TODO
//
DPRINT1("APCs pending!\n");
while (TRUE);
ASSERT(FALSE);
}
//
@ -231,6 +231,45 @@ KiSwapContextInternal(IN PKTHREAD OldThread,
return FALSE;
}
VOID
KiApcInterrupt(VOID)
{
KPROCESSOR_MODE PreviousMode;
KEXCEPTION_FRAME ExceptionFrame;
PKTRAP_FRAME TrapFrame = KeGetCurrentThread()->TrapFrame;
DPRINT1("[APC]\n");
//
// Isolate previous mode
//
PreviousMode = KiGetPreviousMode(TrapFrame);
//
// FIXME No use-mode support
//
if (PreviousMode == UserMode) ASSERT(FALSE);
//
// Disable interrupts
//
_disable();
//
// Clear APC interrupt
//
HalClearSoftwareInterrupt(APC_LEVEL);
//
// Re-enable interrupts
//
_enable();
//
// Deliver APCs
//
KiDeliverApc(PreviousMode, &ExceptionFrame, TrapFrame);
}
VOID
KiDispatchInterrupt(VOID)
{
@ -309,7 +348,7 @@ KiDispatchInterrupt(VOID)
DPRINT1("Swapping context!\n");
KiSwapContext(OldThread, NewThread);
DPRINT1("Back\n");
while (TRUE);
ASSERT(FALSE);
}
}
@ -402,21 +441,17 @@ KiDataAbortHandler(IN PKTRAP_FRAME TrapFrame)
//
// Check if this is a page fault
//
if ((KeArmFaultStatusRegisterGet() == 21) ||
(KeArmFaultStatusRegisterGet() == 23))
if (KeArmFaultStatusRegisterGet() == 21 || KeArmFaultStatusRegisterGet() == 23)
{
//
// Handle the fault
//
Status = MmAccessFault(FALSE, Address, KernelMode, TrapFrame);
Status = MmAccessFault(FALSE,
Address,
KernelMode,
TrapFrame);
if (Status == STATUS_SUCCESS) return Status;
}
//
// We don't handle this yet
//
UNIMPLEMENTED;
while (TRUE);
ASSERT(FALSE);
return STATUS_SUCCESS;
}
@ -443,7 +478,7 @@ KiSystemService(IN PKTHREAD Thread,
// Get the system call ID
//
Id = Instruction & 0xFFFFF;
//DPRINT1("[SWI] (%x) %p (%d) \n", Id, Thread, Thread->PreviousMode);
DPRINT1("[SWI] (%x) %p (%d) \n", Id, Thread, Thread->PreviousMode);
//
// Get the descriptor table
@ -463,7 +498,7 @@ KiSystemService(IN PKTHREAD Thread,
// Check if this is a GUI call
//
UNIMPLEMENTED;
while (TRUE);
ASSERT(FALSE);
}
//
@ -480,7 +515,7 @@ KiSystemService(IN PKTHREAD Thread,
// TODO
//
UNIMPLEMENTED;
while (TRUE);
ASSERT(FALSE);
}
//
@ -499,6 +534,7 @@ KiSystemService(IN PKTHREAD Thread,
//
// Copy them into the kernel stack
//
DPRINT1("Argument: %p\n", *Argument);
Arguments[i] = *Argument;
Argument++;
}
@ -539,6 +575,7 @@ KiSystemService(IN PKTHREAD Thread,
//
// Copy into kernel stack
//
DPRINT1("Argument: %p\n", *Argument);
Arguments[i] = *Argument;
Argument++;
}
@ -548,7 +585,7 @@ KiSystemService(IN PKTHREAD Thread,
// Do the system call and save result in EAX
//
TrapFrame->R0 = KiSystemCall(SystemCall, Arguments, ArgumentCount);
//DPRINT1("Returned: %lx\n", TrapFrame->R0);
DPRINT1("Returned: %lx\n", TrapFrame->R0);
}
VOID
@ -569,7 +606,7 @@ KiSoftwareInterruptHandler(IN PKTRAP_FRAME TrapFrame)
PreviousMode = KiGetPreviousMode(TrapFrame);
//
// Save old previous mode
// FIXME: Save old previous mode
//
//TrapFrame->PreviousMode = PreviousMode;