diff --git a/reactos/ntoskrnl/Makefile b/reactos/ntoskrnl/Makefile index 90853edbab0..f5fe3df955f 100644 --- a/reactos/ntoskrnl/Makefile +++ b/reactos/ntoskrnl/Makefile @@ -332,7 +332,6 @@ OBJECTS_KD = \ kd/kdinit.o \ kd/kdmain.o \ kd/kdio.o \ - kd/service.o \ kd/wrappers/gdbstub.o \ kd/wrappers/bochs.o diff --git a/reactos/ntoskrnl/kd/service.c b/reactos/ntoskrnl/kd/service.c deleted file mode 100644 index d02ebcd1774..00000000000 --- a/reactos/ntoskrnl/kd/service.c +++ /dev/null @@ -1,170 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: ntoskrnl/kd/service.c - * PURPOSE: Debug service dispatcher - * - * PROGRAMMERS: Eric Kohl (ekohl@abo.rhein-zeitung.de) - */ - -#include - - -/* FUNCTIONS ***************************************************************/ - -#define _STR(x) #x -#define STR(x) _STR(x) - -#if defined(__GNUC__) - -void interrupt_handler2d(void); - __asm__("\n\t.global _interrupt_handler2d\n\t" - "_interrupt_handler2d:\n\t" - - /* Save the user context */ - "pushl %ebp\n\t" /* Ebp */ - - "pushl %eax\n\t" /* Eax */ - "pushl %ecx\n\t" /* Ecx */ - "pushl %edx\n\t" /* Edx */ - "pushl %ebx\n\t" /* Ebx */ - "pushl %esi\n\t" /* Esi */ - "pushl %edi\n\t" /* Edi */ - - "pushl %ds\n\t" /* SegDs */ - "pushl %es\n\t" /* SegEs */ - "pushl %fs\n\t" /* SegFs */ - "pushl %gs\n\t" /* SegGs */ - - "subl $112,%esp\n\t" /* FloatSave */ - - "pushl $0\n\t" /* Dr7 */ - "pushl $0\n\t" /* Dr6 */ - "pushl $0\n\t" /* Dr3 */ - "pushl $0\n\t" /* Dr2 */ - "pushl $0\n\t" /* Dr1 */ - "pushl $0\n\t" /* Dr0 */ - - "pushl $0\n\t" /* ContextFlags */ - - /* Set ES to kernel segment */ - "movw $"STR(KERNEL_DS)",%bx\n\t" - "movw %bx,%es\n\t" - - /* FIXME: check to see if SS is valid/inrange */ - - /* DS and GS are now also kernel segments */ - "movw %bx,%ds\n\t" - "movw %bx,%gs\n\t" - - /* Set FS to the PCR */ - "movw $"STR(PCR_SELECTOR)",%bx\n\t" - "movw %bx,%fs\n\t" - - /* Call debug service dispatcher */ - "pushl %edx\n\t" - "pushl %ecx\n\t" - "pushl %eax\n\t" - "call _KdpServiceDispatcher@12\n\t" - - /* Restore the user context */ - "addl $4,%esp\n\t" /* UserContext */ - "addl $24,%esp\n\t" /* Dr[0-3,6-7] */ - "addl $112,%esp\n\t" /* FloatingSave */ - "popl %gs\n\t" /* SegGs */ - "popl %fs\n\t" /* SegFs */ - "popl %es\n\t" /* SegEs */ - "popl %ds\n\t" /* SegDs */ - - "popl %edi\n\t" /* Edi */ - "popl %esi\n\t" /* Esi */ - "popl %ebx\n\t" /* Ebx */ - "popl %edx\n\t" /* Edx */ - "popl %ecx\n\t" /* Ecx */ - "addl $4,%esp\n\t" /* Eax (Not restored) */ - - "popl %ebp\n\t" /* Ebp */ - - "iret\n\t"); - -#elif defined(_MSC_VER) - -__declspec(naked) -void interrupt_handler2d() -{ - __asm - { - /* Save the user context */ - push ebp - push eax - push ecx - push edx - push ebx - push esi - push edi - - push ds - push es - push fs - push gs - - sub esp, 112 /* FloatSave */ - - mov ebx, eax - mov eax, dr7 __asm push eax - mov eax, dr6 __asm push eax - mov eax, dr3 __asm push eax - mov eax, dr2 __asm push eax - mov eax, dr1 __asm push eax - mov eax, dr0 __asm push eax - mov eax, ebx - - push 0 /* ContextFlags */ - - /* Set ES to kernel segment */ - mov bx, KERNEL_DS - mov es, bx - - /* FIXME: check to see if SS is valid/inrange */ - - mov ds, bx /* DS is now also kernel segment */ - - /* Call debug service dispatcher */ - push edx - push ecx - push eax - call KdpServiceDispatcher - add esp, 12 /* restore stack pointer */ - - /* Restore the user context */ - add esp, 4 /* UserContext */ - pop eax __asm mov dr0, eax - pop eax __asm mov dr1, eax - pop eax __asm mov dr2, eax - pop eax __asm mov dr3, eax - pop eax __asm mov dr6, eax - pop eax __asm mov dr7, eax - add esp, 112 /* FloatingSave */ - pop gs - pop fs - pop es - pop ds - - pop edi - pop esi - pop ebx - pop edx - pop ecx - add esp, 4 /* Eax Not restored */ - - pop ebp - - iretd - } -} - -#else -#error Unknown compiler for inline assembler -#endif - -/* EOF */ diff --git a/reactos/ntoskrnl/ke/i386/exp.c b/reactos/ntoskrnl/ke/i386/exp.c index 32a7277334a..e923f53fed7 100644 --- a/reactos/ntoskrnl/ke/i386/exp.c +++ b/reactos/ntoskrnl/ke/i386/exp.c @@ -27,7 +27,7 @@ #endif extern void KiSystemService(void); -extern void interrupt_handler2d(void); +extern void KiDebugService(void); extern VOID KiTrap0(VOID); extern VOID KiTrap1(VOID); @@ -928,7 +928,7 @@ KeInitExceptions(VOID) set_trap_gate(i,(int)KiTrapUnknown, 0); } - set_system_call_gate(0x2d,(int)interrupt_handler2d); + set_system_call_gate(0x2d,(int)KiDebugService); set_system_call_gate(0x2e,(int)KiSystemService); } diff --git a/reactos/ntoskrnl/ke/i386/syscall.S b/reactos/ntoskrnl/ke/i386/syscall.S index 5a04d04e1f3..e0b21ad36d8 100644 --- a/reactos/ntoskrnl/ke/i386/syscall.S +++ b/reactos/ntoskrnl/ke/i386/syscall.S @@ -25,6 +25,7 @@ .globl _KiServiceExit2 .globl _KiFastCallEntry .globl _KiSystemService +.globl _KiDebugService _KiFastCallEntry: @@ -397,3 +398,79 @@ _KiServiceExit2: /* Return to user-mode */ iret + +.intel_syntax noprefix +_KiDebugService: + /* Save the user context */ + push ebp + push eax + push ecx + push edx + push ebx + push esi + push edi + push ds + push es + push fs + push gs + sub esp, 112 /* FloatSave */ + + mov ebx, eax + mov eax, dr7 + push eax + mov eax, dr6 + push eax + mov eax, dr3 + push eax + mov eax, dr2 + push eax + mov eax, dr1 + push eax + mov eax, dr0 + push eax + mov eax, ebx + + push 0 /* ContextFlags */ + + /* Set ES to kernel segment */ + mov bx, KERNEL_DS + mov es, bx + + /* FIXME: check to see if SS is valid/inrange */ + + mov ds, bx /* DS is now also kernel segment */ + + /* Call debug service dispatcher */ + push edx + push ecx + push eax + call _KdpServiceDispatcher@12 + + /* Restore the user context */ + add esp, 4 /* UserContext */ + pop eax + mov dr0, eax + pop eax + mov dr1, eax + pop eax + mov dr2, eax + pop eax + mov dr3, eax + pop eax + mov dr6, eax + pop eax + mov dr7, eax + add esp, 112 /* FloatingSave */ + pop gs + pop fs + pop es + pop ds + pop edi + pop esi + pop ebx + pop edx + pop ecx + add esp, 4 /* Eax Not restored */ + pop ebp + + iretd