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()17Critical_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()28Critical_Enter() 29 { 30 disable_interrupts(); 31 lockLevel[CPU()]++; 32 } 33 34 void Critical_Exit()35Critical_Exit() 36 { 37 lockLevel[CPU()]--; 38 if (lockLevel[CPU()] == 0) 39 { 40 enable_interrupts(); 41 } 42 } 43 44 uint32_t Critical_Level()45Critical_Level() 46 { 47 return lockLevel[CPU()]; 48 } 49 50 static void Debug_Critical(int argc,const char * argv[])51Debug_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