mirror of
https://github.com/reactos/reactos.git
synced 2025-04-10 15:47:31 +00:00
Added KiDebugService. Will optimize soon to use common Exit code
svn path=/trunk/; revision=14800
This commit is contained in:
parent
e160c0fb26
commit
6458f12f54
4 changed files with 79 additions and 173 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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 <ntoskrnl.h>
|
||||
|
||||
|
||||
/* 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 */
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue