When rtl for arm-embedded/arm-freertos is build with hardfloat the fpu should also automagically get enabled, by default it is off which causes a crash when floats are used.

This small patch fixes that problem in cortexm4f_start.inc

can you please apply this patch to trunk?

Thank you,

Michael

diff --git a/rtl/embedded/arm/cortexm4f_start.inc b/rtl/embedded/arm/cortexm4f_start.inc
index 82202b1565..fa557becfc 100644
--- a/rtl/embedded/arm/cortexm4f_start.inc
+++ b/rtl/embedded/arm/cortexm4f_start.inc
@@ -43,6 +43,14 @@ asm
   str r1, [r0]
 {$endif REMAP_VECTTAB}

+{$if not defined(FPUSOFT)}
+  ldr r0, .Lcpacr
+  ldr r1, [r0]
+  orr r1, r1, #0xf00000
+  str r1, [r0]
+  dsb
+  isb
+{$endif not defined(FPUSOFT)}
   bl PASCALMAIN
   b HaltProc

@@ -56,10 +64,13 @@ asm
   .long _data
 .L_edata:
   .long _edata
+{$if not defined(FPUSOFT)}
+.Lcpacr:
+  .long 0xE000ED88
+{$endif not defined(FPUSOFT)}
 {$ifdef REMAP_VECTTAB}
 .Lvtor:
   .long 0xE000ED08
 .Ltext_start:
   .long _text_start
 {$endif REMAP_VECTTAB}
-end;
\ No newline at end of file
diff --git a/rtl/freertos/arm/cortexm4f_start.inc b/rtl/freertos/arm/cortexm4f_start.inc
index 82202b1565..70b75ee6ae 100644
--- a/rtl/freertos/arm/cortexm4f_start.inc
+++ b/rtl/freertos/arm/cortexm4f_start.inc
@@ -43,6 +43,14 @@ asm
   str r1, [r0]
 {$endif REMAP_VECTTAB}

+{$if not defined(FPUSOFT)}
+  ldr r0, .Lcpacr
+  ldr r1, [r0]
+  orr r1, r1, #0xf00000
+  str r1, [r0]
+  dsb
+  isb
+{$endif not defined(FPUSOFT)}
   bl PASCALMAIN
   b HaltProc

@@ -56,10 +64,14 @@ asm
   .long _data
 .L_edata:
   .long _edata
+{$if not defined(FPUSOFT)}
+.Lcpacr:
+  .long 0xE000ED88
+{$endif not defined(FPUSOFT)}
 {$ifdef REMAP_VECTTAB}
 .Lvtor:
   .long 0xE000ED08
 .Ltext_start:
   .long _text_start
 {$endif REMAP_VECTTAB}
-end;
\ No newline at end of file
+end;

diff --git a/rtl/embedded/arm/cortexm4f_start.inc 
b/rtl/embedded/arm/cortexm4f_start.inc
index 82202b1565..fa557becfc 100644
--- a/rtl/embedded/arm/cortexm4f_start.inc
+++ b/rtl/embedded/arm/cortexm4f_start.inc
@@ -43,6 +43,14 @@ asm
   str r1, [r0]
 {$endif REMAP_VECTTAB}
 
+{$if not defined(FPUSOFT)}
+  ldr r0, .Lcpacr
+  ldr r1, [r0]
+  orr r1, r1, #0xf00000
+  str r1, [r0]
+  dsb
+  isb
+{$endif not defined(FPUSOFT)}
   bl PASCALMAIN
   b HaltProc
 
@@ -56,10 +64,13 @@ asm
   .long _data
 .L_edata:
   .long _edata
+{$if not defined(FPUSOFT)}
+.Lcpacr:
+  .long 0xE000ED88
+{$endif not defined(FPUSOFT)}
 {$ifdef REMAP_VECTTAB}
 .Lvtor:
   .long 0xE000ED08
 .Ltext_start:
   .long _text_start
 {$endif REMAP_VECTTAB}
-end;
\ No newline at end of file
diff --git a/rtl/freertos/arm/cortexm4f_start.inc 
b/rtl/freertos/arm/cortexm4f_start.inc
index 82202b1565..70b75ee6ae 100644
--- a/rtl/freertos/arm/cortexm4f_start.inc
+++ b/rtl/freertos/arm/cortexm4f_start.inc
@@ -43,6 +43,14 @@ asm
   str r1, [r0]
 {$endif REMAP_VECTTAB}
 
+{$if not defined(FPUSOFT)}
+  ldr r0, .Lcpacr
+  ldr r1, [r0]
+  orr r1, r1, #0xf00000
+  str r1, [r0]
+  dsb
+  isb
+{$endif not defined(FPUSOFT)}
   bl PASCALMAIN
   b HaltProc
 
@@ -56,10 +64,14 @@ asm
   .long _data
 .L_edata:
   .long _edata
+{$if not defined(FPUSOFT)}
+.Lcpacr:
+  .long 0xE000ED88
+{$endif not defined(FPUSOFT)}
 {$ifdef REMAP_VECTTAB}
 .Lvtor:
   .long 0xE000ED08
 .Ltext_start:
   .long _text_start
 {$endif REMAP_VECTTAB}
-end;
\ No newline at end of file
+end;
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to