diff --git a/Cargo.toml b/Cargo.toml
index c58a7ec9a62339f8e7079db7e15f66a3d28379ac..65a724eb9902aa2bc568fb08c279b7fb01a264e9 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -42,13 +42,15 @@ raw-cpuid = "8.0.0"
 x86 = { version = "0.32.0", default-features = false }
 
 [features]
-default = ["acpi", "multi_core", "serial_debug"]
+default = ["acpi", "multi_core", "no_threaded_syscalls", "serial_debug"]
 acpi = []
 doc = []
 graphical_debug = []
 live = []
 lpss_debug = []
 multi_core = ["acpi"]
+#TODO: remove when threading issues are fixed
+no_threaded_syscalls = []
 pti = []
 qemu_debug = []
 serial_debug = []
diff --git a/src/syscall/mod.rs b/src/syscall/mod.rs
index 3955af57029288c75a757512a1095adf7957fc2b..5afa381dc7f18650d0f0c368015eaf6b16f8a351 100644
--- a/src/syscall/mod.rs
+++ b/src/syscall/mod.rs
@@ -253,8 +253,17 @@ pub fn syscall(a: usize, b: usize, c: usize, d: usize, e: usize, f: usize, bp: u
         }
     }
 
+    #[cfg(feature = "no_threaded_syscalls")]
+    let syscall_lock = {
+        static SYSCALL_LOCK: spin::Mutex<()> = spin::Mutex::new(());
+        SYSCALL_LOCK.lock();
+    };
+
     let result = inner(a, b, c, d, e, f, bp, stack);
 
+    #[cfg(feature = "no_threaded_syscalls")]
+    drop(syscall_lock);
+
     {
         let contexts = crate::context::contexts();
         if let Some(context_lock) = contexts.current() {