diff --git a/Cargo.lock b/Cargo.lock
index 37369cb2a699c41647d085c0410a4b39545ff73c..e2a8e4d5918d3a8278029bfc18320d5cfbf7b72e 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4,9 +4,9 @@ version = 3
 
 [[package]]
 name = "autocfg"
-version = "1.0.1"
+version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
 
 [[package]]
 name = "bit_field"
@@ -22,9 +22,9 @@ checksum = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719"
 
 [[package]]
 name = "bitflags"
-version = "1.2.1"
+version = "1.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
 
 [[package]]
 name = "byteorder"
@@ -34,9 +34,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
 
 [[package]]
 name = "cc"
-version = "1.0.68"
+version = "1.0.73"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4a72c244c1ff497a746a7e1fb3d14bd08420ecda70c8f25c7112f2781652d787"
+checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11"
 
 [[package]]
 name = "cfg-if"
@@ -47,7 +47,7 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 [[package]]
 name = "fdt"
 version = "0.1.0"
-source = "git+https://gitlab.redox-os.org/thomhuds/fdt.git#baca9b0070c281dc99521ee901efcb10e5f84218"
+source = "git+https://gitlab.redox-os.org/thomhuds/fdt.git#7358607679114ccab5f97e14894ed3b59c5d42d6"
 dependencies = [
  "byteorder",
 ]
@@ -72,10 +72,10 @@ dependencies = [
  "cc",
  "fdt",
  "goblin",
- "linked_list_allocator 0.9.0",
+ "linked_list_allocator 0.9.1",
  "log",
  "memoffset",
- "raw-cpuid 10.2.0",
+ "raw-cpuid",
  "redox_syscall",
  "rmm",
  "rustc-cfg",
@@ -96,18 +96,18 @@ dependencies = [
 
 [[package]]
 name = "linked_list_allocator"
-version = "0.9.0"
+version = "0.9.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d0b725207570aa16096962d0b20c79f8a543df2280bd3c903022b9b0b4d7ea68"
+checksum = "549ce1740e46b291953c4340adcd74c59bcf4308f4cac050fd33ba91b7168f4a"
 dependencies = [
  "spinning_top",
 ]
 
 [[package]]
 name = "lock_api"
-version = "0.4.4"
+version = "0.4.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0382880606dff6d15c9476c416d18690b72742aa7b605bb6dd6ec9030fbf07eb"
+checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b"
 dependencies = [
  "scopeguard",
 ]
@@ -123,9 +123,9 @@ dependencies = [
 
 [[package]]
 name = "memoffset"
-version = "0.6.4"
+version = "0.6.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9"
+checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce"
 dependencies = [
  "autocfg",
 ]
@@ -136,17 +136,6 @@ version = "0.2.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6"
 
-[[package]]
-name = "raw-cpuid"
-version = "7.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "beb71f708fe39b2c5e98076204c3cc094ee5a4c12c4cdb119a2b72dc34164f41"
-dependencies = [
- "bitflags",
- "cc",
- "rustc_version",
-]
-
 [[package]]
 name = "raw-cpuid"
 version = "10.2.0"
@@ -158,7 +147,7 @@ dependencies = [
 
 [[package]]
 name = "redox_syscall"
-version = "0.2.11"
+version = "0.2.12"
 dependencies = [
  "bitflags",
 ]
@@ -175,18 +164,9 @@ checksum = "56a596b5718bf5e059d59a30af12f7f462a152de147aa462b70892849ee18704"
 
 [[package]]
 name = "rustc-demangle"
-version = "0.1.19"
+version = "0.1.21"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "410f7acf3cb3a44527c5d9546bad4bf4e6c460915d5f9f2fc524498bfe8f70ce"
-
-[[package]]
-name = "rustc_version"
-version = "0.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
-dependencies = [
- "semver",
-]
+checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342"
 
 [[package]]
 name = "scopeguard"
@@ -200,21 +180,6 @@ version = "0.10.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fda28d4b4830b807a8b43f7b0e6b5df875311b3e7621d84577188c175b6ec1ec"
 
-[[package]]
-name = "semver"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
-dependencies = [
- "semver-parser",
-]
-
-[[package]]
-name = "semver-parser"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
-
 [[package]]
 name = "slab_allocator"
 version = "0.3.1"
@@ -255,11 +220,11 @@ dependencies = [
 
 [[package]]
 name = "x86"
-version = "0.32.0"
+version = "0.47.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8cc872a9a776500ccc6f49799729858738c946b8865fa7e3d6b47cc5dc3a8a7"
+checksum = "55b5be8cc34d017d8aabec95bc45a43d0f20e8b2a31a453cabc804fe996f8dca"
 dependencies = [
  "bit_field",
  "bitflags",
- "raw-cpuid 7.0.4",
+ "raw-cpuid",
 ]
diff --git a/Cargo.toml b/Cargo.toml
index 538fb20e1ea7a0e60baaf6863edb71b613fb1dd0..6745c0e59b168bac5c251e3dd90420ff2fc6a9ed 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -21,7 +21,8 @@ log = "0.4"
 memoffset = { version = "0.6", features = ["unstable_const"] }
 redox_syscall = { path = "syscall" }
 slab_allocator = { path = "slab_allocator", optional = true }
-spin = "0.9"
+# FIXME: There is some undefined behavior probably in the kernel, which forces us to use spin 0.9.0 and not 0.9.2.
+spin = "=0.9.0"
 rmm = { path = "rmm", default-features = false }
 
 [dependencies.goblin]
@@ -39,7 +40,7 @@ fdt = { git = "https://gitlab.redox-os.org/thomhuds/fdt.git", default-features =
 
 [target.'cfg(target_arch = "x86_64")'.dependencies]
 raw-cpuid = "10.2.0"
-x86 = { version = "0.32.0", default-features = false }
+x86 = { version = "0.47.0", default-features = false }
 
 [features]
 default = ["acpi", "multi_core", "serial_debug"]
diff --git a/Xargo.toml b/Xargo.toml
deleted file mode 100644
index ea3144eb6a72a93b0920a0fab89c5acacb04c0bc..0000000000000000000000000000000000000000
--- a/Xargo.toml
+++ /dev/null
@@ -1 +0,0 @@
-[dependencies.alloc]
diff --git a/rmm b/rmm
index 37e88ff4d3254b512e0bdf0faa5059ef08ac74dd..507f7ccd4a33eee5ca442803c91e19b3d2095f39 160000
--- a/rmm
+++ b/rmm
@@ -1 +1 @@
-Subproject commit 37e88ff4d3254b512e0bdf0faa5059ef08ac74dd
+Subproject commit 507f7ccd4a33eee5ca442803c91e19b3d2095f39
diff --git a/src/arch/x86_64/interrupt/exception.rs b/src/arch/x86_64/interrupt/exception.rs
index 242c7cf3b5d0ef34e9fcf2aadc95989b40018aa0..142e2b5d76f3148310bb71e5537e15d6d53458fc 100644
--- a/src/arch/x86_64/interrupt/exception.rs
+++ b/src/arch/x86_64/interrupt/exception.rs
@@ -132,7 +132,7 @@ interrupt_error!(protection, |stack| {
 
 interrupt_error!(page, |stack| {
     let cr2: usize;
-    asm!("mov {}, cr2", out(reg) cr2);
+    core::arch::asm!("mov {}, cr2", out(reg) cr2);
     println!("Page fault: {:>016X}", cr2);
     println!("  Present: {}", stack.code & 1 << 0 != 0);
     println!("  Write: {}", stack.code & 1 << 1 != 0);
diff --git a/src/arch/x86_64/interrupt/handler.rs b/src/arch/x86_64/interrupt/handler.rs
index 7cb1d2b43793645460e7af94bd7e319bd8a17099..d8fa21f796c35d2043fc94896ddfc6e65bfe3490 100644
--- a/src/arch/x86_64/interrupt/handler.rs
+++ b/src/arch/x86_64/interrupt/handler.rs
@@ -131,7 +131,7 @@ impl InterruptStack {
 
         let cs: usize;
         unsafe {
-            asm!("mov {}, cs", out(reg) cs);
+            core::arch::asm!("mov {}, cs", out(reg) cs);
         }
 
         if self.iret.cs & CPL_MASK == cs & CPL_MASK {
@@ -140,7 +140,7 @@ impl InterruptStack {
                 + mem::size_of::<Self>() // disregard Self
                 - mem::size_of::<usize>() * 2; // well, almost: rsp and ss need to be excluded as they aren't present
             unsafe {
-                asm!("mov {}, ss", out(reg) all.ss);
+                core::arch::asm!("mov {}, ss", out(reg) all.ss);
             }
         } else {
             all.rsp = self.iret.rsp;
@@ -406,7 +406,7 @@ macro_rules! interrupt_stack {
                     $code
                 }
             }
-            asm!(concat!(
+            core::arch::asm!(concat!(
                 // Backup all userspace registers to stack
                 $save1!(),
                 "push rax\n",
@@ -462,7 +462,7 @@ macro_rules! interrupt {
                 $code
             }
 
-            asm!(concat!(
+            core::arch::asm!(concat!(
                 // Backup all userspace registers to stack
                 swapgs_iff_ring3_fast!(),
                 "push rax\n",
@@ -517,7 +517,7 @@ macro_rules! interrupt_error {
                 }
             }
 
-            asm!(concat!(
+            core::arch::asm!(concat!(
                 swapgs_iff_ring3_fast_errorcode!(),
                 // Move rax into code's place, put code in last instead (to be
                 // compatible with InterruptStack)
diff --git a/src/arch/x86_64/interrupt/irq.rs b/src/arch/x86_64/interrupt/irq.rs
index b909f6e2b62bcf937f97e58ced7e500fddb1e1fd..c36844a111dd86b33cf031439ee0cddde2217c04 100644
--- a/src/arch/x86_64/interrupt/irq.rs
+++ b/src/arch/x86_64/interrupt/irq.rs
@@ -24,7 +24,7 @@ unsafe fn ps2_interrupt(_index: usize) {
 
     let data: u8;
     let status: u8;
-    asm!("
+    core::arch::asm!("
         sti
         nop
         cli
diff --git a/src/arch/x86_64/interrupt/mod.rs b/src/arch/x86_64/interrupt/mod.rs
index f5bf75ca12c86aed40b2b19db2e70dc56007416e..ebd013f23d2b4c32a9a0424a26ee479cb25703be 100644
--- a/src/arch/x86_64/interrupt/mod.rs
+++ b/src/arch/x86_64/interrupt/mod.rs
@@ -18,13 +18,13 @@ pub use super::device::local_apic::bsp_apic_id;
 /// Clear interrupts
 #[inline(always)]
 pub unsafe fn disable() {
-    asm!("cli", options(nomem, nostack));
+    core::arch::asm!("cli", options(nomem, nostack));
 }
 
 /// Set interrupts
 #[inline(always)]
 pub unsafe fn enable() {
-    asm!("sti", options(nomem, nostack));
+    core::arch::asm!("sti", options(nomem, nostack));
 }
 
 /// Set interrupts and halt
@@ -32,7 +32,7 @@ pub unsafe fn enable() {
 /// Performing enable followed by halt is not guaranteed to be atomic, use this instead!
 #[inline(always)]
 pub unsafe fn enable_and_halt() {
-    asm!("sti; hlt", options(nomem, nostack));
+    core::arch::asm!("sti; hlt", options(nomem, nostack));
 }
 
 /// Set interrupts and nop
@@ -40,18 +40,18 @@ pub unsafe fn enable_and_halt() {
 /// Simply enabling interrupts does not gurantee that they will trigger, use this instead!
 #[inline(always)]
 pub unsafe fn enable_and_nop() {
-    asm!("sti; nop", options(nomem, nostack));
+    core::arch::asm!("sti; nop", options(nomem, nostack));
 }
 
 /// Halt instruction
 #[inline(always)]
 pub unsafe fn halt() {
-    asm!("hlt", options(nomem, nostack));
+    core::arch::asm!("hlt", options(nomem, nostack));
 }
 
 /// Pause instruction
 /// Safe because it is similar to a NOP, and has no memory effects
 #[inline(always)]
 pub fn pause() {
-    unsafe { asm!("pause", options(nomem, nostack)); }
+    unsafe { core::arch::asm!("pause", options(nomem, nostack)); }
 }
diff --git a/src/arch/x86_64/interrupt/syscall.rs b/src/arch/x86_64/interrupt/syscall.rs
index 38c78c23033cb8b71a94ddce3c1df7fed4252cc0..70fd2a60c63d526ffea40a0259441f8cffbaa74a 100644
--- a/src/arch/x86_64/interrupt/syscall.rs
+++ b/src/arch/x86_64/interrupt/syscall.rs
@@ -52,7 +52,7 @@ pub unsafe extern "C" fn __inner_syscall_instruction(stack: *mut InterruptStack)
     with_interrupt_stack!(|stack| {
         // Set a restore point for clone
         let rbp;
-        asm!("mov {}, rbp", out(reg) rbp);
+        core::arch::asm!("mov {}, rbp", out(reg) rbp);
 
         let scratch = &stack.scratch;
         syscall::syscall(scratch.rax, scratch.rdi, scratch.rsi, scratch.rdx, scratch.r10, scratch.r8, rbp, stack)
@@ -61,7 +61,7 @@ pub unsafe extern "C" fn __inner_syscall_instruction(stack: *mut InterruptStack)
 
 #[naked]
 pub unsafe extern "C" fn syscall_instruction() {
-    asm!(concat!(
+    core::arch::asm!(concat!(
     // Yes, this is magic. No, you don't need to understand
     "
         swapgs                    // Set gs segment to TSS
@@ -154,7 +154,7 @@ interrupt_stack!(syscall, |stack| {
 
         // Set a restore point for clone
         let rbp;
-        asm!("mov {}, rbp", out(reg) rbp);
+        core::arch::asm!("mov {}, rbp", out(reg) rbp);
 
         let scratch = &stack.scratch;
         syscall::syscall(scratch.rax, stack.preserved.rbx, scratch.rcx, scratch.rdx, scratch.rsi, scratch.rdi, rbp, stack)
@@ -163,7 +163,7 @@ interrupt_stack!(syscall, |stack| {
 
 #[naked]
 pub unsafe extern "C" fn clone_ret() {
-    asm!(concat!(
+    core::arch::asm!(concat!(
     // The address of this instruction is injected by `clone` in process.rs, on
     // top of the stack syscall->inner in this file, which is done using the rbp
     // register we save there.
diff --git a/src/arch/x86_64/interrupt/trace.rs b/src/arch/x86_64/interrupt/trace.rs
index bb31414210f882fe7414973ac1dc1d850760a92c..b8eb820dfd2bf0029b32f7747316c52144d44a61 100644
--- a/src/arch/x86_64/interrupt/trace.rs
+++ b/src/arch/x86_64/interrupt/trace.rs
@@ -9,7 +9,7 @@ use crate::paging::{ActivePageTable, TableKind, VirtualAddress};
 #[inline(never)]
 pub unsafe fn stack_trace() {
     let mut rbp: usize;
-    asm!("mov {}, rbp", out(reg) rbp);
+    core::arch::asm!("mov {}, rbp", out(reg) rbp);
 
     println!("TRACE: {:>016X}", rbp);
     //Maximum 64 frames
diff --git a/src/arch/x86_64/start.rs b/src/arch/x86_64/start.rs
index d541b42047cd5818b3aa80e827132362d327a1ec..33b30a5e64d8862ea3a31d8b2e0cd756beee48e1 100644
--- a/src/arch/x86_64/start.rs
+++ b/src/arch/x86_64/start.rs
@@ -350,11 +350,10 @@ macro_rules! restore_fsgsbase(
 );
 
 #[naked]
-#[inline(never)]
 // TODO: AbiCompatBool
 pub unsafe extern "C" fn usermode(_ip: usize, _sp: usize, _arg: usize, _is_singlestep: usize) -> ! {
     // rdi, rsi, rdx, rcx
-    asm!(
+    core::arch::asm!(
         concat!("
             shl rcx, {shift_singlestep}
             or rcx, {flag_interrupts}
diff --git a/src/arch/x86_64/stop.rs b/src/arch/x86_64/stop.rs
index eadc8c3c4a237f146a92e6927fa024fc645571c2..0b12b8bce4a9f1b0332d2fb6e5bb16a109f4d54a 100644
--- a/src/arch/x86_64/stop.rs
+++ b/src/arch/x86_64/stop.rs
@@ -20,9 +20,11 @@ pub unsafe extern fn kreset() -> ! {
     }
 
     // Use triple fault to guarantee reset
-    asm!("cli");
-    asm!("lidt cs:0");
-    asm!("int $3");
+    core::arch::asm!("
+        cli
+        lidt cs:0
+        int $3
+    ");
 
     unreachable!();
 }
@@ -87,6 +89,6 @@ pub unsafe extern fn kstop() -> ! {
     // Magic code for VMWare. Also a hard lock.
     println!("Shutdown with cli hlt");
     loop {
-        asm!("cli; hlt");
+        core::arch::asm!("cli; hlt");
     }
 }
diff --git a/src/context/arch/x86_64.rs b/src/context/arch/x86_64.rs
index ebb56d0e20b491604eb2af349136cd704e6862bf..c36772962b1d8a13074f86e237f34f3191d92181 100644
--- a/src/context/arch/x86_64.rs
+++ b/src/context/arch/x86_64.rs
@@ -202,12 +202,11 @@ macro_rules! switch_fsgsbase(
 
 /// Switch to the next context by restoring its stack and registers
 /// Check disassembly!
-#[inline(never)]
 #[naked]
 pub unsafe extern "C" fn switch_to(_prev: &mut Context, _next: &mut Context) {
     use Context as Cx;
 
-    asm!(
+    core::arch::asm!(
         // As a quick reminder for those who are unfamiliar with the System V ABI (extern "C"):
         //
         // - the current parameters are passed in the registers `rdi`, `rsi`,
@@ -339,7 +338,7 @@ unsafe extern fn signal_handler_wrapper() {
     }
 
     // Push scratch registers
-    asm!(
+    core::arch::asm!(
         "
             push rax
             push rcx
diff --git a/src/lib.rs b/src/lib.rs
index bf81498d68edc785fbe3f447e9cd946d20e44e6a..a66a4ab6e7626ac990b96bee5ed13b883e65235d 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -43,16 +43,12 @@
 #![deny(unused_must_use)]
 
 #![feature(allocator_api)]
-#![feature(asm)] // TODO: Relax requirements of most asm invocations
+#![feature(asm_const, asm_sym)] // TODO: Relax requirements of most asm invocations
 #![cfg_attr(target_arch = "aarch64", feature(llvm_asm))] // TODO: Rewrite using asm!
 #![feature(concat_idents)]
 #![feature(const_btree_new)]
-#![feature(const_maybe_uninit_as_ptr)]
-#![feature(const_panic)]
 #![feature(const_ptr_offset_from)]
-#![feature(const_raw_ptr_deref)]
 #![feature(core_intrinsics)]
-#![feature(global_asm)]
 #![feature(integer_atomics)]
 #![feature(lang_items)]
 #![feature(naked_functions)]
diff --git a/syscall b/syscall
index 87ffd8b862f53d575ccee63a953489c038bc9940..30f29c32952343412bb6c36c9fda136d26e9431f 160000
--- a/syscall
+++ b/syscall
@@ -1 +1 @@
-Subproject commit 87ffd8b862f53d575ccee63a953489c038bc9940
+Subproject commit 30f29c32952343412bb6c36c9fda136d26e9431f
diff --git a/targets/x86_64-unknown-kernel.json b/targets/x86_64-unknown-kernel.json
index 92db2c138e545f26b351f39a7604b71572e86337..1437a35cf7b993a42b290650b9d9b971b556abaf 100644
--- a/targets/x86_64-unknown-kernel.json
+++ b/targets/x86_64-unknown-kernel.json
@@ -19,11 +19,10 @@
     "relocation-model": "pic",
     "code-model": "kernel",
     "disable-redzone": true,
-    "eliminate-frame-pointer": false,
+    "frame-pointer": "always",
     "exe-suffix": "",
     "has-rpath": false,
-    "no-compiler-rt": true,
     "no-default-libraries": true,
     "position-independent-executables": false,
-    "has-elf-tls": true
+    "tls-model": "global-dynamic"
 }