From 7675e2b8bef0f57ded27efc543f0fac8450cec39 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Fri, 27 Jun 2008 03:06:11 +0000 Subject: [PATCH] - Implement VidResetDisplay in BootVid-arm. - Implement KiSaveProcessorControlState and make the appropriate changes to KPROCESSOR_STATE and KSPECIAL_REGISTERS on ARM to support this, as well as moving the ARM Register definitions from ntos to NDK. - Implement RtlCaptureContext. - With these changes, BSODs now work, but because of missing palette code, they are actually R(Red)SODs, which is awesome. - Remove debug prints from system call code -- this ends up somehow corrupting the return values *sigh*. More work to be done there, defintely. We have now regressed but we have an RSOD. svn path=/trunk/; revision=34120 --- reactos/drivers/base/bootvid/arm/bootvid.c | 86 +++++---- reactos/include/ndk/arm/ketypes.h | 167 ++++++++++++++++++ reactos/lib/rtl/arm/debug_asm.S | 65 +++++-- reactos/ntoskrnl/include/internal/arm/ke.h | 149 ---------------- reactos/ntoskrnl/include/internal/arm/ksarm.h | 23 +++ reactos/ntoskrnl/ke/arm/cpu.c | 13 ++ reactos/ntoskrnl/ke/arm/stubs_asm.s | 2 - reactos/ntoskrnl/ke/arm/trapc.c | 20 ++- 8 files changed, 322 insertions(+), 203 deletions(-) diff --git a/reactos/drivers/base/bootvid/arm/bootvid.c b/reactos/drivers/base/bootvid/arm/bootvid.c index 1961dff74f4..5ba5b67fdee 100644 --- a/reactos/drivers/base/bootvid/arm/bootvid.c +++ b/reactos/drivers/base/bootvid/arm/bootvid.c @@ -23,6 +23,7 @@ #define WRITE_REGISTER_USHORT(r, v) (*(volatile USHORT *)(r) = (v)) PUSHORT VgaArmBase; +PHYSICAL_ADDRESS VgaPhysical; BOOLEAN NextLine = FALSE; UCHAR VidpTextColor = 0xF; ULONG VidpCurrentX = 0; @@ -244,38 +245,15 @@ PreserveRow(IN ULONG CurrentTop, } } -/* PUBLIC FUNCTIONS **********************************************************/ - -/* - * @implemented - */ -BOOLEAN +VOID NTAPI -VidInitialize(IN BOOLEAN SetMode) -{ - PHYSICAL_ADDRESS Physical; - DPRINT1("bv-arm v0.1\n"); - - // - // Allocate framebuffer - // 600kb works out to 640x480@16bpp - // - Physical.QuadPart = -1; - VgaArmBase = MmAllocateContiguousMemory(600 * 1024, Physical); - if (!VgaArmBase) return FALSE; - - // - // Get physical address - // - Physical = MmGetPhysicalAddress(VgaArmBase); - if (!Physical.QuadPart) return FALSE; - DPRINT1("[BV-ARM] Frame Buffer @ 0x%p 0p%p\n", VgaArmBase, Physical.LowPart); - +VidpInitializeDisplay(VOID) +{ // // Set framebuffer address // - WRITE_REGISTER_ULONG(PL110_LCDUPBASE, Physical.LowPart); - WRITE_REGISTER_ULONG(PL110_LCDLPBASE, Physical.LowPart); + WRITE_REGISTER_ULONG(PL110_LCDUPBASE, VgaPhysical.LowPart); + WRITE_REGISTER_ULONG(PL110_LCDLPBASE, VgaPhysical.LowPart); // // Initialize timings to 640x480 @@ -291,7 +269,7 @@ VidInitialize(IN BOOLEAN SetMode) LCDCONTROL_LCDTFT | LCDCONTROL_LCDPWR | LCDCONTROL_LCDBPP(4)); - + #if DBG // // Draw an RGB test pattern @@ -308,7 +286,39 @@ VidInitialize(IN BOOLEAN SetMode) } } #endif +} + +/* PUBLIC FUNCTIONS **********************************************************/ + +/* + * @implemented + */ +BOOLEAN +NTAPI +VidInitialize(IN BOOLEAN SetMode) +{ + DPRINT1("bv-arm v0.1\n"); + // + // Allocate framebuffer + // 600kb works out to 640x480@16bpp + // + VgaPhysical.QuadPart = -1; + VgaArmBase = MmAllocateContiguousMemory(600 * 1024, VgaPhysical); + if (!VgaArmBase) return FALSE; + + // + // Get physical address + // + VgaPhysical = MmGetPhysicalAddress(VgaArmBase); + if (!VgaPhysical.QuadPart) return FALSE; + DPRINT1("[BV-ARM] Frame Buffer @ 0x%p 0p%p\n", VgaArmBase, VgaPhysical.LowPart); + + // + // Setup the display + // + VidpInitializeDisplay(); + // // We are done! // @@ -322,8 +332,22 @@ VOID NTAPI VidResetDisplay(IN BOOLEAN HalReset) { - UNIMPLEMENTED; - while (TRUE); + // + // Clear the current position + // + VidpCurrentX = 0; + VidpCurrentY = 0; + + // + // Re-initialize the VGA Display + // + VidpInitializeDisplay(); + + // + // Re-initialize the palette and fill the screen black + // + //InitializePalette(); + VidSolidColorFill(0, 0, 639, 479, 0); } /* diff --git a/reactos/include/ndk/arm/ketypes.h b/reactos/include/ndk/arm/ketypes.h index add34dca0e5..dc2ba8cbf23 100644 --- a/reactos/include/ndk/arm/ketypes.h +++ b/reactos/include/ndk/arm/ketypes.h @@ -108,12 +108,179 @@ typedef struct _KEXCEPTION_FRAME // ULONG SwapReturn; } KEXCEPTION_FRAME, *PKEXCEPTION_FRAME; +// +// ARM Internal Registers +// +typedef union _ARM_TTB_REGISTER +{ + struct + { + ULONG Reserved:14; + ULONG BaseAddress:18; + }; + ULONG AsUlong; +} ARM_TTB_REGISTER; + +typedef union _ARM_STATUS_REGISTER +{ + + struct + { + ULONG Mode:5; + ULONG State:1; + ULONG FiqDisable:1; + ULONG IrqDisable:1; + ULONG ImpreciseAbort:1; + ULONG Endianness:1; + ULONG Sbz:6; + ULONG GreaterEqual:4; + ULONG Sbz1:4; + ULONG Java:1; + ULONG Sbz2:2; + ULONG StickyOverflow:1; + ULONG Overflow:1; + ULONG CarryBorrowExtend:1; + ULONG Zero:1; + ULONG NegativeLessThan:1; + }; + ULONG AsUlong; +} ARM_STATUS_REGISTER; + +typedef union _ARM_DOMAIN_REGISTER +{ + struct + { + ULONG Domain0:2; + ULONG Domain1:2; + ULONG Domain2:2; + ULONG Domain3:2; + ULONG Domain4:2; + ULONG Domain5:2; + ULONG Domain6:2; + ULONG Domain7:2; + ULONG Domain8:2; + ULONG Domain9:2; + ULONG Domain10:2; + ULONG Domain11:2; + ULONG Domain12:2; + ULONG Domain13:2; + ULONG Domain14:2; + ULONG Domain15:2; + }; + ULONG AsUlong; +} ARM_DOMAIN_REGISTER; + +typedef union _ARM_CONTROL_REGISTER +{ + struct + { + ULONG MmuEnabled:1; + ULONG AlignmentFaultsEnabled:1; + ULONG DCacheEnabled:1; + ULONG Sbo:4; + ULONG BigEndianEnabled:1; + ULONG System:1; + ULONG Rom:1; + ULONG Sbz:2; + ULONG ICacheEnabled:1; + ULONG HighVectors:1; + ULONG RoundRobinReplacementEnabled:1; + ULONG Armv4Compat:1; + ULONG Sbo1:1; + ULONG Sbz1:1; + ULONG Sbo2:1; + ULONG Reserved:14; + }; + ULONG AsUlong; +} ARM_CONTROL_REGISTER, *PARM_CONTROL_REGISTER; + +typedef union _ARM_ID_CODE_REGISTER +{ + struct + { + ULONG Revision:4; + ULONG PartNumber:12; + ULONG Architecture:4; + ULONG Variant:4; + ULONG Identifier:8; + }; + ULONG AsUlong; +} ARM_ID_CODE_REGISTER, *PARM_ID_CODE_REGISTER; + +typedef union _ARM_CACHE_REGISTER +{ + struct + { + ULONG ILength:2; + ULONG IMultipler:1; + ULONG IAssociativty:3; + ULONG ISize:4; + ULONG IReserved:2; + ULONG DLength:2; + ULONG DMultipler:1; + ULONG DAssociativty:3; + ULONG DSize:4; + ULONG DReserved:2; + ULONG Separate:1; + ULONG CType:4; + ULONG Reserved:3; + }; + ULONG AsUlong; +} ARM_CACHE_REGISTER, *PARM_CACHE_REGISTER; + +typedef union _ARM_LOCKDOWN_REGISTER +{ + struct + { + ULONG Preserve:1; + ULONG Ignored:25; + ULONG Victim:3; + ULONG Reserved:3; + }; + ULONG AsUlong; +} ARM_LOCKDOWN_REGISTER, *PARM_LOCKDOWN_REGISTER; + +// +// ARM Domains +// +typedef enum _ARM_DOMAINS +{ + Domain0, + Domain1, + Domain2, + Domain3, + Domain4, + Domain5, + Domain6, + Domain7, + Domain8, + Domain9, + Domain10, + Domain11, + Domain12, + Domain13, + Domain14, + Domain15 +} ARM_DOMAINS; + +// +// Special Registers Structure (outside of CONTEXT) +// +typedef struct _KSPECIAL_REGISTERS +{ + ARM_CONTROL_REGISTER ControlRegister; + ARM_LOCKDOWN_REGISTER LockdownRegister; + ARM_CACHE_REGISTER CacheRegister; + ARM_STATUS_REGISTER StatusRegister; +} KSPECIAL_REGISTERS, *PKSPECIAL_REGISTERS; + // // Processor State // typedef struct _KPROCESSOR_STATE { struct _CONTEXT ContextFrame; + struct _KSPECIAL_REGISTERS SpecialRegisters; } KPROCESSOR_STATE, *PKPROCESSOR_STATE; // diff --git a/reactos/lib/rtl/arm/debug_asm.S b/reactos/lib/rtl/arm/debug_asm.S index efa9383db47..772398276d8 100644 --- a/reactos/lib/rtl/arm/debug_asm.S +++ b/reactos/lib/rtl/arm/debug_asm.S @@ -1,18 +1,59 @@ /* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Run-Time Library - * PURPOSE: Debug Routines - * FILE: lib/rtl/arm/debug_asm.S + * PROJECT: ReactOS Kernel + * LICENSE: GPL - See COPYING in the top level directory + * FILE: rtl/arm/debug_asm.S + * PURPOSE: Cross-privilege Debugging and Exception Support for ARM + * PROGRAMMERS: ReactOS Portable Systems Group */ -/* GLOBALS ********************************************************************/ + .title "ARM Kernel/User NT Debugging and Exception" + .include "ntoskrnl/include/internal/arm/kxarm.h" + .include "ntoskrnl/include/internal/arm/ksarm.h" -.globl DbgBreakPoint - -/* FUNCTIONS ******************************************************************/ - -.func DbgBreakPoint -DbgBreakPoint: + TEXTAREA + NESTED_ENTRY DbgBreakPoint + PROLOG_END DbgBreakPoint + + // + // Do a breakpoint and return + // bkpt 3 bx lr -.endfunc + ENTRY_END DbgBreakPoint + + NESTED_ENTRY RtlCaptureContext + PROLOG_END RtlCaptureContext + + // + // FIXME: Change to stmdb later + // + str r0, [a1, #CsR0] + str r1, [a1, #CsR1] + str r2, [a1, #CsR2] + str r3, [a1, #CsR3] + str r4, [a1, #CsR4] + str r5, [a1, #CsR5] + str r6, [a1, #CsR6] + str r7, [a1, #CsR7] + str r8, [a1, #CsR8] + str r9, [a1, #CsR9] + str r10, [a1, #CsR10] + str r11, [a1, #CsR11] + str r12, [a1, #CsR12] + str sp, [a1, #CsSp] + str lr, [a1, #CsLr] + str pc, [a1, #CsPc] + mrs ip, spsr + str ip, [a1, #CsPsr] + + // + // Set flags + // + mov ip, #CONTEXT_FULL + str ip, [a1, #CsContextFlags] + + // + // Return + // + bx lr + ENTRY_END RtlCaptureContext diff --git a/reactos/ntoskrnl/include/internal/arm/ke.h b/reactos/ntoskrnl/include/internal/arm/ke.h index ff7f340e3a4..603720ee484 100644 --- a/reactos/ntoskrnl/include/internal/arm/ke.h +++ b/reactos/ntoskrnl/include/internal/arm/ke.h @@ -14,155 +14,6 @@ #define KeArchHaltProcessor() KeArmHaltProcessor() -typedef union _ARM_TTB_REGISTER -{ - struct - { - ULONG Reserved:14; - ULONG BaseAddress:18; - }; - ULONG AsUlong; -} ARM_TTB_REGISTER; - -typedef union _ARM_STATUS_REGISTER -{ - - struct - { - ULONG Mode:5; - ULONG State:1; - ULONG FiqDisable:1; - ULONG IrqDisable:1; - ULONG ImpreciseAbort:1; - ULONG Endianness:1; - ULONG Sbz:6; - ULONG GreaterEqual:4; - ULONG Sbz1:4; - ULONG Java:1; - ULONG Sbz2:2; - ULONG StickyOverflow:1; - ULONG Overflow:1; - ULONG CarryBorrowExtend:1; - ULONG Zero:1; - ULONG NegativeLessThan:1; - }; - ULONG AsUlong; -} ARM_STATUS_REGISTER; - -typedef union _ARM_DOMAIN_REGISTER -{ - struct - { - ULONG Domain0:2; - ULONG Domain1:2; - ULONG Domain2:2; - ULONG Domain3:2; - ULONG Domain4:2; - ULONG Domain5:2; - ULONG Domain6:2; - ULONG Domain7:2; - ULONG Domain8:2; - ULONG Domain9:2; - ULONG Domain10:2; - ULONG Domain11:2; - ULONG Domain12:2; - ULONG Domain13:2; - ULONG Domain14:2; - ULONG Domain15:2; - }; - ULONG AsUlong; -} ARM_DOMAIN_REGISTER; - -typedef union _ARM_CONTROL_REGISTER -{ - struct - { - ULONG MmuEnabled:1; - ULONG AlignmentFaultsEnabled:1; - ULONG DCacheEnabled:1; - ULONG Sbo:4; - ULONG BigEndianEnabled:1; - ULONG System:1; - ULONG Rom:1; - ULONG Sbz:2; - ULONG ICacheEnabled:1; - ULONG HighVectors:1; - ULONG RoundRobinReplacementEnabled:1; - ULONG Armv4Compat:1; - ULONG Sbo1:1; - ULONG Sbz1:1; - ULONG Sbo2:1; - ULONG Reserved:14; - }; - ULONG AsUlong; -} ARM_CONTROL_REGISTER, *PARM_CONTROL_REGISTER; - -typedef union _ARM_ID_CODE_REGISTER -{ - struct - { - ULONG Revision:4; - ULONG PartNumber:12; - ULONG Architecture:4; - ULONG Variant:4; - ULONG Identifier:8; - }; - ULONG AsUlong; -} ARM_ID_CODE_REGISTER, *PARM_ID_CODE_REGISTER; - -typedef union _ARM_CACHE_REGISTER -{ - struct - { - ULONG ILength:2; - ULONG IMultipler:1; - ULONG IAssociativty:3; - ULONG ISize:4; - ULONG IReserved:2; - ULONG DLength:2; - ULONG DMultipler:1; - ULONG DAssociativty:3; - ULONG DSize:4; - ULONG DReserved:2; - ULONG Separate:1; - ULONG CType:4; - ULONG Reserved:3; - }; - ULONG AsUlong; -} ARM_CACHE_REGISTER, *PARM_CACHE_REGISTER; - -typedef union _ARM_LOCKDOWN_REGISTER -{ - struct - { - ULONG Preserve:1; - ULONG Ignored:25; - ULONG Victim:3; - ULONG Reserved:3; - }; - ULONG AsUlong; -} ARM_LOCKDOWN_REGISTER, *PARM_LOCKDOWN_REGISTER; - -typedef enum _ARM_DOMAINS -{ - Domain0, - Domain1, - Domain2, - Domain3, - Domain4, - Domain5, - Domain6, - Domain7, - Domain8, - Domain9, - Domain10, - Domain11, - Domain12, - Domain13, - Domain14, - Domain15 -} ARM_DOMAINS; - VOID NTAPI KeArmInitThreadWithContext( diff --git a/reactos/ntoskrnl/include/internal/arm/ksarm.h b/reactos/ntoskrnl/include/internal/arm/ksarm.h index 17c06dc67b2..0d93f8d417e 100644 --- a/reactos/ntoskrnl/include/internal/arm/ksarm.h +++ b/reactos/ntoskrnl/include/internal/arm/ksarm.h @@ -60,6 +60,29 @@ */ .equ ThKernelStack, 0x20 +/* + * CONTEXT Offsets + */ +.equ CONTEXT_FULL, 0x43 +.equ CsContextFlags, 0x00 +.equ CsR0, 0x04 +.equ CsR1, 0x08 +.equ CsR2, 0x0C +.equ CsR3, 0x10 +.equ CsR4, 0x14 +.equ CsR5, 0x18 +.equ CsR6, 0x1C +.equ CsR7, 0x20 +.equ CsR8, 0x24 +.equ CsR9, 0x28 +.equ CsR10, 0x2C +.equ CsR11, 0x30 +.equ CsR12, 0x34 +.equ CsSp, 0x38 +.equ CsLr, 0x3C +.equ CsPc, 0x40 +.equ CsPsr, 0x44 + #else /* diff --git a/reactos/ntoskrnl/ke/arm/cpu.c b/reactos/ntoskrnl/ke/arm/cpu.c index 4e59a5c38d2..12f3215b4bf 100644 --- a/reactos/ntoskrnl/ke/arm/cpu.c +++ b/reactos/ntoskrnl/ke/arm/cpu.c @@ -115,3 +115,16 @@ KeFlushTb(VOID) // KeArmFlushTlb(); } + +VOID +NTAPI +KiSaveProcessorControlState(OUT PKPROCESSOR_STATE ProcessorState) +{ + // + // Save some critical stuff we use + // + ProcessorState->SpecialRegisters.ControlRegister = KeArmControlRegisterGet(); + ProcessorState->SpecialRegisters.LockdownRegister = KeArmLockdownRegisterGet(); + ProcessorState->SpecialRegisters.CacheRegister = KeArmCacheRegisterGet(); + ProcessorState->SpecialRegisters.StatusRegister = KeArmStatusRegisterGet(); +} diff --git a/reactos/ntoskrnl/ke/arm/stubs_asm.s b/reactos/ntoskrnl/ke/arm/stubs_asm.s index abf9cc1a101..782add27ba4 100644 --- a/reactos/ntoskrnl/ke/arm/stubs_asm.s +++ b/reactos/ntoskrnl/ke/arm/stubs_asm.s @@ -37,7 +37,6 @@ GENERATE_ARM_STUB RtlInitializeContext // // Internal Ke Arch-Specific Helpers // -GENERATE_ARM_STUB KiSaveProcessorControlState GENERATE_ARM_STUB KiInitializeUserApc GENERATE_ARM_STUB KeDisableInterrupts GENERATE_ARM_STUB KiDispatchException @@ -51,7 +50,6 @@ GENERATE_ARM_STUB KiApcInterrupt GENERATE_ARM_STUB KiPassiveRelease GENERATE_ARM_STUB KiInterruptTemplate GENERATE_ARM_STUB KiUnexpectedInterrupt -GENERATE_ARM_STUB RtlCaptureContext GENERATE_ARM_STUB RtlGetCallersAddress GENERATE_ARM_STUB RtlUnwind GENERATE_ARM_STUB RtlpGetExceptionAddress diff --git a/reactos/ntoskrnl/ke/arm/trapc.c b/reactos/ntoskrnl/ke/arm/trapc.c index f8e7b36a92c..1ed5a7f6459 100644 --- a/reactos/ntoskrnl/ke/arm/trapc.c +++ b/reactos/ntoskrnl/ke/arm/trapc.c @@ -402,15 +402,19 @@ KiDataAbortHandler(IN PKTRAP_FRAME TrapFrame) // // Check if this is a page fault // - if (KeArmFaultStatusRegisterGet() == 21 || KeArmFaultStatusRegisterGet() == 23) + if ((KeArmFaultStatusRegisterGet() == 21) || + (KeArmFaultStatusRegisterGet() == 23)) { - Status = MmAccessFault(FALSE, - Address, - KernelMode, - TrapFrame); + // + // Handle the fault + // + Status = MmAccessFault(FALSE, Address, KernelMode, TrapFrame); if (Status == STATUS_SUCCESS) return Status; } + // + // We don't handle this yet + // UNIMPLEMENTED; while (TRUE); return STATUS_SUCCESS; @@ -439,7 +443,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 @@ -495,7 +499,6 @@ KiSystemService(IN PKTHREAD Thread, // // Copy them into the kernel stack // - DPRINT1("Argument: %p\n", *Argument); Arguments[i] = *Argument; Argument++; } @@ -536,7 +539,6 @@ KiSystemService(IN PKTHREAD Thread, // // Copy into kernel stack // - DPRINT1("Argument: %p\n", *Argument); Arguments[i] = *Argument; Argument++; } @@ -546,7 +548,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