1 
2 #include <stdbool.h>
3 #include <stdint.h>
4 
5 #include <sys/kassert.h>
6 #include <sys/kdebug.h>
7 #include <sys/kconfig.h>
8 #include <sys/mp.h>
9 #include <sys/spinlock.h>
10 
11 #include <machine/amd64.h>
12 #include <machine/amd64op.h>
13 
14 uint32_t lockLevel[MAX_CPUS];
15 
16 void
Critical_Init()17 Critical_Init()
18 {
19     int c;
20 
21     for (c = 0; c < MAX_CPUS; c++)
22     {
23 	lockLevel[c] = 0;
24     }
25 }
26 
27 void
Critical_Enter()28 Critical_Enter()
29 {
30     disable_interrupts();
31     lockLevel[CPU()]++;
32 }
33 
34 void
Critical_Exit()35 Critical_Exit()
36 {
37     lockLevel[CPU()]--;
38     if (lockLevel[CPU()] == 0)
39     {
40 	enable_interrupts();
41     }
42 }
43 
44 uint32_t
Critical_Level()45 Critical_Level()
46 {
47     return lockLevel[CPU()];
48 }
49 
50 static void
Debug_Critical(int argc,const char * argv[])51 Debug_Critical(int argc, const char *argv[])
52 {
53     int c;
54 
55     for (c = 0; c < MAX_CPUS; c++) {
56 	kprintf("CPU%d: %u\n", c, lockLevel[c]);
57     }
58 }
59 
60 REGISTER_DBGCMD(critical, "Critical Enter/Exit Stats", Debug_Critical);
61 
62