Changed irq handler from C to assembler
[reactos.git] / reactos / ntoskrnl / kd / dlog.c
1 /* $Id: dlog.c,v 1.1 2001/02/16 18:32:20 dwelch Exp $
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/kd/kdebug.c
6 * PURPOSE: Kernel debugger
7 * PROGRAMMER: Eric Kohl (ekohl@abo.rhein-zeitung.de)
8 * UPDATE HISTORY:
9 * 21/10/99: Created
10 */
11
12 /* INCLUDES ******************************************************************/
13
14 #include <ddk/ntddk.h>
15 #include <internal/ntoskrnl.h>
16 #include <internal/kd.h>
17 #include <ntos/minmax.h>
18
19 /* GLOBALS *******************************************************************/
20
21 #define DEBUGLOG_SIZE (32*1024)
22
23 #ifdef DBGPRINT_FILE_LOG
24
25 static CHAR DebugLog[DEBUGLOG_SIZE];
26 static ULONG DebugLogStart;
27 static ULONG DebugLogEnd;
28 static KSPIN_LOCK DebugLogLock;
29 static ULONG DebugLogOverflow;
30 static HANDLE DebugLogThreadHandle;
31 static CLIENT_ID DebugLogThreadCid;
32 static HANDLE DebugLogFile;
33 static KSEMAPHORE DebugLogSem;
34
35 #endif /* DBGPRINT_FILE_LOG */
36
37 /* FUNCTIONS *****************************************************************/
38
39 #ifdef DBGPRINT_FILE_LOG
40
41 VOID
42 DebugLogInit(VOID)
43 {
44 KeInitializeSpinLock(&DebugLogLock);
45 DebugLogStart = -1;
46 DebugLogEnd = 0;
47 DebugLogOverflow = 0;
48 KeInitializeSemaphore(&DebugLogSem, 0, 255);
49 }
50
51 NTSTATUS
52 DebugLogThreadMain(PVOID Context)
53 {
54 KIRQL oldIrql;
55 IO_STATUS_BLOCK Iosb;
56 CHAR Buffer[256];
57 ULONG WLen;
58
59 for (;;)
60 {
61 KeWaitForSingleObject(&DebugLogSem,
62 0,
63 KernelMode,
64 FALSE,
65 NULL);
66 KeAcquireSpinLock(&DebugLogLock, &oldIrql);
67 while (DebugLogStart != -1)
68 {
69 if (DebugLogStart > DebugLogEnd)
70 {
71 WLen = min(256, DEBUGLOG_SIZE - DebugLogStart);
72 memcpy(Buffer, &DebugLog[DebugLogStart], WLen);
73 DebugLogStart =
74 (DebugLogStart + WLen) % DEBUGLOG_SIZE;
75 if (DebugLogStart == DebugLogEnd)
76 {
77 DebugLogStart = -1;
78 }
79 KeReleaseSpinLock(&DebugLogLock, oldIrql);
80 NtWriteFile(DebugLogFile,
81 NULL,
82 NULL,
83 NULL,
84 &Iosb,
85 Buffer,
86 WLen,
87 NULL,
88 NULL);
89 }
90 else
91 {
92 WLen = min(256, DebugLogEnd - DebugLogStart);
93 memcpy(Buffer, &DebugLog[DebugLogStart], WLen);
94 DebugLogStart =
95 (DebugLogStart + WLen) % DEBUGLOG_SIZE;
96 if (DebugLogStart == DebugLogEnd)
97 {
98 DebugLogStart = -1;
99 }
100 KeReleaseSpinLock(&DebugLogLock, oldIrql);
101 NtWriteFile(DebugLogFile,
102 NULL,
103 NULL,
104 NULL,
105 &Iosb,
106 Buffer,
107 WLen,
108 NULL,
109 NULL);
110 }
111 KeAcquireSpinLock(&DebugLogLock, &oldIrql);
112 }
113 KeReleaseSpinLock(&DebugLogLock, oldIrql);
114 }
115 }
116
117 VOID
118 DebugLogInit2(VOID)
119 {
120 NTSTATUS Status;
121 OBJECT_ATTRIBUTES ObjectAttributes;
122 UNICODE_STRING FileName;
123 IO_STATUS_BLOCK Iosb;
124
125 RtlInitUnicodeString(&FileName, L"\\SystemRoot\\debug.log");
126 InitializeObjectAttributes(&ObjectAttributes,
127 &FileName,
128 0,
129 NULL,
130 NULL);
131
132 Status = NtCreateFile(&DebugLogFile,
133 FILE_ALL_ACCESS,
134 &ObjectAttributes,
135 &Iosb,
136 NULL,
137 FILE_ATTRIBUTE_NORMAL,
138 0,
139 FILE_SUPERSEDE,
140 FILE_WRITE_THROUGH | FILE_SYNCHRONOUS_IO_NONALERT,
141 NULL,
142 0);
143 if (!NT_SUCCESS(Status))
144 {
145 DbgPrint("Failed to create debug log file\n");
146 return;
147 }
148
149 Status = PsCreateSystemThread(&DebugLogThreadHandle,
150 THREAD_ALL_ACCESS,
151 NULL,
152 NULL,
153 &DebugLogThreadCid,
154 DebugLogThreadMain,
155 NULL);
156 }
157
158 VOID
159 DebugLogWrite(PCH String)
160 {
161 KIRQL oldIrql;
162
163 if (KeGetCurrentIrql() > DISPATCH_LEVEL)
164 {
165 DebugLogOverflow++;
166 return;
167 }
168
169 KeAcquireSpinLock(&DebugLogLock, &oldIrql);
170
171 if (DebugLogEnd == DebugLogStart)
172 {
173 DebugLogOverflow++;
174 KeReleaseSpinLock(&DebugLogLock, oldIrql);
175 KeReleaseSemaphore(&DebugLogSem, IO_NO_INCREMENT, 1, FALSE);
176 return;
177 }
178 if (DebugLogStart == -1)
179 {
180 DebugLogStart = DebugLogEnd;
181 }
182
183 while ((*String) != 0)
184 {
185 DebugLog[DebugLogEnd] = *String;
186 String++;
187 if (((DebugLogEnd + 1) % DEBUGLOG_SIZE) == DebugLogStart)
188 {
189 DebugLogOverflow++;
190 KeReleaseSpinLock(&DebugLogLock, oldIrql);
191 KeReleaseSemaphore(&DebugLogSem, IO_NO_INCREMENT, 1, FALSE);
192 return;
193 }
194 DebugLogEnd = (DebugLogEnd + 1) % DEBUGLOG_SIZE;
195 }
196
197 KeReleaseSpinLock(&DebugLogLock, oldIrql);
198 KeReleaseSemaphore(&DebugLogSem, IO_NO_INCREMENT, 1, FALSE);
199 }
200
201 #else /* not DBGPRINT_FILE_LOG */
202
203 VOID
204 DebugLogInit(VOID)
205 {
206 }
207
208 VOID
209 DebugLogInit2(VOID)
210 {
211 }
212
213 VOID
214 DebugLogWrite(PCH String)
215 {
216 }
217
218 #endif /* DBGPRINT_FILE_LOG */
219