diff --git a/kernel/misc.c b/kernel/utility.c similarity index 72% rename from kernel/misc.c rename to kernel/utility.c index f8bf3edd0..5835f8cc5 100755 --- a/kernel/misc.c +++ b/kernel/utility.c @@ -1,5 +1,7 @@ /* This file contains a collection of miscellaneous procedures: * panic abort MINIX due to a fatal error + * safe_lock lock the kernel, use in combination with safe_unlock + * safe_unlock unlock the kernel, but prevent breaking nested locks * alloc_bit bit map manipulation * free_bit bit map manipulation */ @@ -10,6 +12,34 @@ #include +PRIVATE int relock_count = 0; + +/*===========================================================================* + * safe_lock * + *===========================================================================*/ +PUBLIC void safe_lock(c,v) +int c; +char *v; +{ + if(!(read_cpu_flags() & X86_FLAG_I)) { + relock_count++; + } else { + intr_disable(); + } +} + +/*===========================================================================* + * safe_unlock * + *===========================================================================*/ +PUBLIC void safe_unlock(void) +{ + if(! relock_count) { + intr_enable(); + } else { + relock_count--; + } +} + /*===========================================================================* * panic * *===========================================================================*/ @@ -30,6 +60,9 @@ int n; prepare_shutdown(RBT_PANIC); } + + + /*===========================================================================* * free_bit * *===========================================================================*/