diff --git a/arch/x64/processor.hh b/arch/x64/processor.hh
index ef41162ffd6fbe922c9be7ba7ef313ee04abf9a3..e8bb3adf9692e51efe46cb98dd5f0c9fb6084556 100644
--- a/arch/x64/processor.hh
+++ b/arch/x64/processor.hh
@@ -218,6 +218,39 @@ inline u64 rdtsc()
     return lo | (u64(hi) << 32);
 }
 
+struct fpu_state {
+    char x[512];
+    char extra[];
+};
+
+inline void fxsave(fpu_state* s)
+{
+    asm volatile("fxsaveq %0" : "=m"(*s));
+}
+
+inline void fxrstor(fpu_state* s)
+{
+    asm volatile("fxrstorq %0" : : "m"(*s));
+}
+
+inline void xsave(fpu_state* s, u64 mask)
+{
+    u32 a = mask, d = mask >> 32;
+    asm volatile("xsaveq %[fpu]" : [fpu]"=m"(*s) : "a"(a), "d"(d));
+}
+
+inline void xsaveopt(fpu_state* s, u64 mask)
+{
+    u32 a = mask, d = mask >> 32;
+    asm volatile("xsaveoptq %[fpu]" : [fpu]"=m"(*s) : "a"(a), "d"(d));
+}
+
+inline void xrstor(const fpu_state* s, u64 mask)
+{
+    u32 a = mask, d = mask >> 32;
+    asm volatile("xrstorq %[fpu]" : : [fpu]"m"(*s), "a"(a), "d"(d));
+}
+
 struct task_state_segment {
     u32 reserved0;
     u64 rsp[3];