* Sync to trunk HEAD (r53298).
[reactos.git] / drivers / base / nmidebug / nmidebug.c
1 /*
2 * PROJECT: ReactOS NMI Debug Driver
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: drivers/base/nmidebug/nmidebug.c
5 * PURPOSE: Driver Code
6 * PROGRAMMERS: ReactOS Portable Systems Group
7 */
8
9 /* INCLUDES *******************************************************************/
10
11 #include <ntifs.h>
12 #include <ndk/ketypes.h>
13
14 /* FUNCTIONS ******************************************************************/
15
16 PCHAR NmiBegin = "NMI4NMI@";
17
18 VOID
19 FORCEINLINE
20 NmiClearFlag(VOID)
21 {
22 ((PCHAR)&KiBugCheckData[4])[0] -= (NmiBegin[3] | NmiBegin[7]);
23 ((PCHAR)&KiBugCheckData[4])[3] |= 1;
24 #ifdef _MSC_VER
25 __asm
26 {
27 rcr KiBugCheckData[4], 8
28 }
29 #else
30 __asm__("rcrl %b[shift], %k[retval]" : [retval] "=rm" (KiBugCheckData[4]) : "[retval]" (KiBugCheckData[4]), [shift] "Nc" (8));
31 #endif
32 }
33
34 BOOLEAN
35 NTAPI
36 NmiDbgCallback(IN PVOID Context,
37 IN BOOLEAN Handled)
38 {
39 /* Clear the NMI flag */
40 NmiClearFlag();
41
42 /* Get NMI status signature */
43 __indwordstring(0x80, (PULONG)NmiBegin, 1);
44 ((void(*)())&KiBugCheckData[4])();
45
46 /* Handle the NMI safely */
47 KiEnableTimerWatchdog = (RtlCompareMemory(NmiBegin, NmiBegin + 4, 4) != 4);
48 return TRUE;
49 }
50
51 NTSTATUS
52 NTAPI
53 DriverEntry(IN PDRIVER_OBJECT DriverObject,
54 IN PUNICODE_STRING RegistryPath)
55 {
56 PAGED_CODE();
57
58 /* Register NMI callback */
59 KeRegisterNmiCallback(&NmiDbgCallback, NULL);
60
61 /* Return success */
62 return STATUS_SUCCESS;
63 }
64
65 /* EOF */