summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Hellstrom <daniel@gaisler.com>2014-06-05 11:43:02 +0200
committerDaniel Cederman <cederman@gaisler.com>2014-06-27 11:03:25 +0200
commit7d9b72e7d33187d134150286713fb5f01bf13cbd (patch)
treeef65dfea4b548639bfc1d366a088d9104646d1b2
parent747c25d7179c41677d74841795fc6135a8764871 (diff)
SPARC: support for runtime FPU detection
With this patch it is possible to compile a kernel that works on both FPU and non-FPU SPARC systems. The SPARC PSR register contains a bit indicating if FPU is present. It is a minimal increase to the foot-print.
-rw-r--r--cpukit/score/cpu/sparc/cpu_asm.S17
-rw-r--r--cpukit/score/cpu/sparc/rtems/score/sparc.h10
2 files changed, 24 insertions, 3 deletions
diff --git a/cpukit/score/cpu/sparc/cpu_asm.S b/cpukit/score/cpu/sparc/cpu_asm.S
index 92674de783..15f9dd26e1 100644
--- a/cpukit/score/cpu/sparc/cpu_asm.S
+++ b/cpukit/score/cpu/sparc/cpu_asm.S
@@ -55,7 +55,13 @@ SYM(_CPU_Context_save_fp):
or %l1, %lo(SPARC_PSR_EF_MASK), %l1
or %l0, %l1, %l0
mov %l0, %psr ! **** ENABLE FLOAT ACCESS ****
- nop; nop; nop; ! Need three nops before EF is
+ nop; nop; nop; ! Need three nops before EF is
+#ifdef SPARC_DYNAMIC_FPU_DETECTION
+ mov %psr, %l0 ! **** check whether fpu present ****
+ andcc %l0,%l1,%g0
+ beq 1f
+ nop
+#endif
ld [%i0], %l0 ! active due to pipeline delay!!!
std %f0, [%l0 + FO_F1_OFFSET]
std %f2, [%l0 + F2_F3_OFFSET]
@@ -104,7 +110,13 @@ SYM(_CPU_Context_restore_fp):
or %l1, %lo(SPARC_PSR_EF_MASK), %l1
or %l0, %l1, %l0
mov %l0, %psr ! **** ENABLE FLOAT ACCESS ****
- nop; nop; nop; ! Need three nops before EF is
+ nop; nop; nop; ! Need three nops before EF is
+#ifdef SPARC_DYNAMIC_FPU_DETECTION
+ mov %psr, %l0 ! **** check whether fpu present ****
+ andcc %l0,%l1,%g0
+ beq 1f
+ nop
+#endif
ld [%i0], %l0 ! active due to pipeline delay!!!
ldd [%l0 + FO_F1_OFFSET], %f0
ldd [%l0 + F2_F3_OFFSET], %f2
@@ -123,6 +135,7 @@ SYM(_CPU_Context_restore_fp):
ldd [%l0 + F28_F29_OFFSET], %f28
ldd [%l0 + F3O_F31_OFFSET], %f30
ld [%l0 + FSR_OFFSET], %fsr
+1:
ret
restore
diff --git a/cpukit/score/cpu/sparc/rtems/score/sparc.h b/cpukit/score/cpu/sparc/rtems/score/sparc.h
index abd0f8b987..e3251d8473 100644
--- a/cpukit/score/cpu/sparc/rtems/score/sparc.h
+++ b/cpukit/score/cpu/sparc/rtems/score/sparc.h
@@ -63,11 +63,19 @@ extern "C" {
#define SPARC_NUMBER_OF_REGISTER_WINDOWS 8
/**
+ * Compile the SPARC kernel with runtime FPU detection. This is used
+ * by RTEMS kernels built without FPU but still need to be able to
+ * run tasks with FPU enabled. This way the kernel is SPARC (v7/v8)
+ * with or without FPU compatible.
+ */
+#define SPARC_DYNAMIC_FPU_DETECTION 1
+
+/**
* This macro indicates whether this multilib variation has hardware
* floating point or not. We use the gcc cpp predefine _SOFT_FLOAT
* to determine that.
*/
-#if defined(_SOFT_FLOAT)
+#if !defined(SPARC_DYNAMIC_FPU_DETECTION) && defined(_SOFT_FLOAT)
#define SPARC_HAS_FPU 0
#else
#define SPARC_HAS_FPU 1