diff --git a/libgloss/arm/cpu-init/rdimon-aem-m.S b/libgloss/arm/cpu-init/rdimon-aem-m.S
index 611849077..c495efc2d 100644
--- a/libgloss/arm/cpu-init/rdimon-aem-m.S
+++ b/libgloss/arm/cpu-init/rdimon-aem-m.S
@@ -28,9 +28,36 @@
    We define a hardfault handler, required to prevent the simulator
    from entering into an infinite loop.  This handler is located at
    address 0xc by default when linking with mprofile-mps2.specs which
-   uses --section-start=.hardfault_handler_addr=0xc.  */
+   uses --section-start=.hardfault_handler_addr=0xc.
+
+   Enable the FPU when __ARM_FP is set.  */
 
 #if  (__ARM_ARCH_PROFILE == 'M')
+    .syntax    unified
+    .thumb
+
+    @ CPU Initialisation
+    .globl     _rdimon_hw_init_hook
+    .type      _rdimon_hw_init_hook, %function
+
+_rdimon_hw_init_hook:
+    /* Enable FPU for M-profile only .  */
+#if __ARM_FP
+    /* Read CPACR */
+    ldr        r0, =0xE000ED88
+    ldr        r1, [R0]
+    /* Enable full access to CP10 and CP11.  */
+    orr        r1, r1, #(0xFF << 20)
+    str        r1, [R0]
+#if __ARM_ARCH >= 800
+    ldr        r0, =0xE002ED88
+    str        r1, [R0]
+#endif
+    dsb
+    isb
+#endif
+    bx lr
+
     /* On M-profile, call abort in case of hardfault: this causes the
        simulator to abort execution instead of going into an infinite
        loop.  */
diff --git a/libgloss/arm/crt0.S b/libgloss/arm/crt0.S
index b9e768007..cad002d2b 100644
--- a/libgloss/arm/crt0.S
+++ b/libgloss/arm/crt0.S
@@ -1,6 +1,7 @@
 #include "newlib.h"
 #include "arm.h"
 #include "swi.h"
+#include "arm-acle-compat.h"
 
 /* ANSI concatenation macros.  */
 #define CONCAT(a, b) CONCAT2(a, b)
@@ -250,12 +251,8 @@
 	FUNC_START	_start
 	FN_EH_START
 
-	/* __ARM_ARCH_PROFILE is defined from GCC 4.8 onwards, however __ARM_ARCH_7A
-	has been defined since 4.2 onwards, which is when v7-a support was added
-	and hence 'A' profile support was added in the compiler.  Allow for this
-	file to be built with older compilers.  We only call this for A profile
-	cores.  */
-#if defined (__ARM_ARCH_7A__) || (__ARM_ARCH_PROFILE == 'A')
+	/* We only call this for A and M profile cores.  */
+#if (__ARM_ARCH_PROFILE == 'A') || (__ARM_ARCH_PROFILE == 'M')
 /*  The init hook does not use the stack and is called before the stack has been set up.  */
 #ifdef ARM_RDI_MONITOR
 	bl	_rdimon_hw_init_hook
