* Use macro for APC-delivery.
* Mark function start/endings for the compiler.
Modified: trunk/reactos/ntoskrnl/include/internal/i386/asmmacro.S
Modified: trunk/reactos/ntoskrnl/ke/i386/syscall.S
Modified: trunk/reactos/ntoskrnl/ke/i386/trap.s

Modified: trunk/reactos/ntoskrnl/include/internal/i386/asmmacro.S
--- trunk/reactos/ntoskrnl/include/internal/i386/asmmacro.S	2006-01-17 00:13:11 UTC (rev 20928)
+++ trunk/reactos/ntoskrnl/include/internal/i386/asmmacro.S	2006-01-17 01:22:21 UTC (rev 20929)
@@ -64,6 +64,73 @@
     mov [ebp+KTRAP_FRAME_DEBUGEIP], edi;
 
 //
+// These macros help with USer-Mode APC delivery after exiting a trap.
+//
+// CHECK_FOR_APC_DELIVER
+// This macro checks if the trapframe indicates a return to user-mode,
+// and, if so, checks if user-mode APCs should be delivered.
+//
+.macro CHECK_FOR_APC_DELIVER PreserveEax
+    /* Check for V86 mode */
+    test dword ptr [ebp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK
+    jnz 1f
+
+    /* Deliver APCs only if we were called from user mode */
+    test byte ptr [ebp+KTRAP_FRAME_CS], 1
+    je 2f
+
+    /* Get the current thread */
+1:
+    mov ebx, [fs:KPCR_CURRENT_THREAD]
+
+    /* Make it non-alerted */
+    mov byte ptr [ebx+KTHREAD_ALERTED], 0
+
+    /* And only if any are actually pending */
+    cmp byte ptr [ebx+KTHREAD_PENDING_USER_APC], 0
+    je 2f
+
+    /* Save pointer to Trap Frame */
+    mov ebx, ebp
+
+.if \PreserveEax
+    /* Save some stuff that raising IRQL will kill */
+    mov [ebx+KTRAP_FRAME_EAX], eax
+    mov dword ptr [ebx+KTRAP_FRAME_FS], KGDT_R3_TEB + RPL_MASK
+    mov dword ptr [ebx+KTRAP_FRAME_DS], KGDT_R3_DATA + RPL_MASK
+    mov dword ptr [ebx+KTRAP_FRAME_ES], KGDT_R3_DATA + RPL_MASK
+    mov dword ptr [ebx+KTRAP_FRAME_GS], 0
+.endif
+
+    /* Raise IRQL to APC_LEVEL */
+    mov ecx, 1
+    call @KfRaiseIrql@4
+
+    /* Save old IRQL */
+    push eax
+
+    /* Deliver APCs */
+    sti
+    push ebx
+    push 0
+    push UserMode
+    call _KiDeliverApc@12
+
+    /* Return to old IRQL */
+    pop ecx
+    call @KfLowerIrql@4
+
+    /* Restore EAX (only in volatile case) */
+.if \PreserveEax
+    mov eax, [ebx+KTRAP_FRAME_EAX]
+.endif
+    cli
+    jmp 1b
+2:
+.endm
+
+
+//
 // These macros control common execution paths for Traps and System Call Code
 //
 // TRAP_PROLOG

Modified: trunk/reactos/ntoskrnl/ke/i386/syscall.S
--- trunk/reactos/ntoskrnl/ke/i386/syscall.S	2006-01-17 00:13:11 UTC (rev 20928)
+++ trunk/reactos/ntoskrnl/ke/i386/syscall.S	2006-01-17 01:22:21 UTC (rev 20929)
@@ -107,6 +107,7 @@
     push 0
     jmp _KiTrap6
 
+.func KiFastCallEntry
 _KiFastCallEntry:
 
 // ==================== UNIQUE SYSENTER STUB. DO NOT DUPLICATE ============//
@@ -186,7 +187,9 @@
     /* Jump to shared code or DR Save */
     //jnz Dr_FastCallDrSave
     jmp SharedCode
+.endfunc
 
+.func KiSystemService
 _KiSystemService:
 
 // ==================== UNIQUE SYSCALL TRAP ENTRY DO NOT DUPLICATE ============//
@@ -421,68 +424,16 @@
     /* Restore the old trap frame pointer */
     mov edx, [ebp+KTRAP_FRAME_EDX]
     mov [ecx+KTHREAD_TRAP_FRAME], edx
+.endfunc
 
+.func KiServiceExit
 _KiServiceExit:
     /* Disable interrupts */
     cli
 
-// ================= COMMON USER-MODE APC DELIVERY CHECK ============//
-    /* Check for V86 mode */
-    test dword ptr [ebp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK
-    jnz ApcLoop
+    /* Check for, and deliver, User-Mode APCs if needed */
+    CHECK_FOR_APC_DELIVER 1
 
-    /* Deliver APCs only if we were called from user mode */
-    test byte ptr [ebp+KTRAP_FRAME_CS], 1
-    je KiRosTrapReturn
-
-    /* Get the current thread */
-ApcLoop:
-    mov ebx, [fs:KPCR_CURRENT_THREAD]
-
-    /* Make it non-alerted */
-    mov byte ptr [ebx+KTHREAD_ALERTED], 0
-
-    /* And only if any are actually pending */
-    cmp byte ptr [ebx+KTHREAD_PENDING_USER_APC], 0
-    je KiRosTrapReturn
-
-    /* Save pointer to Trap Frame */
-    mov ebx, ebp
-
-// ================= PRESENT ONLY IF VOLATILES NEEDED ============//
-    /* Save some stuff that raising IRQL will kill */
-    mov [ebx+KTRAP_FRAME_EAX], eax
-    mov dword ptr [ebx+KTRAP_FRAME_FS], KGDT_R3_TEB + RPL_MASK
-    mov dword ptr [ebx+KTRAP_FRAME_DS], KGDT_R3_DATA + RPL_MASK
-    mov dword ptr [ebx+KTRAP_FRAME_ES], KGDT_R3_DATA + RPL_MASK
-    mov dword ptr [ebx+KTRAP_FRAME_GS], 0
-// ============= END PRESENT ONLY IF VOLATILES NEEDED ============//
-
-    /* Raise IRQL to APC_LEVEL */
-    mov ecx, 1
-    call @KfRaiseIrql@4
-
-    /* Save old IRQL */
-    push eax
-
-    /* Deliver APCs */
-    sti
-    push ebx
-    push 0
-    push UserMode
-    call _KiDeliverApc@12
-
-    /* Return to old IRQL */
-    pop ecx
-    call @KfLowerIrql@4
-    
-    /* Restore EAX (only in volatile case) */
-    mov eax, [ebx+KTRAP_FRAME_EAX]
-    cli
-    jmp ApcLoop
-// ============== END COMMON USER-MODE APC DELIVERY CHECK ============//
-
-KiRosTrapReturn:
 // ========================= COMMON TRAP EXIT CODE ===================//
 #ifdef DBG
     /* Assert the flags */
@@ -778,55 +729,17 @@
     /* Invalid System Call */
     mov eax, STATUS_INVALID_SYSTEM_SERVICE
     jmp KeReturnFromSystemCall
+.endfunc
 
+.func KiServiceExit2
 _KiServiceExit2:
 
     /* Disable interrupts */
     cli
 
-    /* Check for V86 mode */
-    test dword ptr [ebp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK
-    jnz ApcLoop2
+    /* Check for, and deliver, User-Mode APCs if needed */
+    CHECK_FOR_APC_DELIVER 0
 
-    /* Deliver APCs only if we were called from user mode */
-    test byte ptr [ebp+KTRAP_FRAME_CS], 1
-    je KiRosTrapReturn2
-
-    /* Get the current thread */
-ApcLoop2:
-    mov ebx, [fs:KPCR_CURRENT_THREAD]
-
-    /* Make it non-alerted */
-    mov byte ptr [ebx+KTHREAD_ALERTED], 0
-
-    /* And only if any are actually pending */
-    cmp byte ptr [ebx+KTHREAD_PENDING_USER_APC], 0
-    je KiRosTrapReturn2
-
-    /* Save pointer to Trap Frame */
-    mov ebx, ebp
-
-    /* Raise IRQL to APC_LEVEL */
-    mov ecx, 1
-    call @KfRaiseIrql@4
-
-    /* Save old IRQL */
-    push eax
-
-    /* Deliver APCs */
-    sti
-    push ebx
-    push 0
-    push UserMode
-    call _KiDeliverApc@12
-
-    /* Return to old IRQL */
-    pop ecx
-    call @KfLowerIrql@4
-    cli
-    jmp ApcLoop2
-
-KiRosTrapReturn2:
 #ifdef DBG
     /* Assert the flags */
     pushfd
@@ -1028,57 +941,19 @@
     //jz VdmProc
 
     /* Exit through common routine */
-    jmp Kei386EoiHelper@0
+    jmp _Kei386EoiHelper@0
+.endfunc
 
-.globl Kei386EoiHelper@0
-Kei386EoiHelper@0:
+.globl _Kei386EoiHelper@0
+.func Kei386EoiHelper@0
+_Kei386EoiHelper@0:
 
     /* Disable interrupts */
     cli
 
-    /* Check for V86 mode */
-    test dword ptr [ebp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK
-    jnz ApcLoop3
+    /* Check for, and deliver, User-Mode APCs if needed */
+    CHECK_FOR_APC_DELIVER 0
 
-    /* Deliver APCs only if we were called from user mode */
-    test byte ptr [ebp+KTRAP_FRAME_CS], 1
-    je KiRosTrapReturn3
-
-    /* Get the current thread */
-ApcLoop3:
-    mov ebx, [fs:KPCR_CURRENT_THREAD]
-
-    /* Make it non-alerted */
-    mov byte ptr [ebx+KTHREAD_ALERTED], 0
-
-    /* And only if any are actually pending */
-    cmp byte ptr [ebx+KTHREAD_PENDING_USER_APC], 0
-    je KiRosTrapReturn3
-
-    /* Save pointer to Trap Frame */
-    mov ebx, ebp
-
-    /* Raise IRQL to APC_LEVEL */
-    mov ecx, 1
-    call @KfRaiseIrql@4
-
-    /* Save old IRQL */
-    push eax
-
-    /* Deliver APCs */
-    sti
-    push ebx
-    push 0
-    push UserMode
-    call _KiDeliverApc@12
-
-    /* Return to old IRQL */
-    pop ecx
-    call @KfLowerIrql@4
-    cli
-    jmp ApcLoop3
-
-KiRosTrapReturn3:
 #ifdef DBG
     /* Assert the flags */
     pushfd
@@ -1210,6 +1085,7 @@
     pop ebp
     mov esp, [esp]
     iret
+.endfunc
 
 .globl _NtRaiseException@12
 _NtRaiseException@12:

Modified: trunk/reactos/ntoskrnl/ke/i386/trap.s
--- trunk/reactos/ntoskrnl/ke/i386/trap.s	2006-01-17 00:13:11 UTC (rev 20928)
+++ trunk/reactos/ntoskrnl/ke/i386/trap.s	2006-01-17 01:22:21 UTC (rev 20929)
@@ -43,7 +43,7 @@
     cmp eax, 1
 
     /* Return to caller */
-    jne Kei386EoiHelper@0
+    jne _Kei386EoiHelper@0
     jmp _KiV86Complete
 
 .globl _KiTrap1
@@ -64,7 +64,7 @@
     cmp eax, 1
 
     /* Return to caller */
-    jne Kei386EoiHelper@0
+    jne _Kei386EoiHelper@0
     jmp _KiV86Complete
 
 .globl _KiTrap2
@@ -85,7 +85,7 @@
     cmp eax, 1
 
     /* Return to caller */
-    jne Kei386EoiHelper@0
+    jne _Kei386EoiHelper@0
     jmp _KiV86Complete
 
 .globl _KiTrap3
@@ -106,7 +106,7 @@
     cmp eax, 1
 
     /* Return to caller */
-    jne Kei386EoiHelper@0
+    jne _Kei386EoiHelper@0
     jmp _KiV86Complete
 
 .globl _KiTrap4
@@ -127,7 +127,7 @@
     cmp eax, 1
 
     /* Return to caller */
-    jne Kei386EoiHelper@0
+    jne _Kei386EoiHelper@0
     jmp _KiV86Complete
 
 .globl _KiTrap5
@@ -148,7 +148,7 @@
     cmp eax, 1
 
     /* Return to caller */
-    jne Kei386EoiHelper@0
+    jne _Kei386EoiHelper@0
     jmp _KiV86Complete
 
 .globl _KiTrap6
@@ -169,7 +169,7 @@
     cmp eax, 1
 
     /* Return to caller */
-    jne Kei386EoiHelper@0
+    jne _Kei386EoiHelper@0
     jmp _KiV86Complete
 
 .globl _KiTrap7
@@ -190,7 +190,7 @@
     cmp eax, 1
 
     /* Return to caller */
-    jne Kei386EoiHelper@0
+    jne _Kei386EoiHelper@0
     jmp _KiV86Complete
 
 .globl _KiTrap8
@@ -216,7 +216,7 @@
     cmp eax, 1
 
     /* Return to caller */
-    jne Kei386EoiHelper@0
+    jne _Kei386EoiHelper@0
     jmp _KiV86Complete
 
 .globl _KiTrap10
@@ -234,7 +234,7 @@
     cmp eax, 1
 
     /* Return to caller */
-    jne Kei386EoiHelper@0
+    jne _Kei386EoiHelper@0
     jmp _KiV86Complete
 
 .globl _KiTrap11
@@ -252,7 +252,7 @@
     cmp eax, 1
 
     /* Return to caller */
-    jne Kei386EoiHelper@0
+    jne _Kei386EoiHelper@0
     jmp _KiV86Complete
 
 .globl _KiTrap12
@@ -270,7 +270,7 @@
     cmp eax, 1
 
     /* Return to caller */
-    jne Kei386EoiHelper@0
+    jne _Kei386EoiHelper@0
     jmp _KiV86Complete
 
 .globl _KiTrap13
@@ -288,7 +288,7 @@
     cmp eax, 1
 
     /* Return to caller */
-    jne Kei386EoiHelper@0
+    jne _Kei386EoiHelper@0
     jmp _KiV86Complete
 
 .globl _KiTrap14
@@ -306,7 +306,7 @@
     cmp eax, 1
 
     /* Return to caller */
-    jne Kei386EoiHelper@0
+    jne _Kei386EoiHelper@0
     jmp _KiV86Complete
 
 .globl _KiTrap15
@@ -327,7 +327,7 @@
     cmp eax, 1
 
     /* Return to caller */
-    jne Kei386EoiHelper@0
+    jne _Kei386EoiHelper@0
     jmp _KiV86Complete
 
 .globl _KiTrap16
@@ -348,7 +348,7 @@
     cmp eax, 1
 
     /* Return to caller */
-    jne Kei386EoiHelper@0
+    jne _Kei386EoiHelper@0
     jmp _KiV86Complete
 
 .globl _KiTrap17
@@ -369,7 +369,7 @@
     cmp eax, 1
 
     /* Return to caller */
-    jne Kei386EoiHelper@0
+    jne _Kei386EoiHelper@0
     jmp _KiV86Complete
 
 .globl _KiTrap18
@@ -390,7 +390,7 @@
     cmp eax, 1
 
     /* Return to caller */
-    jne Kei386EoiHelper@0
+    jne _Kei386EoiHelper@0
     jmp _KiV86Complete
 
 .globl _KiTrap19
@@ -411,7 +411,7 @@
     cmp eax, 1
 
     /* Return to caller */
-    jne Kei386EoiHelper@0
+    jne _Kei386EoiHelper@0
     jmp _KiV86Complete
 
 .globl _KiTrapUnknown
@@ -426,7 +426,7 @@
     cmp eax, 1
 
     /* Return to caller */
-    jne Kei386EoiHelper@0
+    jne _Kei386EoiHelper@0
     jmp _KiV86Complete
 
 .globl _KiCoprocessorError@0