diff --git a/patches/libtock-rs/06-no_spin_allocator.patch b/patches/libtock-rs/06-no_spin_allocator.patch
new file mode 100644
index 0000000000000000000000000000000000000000..ec61cf00fedd24e2ed26924ffcc45be95a10621b
--- /dev/null
+++ b/patches/libtock-rs/06-no_spin_allocator.patch
@@ -0,0 +1,77 @@
+diff --git a/Cargo.toml b/Cargo.toml
+index 844e424..386a9ed 100644
+--- a/Cargo.toml
++++ b/Cargo.toml
+@@ -6,7 +6,7 @@ license = "MIT/Apache-2.0"
+ edition = "2018"
+ 
+ [dependencies]
+-linked_list_allocator = "0.6.6"
++linked_list_allocator = { version = "0.6.6", default-features = false }
+ 
+ [features]
+ panic_console = []
+diff --git a/src/entry_point.rs b/src/entry_point.rs
+index 15e1d03..2fe5c40 100644
+--- a/src/entry_point.rs
++++ b/src/entry_point.rs
+@@ -1,8 +1,10 @@
+ use crate::memop;
+ use crate::syscalls;
+-use crate::ALLOCATOR;
++use core::alloc::{GlobalAlloc, Layout};
+ use core::intrinsics;
+ use core::ptr;
++use core::ptr::NonNull;
++use linked_list_allocator::Heap;
+ 
+ // _start and rust_start are the first two procedures executed when a Tock
+ // application starts. _start is invoked directly by the Tock kernel; it
+@@ -357,7 +359,7 @@ pub unsafe extern "C" fn rust_start(app_start: usize, stacktop: usize, app_heap_
+     // Tell the kernel the new app heap break.
+     memop::set_brk(app_heap_end as *const u8);
+ 
+-    ALLOCATOR.lock().init(app_heap_start, HEAP_SIZE);
++    HEAP.init(app_heap_start, HEAP_SIZE);
+ 
+     main(0, ptr::null());
+ 
+@@ -365,3 +367,23 @@ pub unsafe extern "C" fn rust_start(app_start: usize, stacktop: usize, app_heap_
+         syscalls::yieldk();
+     }
+ }
++
++#[cfg(any(target_arch = "arm", target_arch = "riscv32"))]
++#[global_allocator]
++static ALLOCATOR: TockAllocator = TockAllocator;
++
++static mut HEAP: Heap = Heap::empty();
++
++struct TockAllocator;
++
++unsafe impl GlobalAlloc for TockAllocator {
++    unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
++        HEAP.allocate_first_fit(layout)
++            .ok()
++            .map_or(0 as *mut u8, |allocation| allocation.as_ptr())
++    }
++
++    unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
++        HEAP.deallocate(NonNull::new_unchecked(ptr), layout)
++    }
++}
+diff --git a/src/lib.rs b/src/lib.rs
+index c9001bf..2f9c1c0 100644
+--- a/src/lib.rs
++++ b/src/lib.rs
+@@ -44,10 +44,6 @@ pub mod syscalls;
+ #[path = "syscalls_mock.rs"]
+ pub mod syscalls;
+ 
+-#[cfg(any(target_arch = "arm", target_arch = "riscv32"))]
+-#[global_allocator]
+-static ALLOCATOR: linked_list_allocator::LockedHeap = linked_list_allocator::LockedHeap::empty();
+-
+ // Dummy structure to force importing the panic_handler and other no_std elements when nothing else
+ // is imported.
+ pub struct LibTock;