mirror of
https://github.com/reactos/reactos.git
synced 2025-02-28 11:25:13 +00:00
143 lines
2.8 KiB
C
143 lines
2.8 KiB
C
![]() |
/*++
|
||
|
|
||
|
Copyright (c) 1998-2001 Klaus P. Gerlicher
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
GPFault.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
handle general protection faults on x86
|
||
|
|
||
|
Environment:
|
||
|
|
||
|
Kernel mode only
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Klaus P. Gerlicher
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
13-Nov-1999: created
|
||
|
15-Nov-2000: general cleanup of source files
|
||
|
|
||
|
Copyright notice:
|
||
|
|
||
|
This file may be distributed under the terms of the GNU Public License.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
////////////////////////////////////////////////////
|
||
|
// INCLUDES
|
||
|
////
|
||
|
#include "remods.h"
|
||
|
#include "precomp.h"
|
||
|
|
||
|
////////////////////////////////////////////////////
|
||
|
// GLOBALS
|
||
|
////
|
||
|
ULONG OldGPFaultHandler = 0;
|
||
|
|
||
|
char tempGP[1024];
|
||
|
|
||
|
////////////////////////////////////////////////////
|
||
|
// FUNCTIONS
|
||
|
////
|
||
|
|
||
|
//*************************************************************************
|
||
|
// NewGPFaultHandler()
|
||
|
//
|
||
|
//*************************************************************************
|
||
|
void HandleGPFault(FRAME* ptr)
|
||
|
{
|
||
|
DPRINT((0,"HandleGPFault(): ptr = %x at eip: %x\n",ptr, ptr->eip));
|
||
|
}
|
||
|
|
||
|
//*************************************************************************
|
||
|
// NewGPFaultHandler()
|
||
|
//
|
||
|
//*************************************************************************
|
||
|
__asm__ ("\n\t \
|
||
|
NewGPFaultHandler:\n\t \
|
||
|
pushfl\n\t \
|
||
|
cli\n\t \
|
||
|
cld\n\t \
|
||
|
pushal\n\t \
|
||
|
pushl %ds\n\t \
|
||
|
\n\t \
|
||
|
// test for v86 mode\n\t \
|
||
|
testl $0x20000,40(%esp)\n\t \
|
||
|
jnz notv86\n\t \
|
||
|
popl %ds\n\t \
|
||
|
popal\n\t \
|
||
|
popfl\n\t \
|
||
|
.byte 0x2e\n\t \
|
||
|
jmp *_OldGPFaultHandler\n\t \
|
||
|
notv86:\n\t \
|
||
|
// setup default data selectors\n\t \
|
||
|
movw %ss,%ax\n\t \
|
||
|
movw %ax,%ds\n\t \
|
||
|
\n\t \
|
||
|
// get frame ptr\n\t \
|
||
|
lea 40(%esp),%eax\n\t \
|
||
|
pushl %eax\n\t \
|
||
|
call _HandleGPFault\n\t \
|
||
|
addl $4,%esp\n\t \
|
||
|
\n \t \
|
||
|
popl %ds\n\t \
|
||
|
popal\n\t \
|
||
|
popfl\n\t \
|
||
|
// remove error code from stack and replace with reason code\n\t \
|
||
|
movl $" STR(REASON_GP_FAULT) ",(%esp)\n\t \
|
||
|
// call debugger loop\n\t \
|
||
|
jmp NewInt31Handler\n\t \
|
||
|
");
|
||
|
|
||
|
//*************************************************************************
|
||
|
// InstallGPFaultHook()
|
||
|
//
|
||
|
//*************************************************************************
|
||
|
void InstallGPFaultHook(void)
|
||
|
{
|
||
|
ULONG LocalGPFaultHandler;
|
||
|
|
||
|
ENTER_FUNC();
|
||
|
|
||
|
MaskIrqs();
|
||
|
if(!OldGPFaultHandler)
|
||
|
{
|
||
|
__asm__("mov $NewGPFaultHandler,%0"
|
||
|
:"=r" (LocalGPFaultHandler)
|
||
|
:
|
||
|
:"eax");
|
||
|
OldGPFaultHandler=SetGlobalInt(0x0D,(ULONG)LocalGPFaultHandler);
|
||
|
}
|
||
|
UnmaskIrqs();
|
||
|
|
||
|
LEAVE_FUNC();
|
||
|
}
|
||
|
|
||
|
//*************************************************************************
|
||
|
// DeInstallGPFaultHook()
|
||
|
//
|
||
|
//*************************************************************************
|
||
|
void DeInstallGPFaultHook(void)
|
||
|
{
|
||
|
ENTER_FUNC();
|
||
|
|
||
|
MaskIrqs();
|
||
|
if(OldGPFaultHandler)
|
||
|
{
|
||
|
RemoveAllSWBreakpoints(TRUE);
|
||
|
SetGlobalInt(0x0D,(ULONG)OldGPFaultHandler);
|
||
|
OldGPFaultHandler=0;
|
||
|
}
|
||
|
UnmaskIrqs();
|
||
|
|
||
|
LEAVE_FUNC();
|
||
|
}
|
||
|
|
||
|
// EOF
|