Move critical section stuff to sync.c
authorcoderain <coderain@sdf.org>
Thu, 5 Oct 2017 14:59:58 +0000 (16:59 +0200)
committercoderain <coderain@sdf.org>
Thu, 5 Oct 2017 14:59:58 +0000 (16:59 +0200)
kernel/include/common.h
kernel/include/sync.h
kernel/src/common.c
kernel/src/interrupt.c
kernel/src/irq.c
kernel/src/sync.c

index b6f7681bead902cf73ca84f66a78705147cab9a8..8c1c24e4e0eb77eb5752ca97f7e8955a1f21a877 100644 (file)
@@ -72,23 +72,27 @@ IO_PORT_FUNCTIONS(b, byte_t)
 IO_PORT_FUNCTIONS(w, word_t)
 IO_PORT_FUNCTIONS(l, dword_t)
 
-typedef bool_t critical_t;
-
-static inline void enable_ints()
+static inline bool_t check_ints()
 {
-    asm volatile ("sti");
+    dword_t eflags;
+    asm volatile ("pushfl\n"
+                  "popl %0"
+                  : "=g"(eflags));
+    return (eflags & 0x200) != 0 ? TRUE : FALSE;
 }
 
-static inline void disable_ints()
+static inline bool_t enable_ints()
 {
-    asm volatile ("cli");
+    bool_t old = check_ints();
+    asm volatile ("sti");
+    return old;
 }
 
-static inline bool_t check_ints()
+static inline bool_t disable_ints()
 {
-    dword_t eflags;
-    asm volatile ("pushfl\npopl %0" : "=g"(eflags));
-    return (eflags & 0x200) != 0 ? TRUE : FALSE;
+    bool_t old = check_ints();
+    asm volatile ("cli");
+    return old;
 }
 
 static inline void halt()
@@ -134,8 +138,6 @@ static inline uintptr_t pop_from_stack(uintptr_t *stack)
     return value;
 }
 
-void enter_critical(critical_t *critical);
-void leave_critical(critical_t *critical);
 int strlen(const char *str);
 void strrev(char *str);
 char *strcpy(char *destination, const char *source);
index 864423ffa5b4638ea0543d4a7e11ffaa1cd2b0c0..18ade6e5d20cdffa5758c273dea79cc4ffeccb10 100644 (file)
@@ -29,6 +29,7 @@
 #define wait_mutex(m, t) wait_semaphore((m), 1, (t))
 #define release_mutex(m) release_semaphore((m), 1)
 
+typedef uint8_t critical_t;
 typedef volatile uintptr_t lock_t;
 typedef volatile uintptr_t resource_t;
 
@@ -39,6 +40,8 @@ typedef struct
     dword_t max_count;
 } semaphore_t, mutex_t;
 
+void enter_critical(critical_t *critical);
+void leave_critical(critical_t *critical);
 void acquire_lock(lock_t *lock);
 void release_lock(lock_t *lock);
 void acquire_resource_shared(resource_t *res);
index 47af9ae88276ff7041a15911374220062ba844c9..f90b0bc803910f4906c7d1d6db22630b01e919a9 100644 (file)
@@ -28,22 +28,6 @@ static byte_t terminal_color = 0x07;
 
 bool_t video_initialized = FALSE;
 
-void enter_critical(critical_t *critical)
-{
-    *critical = 0;
-    if (check_ints()) *critical |= (1 << 0);
-    if (scheduler_enabled) *critical |= (1 << 1);
-
-    disable_ints();
-    scheduler_enabled = FALSE;
-}
-
-void leave_critical(critical_t *critical)
-{
-    if (*critical & (1 << 0)) enable_ints();
-    if (*critical & (1 << 1)) scheduler_enabled = TRUE;
-}
-
 int strlen(const char *str)
 {
     int ret = 0;
index 83a8e40e59965f94b61cea98c5fff6dbc7bc5d6d..fcbcfe99a546ff480695fe8ae5edf58918910c17 100644 (file)
@@ -19,6 +19,7 @@
 
 #include <interrupt.h>
 #include <segments.h>
+#include <sync.h>
 
 static byte_t isr_stubs[IDT_NUM_INTERRUPTS * ISR_STUB_SIZE];
 static idt_entry_t idt[IDT_NUM_INTERRUPTS];
index 4a606287b12b188eb7bac3036494f6acb3b92d5e..d3aa03d278944b2a2859229702a160ce52ff29b7 100644 (file)
@@ -19,6 +19,7 @@
 
 #include <irq.h>
 #include <heap.h>
+#include <sync.h>
 
 static list_entry_t irq_handlers[MAX_IRQ_COUNT];
 static dword_t irq_alloc_bitmap = 0xFFFFF3FF;
index d151cdbe295598d4637393b45ecf6e8ec3c96d5c..d1c4e1331efc57bedcca6fbb08da83f7a2d124e3 100644 (file)
 #include <thread.h>
 #include <heap.h>
 
+void enter_critical(critical_t *critical)
+{
+    *critical = 0;
+    if (disable_ints()) *critical |= (1 << 0);
+    if (scheduler_enabled) *critical |= (1 << 1);
+
+    disable_ints();
+    scheduler_enabled = FALSE;
+}
+
+void leave_critical(critical_t *critical)
+{
+    if (*critical & (1 << 1)) scheduler_enabled = TRUE;
+    if (*critical & (1 << 0)) enable_ints();
+}
+
 void acquire_lock(lock_t *lock)
 {
     if (scheduler_enabled)