Nucleus
Barry Exiting interrupt context on clone() child 571b85e (3 years, 3 months ago)
diff --git a/include/nucleus/cpu.h b/include/nucleus/cpu.h
index 88c7506..b8293b8 100644
--- a/include/nucleus/cpu.h
+++ b/include/nucleus/cpu.h
@@ -23,20 +23,6 @@ extern cpu_t lapicNums[];
#define CPUID (apic ? lapicNums[(cpu_t) (LAPIC(0x20) >> 24)] : 0)
#define MAX_CPUS 2
-/* Push/pop interrupts */
-static inline uintptr_t
-irq_disable(void)
-{
- uintptr_t flags;
- asm volatile("pushf; cli; pop %0" : "=r" (flags) :: "memory");
- return flags;
-}
-static inline void
-irq_restore(uintptr_t flags)
-{
- asm volatile("push %0; popf" :: "rm" (flags) : "memory","cc");
-}
-
void register_exception(int num, exc_handler_t addr);
void register_interrupt(int num, int_handler_t addr);
diff --git a/include/nucleus/task.h b/include/nucleus/task.h
index cfc0c99..11ad4ae 100644
--- a/include/nucleus/task.h
+++ b/include/nucleus/task.h
@@ -35,7 +35,9 @@ struct Task {
gid_t gid, egid, sgid;
enum Priority priority;
enum State state;
+ uint32_t inCriticalSection;
+ uintptr_t esi, edi, ebx;
uintptr_t esp, ebp, eip;
page_dir_t pageDir;
@@ -56,6 +58,19 @@ super_user(void)
return (current->euid == 0);
}
+/* Enter a critical section */
+static inline void
+enter_critical_section(void)
+{
+ __atomic_add_fetch(¤t->inCriticalSection, 1, __ATOMIC_RELAXED);
+}
+/* Exit a critical section */
+static inline void
+exit_critical_section(void)
+{
+ __atomic_sub_fetch(¤t->inCriticalSection, 1, __ATOMIC_RELAXED);
+}
+
void init_tasking(void);
void schedule(void);
pid_t clone(int flags);