summaryrefslogtreecommitdiffstats
path: root/bsps
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2018-03-26 12:10:15 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2018-03-26 15:12:48 +0200
commitfc2ec62978ac749d9f731fbc768e48e4f0c4a8f9 (patch)
tree32c2dfee817f51dfc689ddd2e132873b99360265 /bsps
parentbsps/m68k: Remove unused define (diff)
downloadrtems-fc2ec62978ac749d9f731fbc768e48e4f0c4a8f9.tar.bz2
bsps/m68k: Move libcpu content to bsps
This patch is a part of the BSP source reorganization. Update #3285.
Diffstat (limited to 'bsps')
-rw-r--r--bsps/m68k/csb360/start/idle-mcf5272.c27
-rw-r--r--bsps/m68k/shared/m68kidle.c27
-rw-r--r--bsps/m68k/shared/memProbe.c105
3 files changed, 159 insertions, 0 deletions
diff --git a/bsps/m68k/csb360/start/idle-mcf5272.c b/bsps/m68k/csb360/start/idle-mcf5272.c
new file mode 100644
index 0000000000..c645b288b8
--- /dev/null
+++ b/bsps/m68k/csb360/start/idle-mcf5272.c
@@ -0,0 +1,27 @@
+/*
+ * Motorola MC68xxx Dependent Idle Body Source
+ *
+ * This kernel routine is the idle thread. The idle thread runs any time
+ * no other thread is ready to run. This thread loops forever with
+ * interrupts enabled.
+ */
+
+/*
+ * COPYRIGHT (c) 1989-2002.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/thread.h>
+
+void *_CPU_Thread_Idle_body( uintptr_t ignored )
+{
+ for( ; ; ) {
+ __asm__ volatile( "nop" );
+ __asm__ volatile( "nop" );
+ }
+}
diff --git a/bsps/m68k/shared/m68kidle.c b/bsps/m68k/shared/m68kidle.c
new file mode 100644
index 0000000000..f43651f49e
--- /dev/null
+++ b/bsps/m68k/shared/m68kidle.c
@@ -0,0 +1,27 @@
+/*
+ * Motorola MC68xxx Dependent Idle Body Source
+ *
+ * This kernel routine is the idle thread. The idle thread runs any time
+ * no other thread is ready to run. This thread loops forever with
+ * interrupts enabled.
+ */
+
+/*
+ * COPYRIGHT (c) 1989-2002.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/thread.h>
+
+void *_CPU_Thread_Idle_body( uintptr_t ignored )
+{
+ for( ; ; ) {
+ /* supervisor mode, all interrupts on */
+ __asm__ volatile( "stop #0x3000":::"cc" );
+ }
+}
diff --git a/bsps/m68k/shared/memProbe.c b/bsps/m68k/shared/memProbe.c
new file mode 100644
index 0000000000..d352f76b6e
--- /dev/null
+++ b/bsps/m68k/shared/memProbe.c
@@ -0,0 +1,105 @@
+/*
+ * Address Probing for M68k/ColdFire
+ */
+
+#include <bsp.h>
+#include <string.h>
+#include <rtems/m68k/sim.h>
+
+#if (M68K_COLDFIRE_ARCH == 1)
+# define EXCEPTION_FRAME_PC_OFFSET "4"
+#else
+# define EXCEPTION_FRAME_PC_OFFSET "2"
+#endif
+
+typedef int (*MemProber)(void *from, void *to);
+int memProbeByte(void *from, void *to);
+int memProbeShort(void *from, void *to);
+int memProbeLong(void *from, void *to);
+int memProbeCatcher(void);
+rtems_status_code bspExtMemProbe(void *addr, int write, int size, void *pval);
+
+__asm__(
+ ".text\n"
+ "memProbeByte: \n"
+ " move.l %sp@(4),%a0\n"
+ " move.b %a0@,%d0 \n"
+ " move.l %sp@(8),%a0\n"
+ " move.b %d0,%a0@ \n"
+ " bra.b 1f \n"
+ "memProbeShort: \n"
+ " move.l %sp@(4),%a0\n"
+ " move.w %a0@,%d0 \n"
+ " move.l %sp@(8),%a0\n"
+ " move.w %d0,%a0@ \n"
+ " bra.b 1f \n"
+ "memProbeLong: \n"
+ " move.l %sp@(4),%a0\n"
+ " move.l %a0@,%d0 \n"
+ " move.l %sp@(8),%a0\n"
+ " move.l %d0,%a0@ \n"
+ "1: nop \n"
+ " moveq.l #1,%d0 \n"
+ " rts \n"
+ "memProbeCatcher: \n"
+ " move.l #1f,%d0 \n"
+ " move.l %d0,%sp@(" EXCEPTION_FRAME_PC_OFFSET ")\n"
+ " rte \n"
+ "1: clr.l %d0 \n"
+ " rts \n"
+);
+
+rtems_status_code
+bspExtMemProbe(void *addr, int write, int size, void *pval)
+{
+ rtems_status_code rval=RTEMS_SUCCESSFUL;
+ rtems_interrupt_level level;
+ unsigned long buf;
+ MemProber probe;
+ void *saveVector;
+ void **exceptionPointer;
+ void *vbr;
+
+ /*
+ * Sanity check
+ */
+ switch (size) {
+ case sizeof(char): probe=memProbeByte; break;
+ case sizeof(short): probe=memProbeShort; break;
+ case sizeof(long): probe=memProbeLong; break;
+ default: return RTEMS_INVALID_SIZE;
+ }
+
+ /*
+ * use a buffer to make sure we don't end up probing 'pval'.
+ */
+ if (write && pval)
+ memcpy(&buf, pval, size);
+
+ /*
+ * Get location of access fault exception
+ */
+ m68k_get_vbr(vbr);
+ exceptionPointer = (void **)((char *)vbr + (2 * 4));
+
+ /*
+ * Probe!
+ */
+ rtems_interrupt_disable(level);
+ saveVector = *exceptionPointer;
+ *exceptionPointer = memProbeCatcher;
+ if (write) {
+ if (probe(&buf, addr) == 0)
+ rval = RTEMS_INVALID_ADDRESS;
+ }
+ else {
+ if (probe(addr, &buf) == 0)
+ rval = RTEMS_INVALID_ADDRESS;
+ }
+ *exceptionPointer = saveVector;
+ rtems_interrupt_enable(level);
+
+ if (!write && pval && (rval == RTEMS_SUCCESSFUL))
+ memcpy(pval, &buf, size);
+ return rval;
+}