- Implement KiApcInterrupt -- ACPs now work!
authorReactOS Portable Systems Group <ros-arm-bringup@svn.reactos.org>
Fri, 27 Jun 2008 04:19:50 +0000 (04:19 +0000)
committerReactOS Portable Systems Group <ros-arm-bringup@svn.reactos.org>
Fri, 27 Jun 2008 04:19:50 +0000 (04:19 +0000)
- 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

reactos/boot/freeldr/freeldr/arch/arm/loader.c
reactos/ntoskrnl/ke/arm/kiinit.c
reactos/ntoskrnl/ke/arm/stubs_asm.s
reactos/ntoskrnl/ke/arm/trapc.c

index 49bdeab..daae174 100644 (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
index d4ecb96..f93f58b 100644 (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");
     }
index 782add2..4bd5619 100644 (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  
index 1ed5a7f..1194903 100644 (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;