[ros-dev] [ros-diffs] [sir_richard] 45041: [NTOS]: Put ASM macros back since the HAL also uses them.

Gabriel ilardi gabrielilardi at hotmail.it
Mon Jan 11 09:19:55 CET 2010


Hi,

Just for the record, with this revision I can't enter in graphic mode in 2nd stage, I always get this at the end of the drivers loading:

(subsystems/win32/win32k/ntuser/sysparams.c:1499) UserSystemParametersInfo called without active windowstation.
PuTTYEntered debugger on last-chance exception (Exception Code: 0xc000001d) (Invalid Opcode)
kdb:> bt
Eip:
<00010002>
Frames:
<43504420>
Couldn't access memory at 0x2A2A2A0E!
kdb:>


Best regards,

Gabriel.


> Date: Mon, 11 Jan 2010 06:41:19 +0000
> To: ros-diffs at reactos.org
> From: sir_richard at svn.reactos.org
> Subject: [ros-diffs] [sir_richard] 45041: [NTOS]: Put ASM macros back since the HAL also uses them.
> 
> Author: sir_richard
> Date: Mon Jan 11 07:41:19 2010
> New Revision: 45041
> 
> URL: http://svn.reactos.org/svn/reactos?rev=45041&view=rev
> Log:
> [NTOS]: Put ASM macros back since the HAL also uses them.
> 
> 
> Modified:
>     trunk/reactos/ntoskrnl/include/internal/i386/asmmacro.S
> 
> Modified: trunk/reactos/ntoskrnl/include/internal/i386/asmmacro.S
> URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/i386/asmmacro.S?rev=45041&r1=45040&r2=45041&view=diff
> ==============================================================================
> --- trunk/reactos/ntoskrnl/include/internal/i386/asmmacro.S [iso-8859-1] (original)
> +++ trunk/reactos/ntoskrnl/include/internal/i386/asmmacro.S [iso-8859-1] Mon Jan 11 07:41:19 2010
> @@ -114,6 +114,28 @@
>  .endm
>  
>  //
> +// @name UNHANDLED_V86_PATH
> +//
> +// This macro prints out that the current code path is for unhandled VDM support
> +//
> +// @param None
> +//
> +// @remark None.
> +//
> +.macro UNHANDLED_V86_PATH
> +    /* Get EIP */
> +    call $+5
> +
> +    /* Print debug message */
> +    push offset _V86UnhandledMsg
> +    call _DbgPrint
> +    add esp, 8
> +
> +    /* Loop indefinitely */
> +    jmp $
> +.endm
> +
> +//
>  // @name IDT
>  //
>  // This macro creates an IDT entry for the given handler
> @@ -255,6 +277,58 @@
>  .endm
>  
>  //
> +// @name INVALID_V86_OPCODE
> +//
> +// This macro creates one or more entries for unhandled V86 Opcodes
> +// in the V86 Opcode Table.
> +//
> +// @param count.
> +//        Number of entries to generate.
> +//
> +// @remark None.
> +//
> +.macro INVALID_V86_OPCODE count
> +    .rept \count
> +        .byte 0
> +    .endr
> +.endm
> +
> +//
> +// @name GENERATE_PREFIX_HANDLER
> +//
> +// This macro creates a prefix opcode handler.
> +//
> +// @param None.
> +//
> +// @remark None.
> +//
> +.macro GENERATE_PREFIX_HANDLER Name
> +.func Opcode&Name&PrefixV86
> +_Opcode&Name&PrefixV86:
> +    or ebx, PREFIX_FLAG_&Name
> +    jmp _OpcodeGenericPrefixV86
> +.endfunc
> +.endm
> +
> +//
> +// @name INVALID_V86_OPCODE
> +//
> +// This macro prints out visible message and hangs the computer.
> +//
> +// @param None.
> +//
> +// @remark Temporary debugging use.
> +//
> +.macro UNHANDLED_V86_OPCODE
> +    /* Print debug message, breakpoint and freeze */
> +    push ecx
> +    push offset V86DebugMsg
> +    call _DbgPrint
> +    add esp, 8
> +    jmp $
> +.endm
> +
> +//
>  // @name TRAP_FIXUPS
>  //
>  // This macro contains out-of-line code for various Trap Frame Fixups, such as:
> @@ -448,6 +522,96 @@
>      cli
>      jmp 1b
>  2:
> +.endm
> +
> +//
> +// @name TRAP_PROLOG
> +// 
> +// This macro creates a standard trap entry prologue.
> +// It should be used for entry into any kernel trap (KiTrapXx), but not for
> +// system calls, which require special handling.
> +//
> +// @param Label
> +//        Identifying name of the caller function; will be used to append
> +//        to the name V86 and DR helper functions, which must already exist.
> +//
> +// @remark Use as follows:
> +//          _KiTrap00:
> +//              /* Push fake error code */
> +//              push 0
> +//
> +//              /* Enter common prologue */
> +//              TRAP_PROLOG(0)
> +//
> +//              /* Handle trap */
> +//              <Your Trap Code Here>
> +//
> +.macro TRAP_PROLOG Label EndLabel
> +    /* Just to be safe, clear out the HIWORD, since it's reserved */
> +    mov word ptr [esp+2], 0
> +
> +    /* Save the non-volatiles */
> +    push ebp
> +    push ebx
> +    push esi
> +    push edi
> +
> +    /* Save FS and set it to PCR */
> +    push fs
> +    mov ebx, KGDT_R0_PCR
> +    .byte 0x66
> +    mov fs, bx
> +
> +    /* Save exception list and bogus previous mode */
> +    push fs:[KPCR_EXCEPTION_LIST]
> +    push -1
> +
> +    /* Save volatiles and segment registers */
> +    push eax
> +    push ecx
> +    push edx
> +    push ds
> +    push es
> +    push gs
> +
> +    /* Set the R3 data segment */
> +    mov ax, KGDT_R3_DATA + RPL_MASK
> +
> +    /* Skip debug registers and debug stuff */
> +    sub esp, 0x30
> +
> +    /* Load the segment registers */
> +    .byte 0x66
> +    mov ds, ax
> +    .byte 0x66
> +    mov es, ax
> +
> +    /* Check if this interrupt happened in 16-bit mode */
> +    cmp esp, 0x10000
> +    jb _Ki16BitStackException
> +
> +    /* Set up frame */
> +    mov ebp, esp
> +
> +    /* Check if this was from V86 Mode */
> +    test dword ptr [ebp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK
> +    jnz V86_&Label
> +
> +V86_&EndLabel:
> +    /* Get current thread */
> +    mov ecx, fs:[KPCR_CURRENT_THREAD]
> +    cld
> +
> +    /* Flush DR7 */
> +    and dword ptr [ebp+KTRAP_FRAME_DR7], 0
> +
> +    /* Check if the thread was being debugged */
> +    test byte ptr [ecx+KTHREAD_DEBUG_ACTIVE], 0xFF
> +    jnz Dr_&Label
> +
> +    /* Set the Trap Frame Debug Header */
> +Dr_&EndLabel:
> +    SET_TF_DEBUG_HEADER
>  .endm
>  
>  //
> @@ -735,6 +899,164 @@
>  .endm
>  
>  //
> +// @name V86_TRAP_PROLOG
> +// 
> +// This macro creates a V86 Trap entry prologue.
> +// It should be used for entry into any fast-system call (KiGetTickCount,
> +// KiCallbackReturn, KiRaiseAssertion) and the generic system call handler
> +// (KiSystemService)
> +//
> +// @param Label
> +//        Unique label identifying the name of the caller function; will be
> +//        used to append to the name of the DR helper function, which must
> +//        already exist.
> +//
> +// @remark None.
> +//
> +.macro V86_TRAP_PROLOG Label EndLabel
> +
> +    /* Skip everything to the error code */
> +    sub esp, KTRAP_FRAME_ERROR_CODE
> +
> +    /* Clear the error code */
> +    mov word ptr [esp+KTRAP_FRAME_ERROR_CODE+2], 0
> +
> +    /* Save the registers we'll trample */
> +    mov [esp+KTRAP_FRAME_EBX], ebx
> +    mov [esp+KTRAP_FRAME_EAX], eax
> +    mov [esp+KTRAP_FRAME_EBP], ebp
> +    mov [esp+KTRAP_FRAME_ESI], esi
> +    mov [esp+KTRAP_FRAME_EDI], edi
> +
> +    /* Save PCR and Ring 3 segments */
> +    mov ebx, KGDT_R0_PCR
> +    mov eax, KGDT_R3_DATA + RPL_MASK
> +
> +    /* Save ECX and EDX too */
> +    mov [esp+KTRAP_FRAME_ECX], ecx
> +    mov [esp+KTRAP_FRAME_EDX], edx
> +
> +    /* Set debugging markers */
> +    mov dword ptr [esp+KTRAP_FRAME_PREVIOUS_MODE], -1
> +    mov dword ptr [esp+KTRAP_FRAME_DEBUGARGMARK], 0xBADB0D00
> +
> +    /* Now set segments (use OVERRIDE, 0x66) */
> +    .byte 0x66
> +    mov fs, bx
> +    .byte 0x66
> +    mov ds, ax
> +    .byte 0x66
> +    mov es, ax
> +
> +    /* Set the trap frame in the stack and clear the direction flag */
> +    mov ebp, esp
> +    cld
> +
> +    /* Save the exception list */
> +    mov eax, fs:[KPCR_EXCEPTION_LIST]
> +    mov [esp+KTRAP_FRAME_EXCEPTION_LIST], eax
> +
> +    /* Check if we need debugging */
> +    mov eax, dr7
> +    test eax, ~DR7_RESERVED_MASK
> +    mov [esp+KTRAP_FRAME_DR7], eax
> +    jnz Dr_&Label
> +
> +Dr_&EndLabel:
> +.endm
> +
> +//
> +// @name V86_TRAP_EPILOG
> +// 
> +// This macro creates an epilogue for leaving V86 traps
> +//
> +// @param None.
> +//
> +// @remark None.
> +//
> +.macro V86_TRAP_EPILOG
> +
> +    /* Get the current thread and make it unalerted */
> +ExitBegin:
> +    mov ebx, PCR[KPCR_CURRENT_THREAD]
> +    mov byte ptr [ebx+KTHREAD_ALERTED], 0
> +
> +    /* Check if it has User-mode APCs pending */
> +    cmp byte ptr [ebx+KTHREAD_PENDING_USER_APC], 0
> +    jne PendingUserApc
> +
> +    /* It doesn't, pop the frame */
> +    add esp, KTRAP_FRAME_EDX
> +    pop edx
> +    pop ecx
> +    pop eax
> +
> +    /* Check if DR registers should be restored */
> +    test dword ptr [ebp+KTRAP_FRAME_DR7], ~DR7_RESERVED_MASK
> +    jnz V86DebugRestore
> +
> +    /* Finish popping the rest of the frame, and return to P-mode */
> +V86DebugContinue:
> +    add esp, 12
> +    pop edi
> +    pop esi
> +    pop ebx
> +    pop ebp
> +    add esp, 4
> +    iretd
> +
> +V86DebugRestore:
> +
> +    /* Get DR0, 1 */
> +    xor ebx, ebx
> +    mov esi, [ebp+KTRAP_FRAME_DR0]
> +    mov edi, [ebp+KTRAP_FRAME_DR1]
> +
> +    /* Clear DR 7 */
> +    mov dr7, ebx
> +
> +    /* Get DR2 and load DR0-2 */
> +    mov ebx, [ebp+KTRAP_FRAME_DR2]
> +    mov dr0, esi
> +    mov dr1, edi
> +    mov dr2, ebx
> +
> +    /* Get DR3-7 */
> +    mov esi, [ebp+KTRAP_FRAME_DR0]
> +    mov edi, [ebp+KTRAP_FRAME_DR1]
> +    mov ebx, [ebp+KTRAP_FRAME_DR7]
> +
> +    /* Load them */
> +    mov dr3, esi
> +    mov dr6, edi
> +    mov dr7, ebx
> +    jmp V86DebugContinue
> +
> +PendingUserApc:
> +
> +    /* Raise to APC level */
> +    mov ecx, APC_LEVEL
> +    call @KfRaiseIrql at 4
> +
> +    /* Save KIRQL and deliver APCs */
> +    push eax
> +    sti
> +    push ebp
> +    push 0
> +    push UserMode
> +    call _KiDeliverApc at 12
> +
> +    /* Restore IRQL */
> +    pop ecx
> +    call @KfLowerIrql at 4
> +    cli
> +
> +    /* Check if we're not in V86 anymore */
> +    test dword ptr [ebp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK
> +    jnz ExitBegin
> +.endm
> +
> +//
>  // @name TRAP_EPILOG
>  // 
>  // This macro creates an epilogue for leaving any system trap.
> 
> 
 		 	   		  
_________________________________________________________________
Non sei a casa? Prova il nuovo Web Messenger
http://www.messenger.it/web/default.aspx
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.reactos.org/pipermail/ros-dev/attachments/20100111/bd6b0e67/attachment.htm 


More information about the Ros-dev mailing list