diff --git a/libgloss/arm/crt0.S b/libgloss/arm/crt0.S
index b9e768007..0bec14e91 100644
--- a/libgloss/arm/crt0.S
+++ b/libgloss/arm/crt0.S
@@ -366,6 +366,19 @@
 
 #endif
 #endif
+
+	/* Enable FPU for M-profile only .  */
+#if defined (THUMB_VXM) && __ARM_FP
+	/* Read CPACR */
+	ldr r0, =0xE000ED88
+	ldr r1, [R0]
+	/* Enable full access to CP10 and CP11.  */
+	orr r1, r1, #(0xF << 20)
+	str r1, [R0]
+	dsb
+	isb
+#endif
+
 	/* Zero the memory in the .bss section.  */
 	movs 	a2, #0			/* Second arg: fill value.  */
 	mov	fp, a2			/* Null frame pointer.  */
diff --git a/newlib/libc/sys/arm/crt0.S b/newlib/libc/sys/arm/crt0.S
index 51e86d549..4c775fbbb 100644
--- a/newlib/libc/sys/arm/crt0.S
+++ b/newlib/libc/sys/arm/crt0.S
@@ -353,6 +353,19 @@
 
 #endif
 #endif
+
+	/* Enable FPU for M-profile only .  */
+#if defined (THUMB_VXM) && __ARM_FP
+	/* Read CPACR */
+	ldr r0, =0xE000ED88
+	ldr r1, [R0]
+	/* Enable full access to CP10 and CP11.  */
+	orr r1, r1, #(0xF << 20)
+	str r1, [R0]
+	dsb
+	isb
+#endif
+
 	/* Zero the memory in the .bss section.  */
 	movs 	a2, #0			/* Second arg: fill value.  */
 	mov	fp, a2			/* Null frame pointer.  */
