Index: kernel/arch/abs32le/include/arch/fpu_context.h
===================================================================
--- kernel/arch/abs32le/include/arch/fpu_context.h	(revision 1eaead40ef1e81dc0e203498597d60b2e71fcd27)
+++ kernel/arch/abs32le/include/arch/fpu_context.h	(revision 0366d09d1929d3cd61f8f612f9ea15794bc5650c)
@@ -36,6 +36,4 @@
 #define KERN_abs32le_FPU_CONTEXT_H_
 
-#define FPU_CONTEXT_ALIGN  16
-
 /*
  * On real hardware this stores the FPU registers
Index: kernel/arch/arm32/include/arch/fpu_context.h
===================================================================
--- kernel/arch/arm32/include/arch/fpu_context.h	(revision 1eaead40ef1e81dc0e203498597d60b2e71fcd27)
+++ kernel/arch/arm32/include/arch/fpu_context.h	(revision 0366d09d1929d3cd61f8f612f9ea15794bc5650c)
@@ -40,11 +40,9 @@
 #include <stdint.h>
 
-#define FPU_CONTEXT_ALIGN    8
-
 /*
  * ARM Architecture reference manual, p B-1529.
  */
 typedef struct {
-	uint32_t fpexc;
+	_Alignas(8) uint32_t fpexc;
 	uint32_t fpscr;
 	uint32_t s[64];
Index: kernel/arch/arm64/include/arch/fpu_context.h
===================================================================
--- kernel/arch/arm64/include/arch/fpu_context.h	(revision 1eaead40ef1e81dc0e203498597d60b2e71fcd27)
+++ kernel/arch/arm64/include/arch/fpu_context.h	(revision 0366d09d1929d3cd61f8f612f9ea15794bc5650c)
@@ -39,6 +39,4 @@
 #include <arch/fpu_context_struct.h>
 
-#define FPU_CONTEXT_ALIGN  16
-
 #endif
 
Index: kernel/arch/arm64/include/arch/fpu_context_struct.h
===================================================================
--- kernel/arch/arm64/include/arch/fpu_context_struct.h	(revision 1eaead40ef1e81dc0e203498597d60b2e71fcd27)
+++ kernel/arch/arm64/include/arch/fpu_context_struct.h	(revision 0366d09d1929d3cd61f8f612f9ea15794bc5650c)
@@ -42,5 +42,5 @@
 /** ARM64 FPU context. */
 typedef struct fpu_context {
-	uint128_t vregs[32];
+	_Alignas(16) uint128_t vregs[32];
 	uint32_t fpcr;
 	uint32_t fpsr;
Index: kernel/arch/ia32/include/arch/fpu_context.h
===================================================================
--- kernel/arch/ia32/include/arch/fpu_context.h	(revision 1eaead40ef1e81dc0e203498597d60b2e71fcd27)
+++ kernel/arch/ia32/include/arch/fpu_context.h	(revision 0366d09d1929d3cd61f8f612f9ea15794bc5650c)
@@ -38,8 +38,6 @@
 #include <stdint.h>
 
-#define FPU_CONTEXT_ALIGN  16
-
 typedef struct {
-	uint8_t fpu[512];  /* FXSAVE & FXRSTOR storage area */
+	_Alignas(16) uint8_t fpu[512];  /* FXSAVE & FXRSTOR storage area */
 } fpu_context_t;
 
Index: kernel/arch/ia64/include/arch/fpu_context.h
===================================================================
--- kernel/arch/ia64/include/arch/fpu_context.h	(revision 1eaead40ef1e81dc0e203498597d60b2e71fcd27)
+++ kernel/arch/ia64/include/arch/fpu_context.h	(revision 0366d09d1929d3cd61f8f612f9ea15794bc5650c)
@@ -36,6 +36,4 @@
 #define KERN_ia64_FPU_CONTEXT_H_
 
-#define FPU_CONTEXT_ALIGN 16
-
 #include <_bits/int128_t.h>
 
@@ -43,5 +41,5 @@
 
 typedef struct {
-	uint128_t fr[FRS];
+	_Alignas(16) uint128_t fr[FRS];
 } fpu_context_t;
 
Index: kernel/arch/mips32/include/arch/fpu_context.h
===================================================================
--- kernel/arch/mips32/include/arch/fpu_context.h	(revision 1eaead40ef1e81dc0e203498597d60b2e71fcd27)
+++ kernel/arch/mips32/include/arch/fpu_context.h	(revision 0366d09d1929d3cd61f8f612f9ea15794bc5650c)
@@ -39,6 +39,4 @@
 #include <arch/fpu_context_struct.h>
 
-#define FPU_CONTEXT_ALIGN    sizeof(sysarg_t)
-
 #endif
 
Index: kernel/arch/mips32/include/arch/fpu_context_struct.h
===================================================================
--- kernel/arch/mips32/include/arch/fpu_context_struct.h	(revision 1eaead40ef1e81dc0e203498597d60b2e71fcd27)
+++ kernel/arch/mips32/include/arch/fpu_context_struct.h	(revision 0366d09d1929d3cd61f8f612f9ea15794bc5650c)
@@ -42,5 +42,5 @@
 
 typedef struct fpu_context {
-	sysarg_t dregs[32];
+	_Alignas(sizeof(sysarg_t)) sysarg_t dregs[32];
 	sysarg_t cregs[32];
 } fpu_context_t;
Index: kernel/arch/ppc32/include/arch/fpu_context.h
===================================================================
--- kernel/arch/ppc32/include/arch/fpu_context.h	(revision 1eaead40ef1e81dc0e203498597d60b2e71fcd27)
+++ kernel/arch/ppc32/include/arch/fpu_context.h	(revision 0366d09d1929d3cd61f8f612f9ea15794bc5650c)
@@ -36,6 +36,4 @@
 #define KERN_ppc32_FPU_CONTEXT_H_
 
-#define FPU_CONTEXT_ALIGN	8
-
 #include <arch/fpu_context_struct.h>
 
Index: kernel/arch/ppc32/include/arch/fpu_context_struct.h
===================================================================
--- kernel/arch/ppc32/include/arch/fpu_context_struct.h	(revision 1eaead40ef1e81dc0e203498597d60b2e71fcd27)
+++ kernel/arch/ppc32/include/arch/fpu_context_struct.h	(revision 0366d09d1929d3cd61f8f612f9ea15794bc5650c)
@@ -70,5 +70,5 @@
 
 typedef struct fpu_context {
-	uint64_t fr0;
+	_Alignas(8) uint64_t fr0;
 	uint64_t fr1;
 	uint64_t fr2;
Index: kernel/arch/sparc64/include/arch/fpu_context.h
===================================================================
--- kernel/arch/sparc64/include/arch/fpu_context.h	(revision 1eaead40ef1e81dc0e203498597d60b2e71fcd27)
+++ kernel/arch/sparc64/include/arch/fpu_context.h	(revision 0366d09d1929d3cd61f8f612f9ea15794bc5650c)
@@ -38,9 +38,7 @@
 #include <stdint.h>
 
-#define FPU_CONTEXT_ALIGN	8
-
 typedef struct {
-	uint64_t	d[32];
-	uint64_t	fsr;
+	_Alignas(8) uint64_t d[32];
+	uint64_t fsr;
 } fpu_context_t;
 
Index: kernel/generic/include/proc/thread.h
===================================================================
--- kernel/generic/include/proc/thread.h	(revision 1eaead40ef1e81dc0e203498597d60b2e71fcd27)
+++ kernel/generic/include/proc/thread.h	(revision 0366d09d1929d3cd61f8f612f9ea15794bc5650c)
@@ -151,5 +151,7 @@
 	link_t joiner_link;
 
-	fpu_context_t *saved_fpu_context;
+#ifdef CONFIG_FPU
+	fpu_context_t fpu_context;
+#endif
 	bool fpu_context_exists;
 
Index: kernel/generic/src/proc/scheduler.c
===================================================================
--- kernel/generic/src/proc/scheduler.c	(revision 1eaead40ef1e81dc0e203498597d60b2e71fcd27)
+++ kernel/generic/src/proc/scheduler.c	(revision 0366d09d1929d3cd61f8f612f9ea15794bc5650c)
@@ -97,5 +97,5 @@
 	fpu_enable();
 	if (THREAD->fpu_context_exists)
-		fpu_context_restore(THREAD->saved_fpu_context);
+		fpu_context_restore(&THREAD->fpu_context);
 	else {
 		fpu_init();
@@ -140,5 +140,5 @@
 	if (CPU->fpu_owner != NULL) {
 		irq_spinlock_lock(&CPU->fpu_owner->lock, false);
-		fpu_context_save(CPU->fpu_owner->saved_fpu_context);
+		fpu_context_save(&CPU->fpu_owner->fpu_context);
 
 		/* Don't prevent migration */
@@ -150,5 +150,5 @@
 	irq_spinlock_lock(&THREAD->lock, false);
 	if (THREAD->fpu_context_exists) {
-		fpu_context_restore(THREAD->saved_fpu_context);
+		fpu_context_restore(&THREAD->fpu_context);
 	} else {
 		fpu_init();
@@ -325,5 +325,5 @@
 
 #if (defined CONFIG_FPU) && (!defined CONFIG_FPU_LAZY)
-		fpu_context_save(THREAD->saved_fpu_context);
+		fpu_context_save(&THREAD->fpu_context);
 #endif
 		if (!context_save(&THREAD->saved_context)) {
Index: kernel/generic/src/proc/thread.c
===================================================================
--- kernel/generic/src/proc/thread.c	(revision 1eaead40ef1e81dc0e203498597d60b2e71fcd27)
+++ kernel/generic/src/proc/thread.c	(revision 0366d09d1929d3cd61f8f612f9ea15794bc5650c)
@@ -102,8 +102,4 @@
 static slab_cache_t *thread_cache;
 
-#ifdef CONFIG_FPU
-slab_cache_t *fpu_context_cache;
-#endif
-
 static void *threads_getkey(odlink_t *);
 static int threads_cmp(void *, void *);
@@ -164,11 +160,4 @@
 	/* call the architecture-specific part of the constructor */
 	thr_constructor_arch(thread);
-
-#ifdef CONFIG_FPU
-	thread->saved_fpu_context = slab_alloc(fpu_context_cache,
-	    FRAME_ATOMIC | kmflags);
-	if (!thread->saved_fpu_context)
-		return ENOMEM;
-#endif /* CONFIG_FPU */
 
 	/*
@@ -198,11 +187,6 @@
 	uintptr_t stack_phys =
 	    frame_alloc(STACK_FRAMES, kmflags, STACK_SIZE - 1);
-	if (!stack_phys) {
-#ifdef CONFIG_FPU
-		assert(thread->saved_fpu_context);
-		slab_free(fpu_context_cache, thread->saved_fpu_context);
-#endif
+	if (!stack_phys)
 		return ENOMEM;
-	}
 
 	thread->kstack = (uint8_t *) PA2KA(stack_phys);
@@ -225,9 +209,4 @@
 	frame_free(KA2PA(thread->kstack), STACK_FRAMES);
 
-#ifdef CONFIG_FPU
-	assert(thread->saved_fpu_context);
-	slab_free(fpu_context_cache, thread->saved_fpu_context);
-#endif
-
 	return STACK_FRAMES;  /* number of frames freed */
 }
@@ -243,11 +222,6 @@
 
 	atomic_store(&nrdy, 0);
-	thread_cache = slab_cache_create("thread_t", sizeof(thread_t), 0,
+	thread_cache = slab_cache_create("thread_t", sizeof(thread_t), _Alignof(thread_t),
 	    thr_constructor, thr_destructor, 0);
-
-#ifdef CONFIG_FPU
-	fpu_context_cache = slab_cache_create("fpu_context_t",
-	    sizeof(fpu_context_t), FPU_CONTEXT_ALIGN, NULL, NULL, 0);
-#endif
 
 	odict_initialize(&threads, threads_getkey, threads_cmp);
