summaryrefslogtreecommitdiffstats
path: root/c/src/exec/score/cpu/m68k/m68k.h
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/exec/score/cpu/m68k/m68k.h')
-rw-r--r--c/src/exec/score/cpu/m68k/m68k.h78
1 files changed, 68 insertions, 10 deletions
diff --git a/c/src/exec/score/cpu/m68k/m68k.h b/c/src/exec/score/cpu/m68k/m68k.h
index 1d12e9ea10..a6cf0ce212 100644
--- a/c/src/exec/score/cpu/m68k/m68k.h
+++ b/c/src/exec/score/cpu/m68k/m68k.h
@@ -40,6 +40,7 @@ extern "C" {
* -m68302 (no FP) (deprecated, use -m68000)
* -m68332 (no FP) (deprecated, use -mcpu32)
* -mcpu32 (no FP)
+ * -m5200 (no FP)
*
* As of gcc 2.8.1 and egcs 1.1, there is no distinction made between
* the CPU32 and CPU32+. The option -mcpu32 generates code which can
@@ -164,6 +165,19 @@ extern "C" {
#define M68K_HAS_FPU 0
#define M68K_HAS_FPSP_PACKAGE 0
+#elif defined(__mcf5200__)
+/* Motorola ColdFire V2 core - RISC/68020 hybrid */
+#define CPU_MODEL_NAME "m5200"
+#define M68K_HAS_VBR 1
+#define M68K_HAS_BFFFO 0
+#define M68K_HAS_SEPARATE_STACKS 0
+#define M68K_HAS_PREINDEXING 0
+#define M68K_HAS_EXTB_L 1
+#define M68K_HAS_MISALIGNED 1
+#define M68K_HAS_FPU 0
+#define M68K_HAS_FPSP_PACKAGE 0
+#define M68K_COLDFIRE_ARCH 1
+
#elif defined(__mc68000__)
#define CPU_MODEL_NAME "m68000"
@@ -188,31 +202,64 @@ extern "C" {
#endif
/*
+ * If the above did not specify a ColdFire architecture, then set
+ * this flag to indicate that it is not a ColdFire CPU.
+ */
+
+#if !defined(M68K_COLDFIRE_ARCH)
+#define M68K_COLDFIRE_ARCH 0
+#endif
+
+/*
* Define the name of the CPU family.
*/
-#define CPU_NAME "Motorola MC68xxx"
+#if ( M68K_COLDFIRE_ARCH == 1 )
+ #define CPU_NAME "Motorola ColdFire"
+#else
+ #define CPU_NAME "Motorola MC68xxx"
+#endif
#ifndef ASM
+#if ( M68K_COLDFIRE_ARCH == 1 )
#define m68k_disable_interrupts( _level ) \
- asm volatile ( "movew %%sr,%0\n\t" \
- "orw #0x0700,%%sr" \
+ do { register unsigned32 _tmpsr = 0x0700; \
+ asm volatile ( "move.w %%sr,%0\n\t" \
+ "or.l %0,%1\n\t" \
+ "move.w %1,%%sr" \
+ : "=d" (_level), "=d"(_tmpsr) : "1"(_tmpsr) ); \
+ } while( 0 )
+#else
+#define m68k_disable_interrupts( _level ) \
+ asm volatile ( "move.w %%sr,%0\n\t" \
+ "or.w #0x0700,%%sr" \
: "=d" (_level))
+#endif
#define m68k_enable_interrupts( _level ) \
- asm volatile ( "movew %0,%%sr " : : "d" (_level));
+ asm volatile ( "move.w %0,%%sr " : : "d" (_level));
+#if ( M68K_COLDFIRE_ARCH == 1 )
#define m68k_flash_interrupts( _level ) \
- asm volatile ( "movew %0,%%sr\n\t" \
- "orw #0x0700,%%sr" \
+ do { register unsigned32 _tmpsr = 0x0700; \
+ asm volatile ( "move.w %2,%%sr\n\t" \
+ "or.l %2,%1\n\t" \
+ "move.w %1,%%sr" \
+ : "=d"(_tmpsr) : "0"(_tmpsr), "d"(_level) ); \
+ } while( 0 )
+#else
+#define m68k_flash_interrupts( _level ) \
+ asm volatile ( "move.w %0,%%sr\n\t" \
+ "or.w #0x0700,%%sr" \
: : "d" (_level))
+#endif
#define m68k_get_interrupt_level( _level ) \
do { \
register unsigned32 _tmpsr; \
\
- asm volatile( "movw %%sr,%0" : "=d" (_tmpsr)); \
+ asm volatile( "move.w %%sr,%0" : "=d" (_tmpsr)); \
_level = (_tmpsr & 0x0700) >> 8; \
} while (0)
@@ -220,17 +267,28 @@ extern "C" {
do { \
register unsigned32 _tmpsr; \
\
- asm volatile( "movw %%sr,%0" : "=d" (_tmpsr)); \
+ asm volatile( "move.w %%sr,%0" : "=d" (_tmpsr)); \
_tmpsr = (_tmpsr & 0xf8ff) | ((_newlevel) << 8); \
- asm volatile( "movw %0,%%sr" : : "d" (_tmpsr)); \
+ asm volatile( "move.w %0,%%sr" : : "d" (_tmpsr)); \
} while (0)
-#if ( M68K_HAS_VBR == 1 )
+#if ( M68K_HAS_VBR == 1 && M68K_COLDFIRE_ARCH == 0 )
#define m68k_get_vbr( vbr ) \
asm volatile ( "movec %%vbr,%0 " : "=r" (vbr))
#define m68k_set_vbr( vbr ) \
asm volatile ( "movec %0,%%vbr " : : "r" (vbr))
+
+#elif ( M68K_COLDFIRE_ARCH == 1 )
+#define m68k_get_vbr( _vbr ) _vbr = (void *)_VBR
+
+#define m68k_set_vbr( _vbr ) \
+ asm volatile ("move.l %%a7,%%d1 \n\t" \
+ "move.l %0,%%a7\n\t" \
+ "movec %%a7,%%vbr\n\t" \
+ "move.l %%d1,%%a7\n\t" \
+ : : "d" (_vbr) : "d1" );
+
#else
#define m68k_get_vbr( _vbr ) _vbr = (void *)_VBR
#define m68k_set_vbr( _vbr )